Пример #1
0
        public void TestPosterior()
        {
            var logMath = LogMath.GetLogMath();

            var lattice = new Lattice();

            var a = lattice.AddNode("A", "A", 0, 0);
            var b = lattice.AddNode("B", "B", 0, 0);
            var c = lattice.AddNode("C", "C", 0, 0);
            var d = lattice.AddNode("D", "D", 0, 0);

            const double acousticAb = 4;
            const double acousticAc = 6;
            const double acousticCb = 1;
            const double acousticBd = 5;
            const double acousticCD = 2;

            lattice.InitialNode  = a;
            lattice.TerminalNode = d;

            lattice.AddEdge(a, b, logMath.LinearToLog(acousticAb), 0);
            lattice.AddEdge(a, c, logMath.LinearToLog(acousticAc), 0);
            lattice.AddEdge(c, b, logMath.LinearToLog(acousticCb), 0);
            lattice.AddEdge(b, d, logMath.LinearToLog(acousticBd), 0);
            lattice.AddEdge(c, d, logMath.LinearToLog(acousticCD), 0);

            lattice.ComputeNodePosteriors(1.0f);
            const double pathAbd  = acousticAb * acousticBd;
            const double pathAcbd = acousticAc * acousticCb * acousticBd;
            const double pathAcd  = acousticAc * acousticCD;
            const double allPaths = pathAbd + pathAcbd + pathAcd;

            const double bPosterior = (pathAbd + pathAcbd) / allPaths;
            const double cPosterior = (pathAcbd + pathAcd) / allPaths;

            const double delta = 1e-4;

            Assert.AreEqual(logMath.LogToLinear((float)a.Posterior), 1.0, delta);
            Assert.AreEqual(logMath.LogToLinear((float)b.Posterior), bPosterior, delta);
            Assert.AreEqual(logMath.LogToLinear((float)c.Posterior), cPosterior, delta);
            Assert.AreEqual(logMath.LogToLinear((float)d.Posterior), 1.0, delta);
        }