/// <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(); }