public void HiddenMarkovModelFunctionConstructorTest()
        {
            HiddenMarkovModel model = CreateModel1();

            DiscreteMarkovModelFunction target = new DiscreteMarkovModelFunction(model);

            var features = target.Features;

            double[] weights = target.Weights;

            Assert.AreEqual(features.Length, 12);
            Assert.AreEqual(weights.Length, 12);

            int k = 0;

            for (int i = 0; i < model.States; i++)
            {
                Assert.AreEqual(model.Probabilities[i], weights[k++]);
            }

            for (int i = 0; i < model.States; i++)
            {
                for (int j = 0; j < model.States; j++)
                {
                    Assert.AreEqual(model.Transitions[i, j], weights[k++]);
                }
            }

            for (int i = 0; i < model.States; i++)
            {
                for (int j = 0; j < model.Symbols; j++)
                {
                    Assert.AreEqual(model.Emissions[i, j], weights[k++]);
                }
            }
        }
Пример #2
0
        public void ConditionalRandomFieldConstructorTest()
        {
            HiddenMarkovModel hmm = createHMM();

            int states = 2;
            var function = new DiscreteMarkovModelFunction(hmm);
            var target = new ConditionalRandomField<int>(states, function);


            Assert.AreEqual(function, target.Function);
            Assert.AreEqual(2, target.States);
        }
        public void BackwardTest()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                                    ForwardBackwardAlgorithmTest.CreateModel2();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);


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

            double logLikelihood;

            double[,] actual = Accord.Statistics.Models.Fields.
                               ForwardBackwardAlgorithm.Backward(function.Factors[0], observations, 0, 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, 1e-10);
            Assert.AreEqual(actual[0, 1], a01, 1e-10);

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

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

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

            foreach (double e in actual)
            {
                Assert.IsFalse(double.IsNaN(e));
            }

            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);
            Assert.IsFalse(double.IsNaN(p));

            p = System.Math.Exp(logLikelihood);
            Assert.AreEqual(0.054814695, p, 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }
        public void ForwardScalingTest()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                                    ForwardBackwardAlgorithmTest.CreateModel1();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);


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

            double[] scaling;
            double   logLikelihood;

            double[,] actual = Accord.Statistics.Models.Fields.
                               ForwardBackwardAlgorithm.Forward(function.Factors[0], observations, 0, out scaling, out logLikelihood);

            double[] P = Matrix.Exp(hmm.Probabilities);
            double[,] B = Matrix.Exp(hmm.Emissions);
            double[,] A = Matrix.Exp(hmm.Transitions);

            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], 1e-10);
            Assert.AreEqual(a01, actual[0, 1], 1e-10);

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

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

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

            foreach (double e in actual)
            {
                Assert.IsFalse(double.IsNaN(e));
            }


            double p = System.Math.Exp(logLikelihood);

            Assert.AreEqual(0.00384315, p, 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }
