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
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