package edu.stanford.nlp.sempre.tables.lambdadcs; import java.util.*; import edu.stanford.nlp.sempre.*; import edu.stanford.nlp.sempre.tables.lambdadcs.LambdaDCSException.Type; import fig.basic.*; /** * A unary with finite number of elements. Represented as a set of values. * * @author ppasupat */ public class ExplicitUnaryDenotation extends UnaryDenotation { protected final List<Value> values; public ExplicitUnaryDenotation() { values = Collections.emptyList(); } public ExplicitUnaryDenotation(Value value) { values = Collections.singletonList(value); } public ExplicitUnaryDenotation(Collection<Value> values) { this.values = new ArrayList<>(values); } @Override public LispTree toLispTree() { LispTree tree = LispTree.proto.newList(); tree.addChild("unary"); for (Value value : values) tree.addChild(value.toLispTree()); return tree; } protected ListValue cachedValue; @Override public ListValue toValue() { if (cachedValue != null) return cachedValue; ListValue result = new ListValue(values); if (LambdaDCSExecutor.opts.sortResults) result = result.getSorted(); cachedValue = result; return result; } @Override public String toString() { return toLispTree().toString(); } @Override public boolean contains(Object o) { return values.contains(o); } @Override public boolean containsAll(Collection<?> c) { return values.containsAll(c); } @Override public Iterator<Value> iterator() { return values.iterator(); } @Override public Object[] toArray() { return values.toArray(); } @Override public <T> T[] toArray(T[] a) { return values.toArray(a); } @Override public int size() { return values.size(); } @Override public UnaryDenotation merge(UnaryDenotation that, MergeFormula.Mode mode) { if (that.size() == Integer.MAX_VALUE) return that.merge(this, mode); Set<Value> merged = new HashSet<>(values); switch (mode) { case and: merged.retainAll(that); break; case or: merged.addAll(that); break; default: throw new LambdaDCSException(Type.invalidFormula, "Unknown merge mode: %s", mode); } return new ExplicitUnaryDenotation(merged); } @Override public UnaryDenotation aggregate(AggregateFormula.Mode mode) { if (mode == AggregateFormula.Mode.count) { // Count the set size, not the list size return new ExplicitUnaryDenotation(new NumberValue(new HashSet<>(values).size())); } return new ExplicitUnaryDenotation(DenotationUtils.aggregate(this, mode)); } @Override public UnaryDenotation filter(UnaryDenotation upperBound) { List<Value> filtered = new ArrayList<>(); for (Value value : values) { if (upperBound.contains(value)) filtered.add(value); } return new ExplicitUnaryDenotation(filtered); } }