package edu.stanford.nlp.sempre.interactive;
import java.util.List;
import org.testng.collections.Lists;
import edu.stanford.nlp.sempre.ActionFormula;
import edu.stanford.nlp.sempre.Derivation;
import edu.stanford.nlp.sempre.DerivationStream;
import edu.stanford.nlp.sempre.Example;
import edu.stanford.nlp.sempre.FeatureExtractor;
import edu.stanford.nlp.sempre.FeatureVector;
import edu.stanford.nlp.sempre.SemanticFn;
import edu.stanford.nlp.sempre.SingleDerivationStream;
import fig.basic.LispTree;
import fig.basic.Option;
/**
* Generates formula scoped in various modes sequential: just perform in
* sequence, no scoping block: basic scoping block blockr: returns selected
* isolate: scopes allItems instead of selected
*
* @author sidaw
*/
public class BlockFn extends SemanticFn {
public static class Options {
@Option(gloss = "verbosity")
public int verbose = 0;
}
public static Options opts = new Options();
List<ActionFormula.Mode> scopingModes = Lists.newArrayList(ActionFormula.Mode.block, ActionFormula.Mode.blockr,
ActionFormula.Mode.isolate);
ActionFormula.Mode mode = ActionFormula.Mode.block;
boolean optional = true;
@Override
public void init(LispTree tree) {
super.init(tree);
if (tree.child(1).value.equals("sequential"))
mode = ActionFormula.Mode.sequential;
else if (tree.child(1).value.equals("block"))
mode = ActionFormula.Mode.block;
else if (tree.child(1).value.equals("blockr"))
mode = ActionFormula.Mode.blockr;
else if (tree.child(1).value.equals("isolate"))
mode = ActionFormula.Mode.isolate;
else
mode = ActionFormula.Mode.sequential;
}
public BlockFn(ActionFormula.Mode mode) {
this.mode = mode;
}
public BlockFn() {
this.mode = ActionFormula.Mode.sequential;
}
@Override
public DerivationStream call(final Example ex, final Callable c) {
return new SingleDerivationStream() {
@Override
public Derivation createDerivation() {
List<Derivation> args = c.getChildren();
if (args.size() == 1) {
Derivation onlyChild = args.get(0);
// LogInfo.logs("1 BlockFn %s : %s Example.size=%d, callInfo(%d,%d)",
// onlyChild, mode, ex.getTokens().size(), onlyChild.getStart(),
// onlyChild.getEnd());
if (onlyChild == null)
return null;
if (onlyChild.getStart() != 0 || onlyChild.getEnd() != ex.getTokens().size())
return null;
// do not do anything to the core language
if (onlyChild.allAnchored())
return null;
// if (!ILUtils.stripBlock(onlyChild).rule.isInduced()) return null;
// if already blocked explicitly, do not do anything
if (scopingModes.contains(((ActionFormula) onlyChild.formula).mode))
return null;
// do not repeat any blocks
if (((ActionFormula) onlyChild.formula).mode == BlockFn.this.mode)
return null;
FeatureVector features = new FeatureVector();
if (FeatureExtractor.containsDomain(":scope")) {
features.add(":scope",
BlockFn.this.mode.toString() + "::" + !InteractiveUtils.stripBlock(onlyChild).rule.isInduced());
features.add(":scope", BlockFn.this.mode.toString() + "::" + ex.id);
}
Derivation deriv = new Derivation.Builder()
.formula(new ActionFormula(mode, Lists.newArrayList(onlyChild.formula))).withCallable(c)
.localFeatureVector(features).createDerivation();
return deriv;
} else
return null;
}
};
}
}