Пример #1
0
 public static void Message_Tranfer_Arbol_Union(MarkovNet arboldeunion, Evidence evidence)
 {
     Generic(evidence, null, arboldeunion);
 }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
            }
        }