Ejemplo n.º 1
0
        public static double EnumerateAll(List <BayesianNode> vars, List <Evidence> evidences)
        {
            if (vars.Count == 0)
            {
                return(1.0);
            }

            var y     = vars.First();
            var tuple = BooleanTuple.Of(0, y.TupleSize).Flip(0);

            for (var i = 0; i < y.Parents.Count; i++)
            {
                var p = y.Parents[i];
                var e = evidences.First(evidence => evidence.Node == p);
                if (e.Report)
                {
                    tuple = tuple.Flip(i + 1);
                }
            }

            var ev          = evidences.FirstOrDefault(e => e.Node == y);
            var probability = y.Table[tuple];

            if (ev != null)
            {
                return((ev.Report ? probability : 1 - probability) * EnumerateAll(Rest(vars, y), evidences));
            }

            return(probability * EnumerateAll(Rest(vars, y), Extend(evidences, y, true)) +
                   (1 - probability) * EnumerateAll(Rest(vars, y), Extend(evidences, y, false)));
        }
Ejemplo n.º 2
0
        public void FloodNodeTest()
        {
            var probabilities = new List <double>
            {
                0.2,
                0.4,
                0,
                0
            };

            for (var i = 0; i < 4; i++)
            {
                var v = graph.Vertex(i + 1);
                Assert.AreEqual(v, network.FloodingNode(v).V);
                var table = network.FloodingNode(v).Table;
                Assert.AreEqual(2, network.FloodingNode(v).Table.Count);
                Assert.IsTrue(table.ContainsKey(BooleanTuple.Of(true)));
                Assert.IsTrue(table.ContainsKey(BooleanTuple.Of(false)));
                Assert.AreEqual(probabilities[i], table[BooleanTuple.Of(true)]);
                Assert.AreEqual(1 - probabilities[i], table[BooleanTuple.Of(false)]);
            }
        }