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