private int initialRandomState(DuoBaumLevel level) { double d = random.nextDouble(); double sum = 0.0; for (int j = 0, n = level.size(); j < n; ++j) { sum += level.forwardValue(j); if (d <= sum) { return j; } } assert false; return level.size() - 1; // error in finite bit arithmetic encountered }
private int randomPreviousState( DuoBaumLevel level, int nodeAB1, int nodeA2, int nodeB2, double nodeValue) { double d = random.nextDouble() * nodeValue; double sum = 0.0; for (int j = 0, n = level.size(); j < n; ++j) { if (nodeAB1 == level.childNodeAB1(j) && nodeA2 == level.childNodeA2(j) && nodeB2 == level.childNodeB2(j)) { sum += level.forwardValue(j); if (d <= sum) { return j; } } } return level.size() - 1; // error in finite bit arithmetic encountered }
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)); }