package edu.cmu.minorthird.classify.sequential;
public class HMMAlgo {
HMM hmm; // the hidden Markov model
String[] x; // the observed sequence of emissions
public HMMAlgo(HMM hmm, String[] x)
{ this.hmm = hmm; this.x = x; }
// Compute log(p+q) from plog = log p and qlog = log q, using that
// log (p + q) = log (p(1 + q/p)) = log p + log(1 + q/p)
// = log p + log(1 + exp(log q - log p)) = plog + log(1 + exp(logq - logp))
// and that log(1 + exp(d)) < 1E-17 for d < -37.
static double logplus(double plog, double qlog) {
double max, diff;
if (plog > qlog) {
if (qlog == Double.NEGATIVE_INFINITY)
return plog;
else {
max = plog; diff = qlog - plog;
}
} else {
if (plog == Double.NEGATIVE_INFINITY)
return qlog;
else {
max = qlog; diff = plog - qlog;
}
}
// Now diff <= 0 so Math.exp(diff) will not overflow
return max + (diff < -37 ? 0 : Math.log(1 + Math.exp(diff)));
}
}