public void DecodeTest()
{
// Create the transition matrix A
double[,] transitions =
{
{ 0.7, 0.3 },
{ 0.4, 0.6 }
};
// Create the vector of emission densities B
GeneralDiscreteDistribution[] emissions =
{
new GeneralDiscreteDistribution(0.1, 0.4, 0.5),
new GeneralDiscreteDistribution(0.6, 0.3, 0.1)
};
// Create the initial probabilities pi
double[] initial =
{
0.6, 0.4
};
// Create a new hidden Markov model with discrete probabilities
var hmm = new HiddenMarkovModel<GeneralDiscreteDistribution, double>(transitions, emissions, initial);
// After that, one could, for example, query the probability
// of a sequence occurring. We will consider the sequence
double[] sequence = new double[] { 0, 1, 2 };
// And now we will evaluate its likelihood
double logLikelihood = hmm.Evaluate(sequence);
// At this point, the log-likelihood of the sequence
// occurring within the model is -3.3928721329161653.
// We can also get the Viterbi path of the sequence
int[] path = hmm.Decode(sequence, out logLikelihood);
// At this point, the state path will be 1-0-0 and the
// log-likelihood will be -4.3095199438871337
Assert.AreEqual(logLikelihood, Math.Log(0.01344), 1e-10);
Assert.AreEqual(path[0], 1);
Assert.AreEqual(path[1], 0);
Assert.AreEqual(path[2], 0);
}