package edu.cmu.minorthird.classify.sequential; // The `Forward algorithm': find the probability of an observed sequence x public class Forward extends HMMAlgo { double[][] f; // the matrix used to find the decoding // f[i][k] = f_k(i) = log(P(x1..xi, pi_i=k)) private int L; public Forward(HMM hmm, String[] x) { super(hmm, x); L = x.length; f = new double[L+1][hmm.nstate]; f[0][0] = 0; // = log(1) for (int k=1; k<hmm.nstate; k++) f[0][k] = Double.NEGATIVE_INFINITY; // = log(0) for (int i=1; i<=L; i++) f[i][0] = Double.NEGATIVE_INFINITY; // = log(0) for (int i=1; i<=L; i++) for (int ell=1; ell<hmm.nstate; ell++) { double sum = Double.NEGATIVE_INFINITY; // = log(0) for (int k=0; k<hmm.nstate; k++) { sum = logplus(sum, f[i-1][k] + hmm.loga[k][ell]); } f[i][ell] = hmm.loge[ell][Integer.parseInt(x[i-1])] + sum; } } double logprob() { double sum = Double.NEGATIVE_INFINITY; // = log(0) for (int k=0; k<hmm.nstate; k++) sum = logplus(sum, f[L][k]); return sum; } /*public void print(Output out) { for (int j=0; j<hmm.nstate; j++) { for (int i=0; i<f.length; i++) out.print(HMM.fmtlog(f[i][j])); out.println(); } }*/ }