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;
  }