private double getUpdatedMarginalFromModel(int variable, int category) { Proposition evidence = getEvidence().getProposition(); int[] variableValues = new int[evidence.getNumVariables()]; for (int i = 0; i < evidence.getNumVariables(); i++) { variableValues[i] = nextValue(evidence, i, -1); } variableValues[variableValues.length - 1] = -1; double sum = 0.0; loop: while (true) { for (int i = evidence.getNumVariables() - 1; i >= 0; i--) { if (hasNextValue(evidence, i, variableValues[i])) { variableValues[i] = nextValue(evidence, i, variableValues[i]); for (int j = i + 1; j < evidence.getNumVariables(); j++) { if (hasNextValue(evidence, j, -1)) { variableValues[j] = nextValue(evidence, j, -1); } else { break loop; } } double product = 1.0; for (int m = 0; m < getNumNodes(); m++) { Proposition assertion = Proposition.tautology(this); assertion.setCategory(variable, category); Proposition condition = new Proposition(evidence); int[] parents = getParents(m); for (int parent : parents) { condition.disallowComplement(parent, variableValues[parent]); } if (condition.existsCombination()) { product *= getDiscreteProbs().getConditionalProb(assertion, condition); } } sum += product; continue loop; } } break; } return sum; }