package edu.stanford.nlp.sempre.overnight;
import java.util.*;
import edu.stanford.nlp.sempre.*;
/**
* Hard-coded hacks for pruning derivations in floating parser for overnight domains.
*/
public class OvernightDerivationPruningComputer extends DerivationPruningComputer {
public OvernightDerivationPruningComputer(DerivationPruner pruner) {
super(pruner);
}
@Override
public Collection<String> getAllStrategyNames() {
return Arrays.asList("violateHardConstraints");
}
@Override
public String isPrunedGeneral(Derivation deriv) {
if (containsStrategy("violateHardConstraints") && violateHardConstraints(deriv)) return "violateHardConstraints";
return null;
}
// Check a few hard constraints on each derivation
private static boolean violateHardConstraints(Derivation deriv) {
if (deriv.value != null) {
if (deriv.value instanceof ErrorValue) return true;
if (deriv.value instanceof StringValue) { //empty denotation
if (((StringValue) deriv.value).value.equals("[]")) return true;
}
if (deriv.value instanceof ListValue) {
List<Value> values = ((ListValue) deriv.value).values;
// empty lists
if (values.size() == 0) return true;
// NaN
if (values.size() == 1 && values.get(0) instanceof NumberValue) {
if (Double.isNaN(((NumberValue) values.get(0)).value)) return true;
}
// If we are supposed to get a number but we get a string (some sparql weirdness)
if (deriv.type.equals(SemType.numberType) &&
values.size() == 1 &&
!(values.get(0) instanceof NumberValue)) return true;
}
}
return false;
}
}