diff --git a/src/edu/stanford/nlp/sempre/tables/TableKnowledgeGraph.java b/src/edu/stanford/nlp/sempre/tables/TableKnowledgeGraph.java index 8609e7a..143aeca 100644 --- a/src/edu/stanford/nlp/sempre/tables/TableKnowledgeGraph.java +++ b/src/edu/stanford/nlp/sempre/tables/TableKnowledgeGraph.java @@ -608,13 +608,19 @@ public class TableKnowledgeGraph extends KnowledgeGraph implements FuzzyMatchabl return null; } + public Value getNameValueWithOriginalString(NameValue value) { + if (value.description == null) + value = new NameValue(value.id, getOriginalString(value.id)); + return value; + } + public ListValue getListValueWithOriginalStrings(ListValue answers) { List values = new ArrayList<>(); for (Value value : answers.values) { if (value instanceof NameValue) { NameValue name = (NameValue) value; if (name.description == null) - value = new NameValue(name.id, getOriginalString(((NameValue) value).id)); + value = new NameValue(name.id, getOriginalString(name.id)); } values.add(value); } diff --git a/src/edu/stanford/nlp/sempre/tables/TableValueEvaluator.java b/src/edu/stanford/nlp/sempre/tables/TableValueEvaluator.java index f1d2a84..87e44a5 100644 --- a/src/edu/stanford/nlp/sempre/tables/TableValueEvaluator.java +++ b/src/edu/stanford/nlp/sempre/tables/TableValueEvaluator.java @@ -23,6 +23,8 @@ public class TableValueEvaluator implements ValueEvaluator { public boolean allowNormalizedStringMatch = true; @Option(gloss = "When comparing number values, only consider the value and not the unit") public boolean ignoreNumberValueUnits = true; + @Option(gloss = "Strict date evaluation (year, month, and date all have to match)") + public boolean strictDateEvaluation = false; } public static Options opts = new Options(); @@ -113,11 +115,15 @@ public class TableValueEvaluator implements ValueEvaluator { } protected boolean compareDateValues(DateValue target, DateValue pred) { - // If a field in target is not blank (-1), pred must match target on that field - if (target.year != -1 && target.year != pred.year) return false; - if (target.month != -1 && target.month != pred.month) return false; - if (target.day != -1 && target.day != pred.day) return false; - return true; + if (opts.strictDateEvaluation) { + return target.equals(pred); + } else { + // If a field in target is not blank (-1), pred must match target on that field + if (target.year != -1 && target.year != pred.year) return false; + if (target.month != -1 && target.month != pred.month) return false; + if (target.day != -1 && target.day != pred.day) return false; + return true; + } } } diff --git a/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutor.java b/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutor.java index ccaa167..bb1aace 100644 --- a/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutor.java +++ b/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutor.java @@ -205,6 +205,8 @@ class LambdaDCSCoreLogic { // Rule out binaries if (CanonicalNames.isBinary(value) && LambdaDCSExecutor.opts.executeBinary) throw new LambdaDCSException(Type.notUnary, "[Unary] Binary value %s", formula); + if (value instanceof NameValue && graph instanceof TableKnowledgeGraph) + value = ((TableKnowledgeGraph) graph).getNameValueWithOriginalString((NameValue) value); // Other cases return typeHint.applyBound(new ExplicitUnaryDenotation(value)); } diff --git a/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutorTest.java b/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutorTest.java index c2159e4..d603f9e 100644 --- a/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutorTest.java +++ b/src/edu/stanford/nlp/sempre/tables/lambdadcs/LambdaDCSExecutorTest.java @@ -4,6 +4,7 @@ import java.util.*; import fig.basic.*; import edu.stanford.nlp.sempre.*; +import edu.stanford.nlp.sempre.corenlp.CoreNLPAnalyzer; import edu.stanford.nlp.sempre.tables.TableKnowledgeGraph; import org.testng.annotations.Test; @@ -253,8 +254,9 @@ public class LambdaDCSExecutorTest { "(and (!= (and (!= fb:cell.away) fb:cell.home)) ((reverse fb:row.row.opponent) (fb:row.row.index (- (number 1) (number 1)))))", graph, matches("(name fb:cell.derby_county)")); } - + @Test(groups = "lambdaCSV3") public void lambdaOnGraphCSV3Test() { + LanguageAnalyzer.setSingleton(new CoreNLPAnalyzer()); KnowledgeGraph graph = getKnowledgeGraph("csv3"); runFormula(executor, "(count (fb:type.object.type fb:type.row))", @@ -262,5 +264,12 @@ public class LambdaDCSExecutorTest { runFormula(executor, "(count (fb:row.row.opened (fb:cell.cell.date (< (date 1926 -1 -1)))))", graph, matches("(number 6)")); + runFormula(executor, + "(sum (- (count ((reverse fb:row.row.index) (fb:type.object.type fb:type.row))) " + + "((reverse fb:row.row.index) (fb:row.row.latitude ((reverse fb:row.row.longitude) (fb:type.object.type fb:type.row))))))", + graph, matches("(number 6)")); + runFormula(executor, + "(- (number 1926) (argmax (number 1) (number 1) ((reverse fb:cell.cell.number) (or (or (or fb:cell.1920 fb:cell.1925) fb:cell.1926) fb:cell.1946)) (reverse (lambda x (sum ((reverse fb:cell.cell.number) (fb:cell.cell.number (var x))))))))", + graph, matches("(number 6)")); } } diff --git a/tables/dump-parsers/convert-to-postfix.py b/tables/dump-parsers/convert-to-postfix.py index e64514b..3030e8e 100755 --- a/tables/dump-parsers/convert-to-postfix.py +++ b/tables/dump-parsers/convert-to-postfix.py @@ -5,7 +5,7 @@ If the file is tab-separated, only process the first column. """ -import sys, os, shutil, re, argparse, json +import sys, os, shutil, re, argparse, json, gzip from codecs import open from itertools import izip from collections import defaultdict