/** KernelViterbi.java
* Created on Jun 28, 2008
*
* @author Sunita Sarawagi
* @since 1.3
* @version 1.3
*/
package iitb.KernelCRF;
import iitb.CRF.DataSequence;
import iitb.CRF.Viterbi;
import iitb.KernelCRF.KernelCRF.SupportVector;
import cern.colt.matrix.tdouble.DoubleMatrix1D;
import cern.colt.matrix.tdouble.DoubleMatrix2D;
public class KernelViterbi extends Viterbi {
/**
*
*/
private static final long serialVersionUID = 5747241353594394559L;
KernelCRF model;
public KernelViterbi(KernelCRF model, int bs) {
super(model, bs);
this.model = model;
}
@Override
protected void computeLogMi(DataSequence dataSeq, int i, int ell, double[] lambda) {
Ri.assign(0); Mi.assign(0);
for (SupportVector sv : model.svecs) {
computeLogMi(dataSeq,i,Mi,Ri,sv.dataSeq,sv.yseq,sv.alpha);
}
}
protected double kernelValue(DataSequence d1, int p1, DataSequence d2, int p2) {
return model.kernel.kernel(d1, p1, d2, p2);
}
protected void computeLogMi(DataSequence dataSeq, int i, DoubleMatrix2D kMi, DoubleMatrix1D kRi, DataSequence consData, YSequence yseq, double alpha) {
if (consData==null) return;
for (int j = 0; j < consData.length(); j++) {
int consY = yseq.getY(j);
int ypp = consData.y(j);
if (consY != ypp) {
double kval = kernelValue(dataSeq, i, consData, j);
kRi.set(consY, kRi.get(consY)-alpha*kval);
kRi.set(ypp, kRi.get(ypp)+alpha*kval);
}
if ((i > 0) && (j > 0)) {
int consPrevY = yseq.getY(j-1);
int yprev = consData.y(j-1);
if ((consY != consData.y(j)) || (consPrevY != consData.y(j-1))) {
kMi.set(consPrevY, consY, kMi.get(consPrevY, consY)-alpha);
kMi.set(yprev, ypp, kMi.get(yprev, ypp)+alpha);
}
}
}
}
}