public void AKN_HMM_Learning_UT()
        {
            AKN_HiddenMarkovModel <String> m_HiddenMarkovModel = new AKN_HiddenMarkovModel <String>(3, 2);

            m_HiddenMarkovModel.MSetStates(new float[] { 0.656F, 0.344F, 0.0F }, new string[] { "Etat_1", "Etat_2", "Etat_3" });
            m_HiddenMarkovModel.MSetTransitions(new float[, ] {
                { 0.346F, 0.365F, 0.289F }, { 0.159F, 0.514F, 0.327F }, { 0.377F, 0.259F, 0.364F }
            });
            m_HiddenMarkovModel.MSetObservations(new String[] { "Pile", "Face" });
            m_HiddenMarkovModel.MSetEmissions(new float[, ] {
                { 1.0F, 0.0F }, { 0.631F, 0.369F }, { 0.0F, 1.0F }
            });

            String[] observation = new String[] { "Pile", "Face", "Face", "Pile", "Pile" };

            m_HiddenMarkovModel.MUpdate(observation, 0, 15);

            float p = m_HiddenMarkovModel.MEvaluate(observation, eUseAlgorithme.kForward);

            Assert.That(NearlyEqual(p, (float)(0.2479884)), "Problem  = " + (p - 0.2479884f));

            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_1"].m_startProbability, 1.0F), "Problem !" + m_HiddenMarkovModel["Etat_1"].m_startProbability);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_2"].m_startProbability, 0.0F), "Problem !" + m_HiddenMarkovModel["Etat_2"].m_startProbability);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_3"].m_startProbability, 0.0F), "Problem !" + m_HiddenMarkovModel["Etat_3"].m_startProbability);

            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_1", "Etat_1"], 0.0F), "Problem !" + m_HiddenMarkovModel["Etat_1", "Etat_1"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_1", "Etat_2"], 0.0F), "Problem !" + m_HiddenMarkovModel["Etat_1", "Etat_2"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_1", "Etat_3"], 1.0F), "Problem !" + m_HiddenMarkovModel["Etat_1", "Etat_3"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_2", "Etat_1"], 0.2119321F), "Problem !" + m_HiddenMarkovModel["Etat_2", "Etat_1"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_2", "Etat_2"], 0.788068F), "Problem !" + m_HiddenMarkovModel["Etat_2", "Etat_2"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_2", "Etat_3"], 0.0F), "Problem !" + m_HiddenMarkovModel["Etat_2", "Etat_3"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_3", "Etat_1"], 0.0F), "Problem !" + m_HiddenMarkovModel["Etat_3", "Etat_1"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_3", "Etat_2"], 0.5147933F), "Problem !" + m_HiddenMarkovModel["Etat_3", "Etat_2"]);
            Assert.That(NearlyEqual(m_HiddenMarkovModel["Etat_3", "Etat_3"], 0.4852067F), "Problem !" + m_HiddenMarkovModel["Etat_3", "Etat_3"]);

            Assert.That(NearlyEqual(m_HiddenMarkovModel.MGetEmission("Etat_1", "Pile"), 1.0F), "Problem !" + m_HiddenMarkovModel.MGetEmission("Etat_1", "Pile"));
            Assert.That(NearlyEqual(m_HiddenMarkovModel.MGetEmission("Etat_1", "Face"), 0.0F), "Problem !" + m_HiddenMarkovModel.MGetEmission("Etat_1", "Face"));
            Assert.That(NearlyEqual(m_HiddenMarkovModel.MGetEmission("Etat_2", "Pile"), 0.9686517F), "Problem !" + m_HiddenMarkovModel.MGetEmission("Etat_2", "Pile"));
            Assert.That(NearlyEqual(m_HiddenMarkovModel.MGetEmission("Etat_2", "Face"), 0.03134831F), "Problem !" + m_HiddenMarkovModel.MGetEmission("Etat_2", "Face"));
            Assert.That(NearlyEqual(m_HiddenMarkovModel.MGetEmission("Etat_3", "Pile"), 0.0F), "Problem !" + m_HiddenMarkovModel.MGetEmission("Etat_3", "Pile"));
            Assert.That(NearlyEqual(m_HiddenMarkovModel.MGetEmission("Etat_3", "Face"), 1.0F), "Problem !" + m_HiddenMarkovModel.MGetEmission("Etat_3", "Face"));
        }
        public void AKN_HMM_Evaluation_UT()
        {
            AKN_HiddenMarkovModel <String> m_HiddenMarkovModel;

            String[] observations;
            float    result;

            // Exemple 1
            m_HiddenMarkovModel = new AKN_HiddenMarkovModel <String>(2, 2);
            m_HiddenMarkovModel.MSetStates(new float[] { 1.0F, 0.0F }, new string[] { "Samedi", "Dimanche" });
            m_HiddenMarkovModel.MSetTransitions(new float[, ] {
                { 0.5F, 0.5F }, { 0.0F, 1.0F }
            });
            m_HiddenMarkovModel.MSetObservations(new String[] { "Soleil", "Pluie" });
            m_HiddenMarkovModel.MSetEmissions(new float[, ] {
                { 0.3F, 0.7F }, { 0.8F, 0.2F }
            });

            observations = new String[] { "Soleil", "Pluie", "Pluie", "Soleil" };

            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForward);
            Assert.That(NearlyEqual(result, 0.0334125F), "Problem ! result = " + result);

            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kBackward);
            Assert.That(NearlyEqual(result, 0.0334125F), "Problem ! result = " + result);

            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 0);
            Assert.That(NearlyEqual(result, 0.0334125F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 1);
            Assert.That(NearlyEqual(result, 0.0334125F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 2);
            Assert.That(NearlyEqual(result, 0.0334125F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 3);
            Assert.That(NearlyEqual(result, 0.0334125F), "Problem ! result = " + result);

            // Exemple 2
            m_HiddenMarkovModel = new AKN_HiddenMarkovModel <String>(3, 2);
            m_HiddenMarkovModel.MSetStates(new float[] { 0.5F, 0.3F, 0.2F }, new string[] { "Etat_1", "Etat_2", "Etat_3" });
            m_HiddenMarkovModel.MSetTransitions(new float[, ] {
                { 0.45F, 0.35F, 0.2F }, { 0.1F, 0.5F, 0.4F }, { 0.15F, 0.25F, 0.6F }
            });
            m_HiddenMarkovModel.MSetObservations(new String[] { "Pile", "Face" });
            m_HiddenMarkovModel.MSetEmissions(new float[, ] {
                { 1.0F, 0.0F }, { 0.5F, 0.5F }, { 0.0F, 1.0F }
            });

            observations = new String[] { "Pile", "Face", "Face", "Pile", "Pile" };

            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForward);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);

            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kBackward);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);

            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 0);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 1);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 2);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 3);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);
            result = m_HiddenMarkovModel.MEvaluate(observations, eUseAlgorithme.kForwardAndBackward, 4);
            Assert.That(NearlyEqual(result, 0.0277625F), "Problem ! result = " + result);
        }