001    package org.maltparser.parser;
002    
003    import org.maltparser.core.exception.MaltChainedException;
004    import org.maltparser.core.syntaxgraph.LabelSet;
005    import org.maltparser.parser.guide.OracleGuide;
006    import org.maltparser.parser.history.GuideUserHistory;
007    import org.maltparser.parser.history.action.GuideUserAction;
008    import org.maltparser.parser.history.container.ActionContainer;
009    /**
010     * @author Johan Hall
011     *
012     */
013    public abstract class Oracle implements OracleGuide {
014            private final DependencyParserConfig manager;
015            private final GuideUserHistory history;
016            private String name;
017            protected final ActionContainer[] actionContainers;
018            protected ActionContainer transActionContainer;
019            protected final ActionContainer[] arcLabelActionContainers;
020            
021            public Oracle(DependencyParserConfig manager, GuideUserHistory history) throws MaltChainedException {
022                    this.manager = manager;
023                    this.history = history;
024                    this.actionContainers = history.getActionContainerArray();
025                    
026                    if (actionContainers.length < 1) {
027                            throw new ParsingException("Problem when initialize the history (sequence of actions). There are no action containers. ");
028                    }
029                    int nLabels = 0;
030                    for (int i = 0; i < actionContainers.length; i++) {
031                            if (actionContainers[i].getTableContainerName().startsWith("A.")) {
032                                    nLabels++;
033                            }
034                    }
035                    int j = 0;
036                    this.arcLabelActionContainers = new ActionContainer[nLabels];
037                    for (int i = 0; i < actionContainers.length; i++) {
038                            if (actionContainers[i].getTableContainerName().equals("T.TRANS")) {
039                                    transActionContainer = actionContainers[i];
040                            } else if (actionContainers[i].getTableContainerName().startsWith("A.")) {
041                                    arcLabelActionContainers[j++] = actionContainers[i];
042                            }
043                    }
044            }
045    
046            public GuideUserHistory getHistory() {
047                    return history;
048            }
049            
050            public DependencyParserConfig getConfiguration() {
051                    return manager;
052            }
053            
054            public String getGuideName() {
055                    return name;
056            }
057            
058            public void setGuideName(String guideName) {
059                    this.name = guideName;
060            }
061            
062            protected GuideUserAction updateActionContainers(int transition, LabelSet arcLabels) throws MaltChainedException {      
063                    transActionContainer.setAction(transition);
064    
065                    if (arcLabels == null) {
066                            for (int i = 0; i < arcLabelActionContainers.length; i++) {
067                                    arcLabelActionContainers[i].setAction(-1);      
068                            }
069                    } else {
070                            for (int i = 0; i < arcLabelActionContainers.length; i++) {
071                                    arcLabelActionContainers[i].setAction(arcLabels.get(arcLabelActionContainers[i].getTable()).shortValue());
072                            }               
073                    }
074                    GuideUserAction oracleAction = history.getEmptyGuideUserAction();
075                    oracleAction.addAction(actionContainers);
076                    return oracleAction;
077            }
078    }