public void ConstructorTest()
{
HiddenMarkovModel hmm;
double[,] A, B;
double[] pi;
// Create a HMM with 2 states and 4 symbols
hmm = new HiddenMarkovModel(2, 4);
A = new double[,]
{
{ 0.5, 0.5 },
{ 0.5, 0.5 }
};
B = new double[,]
{
{ 0.25, 0.25, 0.25, 0.25 },
{ 0.25, 0.25, 0.25, 0.25 },
};
pi = new double[] { 1, 0 };
Assert.AreEqual(2, hmm.States);
Assert.AreEqual(4, hmm.Symbols);
Assert.IsTrue(Matrix.Log(A).IsEqual(hmm.LogTransitions));
Assert.IsTrue(Matrix.Log(B).IsEqual(hmm.Emissions));
Assert.IsTrue(Matrix.Log(pi).IsEqual(hmm.Probabilities));
Assert.IsTrue(A.IsEqual(hmm.LogTransitions.Exp()));
Assert.IsTrue(B.IsEqual(hmm.LogEmissions.Exp()));
Assert.IsTrue(pi.IsEqual(hmm.LogInitial.Exp()));
hmm = new HiddenMarkovModel(new Forward(2), 4);
A = new double[,]
{
{ 0.5, 0.5 },
{ 0.0, 1.0 }
};
B = new double[,]
{
{ 0.25, 0.25, 0.25, 0.25 },
{ 0.25, 0.25, 0.25, 0.25 },
};
pi = new double[] { 1, 0 };
Assert.AreEqual(2, hmm.States);
Assert.AreEqual(4, hmm.Symbols);
Assert.IsTrue(Matrix.Log(A).IsEqual(hmm.LogTransitions));
Assert.IsTrue(Matrix.Log(B).IsEqual(hmm.Emissions));
Assert.IsTrue(Matrix.Log(pi).IsEqual(hmm.Probabilities));
hmm = new HiddenMarkovModel(A, B, pi);
Assert.AreEqual(2, hmm.States);
Assert.AreEqual(4, hmm.Symbols);
Assert.IsTrue(Matrix.Log(A).IsEqual(hmm.LogTransitions));
Assert.IsTrue(Matrix.Log(B).IsEqual(hmm.Emissions, 1e-10));
Assert.IsTrue(Matrix.Log(pi).IsEqual(hmm.Probabilities));
}