private double parentSum(DuoBaumLevel level, int sampleA, int sampleB, int state) { int marker = level.marker(); double fwdValue = level.forwardValuesSum() * level.forwardValue(state); int edgeAB1 = level.edgeAB1(state); int edgeA2 = level.edgeA2(state); int edgeB2 = level.edgeB2(state); double tpAB1 = dag.condEdgeProb(marker, edgeAB1); double tpA2 = dag.condEdgeProb(marker, edgeA2); double tpB2 = dag.condEdgeProb(marker, edgeB2); byte symbolAB1 = dag.symbol(marker, edgeAB1); byte symbolA2 = dag.symbol(marker, edgeA2); byte symbolB2 = dag.symbol(marker, edgeB2); double epA = gl.gl(marker, sampleA, symbolAB1, symbolA2); double epB = gl.gl(marker, sampleB, symbolAB1, symbolB2); return fwdValue / ((epA * epB) * (tpAB1 * tpA2 * tpB2)); }