public void PredictTest()
{
double[][] sequences = new double[][]
{
new double[] { 0, 3, 1, 2 },
};
var hmm = HiddenMarkovModel.CreateGeneric(new Forward(4), 4);
var teacher = new BaumWelchLearning<GeneralDiscreteDistribution>(hmm)
{
Tolerance = 1e-10,
Iterations = 0
};
double ll = teacher.Run(sequences);
double l11, l12, l13, l14;
double p1 = hmm.Predict(new double[] { 0 }, out l11);
double p2 = hmm.Predict(new double[] { 0, 3 }, out l12);
double p3 = hmm.Predict(new double[] { 0, 3, 1 }, out l13);
double p4 = hmm.Predict(new double[] { 0, 3, 1, 2 }, out l14);
Assert.AreEqual(3, p1);
Assert.AreEqual(1, p2);
Assert.AreEqual(2, p3);
Assert.AreEqual(2, p4);
double l21 = hmm.Evaluate(new double[] { 0, 3 });
double l22 = hmm.Evaluate(new double[] { 0, 3, 1 });
double l23 = hmm.Evaluate(new double[] { 0, 3, 1, 2 });
double l24 = hmm.Evaluate(new double[] { 0, 3, 1, 2, 2 });
Assert.AreEqual(l11, l21, 1e-10);
Assert.AreEqual(l12, l22, 1e-10);
Assert.AreEqual(l13, l23, 1e-10);
Assert.AreEqual(l14, l24, 1e-2);
Assert.IsFalse(double.IsNaN(l11));
Assert.IsFalse(double.IsNaN(l12));
Assert.IsFalse(double.IsNaN(l13));
Assert.IsFalse(double.IsNaN(l14));
Assert.IsFalse(double.IsNaN(l21));
Assert.IsFalse(double.IsNaN(l22));
Assert.IsFalse(double.IsNaN(l23));
Assert.IsFalse(double.IsNaN(l24));
double ln1;
double[] pn = hmm.Predict(new double[] { 0 }, 4, out ln1);
Assert.AreEqual(4, pn.Length);
Assert.AreEqual(3, pn[0]);
Assert.AreEqual(1, pn[1]);
Assert.AreEqual(2, pn[2]);
Assert.AreEqual(2, pn[3]);
double ln2 = hmm.Evaluate(new double[] { 0, 3, 1, 2, 2 });
Assert.AreEqual(ln1, ln2, 1e-2);
Assert.IsFalse(double.IsNaN(ln1));
Assert.IsFalse(double.IsNaN(ln2));
// Get the mixture distribution defining next state likelihoods
Mixture<GeneralDiscreteDistribution> mixture = null;
double ml11;
double mp1 = hmm.Predict(new double[] { 0 }, out ml11, out mixture);
Assert.AreEqual(l11, ml11);
Assert.AreEqual(p1, mp1);
Assert.IsNotNull(mixture);
Assert.AreEqual(4, mixture.Coefficients.Length);
Assert.AreEqual(4, mixture.Components.Length);
Assert.AreEqual(0, mixture.Coefficients[0], 1e-10);
Assert.AreEqual(1, mixture.Coefficients[1], 1e-10);
Assert.AreEqual(0, mixture.Coefficients[2], 1e-10);
Assert.AreEqual(0, mixture.Coefficients[3], 1e-10);
for (int i = 0; i < mixture.Coefficients.Length; i++)
Assert.IsFalse(double.IsNaN(mixture.Coefficients[i]));
}