package edu.stanford.nlp.sempre.freebase.utils; import edu.stanford.nlp.io.IOUtils; import fig.basic.LispTree; import fig.basic.LogInfo; import fig.basic.MapUtils; import java.io.IOException; import java.io.PrintWriter; import java.util.*; public final class SemparseLogTools { private SemparseLogTools() { } public static void main(String[] args) throws IOException { LogInfo.begin_track_printAll("analyze"); if (args[0].equals("compare")) { compareLogs(args[1], args[2], args[3]); } else if (args[0].equals("diff")) { printDiff(args[1], args[2]); } else if (args[0].equals("fb_descriptions")) { getFbDescInTrueDerivations(args[1], args[2]); } if (args[0].equals("result_list")) { printResultList(args[1], args[2]); } LogInfo.end_track(); } private static void printResultList(String log, String field) { boolean start = false; int numOfIterations = -1; String prob = null; String correct = null; String oracle = null; for (String line : IOUtils.readLines(log)) { if (line.contains("Iteration")) { int slashIndex = line.indexOf('/'); int openCurlyIndex = line.indexOf('{'); numOfIterations = Integer.parseInt(line.substring(slashIndex + 1, openCurlyIndex - 1)); } if (line.contains("Processing iter=" + numOfIterations + ".dev")) { start = true; } if (start) { if (line.contains("Pred@0000")) { prob = line.substring(line.indexOf("prob=") + 5, line.indexOf(", comp=")); } if (line.contains("Example:")) prob = "0"; if (line.contains("Current: correct=")) { int correctIndex = line.indexOf("correct="); int oracleIndex = line.indexOf("oracle="); int partCorrectIndex = line.indexOf("partCorrect="); int parsedIndex = line.indexOf("parsed="); int numTokensIndex = line.indexOf("numTokens="); if (field.equals("oracle")) System.out.println(line.substring(oracleIndex + 7, partCorrectIndex - 1)); if (field.equals("correct")) System.out.println(line.substring(correctIndex + 8, oracleIndex - 1) + "\t" + prob); if (field.equals("parsed")) System.out.println(line.substring(parsedIndex + 7, numTokensIndex - 1)); } } } } private static void getFbDescInTrueDerivations(String log, String out) throws IOException { boolean start = false; int numOfIterations = -1; Map<String, Set<String>> exampleToDescriptions = new HashMap<String, Set<String>>(); String currExample = null; for (String line : IOUtils.readLines(log)) { if (line.contains("Iteration")) { int slashIndex = line.indexOf('/'); int openCurlyIndex = line.indexOf('{'); numOfIterations = Integer.parseInt(line.substring(slashIndex + 1, openCurlyIndex - 1)); } if (line.contains("Processing iter=" + numOfIterations + ".")) { start = true; } if (start) { if (line.contains("Example:")) { int end = line.indexOf("{") - 1; currExample = line.substring(line.indexOf("Example:") + 9, end); exampleToDescriptions.put(currExample, new HashSet<String>()); } if (line.contains("True@")) { String formula = line.substring(line.indexOf("(formula"), line.indexOf("(value") - 1); LispTree t = LispTree.proto.parseFromString(formula); Set<String> descriptions = new HashSet<String>(); extractDescriptionsFromTree(t, descriptions); for (String description : descriptions) MapUtils.addToSet(exampleToDescriptions, currExample, description); } } } PrintWriter writer = IOUtils.getPrintWriter(out); for (String example : exampleToDescriptions.keySet()) { if (exampleToDescriptions.get(example).size() > 0) writer.println(example + "\t" + exampleToDescriptions.get(example)); } writer.close(); } private static void extractDescriptionsFromTree(LispTree t, Set<String> descriptions) { if (t.value != null) { if (t.value.indexOf('.') != t.value.lastIndexOf('.')) { descriptions.add(t.value.substring(t.value.lastIndexOf('.') + 1)); } } if (!t.isLeaf()) { for (LispTree child : t.children) { extractDescriptionsFromTree(child, descriptions); } } } private static void printDiff(String log, String field) throws IOException { boolean start = false; int numOfIterations = -1; String example = null; String targetFormula = null; String targetValue = null; String trueDeriv = null; String predDeriv = null; boolean print = false; for (String line : IOUtils.readLines(log)) { if (line.contains("Iteration")) { int slashIndex = line.indexOf('/'); int openCurlyIndex = line.indexOf('{'); numOfIterations = Integer.parseInt(line.substring(slashIndex + 1, openCurlyIndex - 1)); } if (line.contains("Processing iter=" + numOfIterations + ".dev")) { start = true; } if (start) { if (line.contains("Example:")) { if (print && example != null) { LogInfo.log(example); LogInfo.log(targetFormula); LogInfo.log(targetValue); LogInfo.log(trueDeriv); LogInfo.log(predDeriv); } example = line; targetFormula = null; targetValue = null; trueDeriv = null; predDeriv = null; } if (line.contains("targetFormula:")) { targetFormula = line; } if (line.contains("targetValue:")) { targetValue = line; } if (line.contains("True@") && trueDeriv == null) { trueDeriv = line; } if (line.contains("Pred@") && predDeriv == null) { predDeriv = line; } if (line.contains("Current:")) { if (field.equals("correct")) { if (line.contains("correct=0") && line.contains("oracle=1")) { print = true; } else print = false; } if (field.equals("oracle")) { if (line.contains("oracle=0") && line.contains("parsed=1")) print = true; else print = false; } if (field.equals("parsed")) { if (line.contains("parsed=0")) print = true; else print = false; } } } } } public static void compareLogs(String log1, String log2, String field) { List<Double> correctnessList1 = computeCorrectnessList(log1, field); List<Double> correctnessList2 = computeCorrectnessList(log2, field); if (correctnessList1.size() != correctnessList2.size()) throw new RuntimeException("lists are not same size"); LogInfo.logs("Size of correctness: %s", correctnessList1.size()); for (int i = 0; i < correctnessList1.size(); ++i) { if (!correctnessList1.get(i).equals(correctnessList2.get(i))) { LogInfo.log("example: " + i + " log1: " + correctnessList1.get(i) + " log2: " + correctnessList2.get(i)); } } } private static List<Double> computeCorrectnessList(String log1, String field) { List<Double> res = new LinkedList<>(); boolean start = false; int numOfIterations = -1; for (String line : IOUtils.readLines(log1)) { if (line.contains("Iteration")) { int slashIndex = line.indexOf('/'); int openCurlyIndex = line.indexOf('{'); numOfIterations = Integer.parseInt(line.substring(slashIndex + 1, openCurlyIndex - 1)); LogInfo.logs("Number of iterations=%s", numOfIterations); } if (line.contains("Processing iter=" + numOfIterations + ".dev")) { start = true; } if (start) { if (line.contains("Current: parsed=")) { String[] tokens = line.split("\\s+"); for (String token : tokens) { String[] tokenParts = token.split("="); if (field.equals(tokenParts[0])) res.add(Double.parseDouble(tokenParts[1])); } // LogInfo.logs() // int correctIndex = line.indexOf(" correct="); // int oracleIndex = line.indexOf(" oracle="); // int partCorrectIndex = line.indexOf(" partCorrect="); // int partOracleIndex= line.indexOf(" partOracle="); // int afterPartOracleIndex = line.indexOf("\\s+",partOracleIndex); // LogInfo.logs("part oracle index=%s, after=%s",partCorrectIndex,afterPartOracleIndex); // if (field.equals("oracle")) // res.add(Double.parseDouble(line.substring(oracleIndex + 8, partCorrectIndex))); // if (field.equals("correct")) // res.add(Double.parseDouble(line.substring(correctIndex + 9, oracleIndex))); // if (field.equals("partCorrect")) // res.add(Double.parseDouble(line.substring(partCorrectIndex + 13, partOracleIndex))); // if (field.equals("partOracle")) // res.add(Double.parseDouble(line.substring(partOracleIndex + 12, afterPartOracleIndex))); } } } return res; } }