/// <summary>
        /// Funcion exponencial de el clique Ci
        /// </summary>
        /// <param name="Ci">Clique sobre el que esta definido la funcion </param>
        /// <param name="states">Realizacion de los nodos del clique </param>
        /// <returns>Retorna el resultado de la funcion exponencial de Ci dado una realizacion </returns>
        public double Fi(BayesianClique Ci, List <int> states) //pongo este met aqui pq me hace falta saber el indice de cada nodo para buscar en la evidencia
        {
            double result = 1;

            //revisando evidencia
            if (BayesianNet.Evidence != null)
            {
                for (int i = 0; i < Ci.Nodes.Count; i++) //tener en cuenta que en un clique solo va estar un nodo y su padres, ver la forma de construir el arbol de U si se tiene dudas
                {
                    if (states[i] != BayesianNet.Evidence[BayesianNet.GetIndex(Ci.Nodes[i])] &&
                        BayesianNet.Evidence[BayesianNet.GetIndex(Ci.Nodes[i])] >= 0)
                    {
                        return(0);
                    }
                }
            }

            List <int> aux = new List <int>();

            aux.Add(states[0]);
            foreach (var parent in Ci.Nodes)
            {
                if (BayesianNet.Parent(Ci.Nodes[0]).Contains(parent))
                {
                    aux.Add(states[BayesianNet.GetParentIndex(Ci.Nodes[0], parent) + 1]);
                }
            }

            result *= Ci.Nodes[0].Probabilities.GetElem(aux.ToArray());

            for (int i = 1; i < Ci.Representativos.Count; i++)
            {
                int   parentindex = BayesianNet.GetParentIndex(Ci.Nodes[0], Ci.Representativos[i]);
                int[] stats       = new int[Ci.Representativos[i].ParentMessages.Length + 1];
                stats[0] = states[parentindex + 1];
                for (int k = 1; k < stats.Length; k++)
                {
                    parentindex = BayesianNet.GetParentIndex(Ci.Nodes[0], BayesianNet.ParentInIndex(Ci.Representativos[i], k - 1));
                    stats[k]    = states[parentindex + 1];
                }
                result *= Ci.Representativos[i].Probabilities.GetElem(stats);
            }

            return(result);
        }
        /// <summary>
        /// Crea el primer grafo de racimos
        /// </summary>
        void FirstTreeCluster()
        {
            BayesianClique temp;
            var            listnode = new List <BayesianNode>();

            foreach (var node in BayesianNet)
            {
                listnode.Clear();
                listnode.Add(node);
                listnode.AddRange(BayesianNet.Parent(node));
                temp       = new BayesianClique();
                temp.Name  = node.Name;
                temp.Nodes = new List <BayesianNode>();
                temp.Nodes.AddRange(listnode);
                temp.Representativos = new List <BayesianNode>();
                temp.Representativos.Add(node);
                TreeCluster.AddVertex(temp);

                //poniendo las aristas, recordar que la red markov es no dirigido
                foreach (var adj in BayesianNet.Adjacent(node))
                {
                    BayesianClique adjcliq = Clique(adj.Name, TreeCluster);
                    if (adjcliq != null)
                    {
                        TreeCluster.AddEdge(temp, adjcliq);
                    }
                }
                foreach (var parent in BayesianNet.Parent(node))
                {
                    BayesianClique parentcliq = Clique(parent.Name, TreeCluster);
                    if (parentcliq != null)
                    {
                        TreeCluster.AddEdge(temp, parentcliq);
                    }
                }
            }
            CheckSubConj();
        }