public void PushTest()
        {
            double[][] sequences;

            var classifier = createClassifier(out sequences);
            var running = new RunningMarkovClassifier<NormalDistribution>(classifier);

            for (int i = 0; i < sequences.Length; i++)
            {
                double[] sequence = sequences[i];

                running.Clear();
                for (int j = 0; j < sequence.Length; j++)
                    running.Push(sequence[j]);

                double actualLikelihood;
                int actual = running.Classification;
                actualLikelihood = Math.Exp(running.Responses[actual]) / running.Responses.Exp().Sum();

                double expectedLikelihood;
                int expected = classifier.Compute(sequence, out expectedLikelihood);

                Assert.AreEqual(expected, actual);
                Assert.AreEqual(expectedLikelihood, actualLikelihood, 1e-8);
            }
        }
        public void PushTest()
        {
            int[][] sequences;

            var classifier = createClassifier(out sequences);
            var running    = new RunningMarkovClassifier(classifier);

            for (int i = 0; i < sequences.Length; i++)
            {
                int[] sequence = sequences[i];

                running.Clear();
                for (int j = 0; j < sequence.Length; j++)
                {
                    running.Push(sequence[j]);
                }

                double actualLikelihood;
                int    actual = running.Classification;
                actualLikelihood = Math.Exp(running.Responses[actual]) / running.Responses.Exp().Sum();

                double expectedLikelihood;
                int    expected = classifier.Compute(sequence, out expectedLikelihood);

                Assert.AreEqual(expected, actual);
                Assert.AreEqual(expectedLikelihood, actualLikelihood, 1e-8);
            }
        }
        public void PushTest2()
        {
            int[][] sequences;

            var classifier = createClassifier(out sequences, rejection: true);
            var running    = new RunningMarkovClassifier(classifier);

            for (int i = 0; i < sequences.Length; i++)
            {
                int[] sequence = sequences[i];

                running.Clear();
                for (int j = 0; j < sequence.Length; j++)
                {
                    running.Push(sequence[j]);
                }

                double actualLikelihood;
                int    actual = running.Classification;

                if (actual > -1)
                {
                    double sum = running.Responses.Exp().Sum() + Math.Exp(running.Threshold);
                    actualLikelihood = Math.Exp(running.Responses[actual]) / sum;
                }
                else
                {
                    double sum = running.Responses.Exp().Sum();
                    actualLikelihood = Math.Exp(running.Threshold) /
                                       (sum + Math.Exp(running.Threshold));
                }

                double expectedLikelihood;
                int    expected = classifier.Compute(sequence, out expectedLikelihood);

                Assert.AreEqual(expected, actual);
                Assert.AreEqual(expectedLikelihood, actualLikelihood, 1e-8);
            }
        }
        public void PushTest2()
        {
            int[][] sequences;

            var classifier = createClassifier(out sequences, rejection: true);
            var running = new RunningMarkovClassifier(classifier);

            for (int i = 0; i < sequences.Length; i++)
            {
                int[] sequence = sequences[i];

                running.Clear();
                for (int j = 0; j < sequence.Length; j++)
                    running.Push(sequence[j]);

                double actualLikelihood;
                int actual = running.Classification;

                if (actual > -1)
                {
                    double sum = running.Responses.Exp().Sum() + Math.Exp(running.Threshold);
                    actualLikelihood = Math.Exp(running.Responses[actual]) / sum;
                }
                else
                {
                    double sum = running.Responses.Exp().Sum();
                    actualLikelihood = Math.Exp(running.Threshold) /
                        (sum + Math.Exp(running.Threshold));
                }

                double expectedLikelihood;
                int expected = classifier.Compute(sequence, out expectedLikelihood);

                Assert.AreEqual(expected, actual);
                Assert.AreEqual(expectedLikelihood, actualLikelihood, 1e-8);
            }
        }