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