package edu.berkeley.cs.nlp.ocular.model.em;
import edu.berkeley.cs.nlp.ocular.data.textreader.Charset;
import edu.berkeley.cs.nlp.ocular.lm.LanguageModel;
import tberg.murphy.arrays.a;
/**
* @author Taylor Berg-Kirkpatrick (tberg@eecs.berkeley.edu)
*/
public class DenseBigramTransitionModel {
private static double SPC_TO_SPC_SMOOTH = 1e-2;
private double[] starts;
private double[][] forwardTrans;
private double[][] backwardTrans;
public DenseBigramTransitionModel(LanguageModel lm) {
int numC = lm.getCharacterIndexer().size();
this.starts = new double[numC];
for (int c=0; c<numC; ++c) {
this.starts[c] = Math.log(lm.getCharNgramProb(new int[0], c));
}
this.forwardTrans = new double[numC][numC];
for (int prevC=0; prevC<numC; ++prevC) {
for (int c=0; c<numC; ++c) {
this.forwardTrans[prevC][c] = Math.log(lm.getCharNgramProb(new int[] {prevC}, c));
}
}
int spaceIndex = lm.getCharacterIndexer().getIndex(Charset.SPACE);
a.scalei(this.forwardTrans[spaceIndex], (1.0 - SPC_TO_SPC_SMOOTH));
this.forwardTrans[spaceIndex][spaceIndex] += SPC_TO_SPC_SMOOTH;
this.backwardTrans = new double[numC][numC];
for (int prevC=0; prevC<numC; ++prevC) {
for (int c=0; c<numC; ++c) {
this.backwardTrans[c][prevC] = this.forwardTrans[prevC][c];
}
}
}
public double endLogProb(@SuppressWarnings("unused") int c) {
return 0.0;
}
public double startLogProb(int c) {
return starts[c];
}
public double[] forwardTransitions(int c) {
return forwardTrans[c];
}
public double[] backwardTransitions(int c) {
return backwardTrans[c];
}
}