Accord.Tests.Statistics.Models.Markov.ForwardBackwardAlgorithmTest.ForwardTest2 C# (CSharp) Method

ForwardTest2() private method

private ForwardTest2 ( ) : void
return void
        public void ForwardTest2()
        {
            HiddenMarkovModel hmm = CreateModel2();

            //                     A  B  B  A
            int[] observations = { 0, 1, 1, 0 };

            double[,] actual = ForwardBackwardAlgorithm.Forward(hmm, observations);

            var P = Matrix.Exp(hmm.Probabilities);
            var A = Matrix.Exp(hmm.Transitions);
            var B = Matrix.Exp(hmm.Emissions);

            double a00 = P[0] * B[0, 0];
            double a01 = P[1] * B[1, 0];

            //   a00 = System.Math.Round(a00, 2);
            //   a01 = System.Math.Round(a01, 2);

            double a10 = (a00 * A[0, 0] + a01 * A[1, 0]) * B[0, 1];
            double a11 = (a01 * A[1, 1] + a00 * A[0, 1]) * B[1, 1];

            double a20 = (a10 * A[0, 0] + a11 * A[1, 0]) * B[0, 1];
            double a21 = (a11 * A[1, 1] + a10 * A[0, 1]) * B[1, 1];

            double a30 = (a20 * A[0, 0] + a21 * A[1, 0]) * B[0, 0];
            double a31 = (a21 * A[1, 1] + a20 * A[0, 1]) * B[1, 0];


            Assert.AreEqual(a00, actual[0, 0]);
            Assert.AreEqual(a01, actual[0, 1]);

            Assert.AreEqual(a10, actual[1, 0]);
            Assert.AreEqual(a11, actual[1, 1]);

            Assert.AreEqual(a20, actual[2, 0]);
            Assert.AreEqual(a21, actual[2, 1]);

            Assert.AreEqual(a30, actual[3, 0]);
            Assert.AreEqual(a31, actual[3, 1]);

            double p = 0;
            for (int i = 0; i < hmm.States; i++)
                p += actual[observations.Length - 1, i];

            Assert.AreEqual(0.054814695, p, 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }