package org.maltparser.parser.history.kbest;
import java.util.ArrayList;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.parser.history.action.SingleDecision;
/**
*
* @author Johan Hall
*
*/
public class KBestList {
protected final ArrayList<Candidate> kBestList;
protected int k = -1;
protected int topCandidateIndex;
protected int addCandidateIndex;
protected SingleDecision decision;
/**
* Creates a unrestricted k-best list
*
* @param decision a reference to the single decision that uses the k-best
* list
*/
public KBestList(SingleDecision decision) {
this(-1, decision);
}
/**
* Creates a k-best list
*
* @param k the k-best list size
* @param decision a reference to the single decision that uses the k-best
* list.
*/
public KBestList(Integer k, SingleDecision decision) {
setK(k.intValue());
this.decision = decision;
if (this.k > 0) {
kBestList = new ArrayList<Candidate>(this.k);
initKBestList();
} else {
kBestList = new ArrayList<Candidate>();
}
}
protected void initKBestList() {
for (int i = 0; i < this.k; i++) {
kBestList.add(new Candidate());
}
}
/**
* Resets the k-best list
*/
public void reset() {
this.topCandidateIndex = 0;
this.addCandidateIndex = 0;
}
/**
* Adds a candidate to the k-best list
*
* @param actionCode the integer representation of candidate action
* @throws MaltChainedException
*/
public void add(int actionCode) throws MaltChainedException {
if (k != -1 && addCandidateIndex >= k) {
return;
}
if (addCandidateIndex >= kBestList.size()) {
kBestList.add(new Candidate());
}
kBestList.get(addCandidateIndex).setActionCode(actionCode);
if (addCandidateIndex == 0) {
// if (decision instanceof SingleDecision) {
// ((SingleDecision)decision).addDecision(actionCode);
// }
decision.addDecision(actionCode);
topCandidateIndex++;
}
addCandidateIndex++;
}
public void addList(int[] predictionList) throws MaltChainedException {
int n = (k != -1 && k <= predictionList.length - 1) ? k : predictionList.length - 1;
for (int i = 0; i < n; i++) {
add(predictionList[i]);
}
}
/**
* Adds a candidate to the k-best list
*
* @param symbol the string representation of candidate action
* @throws MaltChainedException
*/
public void add(String symbol) throws MaltChainedException {
// if (decision instanceof SingleDecision) {
// this.add(((SingleDecision)decision).getDecisionCode(symbol));
// }
this.add(decision.getDecisionCode(symbol));
}
/**
* Updates the corresponding single decision with the next value in the
* k-best list.
*
* @return true if decision has been updated, otherwise false
* @throws MaltChainedException
*/
public boolean updateActionWithNextKBest() throws MaltChainedException {
if (addCandidateIndex != 0 && topCandidateIndex < addCandidateIndex && topCandidateIndex < kBestList.size()) {
int actionCode = kBestList.get(topCandidateIndex).getActionCode();
if (decision instanceof SingleDecision) {
((SingleDecision) decision).addDecision(actionCode);
}
topCandidateIndex++;
return true;
}
return false;
}
public int peekNextKBest() {
if (addCandidateIndex != 0 && topCandidateIndex < addCandidateIndex && topCandidateIndex < kBestList.size()) {
return kBestList.get(topCandidateIndex).getActionCode();
}
return -1;
}
/**
* Returns the current size of the k-best list
*
* @return the current size of the k-best list
*/
public int getCurrentSize() {
return addCandidateIndex;
//return kBestList.size();
}
/**
* Returns the maximum number of candidates in the k-best list.
*
* @return the maximum number of candidates in the k-best list
*/
public int getK() {
return k;
}
/**
* Sets the maximum number of candidates in the k-best list
*
* @param k the maximum number of candidates
*/
protected void setK(int k) {
if (k == 0) {
this.k = 1; // the k-best list must contain at least one candidate
}
if (k < 0) {
this.k = -1; // this means that the k-best list is unrestricted.
} else {
this.k = k;
}
}
protected int getTopCandidateIndex() {
return topCandidateIndex;
}
protected int getAddCandidateIndex() {
return addCandidateIndex;
}
/**
* Returns a single decision object
*
* @return a single decision object
*/
public SingleDecision getDecision() {
return decision;
}
public int getKBestListSize() {
return kBestList.size();
}
public ScoredCandidate getCandidate(int i) {
if (i >= kBestList.size()) {
return null;
}
return (ScoredCandidate) kBestList.get(i);
}
/*
* (non-Javadoc) @see java.lang.Object#toString()
*/
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("[ ");
for (int i = 0; i < addCandidateIndex; i++) {
sb.append(kBestList.get(i));
sb.append(' ');
}
sb.append("] ");
return sb.toString();
}
}