LogMath logMath = LogMath.getLogMath();
Lattice lattice = new Lattice();
Node a = lattice.addNode("A", "A", 0, 0);
Node b = lattice.addNode("B", "B", 0, 0);
Node c = lattice.addNode("C", "C", 0, 0);
Node d = lattice.addNode("D", "D", 0, 0);
double acousticAB = 4;
double acousticAC = 6;
double acousticCB = 1;
double acousticBD = 5;
double acousticCD = 2;
lattice.setInitialNode(a);
lattice.setTerminalNode(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);
double pathABD = acousticAB * acousticBD;
double pathACBD = acousticAC * acousticCB * acousticBD;
double pathACD = acousticAC * acousticCD;
double allPaths = pathABD + pathACBD + pathACD;
double bPosterior = (pathABD + pathACBD) / allPaths;
double cPosterior = (pathACBD + pathACD) / allPaths;
double delta = 1e-4;
Assert.assertEquals (logMath.logToLinear((float) a.getPosterior()), 1.0, delta);
Assert.assertEquals (logMath.logToLinear((float) b.getPosterior()), bPosterior, delta);
Assert.assertEquals (logMath.logToLinear((float) c.getPosterior()), cPosterior, delta);
Assert.assertEquals (logMath.logToLinear((float) d.getPosterior()), 1.0, delta);
}