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

ForwardScalingTest() private method

private ForwardScalingTest ( ) : void
return void
        public void ForwardScalingTest()
        {
            HiddenMarkovModel hmm = CreateModel1();

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

            //                     G  G  C  A
            int[] observations = { 2, 2, 1, 0 };

            double[] scaling;
            double logLikelihood;

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

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

            a00 /= t0;
            a01 /= t0;

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

            a10 /= t1;
            a11 /= t1;

            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 t2 = a20 + a21;

            a20 /= t2;
            a21 /= t2;

            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];
            double t3 = a30 + a31;

            a30 /= t3;
            a31 /= t3;

            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 = System.Math.Exp(logLikelihood);
            Assert.AreEqual(0.00384315, p, 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }