package edu.stanford.nlp.sempre.tables.serialize; import java.io.File; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import edu.stanford.nlp.sempre.*; import edu.stanford.nlp.sempre.tables.TableKnowledgeGraph; import fig.basic.*; /** * A Dataset object created from serialized examples created by SerializedDumper. * * @author ppasupat */ public class SerializedDataset extends Dataset { public static class Options { @Option(gloss = "Directory with dumped-*.gz files; to load only specific files, use Dataset.inPaths") public List<String> dumpDirs = new ArrayList<>(); } public static Options opts = new Options(); private final Map<String, List<String>> availableGroups = new LinkedHashMap<>(); @Override public void read() { LogInfo.begin_track_printAll("Dataset.read"); if (Dataset.opts.trainFrac != 1) LogInfo.warnings("Dataset.opts.trainFrac is ignored!"); if (opts.dumpDirs != null && !opts.dumpDirs.isEmpty()) { readDirs(opts.dumpDirs); } else { read(Dataset.opts.inPaths); } LogInfo.end_track(); } public void read(String group, String inPath) { MapUtils.addToList(availableGroups, group, inPath); checkFiles(); } public void read(List<Pair<String, String>> inPaths) { for (Pair<String, String> pair : inPaths) MapUtils.addToList(availableGroups, pair.getFirst(), pair.getSecond()); checkFiles(); } public void readDir(String dumpDir) { readDirs(Collections.singleton(dumpDir)); } public static final Pattern GZ_PATTERN = Pattern.compile("^dumped-([^-]+)(?:-(\\d+)(?:-(.*))?)?\\.gz$"); public void readDirs(Collection<String> dumpDirs) { // Get filenames // File format is dumped-groupname[-offset][-examplename].gz Set<String> filenames = new HashSet<>(), groups = new HashSet<>(); for (String dumpDir : dumpDirs) { String[] filenamesInDumpDir = new File(dumpDir).list(); for (String filename : filenamesInDumpDir) { Matcher matcher = GZ_PATTERN.matcher(filename); if (matcher.matches()) { filenames.add(new File(dumpDir, filename).toString()); groups.add(matcher.group(1)); } } } LogInfo.logs("Available groups: %s", groups); for (String group : groups) { List<String> filenamesForGroup = new ArrayList<>(); for (String filename : filenames) { File file = new File(filename); Matcher matcher = GZ_PATTERN.matcher(file.getName()); if (matcher.matches() && group.equals(matcher.group(1))) filenamesForGroup.add(file.toString()); } if (!filenamesForGroup.isEmpty()) { Collections.sort(filenamesForGroup); availableGroups.put(group, filenamesForGroup); } } checkFiles(); } private void checkFiles() { // Check if all files exist for (List<String> filenamesForGroup : availableGroups.values()) { for (String filename : filenamesForGroup) { File file = new File(filename); if (!file.isFile()) throw new RuntimeException("Error reading dataset: " + file + " is not a file."); } } } @Override public Set<String> groups() { return availableGroups.keySet(); } @Override public LazyLoadedExampleList examples(String group) { if (!availableGroups.containsKey(group)) return null; return new LazyLoadedExampleList(availableGroups.get(group), getMaxExamplesForGroup(group), group.startsWith("single_")); } // ============================================================ // Test // ============================================================ public static void main(String[] args) { TableKnowledgeGraph.opts.baseCSVDir = "lib/data/tables/"; SerializedDataset dataset = new SerializedDataset(); dataset.readDir("out/sliced-dump-8-reps/representative-00-training-sliced-00000-00299/"); LazyLoadedExampleList examples = dataset.examples("representative"); for (int i : new int[]{ 25, 20, 20, 20, 21, 31, 29, 45, 35, 36, 37, 31, 99, 99, 100, 100, 99, 1, 3, 10, 23, 499 }) { LogInfo.logs("=== %d ===", i); Example ex = examples.get(i); LogInfo.logs("%s %d", ex.id, ex.predDerivations.size()); if (!ex.id.equals("nt-" + i)) throw new RuntimeException(String.format("Wrong ID: %s != nt-%d", ex.id, i)); } } }