001    package org.maltparser.parser;
002    
003    import org.maltparser.core.exception.MaltChainedException;
004    import org.maltparser.core.syntaxgraph.DependencyStructure;
005    import org.maltparser.parser.guide.ClassifierGuide;
006    import org.maltparser.parser.guide.OracleGuide;
007    import org.maltparser.parser.guide.SingleGuide;
008    import org.maltparser.parser.history.GuideHistory;
009    import org.maltparser.parser.history.action.GuideDecision;
010    import org.maltparser.parser.history.action.GuideUserAction;
011    /**
012     * @author Johan Hall
013     *
014     */
015    public class BatchTrainer extends Trainer {
016            private final OracleGuide oracleGuide;
017            private int parseCount;
018            
019            public BatchTrainer(DependencyParserConfig manager) throws MaltChainedException {
020                    super(manager);
021                    ((SingleMalt)manager).addRegistry(org.maltparser.parser.Algorithm.class, this);
022                    setManager(manager);
023                    initParserState(1);
024                    setGuide(new SingleGuide(manager, (GuideHistory)parserState.getHistory(), ClassifierGuide.GuideMode.BATCH));
025                    oracleGuide = parserState.getFactory().makeOracleGuide(parserState.getHistory());
026            }
027            
028            public DependencyStructure parse(DependencyStructure goldDependencyGraph, DependencyStructure parseDependencyGraph) throws MaltChainedException {
029                    parserState.clear();
030                    parserState.initialize(parseDependencyGraph);
031                    currentParserConfiguration = parserState.getConfiguration();
032                    parseCount++;
033                    if (diagnostics == true) {
034                            writeToDiaFile(parseCount + "");
035                    }
036                    TransitionSystem transitionSystem = parserState.getTransitionSystem();
037                    while (!parserState.isTerminalState()) {
038                            GuideUserAction action = transitionSystem.getDeterministicAction(parserState.getHistory(), currentParserConfiguration);
039                            if (action == null) {
040                                    action = oracleGuide.predict(goldDependencyGraph, currentParserConfiguration);
041                                    try {
042                                            classifierGuide.addInstance((GuideDecision)action);
043                                    } catch (NullPointerException e) {
044                                            throw new MaltChainedException("The guide cannot be found. ", e);
045                                    }
046                            } else if (diagnostics == true) {
047                                    writeToDiaFile(" *");
048                            }
049                            if (diagnostics == true) {
050                                    writeToDiaFile(" " + transitionSystem.getActionString(action));
051                            }       
052                            parserState.apply(action);
053                    }
054                    copyEdges(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
055                    parseDependencyGraph.linkAllTreesToRoot();
056                    oracleGuide.finalizeSentence(parseDependencyGraph);
057                    if (diagnostics == true) {
058                            writeToDiaFile("\n");
059                    }
060                    return parseDependencyGraph;
061            }
062            
063            public OracleGuide getOracleGuide() {
064                    return oracleGuide;
065            }
066            
067            public void train() throws MaltChainedException { }
068            public void terminate() throws MaltChainedException {
069                    if (diagnostics == true) {
070                            closeDiaWriter();
071                    }
072            }
073    }