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