package edu.stanford.nlp.sempre; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.google.common.base.Strings; import fig.basic.Option; /** * A Session contains the information specific to a user. * It maintains the context for discourse as well as the last example, so that * we can inspect the different predicted derivations and generate new training * examples / update parameters interactively. * * @author Percy Liang */ public class Session { public final String id; // Session id public static class Options { // path for default parameters, if using a different set for each session @Option public String inParamsPath; } public String remoteHost; // Where we connected from public String format; // html or json public ContextValue context; // Current context used to create new examples Example lastEx; // Last example that we processed // if every user have their own model Params params; Learner learner; public Map<String,String> reqParams; public static Options opts = new Options(); // per session parameters public Session(String id) { this.id = id; context = new ContextValue(id, DateValue.now(), new ArrayList<ContextValue.Exchange>()); } public Example getLastExample() { return lastEx; } public String getLastQuery() { return lastEx == null ? null : lastEx.utterance; } public void updateContext() { context = context.withDate(DateValue.now()); } public void updateContext(Example ex, int maxExchanges) { lastEx = ex; List<Derivation> derivations = lastEx.getPredDerivations(); if (derivations.size() > 0) { Derivation deriv = derivations.get(0); List<ContextValue.Exchange> newExchanges = new ArrayList<ContextValue.Exchange>(); newExchanges.addAll(context.exchanges); newExchanges.add(new ContextValue.Exchange(ex.utterance, deriv.formula, deriv.value)); while (newExchanges.size() > maxExchanges) newExchanges.remove(0); context = context.withNewExchange(newExchanges); } } public void updateContextWithNewAnswer(Example ex, Derivation deriv) { List<ContextValue.Exchange> newExchanges = new ArrayList<ContextValue.Exchange>(); for (int i = 0; i < context.exchanges.size() - 1; i++) newExchanges.add(context.exchanges.get(i)); newExchanges.add(new ContextValue.Exchange(ex.utterance, deriv.formula, deriv.value)); context = context.withNewExchange(newExchanges); } public ContextValue getContextExcludingLast() { List<ContextValue.Exchange> newExchanges = new ArrayList<ContextValue.Exchange>(); for (int i = 0; i < context.exchanges.size() - 1; i++) newExchanges.add(context.exchanges.get(i)); return context.withNewExchange(newExchanges); } public void useIndependentLearner(Builder builder) { this.params = new Params(); if (!Strings.isNullOrEmpty(opts.inParamsPath)) this.params.read(opts.inParamsPath); this.learner = new Learner(builder.parser, this.params, new Dataset()); } @Override public String toString() { return String.format("%s: %s; last: %s", id, context, lastEx); } // Decides if we write out any logs public boolean isLogging() { return defaultTrue("logging");} public boolean isWritingCitation() { return defaultTrue("cite");} public boolean isWritingGrammar() { return defaultTrue("grammar");} public boolean isLearning() { return defaultTrue("learn");} public boolean isStatsing() { return defaultTrue("stats");} private boolean defaultTrue(String key) { if (this.reqParams == null) return true; if (!this.reqParams.containsKey(key)) return true; return !this.reqParams.get(key).equals("0"); } }