public void LogForwardTest3()
{
MultivariateNormalDistribution density = new MultivariateNormalDistribution(3);
var hmm = new HiddenMarkovClassifier<MultivariateNormalDistribution>(2, new Ergodic(2), density);
double[][][] inputs =
{
new [] { new double[] { 0, 1, 0 }, new double[] { 0, 1, 0 }, new double[] { 0, 1, 0 } },
new [] { new double[] { 1, 6, 2 }, new double[] { 2, 1, 6 }, new double[] { 1, 1, 0 } },
new [] { new double[] { 9, 1, 0 }, new double[] { 0, 1, 5 }, new double[] { 0, 0, 0 } },
};
int[] outputs =
{
0, 0, 1
};
var function = new MarkovMultivariateFunction(hmm);
var observations = inputs[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[0].States; i++)
p += Math.Exp(actual[observations.Length - 1, i]);
Assert.AreEqual(Math.Exp(logLikelihood), p, 1e-8);
Assert.IsFalse(double.IsNaN(p));
}