public void DecodeTest()
{
// Example taken from http://en.wikipedia.org/wiki/Viterbi_algorithm
// Create the transition matrix A
double[,] transition =
{
{ 0.7, 0.3 },
{ 0.4, 0.6 }
};
// Create the emission matrix B
double[,] emission =
{
{ 0.1, 0.4, 0.5 },
{ 0.6, 0.3, 0.1 }
};
// Create the initial probabilities pi
double[] initial =
{
0.6, 0.4
};
// Create a new hidden Markov model
HiddenMarkovModel hmm = new HiddenMarkovModel(transition, emission, initial);
// After that, one could, for example, query the probability
// of a sequence occurring. We will consider the sequence
int[] sequence = new int[] { 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);
}