def build_join_tree(self, triangulatedGraph):
     # The Triangulated Graph is really a graph of cliques.
     cliques = triangulatedGraph.cliques
     # We start by creating a forest of trees, one for each clique.
     forest = [JoinTree(clique) for clique in cliques]
     sepsetHeap = self.create_sepset_priority_queue(cliques)
     # Join n - 1 sepsets together forming (hopefully) a single tree.
     for n in range(len(forest) - 1):
         while sepsetHeap:
             sepset = heapq.heappop(sepsetHeap)
             # Find out which tree each clique is from
             joinTreeX = GraphUtilities.getTree(forest, sepset.cliqueX)
             joinTreeY = GraphUtilities.getTree(forest, sepset.cliqueY)
             if not joinTreeX == joinTreeY:
                 # If the cliques are on different trees, then join to make a larger one.
                 joinTreeX.merge(sepset, joinTreeY)
                 forest.remove(joinTreeY)
                 break
     if len(forest) > 1:
         raise BadTreeStructure(
             "Inference on a forest of Junction Trees is not yet supported")
     else:
         tree = forest[0]
     tree.init_clique_potentials(self.bnet.nodes)
     return tree
Exemple #2
0
 def build_join_tree (self, triangulatedGraph):
     # The Triangulated Graph is really a graph of cliques.
     cliques = triangulatedGraph.cliques
     # We start by creating a forest of trees, one for each clique.
     forest = [JoinTree(clique) for clique in cliques]
     sepsetHeap = self.create_sepset_priority_queue(cliques)
     # Join n - 1 sepsets together forming (hopefully) a single tree.
     for n in range(len(forest) - 1):
         while sepsetHeap:
             sepset = heapq.heappop(sepsetHeap)
             # Find out which tree each clique is from
             joinTreeX = GraphUtilities.getTree(forest, sepset.cliqueX)
             joinTreeY = GraphUtilities.getTree(forest, sepset.cliqueY)
             if not joinTreeX == joinTreeY:
                 # If the cliques are on different trees, then join to make a larger one.
                 joinTreeX.merge(sepset, joinTreeY)
                 forest.remove(joinTreeY)
                 break
     if len(forest) > 1:
         raise BadTreeStructure("Inference on a forest of Junction Trees is not yet supported")
     else:
         tree = forest[0]
     tree.init_clique_potentials(self.bnet.nodes)
     return tree