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 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                    while (!parserState.isTerminalState()) {
037                            GuideUserAction action = parserState.getTransitionSystem().getDeterministicAction(parserState.getHistory(), currentParserConfiguration);
038                            if (action == null) {
039                                    action = oracleGuide.predict(goldDependencyGraph, currentParserConfiguration);
040                                    try {
041                                            classifierGuide.addInstance((GuideDecision)action);
042                                    } catch (NullPointerException e) {
043                                            throw new MaltChainedException("The guide cannot be found. ", e);
044                                    }
045                            } else if (diagnostics == true) {
046                                    writeToDiaFile(" *");
047                            }
048                            if (diagnostics == true) {
049                                    writeToDiaFile(" " + parserState.getTransitionSystem().getActionString(action));
050                            }       
051                            parserState.apply(action);
052                    }
053                    copyEdges(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
054                    parseDependencyGraph.linkAllTreesToRoot();
055                    oracleGuide.finalizeSentence(parseDependencyGraph);
056                    if (diagnostics == true) {
057                            writeToDiaFile("\n");
058                    }
059                    return parseDependencyGraph;
060            }
061            
062            public OracleGuide getOracleGuide() {
063                    return oracleGuide;
064            }
065            
066            public void train() throws MaltChainedException { }
067            public void terminate() throws MaltChainedException {
068                    if (diagnostics == true) {
069                            closeDiaWriter();
070                    }
071            }
072    }