001 package org.maltparser.parser.algorithm.covington;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.syntaxgraph.DependencyStructure;
005 import org.maltparser.core.syntaxgraph.edge.Edge;
006 import org.maltparser.core.syntaxgraph.node.DependencyNode;
007 import org.maltparser.parser.ParserConfiguration;
008 import org.maltparser.parser.TransitionSystem;
009 import org.maltparser.parser.history.GuideUserHistory;
010 import org.maltparser.parser.history.History;
011 import org.maltparser.parser.history.action.ComplexDecisionAction;
012 import org.maltparser.parser.history.action.GuideUserAction;
013 import org.maltparser.parser.transition.TransitionTable;
014 /**
015 * @author Johan Hall
016 *
017 */
018 public class NonProjective extends TransitionSystem {
019 protected static final int SHIFT = 1;
020 protected static final int NOARC = 2;
021 protected static final int RIGHTARC = 3;
022 protected static final int LEFTARC = 4;
023
024
025 public NonProjective() throws MaltChainedException {
026 super();
027 }
028
029 public void apply(GuideUserAction currentAction, ParserConfiguration config) throws MaltChainedException {
030 CovingtonConfig covingtonConfig = (CovingtonConfig)config;
031 currentAction.getAction(actionContainers);
032
033 Edge e = null;
034 switch (transActionContainer.getActionCode()) {
035 case LEFTARC:
036 e = covingtonConfig.getDependencyGraph().addDependencyEdge(covingtonConfig.getRightTarget().getIndex(), covingtonConfig.getLeftTarget().getIndex());
037 addEdgeLabels(e);
038 break;
039 case RIGHTARC:
040 e = covingtonConfig.getDependencyGraph().addDependencyEdge(covingtonConfig.getLeftTarget().getIndex(), covingtonConfig.getRightTarget().getIndex());
041 addEdgeLabels(e);
042 break;
043 default:
044 break;
045 }
046 update(covingtonConfig, transActionContainer.getActionCode());
047 }
048
049 private void update(CovingtonConfig covingtonConfig, int trans) {
050 if (trans == SHIFT) {
051 covingtonConfig.setRight(covingtonConfig.getRight() + 1);
052 covingtonConfig.setLeft(covingtonConfig.getRight() - 1);
053 } else {
054 DependencyNode rightNode = covingtonConfig.getRightTarget();
055 int leftstop = covingtonConfig.getLeftstop();
056 int left = covingtonConfig.getLeft();
057 left--;
058 DependencyNode leftNode = null;
059 while (left >= leftstop) {
060 leftNode = covingtonConfig.getInput().get(left);
061 if (rightNode.findComponent().getIndex() != leftNode.findComponent().getIndex() &&
062 !(leftNode.hasHead() && rightNode.hasHead())) {
063 break;
064 }
065 left--;
066 }
067 if (left < leftstop) {
068 covingtonConfig.setRight(covingtonConfig.getRight() + 1);
069 covingtonConfig.setLeft(covingtonConfig.getRight() - 1);
070 } else {
071 covingtonConfig.setLeft(left);
072 }
073 }
074 }
075
076 public GuideUserAction getDeterministicAction(GuideUserHistory history, ParserConfiguration config) throws MaltChainedException {
077 return null;
078 }
079
080 protected void addAvailableTransitionToTable(TransitionTable ttable) throws MaltChainedException {
081 ttable.addTransition(SHIFT, "SH", false, null);
082 ttable.addTransition(NOARC, "NA", false, null);
083 ttable.addTransition(RIGHTARC, "RA", true, null);
084 ttable.addTransition(LEFTARC, "LA", true, null);
085 }
086
087 protected void initWithDefaultTransitions(GuideUserHistory history) throws MaltChainedException {
088 GuideUserAction currentAction = new ComplexDecisionAction((History)history);
089
090 transActionContainer.setAction(SHIFT);
091 transActionContainer.setAction(NOARC);
092 for (int i = 0; i < arcLabelActionContainers.length; i++) {
093 arcLabelActionContainers[i].setAction(-1);
094 }
095 currentAction.addAction(actionContainers);
096 }
097
098 public String getName() {
099 return "covnonproj";
100 }
101
102 public boolean permissible(GuideUserAction currentAction, ParserConfiguration config) throws MaltChainedException {
103 CovingtonConfig covingtonConfig = (CovingtonConfig)config;
104 DependencyNode leftTarget = covingtonConfig.getLeftTarget();
105 DependencyNode rightTarget = covingtonConfig.getRightTarget();
106 DependencyStructure dg = covingtonConfig.getDependencyGraph();
107 currentAction.getAction(actionContainers);
108 int trans = transActionContainer.getActionCode();
109
110 if (trans == SHIFT && covingtonConfig.isAllowShift() == false) {
111 return false;
112 }
113 if ((trans == LEFTARC || trans == RIGHTARC) && !isActionContainersLabeled()) {
114 return false;
115 }
116 if (trans == LEFTARC && leftTarget.isRoot()) {
117 return false;
118 }
119 if (trans == LEFTARC && dg.hasLabeledDependency(leftTarget.getIndex())) {
120 return false;
121 }
122 if (trans == RIGHTARC && dg.hasLabeledDependency(rightTarget.getIndex())) {
123 return false;
124 }
125 return true;
126 }
127
128 public GuideUserAction defaultAction(GuideUserHistory history, ParserConfiguration configuration) throws MaltChainedException {
129 return updateActionContainers(history, NonProjective.NOARC, null);
130 }
131 }