package edu.stanford.nlp.sempre;
// Encapsulates the production of possibly many Derivations.
// The subclass has to maintain the cursor to keep track of which is coming next.
public abstract class MultipleDerivationStream implements DerivationStream {
private Derivation nextDeriv; // Next one to return.
int numGenerated = 0;
// Override this class: should create a new Derivation.
// Return null if there are no more.
public abstract Derivation createDerivation();
@Override public boolean hasNext() {
if (nextDeriv != null) return true; // Still one in the queue
nextDeriv = createDerivation(); // Ask for another
return nextDeriv != null;
}
@Override
public Derivation next() {
if (nextDeriv == null) throw new RuntimeException("No more derivations!");
Derivation deriv = nextDeriv;
if (FeatureExtractor.containsDomain("derivRank")) {
numGenerated++;
if (numGenerated <= 3)
deriv.addFeature("derivRank", deriv.rule.sem.toString() + " " + numGenerated);
else if (numGenerated <= 5)
deriv.addFeature("derivRank", deriv.rule.sem.toString() + " 4:5");
else if (numGenerated <= 10)
deriv.addFeature("derivRank", deriv.rule.sem.toString() + " 6:10");
else
deriv.addFeature("derivRank", deriv.rule.sem.toString() + " 11:");
}
nextDeriv = createDerivation();
return deriv;
}
@Override
public Derivation peek() {
if (nextDeriv == null) throw new RuntimeException("No more derivations!");
return nextDeriv;
}
@Override public void remove() { throw new RuntimeException("Cannot remove from DerivationStream"); }
// Default: but can overload this if desired
@Override public int estimatedSize() { return 2; }
}