001package org.maltparser.parser;
002
003import org.maltparser.core.exception.MaltChainedException;
004import org.maltparser.core.syntaxgraph.LabelSet;
005import org.maltparser.parser.guide.OracleGuide;
006import org.maltparser.parser.history.GuideUserHistory;
007import org.maltparser.parser.history.action.GuideUserAction;
008import org.maltparser.parser.history.container.ActionContainer;
009/**
010 * @author Johan Hall
011 *
012 */
013public 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}