/*
* Copyright 1999-2004 Carnegie Mellon University.
* Portions Copyright 2004 Sun Microsystems, Inc.
* Portions Copyright 2004 Mitsubishi Electric Research Laboratories.
* All Rights Reserved. Use is subject to license terms.
*
* See the file "license.terms" for information on usage and
* redistribution of this file, and for a DISCLAIMER OF ALL
* WARRANTIES.
*
*/
package edu.cmu.sphinx.result;
import org.testng.Assert;
import org.testng.annotations.Test;
import edu.cmu.sphinx.result.Lattice;
import edu.cmu.sphinx.result.Node;
import edu.cmu.sphinx.util.LogMath;
/**
* Tests the posterior score computation code. Sets up a simple lattice, and
* dumps out the posterior probabilities of each node.
*/
public class PosteriorTest {
@Test
public void testPosterior() {
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);
}
}