import edu.berkeley.nlp.util.Pair; //导入方法依赖的package包/类
public Pair getKBestChartAndBacktrace(
InstanceSequence sequence, double[] w, int k) {
int n = sequence.getSequenceLength();
int numLabels = encoding.getNumLabels();
int[][][][] bestLabels = new int[n][numLabels][][];
double[][][] bestScores = new double[n][numLabels][];
double[] startScores = scoreCalculator.getLinearVertexScores(sequence,
0, w);
for (int l = 0; l < numLabels; l++) {
bestScores[0][l] = new double[] { startScores[l] };
bestLabels[0][l] = new int[][] { new int[] { -1, 0 } };
}
for (int i = 1; i < n; i++) {
double[][] scoreMatrix = scoreCalculator.getLinearScoreMatrix(
sequence, i, w);
for (int l = 0; l < numLabels; l++) {
PriorityQueue> pq = new PriorityQueue>();
for (int pl = 0; pl < numLabels; pl++) {
double edgeScore = scoreMatrix[pl][l];
for (int c = 0; c < bestScores[i - 1][pl].length; c++) {
double totalScore = edgeScore
+ bestScores[i - 1][pl][c];
pq.add(Pair.makePair(pl, c), totalScore);
}
}
int cands = Math.min(k, pq.size());
bestScores[i][l] = new double[cands];
bestLabels[i][l] = new int[cands][2];
for (int c = 0; c < cands; c++) {
bestScores[i][l][c] = pq.getPriority();
Pair backtrace = pq.next();
bestLabels[i][l][c][0] = backtrace.getFirst();
bestLabels[i][l][c][1] = backtrace.getSecond();
}
}
}
return Pair.makePair(bestLabels, bestScores);
}