Пример #5
0
        public void RunTest()
        {
            int nstates = 3;
            int symbols = 3;

            int[][] sequences = new int[][] 
            {
                new int[] { 0, 1, 1, 1, 2 },
                new int[] { 0, 1, 1, 1, 2, 2, 2 },
                new int[] { 0, 0, 1, 1, 2, 2 },
                new int[] { 0, 1, 1, 1, 2, 2, 2 },
                new int[] { 0, 1, 1, 1, 2, 2 },
                new int[] { 0, 1, 1, 2, 2 },
                new int[] { 0, 0, 1, 1, 1, 2, 2 },
                new int[] { 0, 0, 0, 1, 1, 1, 2, 2 },
                new int[] { 0, 1, 1, 2, 2, 2 },
            };

         
            var function = new DiscreteMarkovModelFunction(nstates, symbols);
            var model = new ConditionalRandomField<int>(nstates, function);


            for (int i = 0; i < sequences.Length; i++)
            {
                double p;
                int[] s = sequences[i];
                int[] r = model.Compute(s, out p);
                Assert.IsFalse(s.IsEqual(r));
            }

            var target = new QuasiNewtonLearning<int>(model); 

            int[][] labels = sequences;
            int[][] observations = sequences;

            double ll0 = model.LogLikelihood(observations, labels);

            double actual = target.Run(observations, labels);

            double ll1 = model.LogLikelihood(observations, labels);

            Assert.IsTrue(ll1 > ll0);


            Assert.AreEqual(-0.01205815673780819, actual, 1e-10);

            for (int i = 0; i < sequences.Length; i++)
            {
                double p;
                int[] s = sequences[i];
                int[] r = model.Compute(s, out p);
                Assert.IsTrue(s.IsEqual(r));
            }
            
        }
        public void ComputeTest()
        {
            HiddenMarkovModel model = CreateModel1();

            DiscreteMarkovModelFunction target = new DiscreteMarkovModelFunction(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++)
                    {
                        expected = Math.Exp(model.Transitions[i, j]) * Math.Exp(model.Emissions[j, x[t]]);
                        actual = Math.Exp(target.Factors[0].Compute(i, j, x, t));
                        Assert.AreEqual(expected, actual, 1e-6);
                    }
                }
            }

        }
        public void BackwardTest()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel2();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);


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

            double logLikelihood;
            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Backward(function.Factors[0], observations, 0, 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, 1e-10);
            Assert.AreEqual(actual[0, 1], a01, 1e-10);

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

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

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

            foreach (double e in actual)
                Assert.IsFalse(double.IsNaN(e));

            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);
            Assert.IsFalse(double.IsNaN(p));

            p = System.Math.Exp(logLikelihood);
            Assert.AreEqual(0.054814695, p, 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }
        public void LogBackwardTest2()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel3();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);

            int[] observations = { 0, 0, 1, 1 };

            double[,] expected = Matrix.Log(Accord.Statistics.Models.Fields.
              ForwardBackwardAlgorithm.Backward(function.Factors[0], observations, 0));

            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.LogBackward(function.Factors[0], observations, 0);

            Assert.IsTrue(expected.IsEqual(actual, 1e-10));

            foreach (double p in actual)
                Assert.IsFalse(double.IsNaN(p));
        }
        public void LogForwardTest2()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel2();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);

            int[] observations = { 0, 1, 1, 0 };

            double[,] expected = Matrix.Log(Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Forward(function.Factors[0], observations, 0));

            double logLikelihood;
            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.LogForward(function.Factors[0], observations, 0, out logLikelihood);

            Assert.IsTrue(expected.IsEqual(actual, 1e-10));

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

            Assert.AreEqual(0.054814695, p, 1e-8);
            Assert.AreEqual(0.054814695, Math.Exp(logLikelihood), 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }
        public void ForwardScalingTest()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel1();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);


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

            double[] scaling;
            double logLikelihood;

            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Forward(function.Factors[0], observations, 0, out scaling, out logLikelihood);

            double[] P = Matrix.Exp(hmm.Probabilities);
            double[,] B = Matrix.Exp(hmm.Emissions);
            double[,] A = Matrix.Exp(hmm.Transitions);

            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], 1e-10);
            Assert.AreEqual(a01, actual[0, 1], 1e-10);

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

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

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

            foreach (double e in actual)
                Assert.IsFalse(double.IsNaN(e));


            double p = System.Math.Exp(logLikelihood);
            Assert.AreEqual(0.00384315, p, 1e-8);
            Assert.IsFalse(double.IsNaN(p));
        }
        public void ForwardScalingTest2()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel2();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);

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

            double[] scaling;
            double logLikelihood;

            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Forward(function.Factors[0], observations, 0, out scaling, out logLikelihood);

            double p = System.Math.Exp(logLikelihood);
            Assert.AreEqual(0.054814695, p, 1e-7);
            Assert.IsFalse(double.IsNaN(p));
        }
        public void ForwardTest3()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel3();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);

            //                     L  L  R  R
            int[] observations = { 0, 0, 1, 1 };

            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Forward(function.Factors[0], observations);

            // Forward matrices from R's HMM package are
            // transposed in relation to the framework's:

            Assert.AreEqual(4, actual.GetLength(0));
            Assert.AreEqual(2, actual.GetLength(1));

            Assert.AreEqual(0.675, actual[0, 0], 1e-10);
            Assert.AreEqual(0.011, actual[0, 1], 1e-10);

            Assert.AreEqual(0.407475, actual[1, 0], 1e-10);
            Assert.AreEqual(0.015697, actual[1, 1], 1e-10);

            Assert.AreEqual(0.08267228, actual[2, 0], 1e-8);
            Assert.AreEqual(0.08138495, actual[2, 1], 1e-8);

            Assert.AreEqual(0.02263833, actual[3, 0], 1e-8);
            Assert.AreEqual(0.06468345, actual[3, 1], 1e-8);

            foreach (double p in actual)
                Assert.IsFalse(double.IsNaN(p));
        }
        public void ForwardTest2()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel2();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);


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

            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Forward(function.Factors[0], observations);

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

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

            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], 1e-10);
            Assert.AreEqual(a01, actual[0, 1], 1e-10);

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

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

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

            foreach (double e in actual)
                Assert.IsFalse(double.IsNaN(e));

            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));
        }
        public void BackwardTest2()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel3();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);

            //                     L  L  R  R
            int[] observations = { 0, 0, 1, 1 };

            double[,] actual = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.Backward(function.Factors[0], observations);

            // Backward matrices from R's HMM package are
            // transposed in relation to the framework's:

            Assert.AreEqual(4, actual.GetLength(0));
            Assert.AreEqual(2, actual.GetLength(1));

            Assert.AreEqual(0.128074432, actual[0, 0], 1e-10);
            Assert.AreEqual(0.07923051, actual[0, 1], 1e-8);

            Assert.AreEqual(0.196816, actual[1, 0]);
            Assert.AreEqual(0.453856, actual[1, 1]);

            Assert.AreEqual(0.376, actual[2, 0]);
            Assert.AreEqual(0.691, actual[2, 1]);

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

            foreach (double p in actual)
                Assert.IsFalse(double.IsNaN(p));
        }
