package edu.umd.hooka.alignment.hmm;
import edu.umd.hooka.PhrasePair;
import edu.umd.hooka.ttables.TTable;
/**
* Represents an HMM that applies to a single sentence pair, which is
* derived from the parameters stored in a TTable and an ATable object.
*
* @author redpony
*
*/
public class HMM_NullWord extends HMM {
static final int MAX_LENGTH = 500;
float p0;
/**
*
* @param ttable
* @param atable
* @param p0 - set to less than zero if it should be trained
*/
public HMM_NullWord(TTable ttable, ATable atable, double p0) {
super(ttable, atable, true);
this.p0 = (float)p0;
}
@Override
public void buildHMMTables(PhrasePair pp) {
int[] es = pp.getE().getWords();
int[] fs = pp.getF().getWords();
l = es.length;
m = fs.length;
emission.resize(m + 1, l + l + 1);
e_coords.resize(m + 1, l + l + 1);
e_coords.fill(-1);
e_words.resize(m + 1, l + l + 1);
e_words.fill(-1);
for (int i = 1; i <= l + l; i++) {
int ei = (i > l) ? 0 : es[i-1];
for (int j = 1; j <= m; j++) {
int fj = fs[j-1];
if (i <= l)
e_words.set(j, i, i - 1);
e_coords.set(j, i, i > l ? 0 : i);
emission.set(j, i, tmodel.get(ei, fj));
}
}
//System.out.println("b:\n"+emission);
transition.resize(l+l+1, l+l+1);
transition.fill(0.0f);
transition_coords.resize(l+l+1, l+l+1);
transition_coords.fill(-1);
for (int i_prev = 0; i_prev <= l+l; i_prev++) {
for (int i = 1; i <= l+l; i++) {
int coord = amodel.getCoord(i - i_prev, (char)l);
if (i > l) coord = -1000;
if (i_prev > l && i <= l) coord = amodel.getCoord(i - i_prev + l, (char)l);
float tp = 0.0f;
if (i_prev > l && i > l && i_prev != i) {
coord = -2000;
} else {
if (i > l)
tp = (p0 < 0.0) ? amodel.get(coord, (char)l, 0) : p0;
else
tp = amodel.get(coord, (char)l, 0);
if (i_prev <= l && i > l) {
if (i - l != i_prev) { tp = 0.0f; coord = -2000; }
}
}
transition.set(i_prev, i, tp);
transition_coords.set(i_prev,i,coord);
}
}
//System.out.println("a:\n"+transition);
//throw new RuntimeException("foo");
//System.out.println("b:\n"+transition_coords);
}
}