package edu.stanford.nlp.sempre;
import java.util.*;
import fig.basic.Evaluation;
import fig.basic.LogInfo;
import fig.basic.Parallelizer;
import fig.basic.StopWatchSet;
import fig.exec.Execution;
/**
* Parallel version of the Learner.
*
* Most of the codes are copied from the paraphrase package.
*
* @author ppasupat
*/
public class LearnerParallelProcessor implements Parallelizer.Processor<Example> {
private final Parser parser;
private final String prefix;
private final boolean computeExpectedCounts;
private Params params; // this is common to threads and should be synchronized
private Evaluation evaluation; // this is common to threads and should be synchronized
public LearnerParallelProcessor(Parser parser, Params params, String prefix, boolean computeExpectedCounts, Evaluation evaluation) {
this.prefix = prefix;
this.parser = parser;
this.computeExpectedCounts = computeExpectedCounts;
this.params = params;
this.evaluation = evaluation;
}
@Override
public void process(Example ex, int i, int n) {
LogInfo.begin_track_printAll(
"%s: example %s/%s: %s", prefix, i, n, ex.id);
ex.log();
Execution.putOutput("example", i);
StopWatchSet.begin("Parser.parse");
ParserState state = parser.parse(params, ex, computeExpectedCounts);
StopWatchSet.end();
if (computeExpectedCounts) {
Map<String, Double> counts = new HashMap<>();
SempreUtils.addToDoubleMap(counts, state.expectedCounts);
// Gathered enough examples, update parameters
StopWatchSet.begin("Learner.updateWeights");
LogInfo.begin_track("Updating learner weights");
if (Learner.opts.verbose >= 2)
SempreUtils.logMap(counts, "gradient");
double sum = 0;
for (double v : counts.values()) sum += v * v;
LogInfo.logs("L2 norm: %s", Math.sqrt(sum));
synchronized (params) {
params.update(counts);
}
counts.clear();
LogInfo.end_track();
StopWatchSet.end();
}
LogInfo.logs("Current: %s", ex.evaluation.summary());
synchronized (evaluation) {
evaluation.add(ex.evaluation);
LogInfo.logs("Cumulative(%s): %s", prefix, evaluation.summary());
}
LogInfo.end_track();
// To save memory
ex.clean();
}
}