Пример #15
0
        public void ComputeTest()
        {

            HiddenMarkovModel hmm = HiddenMarkovModelFunctionTest.CreateModel2();

            int states = hmm.States;


            var function = new DiscreteMarkovModelFunction(hmm);
            var target = new ConditionalRandomField<int>(states, function);
            double p1, p2;

            int[] observations, expected, actual;

            observations = new int[] { 0, 0, 1, 1, 1, 2 };
            expected = hmm.Decode(observations, out p1);
            actual = target.Compute(observations, out p2);

            Assert.IsTrue(expected.IsEqual(actual));
            Assert.AreEqual(p1, p2, 1e-6);


            observations = new int[] { 0, 1, 2, 2, 2 };
            expected = hmm.Decode(observations, out p1);
            actual = target.Compute(observations, out p2);

            Assert.IsTrue(expected.IsEqual(actual));
            Assert.AreEqual(p1, p2, 1e-6);
        }
        public void LogForwardBackwardTest()
        {
            HiddenMarkovModel hmm = Accord.Tests.Statistics.Models.Markov.
                ForwardBackwardAlgorithmTest.CreateModel1();

            DiscreteMarkovModelFunction function = new DiscreteMarkovModelFunction(hmm);

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

            double fwdLogLikelihood;
            double[,] fwd = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.LogForward(function.Factors[0], observations, 0, out fwdLogLikelihood);

            double bwdLogLikelihood;
            double[,] bwd = Accord.Statistics.Models.Fields.
                ForwardBackwardAlgorithm.LogBackward(function.Factors[0], observations, 0, out bwdLogLikelihood);

            Assert.AreEqual(fwdLogLikelihood, bwdLogLikelihood, 1e-10); // -5.5614629361549142
            Assert.AreEqual(-5.5614629361549142, fwdLogLikelihood, 1e-10);
            Assert.IsFalse(double.IsNaN(fwdLogLikelihood));
        }
Пример #17
0
        public void LikelihoodTest()
        {
            HiddenMarkovModel hmm = HiddenMarkovModelFunctionTest.CreateModel2();

            int states = hmm.States;
            int symbols = hmm.Symbols;


            var function1 = new DiscreteMarkovModelFunction(hmm);
            var target1 = new ConditionalRandomField<int>(states, function1);

            var function2 = new DiscreteMarkovModelFunction(states, symbols);
            var target2 = new ConditionalRandomField<int>(states, function2);


            int[] observations;

            double a, b, la, lb;

            observations = new int[] { 0, 0, 1, 1, 1, 2 };
            a = target1.LogLikelihood(observations, observations);
            b = target2.LogLikelihood(observations, observations);
            Assert.IsTrue(a > b);

            observations = new int[] { 0, 0, 1, 1, 1, 2 };
            la = target1.LogLikelihood(observations, observations);
            lb = target2.LogLikelihood(observations, observations);
            Assert.IsTrue(la > lb);

            double lla = System.Math.Log(a);
            double llb = System.Math.Log(b);

            Assert.AreEqual(lla, la, 1e-6);
            Assert.AreEqual(llb, lb, 1e-6);
        }
        public void HiddenMarkovModelFunctionConstructorTest()
        {
            HiddenMarkovModel model = CreateModel1();

            DiscreteMarkovModelFunction target = new DiscreteMarkovModelFunction(model);

            var features = target.Features;
            double[] weights = target.Weights;

            Assert.AreEqual(features.Length, 12);
            Assert.AreEqual(weights.Length, 12);

            int k = 0;

            for (int i = 0; i < model.States; i++)
                Assert.AreEqual(model.Probabilities[i], weights[k++]);

            for (int i = 0; i < model.States; i++)
                for (int j = 0; j < model.States; j++)
                    Assert.AreEqual(model.Transitions[i, j], weights[k++]);

            for (int i = 0; i < model.States; i++)
                for (int j = 0; j < model.Symbols; j++)
                    Assert.AreEqual(model.Emissions[i, j], weights[k++]);
        }