package org.maltparser.parser.history.action;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.parser.history.GuideHistory;
import org.maltparser.parser.history.History;
import org.maltparser.parser.history.HistoryException;
import org.maltparser.parser.history.container.TableContainer;
import org.maltparser.parser.history.container.TableContainer.RelationToNextDecision;
import org.maltparser.parser.history.kbest.KBestList;
/**
*
* @author Johan Hall
* @since 1.1
*
*/
public class SimpleDecisionAction implements SingleDecision {
private History history;
private TableContainer tableContainer;
private int decision;
private KBestList kBestList;
public SimpleDecisionAction(History history, TableContainer tableContainer) throws MaltChainedException {
this.history = history;
this.tableContainer = tableContainer;
createKBestList();
clear();
}
/*
* Action interface
*/
public void clear() {
decision = -1;
if (kBestList != null) {
kBestList.reset();
}
}
public int numberOfDecisions() {
return 1;
}
/*
* SingleDecision interface
*/
public void addDecision(int code) throws MaltChainedException {
if (code == -1 || !tableContainer.containCode(code)) {
decision = -1;
}
decision = code;
}
public void addDecision(String symbol) throws MaltChainedException {
decision = tableContainer.getCode(symbol);
}
public int getDecisionCode() throws MaltChainedException {
return decision;
}
public int getDecisionCode(String symbol) throws MaltChainedException {
return tableContainer.getCode(symbol);
}
public String getDecisionSymbol() throws MaltChainedException {
return tableContainer.getSymbol(decision);
}
public boolean updateFromKBestList() throws MaltChainedException {
if (kBestList == null) {
return false;
}
return kBestList.updateActionWithNextKBest();
}
public boolean continueWithNextDecision() throws MaltChainedException {
return tableContainer.continueWithNextDecision(decision);
}
public GuideHistory getGuideHistory() {
return (GuideHistory) history;
}
/*
* Getters and Setters
*/
public History getActionHistory() {
return history;
}
public TableContainer getTableContainer() {
return tableContainer;
}
public KBestList getKBestList() throws MaltChainedException {
return kBestList;
}
public RelationToNextDecision getRelationToNextDecision() {
return tableContainer.getRelationToNextDecision();
}
private void createKBestList() throws MaltChainedException {
final Class<?> kBestListClass = history.getKBestListClass();
if (kBestListClass == null) {
return;
}
final Class<?>[] argTypes = {java.lang.Integer.class, org.maltparser.parser.history.action.SingleDecision.class};
final Object[] arguments = new Object[2];
arguments[0] = history.getKBestSize();
arguments[1] = this;
try {
final Constructor<?> constructor = kBestListClass.getConstructor(argTypes);
kBestList = (KBestList) constructor.newInstance(arguments);
} catch (NoSuchMethodException e) {
throw new HistoryException("The kBestlist '" + kBestListClass.getName() + "' cannot be initialized. ", e);
} catch (InstantiationException e) {
throw new HistoryException("The kBestlist '" + kBestListClass.getName() + "' cannot be initialized. ", e);
} catch (IllegalAccessException e) {
throw new HistoryException("The kBestlist '" + kBestListClass.getName() + "' cannot be initialized. ", e);
} catch (InvocationTargetException e) {
throw new HistoryException("The kBestlist '" + kBestListClass.getName() + "' cannot be initialized. ", e);
}
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(decision);
return sb.toString();
}
}