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 }