После небольшой игры я понял, в чем моя проблема.
double partSats = result.satCount(union);
Возвращает ли правильный ответ. Он рассчитывает, сколько существует возможных решений, и делит решение на 2 ^ (# наборов в наборе).
Причина, по которой я подумал, что satCount(union)
не работает, связана с неправильным использованием exist()
где-то еще в коде.
Вот реализация satCound (varSet) для справки:
/**
* <p>Calculates the number of satisfying variable assignments to the variables
* in the given varset. ASSUMES THAT THE BDD DOES NOT HAVE ANY ASSIGNMENTS TO
* VARIABLES THAT ARE NOT IN VARSET. You will need to quantify out the other
* variables first.</p>
*
* <p>Compare to bdd_satcountset.</p>
*
* @return the number of satisfying variable assignments
*/
public double satCount(BDDVarSet varset) {
BDDFactory factory = getFactory();
if (varset.isEmpty() || isZero()) /* empty set */
return 0.;
double unused = factory.varNum();
unused -= varset.size();
unused = satCount() / Math.pow(2.0, unused);
return unused >= 1.0 ? unused : 1.0;
}