package edu.stanford.nlp.sempre.interactive; import java.io.PrintWriter; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import edu.stanford.nlp.sempre.Json; import fig.basic.Evaluation; import fig.basic.IOUtils; import fig.basic.LogInfo; import fig.exec.Execution; public class SimulationAnalyzer { @SuppressWarnings("unchecked") public static Map<String, Object> getStats(String jsonResponse) { Map<String, Object> response = Json.readMapHard(jsonResponse); if (response.containsKey("stats")) return (Map<String, Object>) response.get("stats"); return null; } static Evaluation qEval = new Evaluation(); static Evaluation acceptEval = new Evaluation(); static Evaluation dEval = new Evaluation(); static int queryCount = 0; // add stats to the query. public synchronized static void addStats(Map<String, Object> query, String jsonResponse) { Map<String, Object> stats = getStats(jsonResponse); Map<String, Object> line = new LinkedHashMap<String, Object>(query); LogInfo.logs("stats: %s", stats); if (stats == null) { LogInfo.logs("No stats"); LogInfo.log(query); LogInfo.log(jsonResponse); return; } // make sure no key conflict for (Entry<String, Object> entry : stats.entrySet()) { line.put("stats." + entry.getKey(), entry.getValue()); } line.put("queryCount", ++queryCount); PrintWriter infoFile = IOUtils.openOutAppendHard(Execution.getFile("plotInfo.json")); infoFile.println(Json.writeValueAsStringHard(line)); infoFile.close(); if (!stats.containsKey("type")) return; if (stats.get("type").equals("def") && !stats.containsKey("error")) { qEval.add("def.head_len", (Integer) stats.get("head_len")); qEval.add("def.json_len", (Integer) stats.get("json_len")); qEval.add("def.num_failed", (Integer) stats.get("num_failed")); qEval.add("def.num_body", (Integer) stats.get("num_body")); qEval.add("def.num_rules", (Integer) stats.get("num_rules")); qEval.add("def.time", (Integer) stats.get("count")); } if (stats.get("type").equals("q") && !stats.containsKey("error")) { GrammarInducer.ParseStatus status = GrammarInducer.ParseStatus.fromString(stats.get("status").toString()); int size = (Integer) stats.get("size"); qEval.add("q.size", size); qEval.add("q.isCore", status == GrammarInducer.ParseStatus.Core); qEval.add("q.isInduced", status == GrammarInducer.ParseStatus.Induced); } if (stats.get("type").equals("accept") && !stats.containsKey("error")) { GrammarInducer.ParseStatus status = GrammarInducer.ParseStatus.fromString(stats.get("status").toString()); int size = (Integer) stats.get("size"); int rank = (Integer) stats.get("rank"); acceptEval.add("size", size); if (rank != -1) acceptEval.add("rank", rank); acceptEval.add("isCore", status == GrammarInducer.ParseStatus.Core); acceptEval.add("isInduced", status == GrammarInducer.ParseStatus.Induced); } } public synchronized static void flush() { // TODO Auto-generated method stub qEval.logStats("q"); qEval.putOutput("q"); acceptEval.logStats("accept"); acceptEval.putOutput("accept"); } }