001 package org.maltparser.parser.history.action;
002
003 import java.util.ArrayList;
004
005 import org.maltparser.core.exception.MaltChainedException;
006 import org.maltparser.parser.history.GuideHistory;
007 import org.maltparser.parser.history.GuideUserHistory;
008 import org.maltparser.parser.history.HistoryException;
009 import org.maltparser.parser.history.History;
010 import org.maltparser.parser.history.container.ActionContainer;
011 import org.maltparser.parser.history.container.CombinedTableContainer;
012 import org.maltparser.parser.history.kbest.ScoredKBestList;
013
014 /**
015 *
016 * @author Johan Hall
017 * @since 1.1
018 **/
019 public class ComplexDecisionAction implements GuideUserAction, MultipleDecision {
020 private History history;
021 private ArrayList<SimpleDecisionAction> decisions;
022
023 public ComplexDecisionAction(History history) throws MaltChainedException {
024 this.history = history;
025 decisions = new ArrayList<SimpleDecisionAction>(history.getDecisionTables().size());
026 for (int i=0, n = history.getDecisionTables().size(); i < n; i++) {
027 decisions.add(new SimpleDecisionAction(history, history.getDecisionTables().get(i)));
028 }
029 }
030
031 public ComplexDecisionAction(GuideHistory history) throws MaltChainedException {
032 this((History)history);
033 }
034
035 /* GuideUserAction interface */
036 public void addAction(ArrayList<ActionContainer> actionContainers) throws MaltChainedException {
037 if (actionContainers == null || actionContainers.size() != history.getActionTables().size()) {
038 throw new HistoryException("The action containers does not exist or is not of the same size as the action table. ");
039 }
040 int j = 0;
041 for (int i = 0, n = history.getDecisionTables().size(); i < n; i++) {
042 if (history.getDecisionTables().get(i) instanceof CombinedTableContainer) {
043 CombinedTableContainer tableContainer = (CombinedTableContainer)history.getDecisionTables().get(i);
044 int nContainers = tableContainer.getNumberContainers();
045 decisions.get(i).addDecision(tableContainer.getCombinedCode(actionContainers.subList(j, j + nContainers)));
046 j = j + nContainers;
047 } else {
048 decisions.get(i).addDecision(actionContainers.get(j).getActionCode());
049 j++;
050 }
051 }
052 }
053
054 public void getAction(ArrayList<ActionContainer> actionContainers) throws MaltChainedException {
055 if (actionContainers == null || actionContainers.size() != history.getActionTables().size()) {
056 throw new HistoryException("The action containers does not exist or is not of the same size as the action table. ");
057 }
058 int j = 0;
059 for (int i = 0, n=history.getDecisionTables().size(); i < n; i++) {
060 if (history.getDecisionTables().get(i) instanceof CombinedTableContainer) {
061 CombinedTableContainer tableContainer = (CombinedTableContainer)history.getDecisionTables().get(i);
062 int nContainers = tableContainer.getNumberContainers();
063 tableContainer.setActionContainer(actionContainers.subList(j, j + nContainers), decisions.get(i).getDecisionCode());
064 j = j + nContainers;
065 } else {
066 actionContainers.get(j).setAction(decisions.get(i).getDecisionCode());
067 j++;
068 }
069 }
070 }
071
072 public void addAction(ActionContainer[] actionContainers) throws MaltChainedException {
073 if (actionContainers == null || actionContainers.length != history.getActionTables().size()) {
074 throw new HistoryException("The action containers does not exist or is not of the same size as the action table. ");
075 }
076 int j = 0;
077 for (int i = 0, n = history.getDecisionTables().size(); i < n; i++) {
078 if (history.getDecisionTables().get(i) instanceof CombinedTableContainer) {
079 CombinedTableContainer tableContainer = (CombinedTableContainer)history.getDecisionTables().get(i);
080 int nContainers = tableContainer.getNumberContainers();
081 decisions.get(i).addDecision(tableContainer.getCombinedCode(actionContainers, j));
082 j = j + nContainers;
083 } else {
084 decisions.get(i).addDecision(actionContainers[j].getActionCode());
085 j++;
086 }
087 }
088 }
089
090 public void getAction(ActionContainer[] actionContainers) throws MaltChainedException {
091 if (actionContainers == null || actionContainers.length != history.getActionTables().size()) {
092 throw new HistoryException("The action containers does not exist or is not of the same size as the action table. ");
093 }
094 int j = 0;
095 for (int i = 0, n=history.getDecisionTables().size(); i < n; i++) {
096 if (history.getDecisionTables().get(i) instanceof CombinedTableContainer) {
097 CombinedTableContainer tableContainer = (CombinedTableContainer)history.getDecisionTables().get(i);
098 int nContainers = tableContainer.getNumberContainers();
099 tableContainer.setActionContainer(actionContainers, j, decisions.get(i).getDecisionCode());
100 j = j + nContainers;
101 } else {
102 actionContainers[j].setAction(decisions.get(i).getDecisionCode());
103 j++;
104 }
105 }
106 }
107
108
109 public void getKBestLists(ArrayList<ScoredKBestList> kbestListContainers) throws MaltChainedException {
110 // if (kbestListContainers == null || kbestListContainers.size() != history.getActionTables().size()) {
111 // throw new HistoryException("The action containers does not exist or is not of the same size as the action table. ");
112 // }
113 kbestListContainers.clear();
114 for (int i = 0, n=decisions.size(); i < n; i++) {
115 kbestListContainers.add((ScoredKBestList)decisions.get(i).getKBestList());
116 }
117 }
118
119 public void getKBestLists(ScoredKBestList[] kbestListContainers) throws MaltChainedException {
120 for (int i = 0, n=decisions.size(); i < n; i++) {
121 kbestListContainers[0] = (ScoredKBestList)decisions.get(i).getKBestList();
122 }
123 }
124
125 public int numberOfActions() {
126 return history.getActionTables().size();
127 }
128
129 public GuideUserHistory getGuideUserHistory() {
130 return (GuideUserHistory)history;
131 }
132
133 public void clear() {
134 for (int i=0, n = decisions.size(); i < n;i++) {
135 decisions.get(i).clear();
136 }
137 }
138
139 /* MultipleDecision */
140 public SingleDecision getSingleDecision(int decisionIndex) throws MaltChainedException {
141 return decisions.get(decisionIndex);
142 }
143
144 /* GuideDecision */
145 public int numberOfDecisions() {
146 return history.getDecisionTables().size();
147 }
148
149 public GuideHistory getGuideHistory() {
150 return (GuideHistory)history;
151 }
152
153 public boolean equals(Object obj) {
154 if (this == obj)
155 return true;
156 if (obj == null)
157 return false;
158 if (getClass() != obj.getClass())
159 return false;
160 ComplexDecisionAction other = (ComplexDecisionAction) obj;
161 if (decisions == null) {
162 if (other.decisions != null)
163 return false;
164 } else if (decisions.size() != other.decisions.size()) {
165 return false;
166 } else {
167 for (int i = 0; i < decisions.size(); i++) {
168 try {
169 if (decisions.get(i).getDecisionCode() != other.decisions.get(i).getDecisionCode()) {
170 return false;
171 }
172 } catch (MaltChainedException e) {
173 System.err.println("Error in equals. ");
174 }
175 }
176 }
177
178 return true;
179 }
180
181 public String toString() {
182 StringBuilder sb = new StringBuilder();
183 for (int i = 0, n = decisions.size(); i < n; i++) {
184 sb.append(decisions.get(i));
185 sb.append(';');
186 }
187 if (sb.length() > 0) {
188 sb.setLength(sb.length()-1);
189 }
190 return sb.toString();
191 }
192 }