public static List<ConditionalProbabilityTable> sumOut( List<ConditionalProbabilityTable> factorization, List<Variable> varsToSumOut) { List<ConditionalProbabilityTable> newFactorization = new ArrayList<>(factorization); for (Variable varToSumOut : varsToSumOut) { // Multiply all together List<ConditionalProbabilityTable> relevantCpts = Inference.getAllCptsContaining(newFactorization, varToSumOut); ConditionalProbabilityTable product = Inference.multiplyAll(relevantCpts); // Marginalize out the variable ConditionalProbabilityTable marginal = product.marginalize(varToSumOut); newFactorization.removeAll(relevantCpts); newFactorization.add(marginal); } return newFactorization; }