public void BackwardTest()
{
HiddenMarkovModel hmm = CreateModel2();
// A B B A
int[] observations = { 0, 1, 1, 0 };
double logLikelihood;
double[,] actual = ForwardBackwardAlgorithm.Backward(hmm, observations, out logLikelihood);
var A = Matrix.Exp(hmm.Transitions);
var B = Matrix.Exp(hmm.Emissions);
var P = Matrix.Exp(hmm.Probabilities);
double a30 = 1;
double a31 = 1;
double a20 = A[0, 0] * B[0, 0] * a30 + A[0, 1] * B[1, 0] * a31;
double a21 = A[1, 0] * B[0, 0] * a30 + A[1, 1] * B[1, 0] * a31;
double a10 = A[0, 0] * B[0, 1] * a20 + A[0, 1] * B[1, 1] * a21;
double a11 = A[1, 0] * B[0, 1] * a20 + A[1, 1] * B[1, 1] * a21;
double a00 = A[0, 0] * B[0, 1] * a10 + A[0, 1] * B[1, 1] * a11;
double a01 = A[1, 0] * B[0, 1] * a10 + A[1, 1] * B[1, 1] * a11;
Assert.AreEqual(actual[0, 0], a00);
Assert.AreEqual(actual[0, 1], a01);
Assert.AreEqual(actual[1, 0], a10);
Assert.AreEqual(actual[1, 1], a11);
Assert.AreEqual(actual[2, 0], a20);
Assert.AreEqual(actual[2, 1], a21);
Assert.AreEqual(actual[3, 0], a30);
Assert.AreEqual(actual[3, 1], a31);
double p = 0;
for (int i = 0; i < hmm.States; i++)
p += actual[0, i] * P[i] * B[i, observations[0]];
Assert.AreEqual(0.054814695, p, 1e-8);
p = System.Math.Exp(logLikelihood);
Assert.AreEqual(0.054814695, p, 1e-8);
}