public void LearnTest5()
{
double[][][] sequences = new double[][][]
{
new double[][] { new double[] { 0 }, new double[] { 3 }, new double[] { 1 } },
new double[][] { new double[] { 0 }, new double[] { 2 } },
new double[][] { new double[] { 1 }, new double[] { 0 }, new double[] { 3 } },
new double[][] { new double[] { 3 }, new double[] { 4 } },
new double[][] { new double[] { 0 }, new double[] { 1 }, new double[] { 3 }, new double[] { 5 } },
new double[][] { new double[] { 0 }, new double[] { 3 }, new double[] { 4 } },
new double[][] { new double[] { 0 }, new double[] { 1 }, new double[] { 3 }, new double[] { 5 } },
new double[][] { new double[] { 0 }, new double[] { 1 }, new double[] { 3 }, new double[] { 5 } },
new double[][] { new double[] { 0 }, new double[] { 1 }, new double[] { 3 }, new double[] { 4 }, new double[] { 5 } },
};
var hmm = HiddenMarkovModel.CreateGeneric(3, 6);
var teacher = new ViterbiLearning<GeneralDiscreteDistribution>(hmm) { Iterations = 100, Tolerance = 0 };
double ll = teacher.Run(sequences);
double l0; hmm.Decode(sequences[0], out l0);
double l1; hmm.Decode(sequences[1], out l1);
double l2; hmm.Decode(sequences[2], out l2);
double pl = System.Math.Exp(ll);
double p0 = System.Math.Exp(l0);
double p1 = System.Math.Exp(l1);
double p2 = System.Math.Exp(l2);
Assert.AreEqual(0.077427215162407442, pl, 1e-6);
Assert.AreEqual(0.009958847736625515, p0, 1e-6);
Assert.AreEqual(0.006790123456790126, p1, 1e-6);
Assert.AreEqual(0.009958847736625515, p2, 1e-6);
Assert.AreEqual(1, hmm.Dimension);
double[][] sequences2 = new double[][]
{
new double[] { 0, 3, 1 },
new double[] { 0, 2 },
new double[] { 1, 0, 3 },
new double[] { 3, 4 },
new double[] { 0, 1, 3, 5 },
new double[] { 0, 3, 4 },
new double[] { 0, 1, 3, 5 },
new double[] { 0, 1, 3, 5 },
new double[] { 0, 1, 3, 4, 5 },
};
hmm = HiddenMarkovModel.CreateGeneric(3, 6);
teacher = new ViterbiLearning<GeneralDiscreteDistribution>(hmm) { Iterations = 100 };
double ll2 = teacher.Run(sequences2);
double l02; hmm.Decode(sequences2[0], out l02);
double l12; hmm.Decode(sequences2[1], out l12);
double l22; hmm.Decode(sequences2[2], out l22);
Assert.AreEqual(ll, ll2);
Assert.AreEqual(l0, l02);
Assert.AreEqual(l1, l12);
Assert.AreEqual(l2, l22);
Assert.AreEqual(1, hmm.Dimension);
}