public void ComputeTest()
{
HiddenMarkovModel model = CreateModel1();
MarkovDiscreteFunction target = new MarkovDiscreteFunction(model);
double actual;
double expected;
int[] x = { 0, 1 };
for (int i = 0; i < model.States; i++)
{
// Check initial state transitions
expected = Math.Exp(model.Probabilities[i]) * Math.Exp(model.Emissions[i, x[0]]);
actual = Math.Exp(target.Factors[0].Compute(-1, i, x, 0));
Assert.AreEqual(expected, actual, 1e-6);
}
for (int t = 0; t < x.Length; t++)
{
for (int i = 0; i < model.States; i++)
{
// Check initial state transitions
expected = Math.Exp(model.Probabilities[i]) * Math.Exp(model.Emissions[i, x[0]]);
actual = Math.Exp(target.Factors[0].Compute(-1, i, x, 0));
Assert.AreEqual(expected, actual, 1e-6);
// Check normal state transitions
for (int j = 0; j < model.States; j++)
{
double xb = Math.Exp(model.Transitions[i, j]);
double xc = Math.Exp(model.Emissions[j, x[t]]);
expected = xb * xc;
actual = Math.Exp(target.Factors[0].Compute(i, j, x, t));
Assert.AreEqual(expected, actual, 1e-6);
}
}
}
}
}