package edu.stanford.nlp.sequences;
import edu.stanford.nlp.stats.Counter;
import edu.stanford.nlp.stats.Counters;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @author Christopher Manning
*/
public class KBestSequenceFinderTest extends TestCase {
private static final boolean DEBUG = false;
private static final int K2NR = 20;
private static String[] test2nrAnswers = {
"[0, 0, 7, 8, 9]",
"[0, 0, 6, 7, 8]",
"[0, 0, 5, 6, 7]",
"[0, 0, 4, 5, 6]",
"[0, 0, 8, 9, 1]",
"[0, 0, 1, 8, 9]",
"[0, 0, 2, 8, 9]",
"[0, 0, 8, 9, 2]",
"[0, 0, 8, 9, 3]",
"[0, 0, 3, 8, 9]",
"[0, 0, 4, 8, 9]",
"[0, 0, 8, 9, 4]",
"[0, 0, 3, 4, 5]",
"[0, 0, 8, 9, 5]",
"[0, 0, 5, 8, 9]",
"[0, 0, 6, 8, 9]",
"[0, 0, 8, 9, 6]",
"[0, 0, 8, 9, 7]",
"[0, 0, 8, 8, 9]",
"[0, 0, 8, 9, 8]",
};
private static double[] test2nrScores = {
17.142857142857142,
15.166666666666668,
13.2,
11.25,
10.125,
10.125,
9.625,
9.625,
9.458333333333334,
9.458333333333334,
9.375,
9.375,
9.333333333333332,
9.325,
9.325,
9.291666666666666,
9.291666666666666,
9.267857142857142,
9.25,
9.25,
};
public void testPerStateBestSequenceFinder() {
KBestSequenceFinder bsf = new KBestSequenceFinder();
BestSequenceFinderTest.TestSequenceModel tsm2nr = new BestSequenceFinderTest.TestSequenceModel2nr();
runSequencesFinder(tsm2nr, bsf);
BestSequenceFinderTest.runPossibleValuesChecker(tsm2nr, bsf);
}
public static void runSequencesFinder(BestSequenceFinderTest.TestSequenceModel tsm,
KBestSequenceFinder sf) {
Counter<int[]> bestLabelsCounter = sf.kBestSequences(tsm, K2NR);
List<int[]> topValues = Counters.toSortedList(bestLabelsCounter);
Iterator<int[]> iter = topValues.iterator();
for (int i = 0; i < K2NR; i++) {
int[] sequence = iter.next();
String strSequence = Arrays.toString(sequence);
double score = bestLabelsCounter.getCount(sequence);
if (DEBUG) {
System.err.println((i+1) + " best sequence: " + strSequence + "; score: " + score);
System.err.println(" vs. correct: " + test2nrAnswers[i]);
}
// Deal with ties in the scoring ... only tied pairs handled.
boolean found = false;
if (strSequence.equals(test2nrAnswers[i])) {
found = true;
} else if (i > 0 && Math.abs(score - test2nrScores[i-1]) < 1e-8 &&
strSequence.equals(test2nrAnswers[i-1])) {
found = true;
} else if (i+1 < test2nrScores.length && Math.abs(score - test2nrScores[i+1]) < 1e-8 &&
strSequence.equals(test2nrAnswers[i+1])) {
found = true;
}
assertTrue("Best sequence is wrong. Correct: " + test2nrAnswers[i] +
", found: " + strSequence, found);
assertEquals("Best sequence score is wrong.", test2nrScores[i], score, 1e-8);
}
}
}