package iitb.CRF;
/**
*
* NestedViterbi search
*
* @author Sunita Sarawagi
* @since 1.1
* @version 1.3
*/
public class NestedViterbi extends Viterbi {
/**
*
*/
private static final long serialVersionUID = -1556279124003455655L;
NestedCRF nestedModel;
NestedViterbi(NestedCRF nestedModel, int bs) {
super(nestedModel, bs);
this.nestedModel = nestedModel;
}
double fillArray(DataSequence dataSeq, double lambda[], boolean calcScore) {
int numY = model.numY;
int maxLen = nestedModel.featureGenNested.maxMemory();
for (int i = 0; i < dataSeq.length(); i++) {
for (int yi = 0; yi < numY; winningLabel[yi++][i].clear());
for (int ell = 1; (ell <= maxLen) && (i-ell >= -1); ell++) {
nestedModel.featureGenNested.startScanFeaturesAt(dataSeq, i-ell,i);
Trainer.computeLogMi(model.featureGenerator,lambda,Mi,Ri,false);
for (int yi = 0; yi < numY; yi++) {
if (i-ell < 0) {
winningLabel[yi][i].add((float)Ri.get(yi));
} else {
for (int yp = 0; yp < numY; yp++) {
double val = Mi.get(yp,yi)+Ri.get(yi);
winningLabel[yi][i].add(winningLabel[yp][i-ell], (float)val);
}
}
}
}
}
return 0;
}
public double bestLabelSequence(SegmentDataSequence dataSeq, double lambda[]) {
viterbiSearch(dataSeq, lambda,false);
Soln ybest = finalSoln.get(0);
ybest = ybest.prevSoln;
while (ybest != null) {
dataSeq.setSegment(ybest.prevPos()+1,ybest.pos,ybest.label);
ybest = ybest.prevSoln;
}
return finalSoln.get(0).score;
}
};