public static double[] Ask(Query q, BayesNet net)
        {
            Dictionary <string, bool?> evidenceVariables = q.EvidenceVariables;

            double[] probDist = new double[2];
            // true probability
            evidenceVariables[q.QueryVariable] = true;
            probDist[0] = EnumerateAll(net, net.GetVariables(), evidenceVariables);
            // false probability
            evidenceVariables[q.QueryVariable] = false;
            probDist[1] = EnumerateAll(net, net.GetVariables(), evidenceVariables);
            // System.out.println( probDist[0] + " " + probDist[1]);
            // return probDist;
            double[] normalized = Util.Util.Normalize(probDist);
            // System.out.println( normalized[0] + " " + normalized[1]);
            return(normalized);
        }
        private static double EnumerateAll(BayesNet net, IList <string> unprocessedVariables,
                                           Dictionary <string, bool?> evidenceVariables)
        {
            if (unprocessedVariables.Count == 0)
            {
                return(1.0);
            }

            var y = unprocessedVariables[0];

            if (evidenceVariables.Keys.Contains(y))
            {
                double probYGivenParents = net.ProbabilityOf(y, evidenceVariables[y], evidenceVariables);

                double secondTerm = EnumerateAll(net, Util.Util.Rest(unprocessedVariables), evidenceVariables);

                return(probYGivenParents * secondTerm);
            }
            else
            {
                double sigma = 0.0;
                Dictionary <string, bool?> clone1 = CloneEvidenceVariables(evidenceVariables);
                clone1[y] = true;
                double probYTrueGivenParents = net.ProbabilityOf(y,
                                                                 true, clone1);

                double secondTerm = EnumerateAll(net, Util.Util.Rest(unprocessedVariables), clone1);

                double trueProbabilityY = probYTrueGivenParents * secondTerm;

                Dictionary <string, bool?> clone2 = CloneEvidenceVariables(evidenceVariables);
                clone2[y] = false;
                double probYFalseGivenParents = net.ProbabilityOf(y,
                                                                  false, clone2);

                secondTerm = EnumerateAll(net, Util.Util.Rest(unprocessedVariables),
                                          clone2);
                double falseProbabilityY = probYFalseGivenParents * secondTerm;
                // System.out.print(secondTerm + " ) )");
                sigma = trueProbabilityY + falseProbabilityY;
                return(sigma);
            }
        }