private static double enumerateAll(BayesNet net, List<string> unprocessedVariables,
Dictionary<String, bool> evidenceVariables)
{
if (unprocessedVariables.Count == 0)
{
return 1.0;
}
else
{
String Y = (String)unprocessedVariables[0];
if (evidenceVariables.ContainsKey(Y))
{
double probYGivenParents = net.probabilityOf(Y,
evidenceVariables[Y], evidenceVariables);
double secondTerm = enumerateAll(net, Util
.rest(unprocessedVariables), evidenceVariables);
return probYGivenParents * secondTerm;
}
else
{
double sigma = 0.0;
Dictionary<String, bool> clone1 = cloneEvidenceVariables(evidenceVariables);
clone1.Add(Y, true);
double probYTrueGivenParents = net.probabilityOf(Y,
true, clone1);
double secondTerm = enumerateAll(net, Util
.rest(unprocessedVariables), clone1);
double trueProbabilityY = probYTrueGivenParents * secondTerm;
Dictionary<String, bool> clone2 = cloneEvidenceVariables(evidenceVariables);
clone2.Add(Y, false);
double probYFalseGivenParents = net.probabilityOf(Y,
false, clone2);
secondTerm = enumerateAll(net, Util.rest(unprocessedVariables),
clone2);
double falseProbabilityY = probYFalseGivenParents * secondTerm;
// System.Console.Write(secondTerm + " ) )");
sigma = trueProbabilityY + falseProbabilityY;
return sigma;
}
}
}