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, Evidence evidence)
 {
     Generic(evidence, null, arboldeunion);
 }
示例#4
0
        /// <summary>
        /// Metodo que calcula, mediante el traspaso de mensajes en un poliarbol,
        /// las probabilidades condicionales de un nodo dada la evidencia.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="poliarbol"></param>
        /// <param name="evidence">Tiene tantos elementos como nodos el poliarbol.
        /// En la posicion i-esima guarda el valor del estado de la variable i si esta forma parte de la evidencia;
        /// -1 en otro caso.
        /// </param>


        public static void Message_Tranfer_Poliarbol(BayesianGraph poliarbol, Evidence evidence)
        {
            Generic(evidence, poliarbol, null);
        }
示例#5
0
        /// <summary>
        /// Realiza todas las realizaciones de una evidencia estocastica
        /// </summary>
        /// <param name="evidence"></param>
        /// <param name="realization"></param>
        /// <param name="pos"></param>
        /// <returns></returns>
        static IEnumerable <Tuple <KeyValuePair <BayesianNode, int>[], double> > EvidenceRealization(Evidence evidence, KeyValuePair <BayesianNode, int>[] realization, int pos, double probability = 1.0)
        {
            if (pos == realization.Length)
            {
                if (realization.Any(x => x.Value >= 0))
                {
                    yield return(new Tuple <KeyValuePair <BayesianNode, int>[], double>(realization, probability));
                }

                yield break;
            }
            //en cada paso recursivo se escoge un nodo para su seleccion de estado
            //por cada probabilidad de estar en un estado de el nodo en la posicion pos
            bool outofevidence = true;

            for (int i = 0; i < evidence.EvidenceValues[pos].Length; i++)
            {
                if (evidence.EvidenceValues[pos][i] > 0)
                {
                    realization[pos] = new KeyValuePair <BayesianNode, int>(realization[pos].Key, i);
                    outofevidence    = false;
                    var p = probability * evidence.EvidenceValues[pos][i];
                    foreach (var item in EvidenceRealization(evidence, realization, pos + 1, p))
                    {
                        yield return(item);
                    }
                }
            }
            //si no esta en la evidencia entonces relization[pos]=bayesiannode,-1
            if (outofevidence)
            {
                foreach (var item in EvidenceRealization(evidence, realization, pos + 1, probability))
                {
                    yield return(item);
                }
            }
        }
        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);

           }
        }
        /// <summary>
        /// Metodo que calcula, mediante el traspaso de mensajes en un poliarbol,
        /// las probabilidades condicionales de un nodo dada la evidencia.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="poliarbol"></param>
        /// <param name="evidence">Tiene tantos elementos como nodos el poliarbol.
        /// En la posicion i-esima guarda el valor del estado de la variable i si esta forma parte de la evidencia; 
        /// -1 en otro caso. 
        /// </param>

        
        public static void Message_Tranfer_Poliarbol(BayesianGraph poliarbol, Evidence evidence)
        {
            Generic(evidence, poliarbol, null);
        } 
        /// <summary>
        /// Realiza todas las realizaciones de una evidencia estocastica
        /// </summary>
        /// <param name="evidence"></param>
        /// <param name="realization"></param>
        /// <param name="pos"></param>
        /// <returns></returns>
        static IEnumerable<Tuple<KeyValuePair<BayesianNode, int>[],double>> EvidenceRealization(Evidence evidence, KeyValuePair<BayesianNode, int>[] realization, int pos,double probability=1.0)
        {
            if (pos == realization.Length)
            {
                if(realization.Any(x=>x.Value>=0))
                yield return new Tuple<KeyValuePair<BayesianNode, int>[], double>(realization,probability);
                
                yield break;
            }
            //en cada paso recursivo se escoge un nodo para su seleccion de estado
            //por cada probabilidad de estar en un estado de el nodo en la posicion pos
            bool outofevidence = true;
            for (int i = 0; i < evidence.EvidenceValues[pos].Length; i++)
            {
                
                if (evidence.EvidenceValues[pos][i] > 0)
                {
                    realization[pos] = new KeyValuePair<BayesianNode, int>(realization[pos].Key, i);
                    outofevidence = false;
                    var p = probability*evidence.EvidenceValues[pos][i];
                    foreach (var item in EvidenceRealization(evidence, realization, pos + 1,p))
                        yield return item;
                }
                
            }
            //si no esta en la evidencia entonces relization[pos]=bayesiannode,-1
            if(outofevidence)
                foreach (var item in EvidenceRealization(evidence, realization, pos + 1,probability))
                    yield return item;

        }