001 package org.maltparser.parser.history.action;
002
003
004 import java.lang.reflect.Constructor;
005 import java.lang.reflect.InvocationTargetException;
006
007 import org.maltparser.core.exception.MaltChainedException;
008 import org.maltparser.parser.history.GuideHistory;
009 import org.maltparser.parser.history.HistoryException;
010 import org.maltparser.parser.history.History;
011 import org.maltparser.parser.history.container.TableContainer;
012 import org.maltparser.parser.history.container.TableContainer.RelationToNextDecision;
013 import org.maltparser.parser.history.kbest.KBestList;
014 /**
015 *
016 * @author Johan Hall
017 * @since 1.1
018 **/
019 public class SimpleDecisionAction implements SingleDecision {
020 private History history;
021 private TableContainer tableContainer;
022 private int decision;
023 private KBestList kBestList;
024
025
026 public SimpleDecisionAction(History history, TableContainer tableContainer) throws MaltChainedException {
027 this.history = history;
028 this.tableContainer = tableContainer;
029 createKBestList();
030 clear();
031 }
032
033 /* Action interface */
034 public void clear() {
035 decision = -1;
036 if (kBestList != null) {
037 kBestList.reset();
038 }
039 }
040
041 public int numberOfDecisions() {
042 return 1;
043 }
044
045 /* SingleDecision interface */
046 public void addDecision(int code) throws MaltChainedException {
047 if (code == -1 || !tableContainer.containCode(code)) {
048 decision = -1;
049 }
050 decision = code;
051 }
052
053 public void addDecision(String symbol) throws MaltChainedException {
054 decision = tableContainer.getCode(symbol);
055 }
056
057 public int getDecisionCode() throws MaltChainedException {
058 return decision;
059 }
060
061 public int getDecisionCode(String symbol) throws MaltChainedException {
062 return tableContainer.getCode(symbol);
063 }
064
065 public String getDecisionSymbol() throws MaltChainedException {
066 return tableContainer.getSymbol(decision);
067 }
068
069 public boolean updateFromKBestList() throws MaltChainedException {
070 if (kBestList == null) {
071 return false;
072 }
073 return kBestList.updateActionWithNextKBest();
074 }
075
076 public boolean continueWithNextDecision() throws MaltChainedException {
077 return tableContainer.continueWithNextDecision(decision);
078 }
079
080 public GuideHistory getGuideHistory() {
081 return (GuideHistory)history;
082 }
083
084 /* Getters and Setters */
085 public History getActionHistory() {
086 return history;
087 }
088
089 public TableContainer getTableContainer() {
090 return tableContainer;
091 }
092
093 public KBestList getKBestList() throws MaltChainedException {
094 return kBestList;
095 }
096
097 public RelationToNextDecision getRelationToNextDecision() {
098 return tableContainer.getRelationToNextDecision();
099 }
100
101 private void createKBestList() throws MaltChainedException {
102 final Class<?> kBestListClass = history.getKBestListClass();
103 if (kBestListClass == null) {
104 return;
105 }
106 final Class<?>[] argTypes = { java.lang.Integer.class, org.maltparser.parser.history.action.SingleDecision.class };
107
108 final Object[] arguments = new Object[2];
109 arguments[0] = history.getKBestSize();
110 arguments[1] = this;
111 try {
112 final Constructor<?> constructor = kBestListClass.getConstructor(argTypes);
113 kBestList = (KBestList)constructor.newInstance(arguments);
114 } catch (NoSuchMethodException e) {
115 throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
116 } catch (InstantiationException e) {
117 throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
118 } catch (IllegalAccessException e) {
119 throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
120 } catch (InvocationTargetException e) {
121 throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
122 }
123 }
124
125 public String toString() {
126 final StringBuilder sb = new StringBuilder();
127 sb.append(decision);
128 return sb.toString();
129 }
130 }