public static void Message_Tranfer_Arbol_Union(MarkovNet arboldeunion, Evidence evidence) { Generic(evidence, null, arboldeunion); }
static void Generic(Evidence evidence, BayesianGraph poliarbol, MarkovNet arboldeunion) { //tamanno del grafo sea poliarbol o de racimos var count = poliarbol == null ? arboldeunion.Count : poliarbol.Count; double realization_probalility = 1.0; var nodesConditionalProbabilities = new double[count][]; var bayesianGraph = poliarbol ?? arboldeunion.BayesianNet; bool traspasoEnPoliarbol = poliarbol != null; if (evidence == null) { return; } var deterministicEvidence = new KeyValuePair <BayesianNode, int> [evidence.EvidenceValues.Length]; //absorber evidencia //no hay evidencia for (int i = 0; i < count; i++) { deterministicEvidence[i] = new KeyValuePair <BayesianNode, int>(bayesianGraph[i], -1); } for (int j = 0; j < count; j++) { nodesConditionalProbabilities[j] = new double[bayesianGraph[j].ConditionalProbability.Length]; } bool stocasticrealizations = false; foreach (var item in EvidenceRealization(evidence, deterministicEvidence, 0)) { stocasticrealizations = true; if (traspasoEnPoliarbol) { Message_Tranfer_Poliarbol(poliarbol, item.Item1); } else { Message_Tranfer_Arbol_Union(arboldeunion, item.Item1); } realization_probalility = item.Item2; for (int i = 0; i < nodesConditionalProbabilities.Length; i++) { for (int j = 0; j < nodesConditionalProbabilities[i].Length; j++) { nodesConditionalProbabilities[i][j] += bayesianGraph[i].ConditionalProbability[j] * realization_probalility; } } } //si no hubo evidencia estocastica es que se esta solicitando el traspaso de //msges sin evidencia if (stocasticrealizations) { for (int i = 0; i < nodesConditionalProbabilities.Length; i++) { for (int j = 0; j < nodesConditionalProbabilities[i].Length; j++) { bayesianGraph[i].ConditionalProbability[j] = nodesConditionalProbabilities[i][j]; } } } else { if (traspasoEnPoliarbol) { Message_Tranfer_Poliarbol(poliarbol, deterministicEvidence); } else { Message_Tranfer_Arbol_Union(arboldeunion, deterministicEvidence); } } }
public static void Message_Tranfer_Arbol_Union(MarkovNet arboldeunion, KeyValuePair <BayesianNode, int>[] evidence = null) { //absorber evidence if (evidence != null && evidence.Length > 0) { arboldeunion.BayesianNet.Evidence = evidence.Select(x => x.Value).ToArray(); } if (arboldeunion.Count() > ParalellStartNumber) { #region ParalellAlgorithm arboldeunion.Debug = true; var taskarr = new Task[arboldeunion.Count]; for (int i = 0; i < arboldeunion.Count; i++) { taskarr[i] = new Task(o => { var node = o as BayesianNode; if (node != null) { lock (node) { do { arboldeunion.Work(node); } while (!node.Finished); } } }, arboldeunion[i]); taskarr[i].Start(); } for (int i = 0; i < arboldeunion.Count * 8; i++) { System.Threading.Thread.Sleep(300); Increment(); } Task.WaitAll(taskarr); arboldeunion.Debug = false; #endregion } else #region DeterministicAlgorithm { while (!arboldeunion.AllConditionalProbabilitiesComputed()) { foreach (var item in arboldeunion) { arboldeunion.Work(item); } Increment(); } } #endregion foreach (var node in arboldeunion.BayesianNet) { arboldeunion.Marginalize_X(node); } }