// Create clique trees by minimum (or maximum) spanning tree method
clique_trees = JunctionTree(nx.minimum_spanning_tree(complete_graph).edges())
factor = self.factors[0]
factor = factor.product(*[self.factors[i] for i in
range(1, len(self.factors))])
if set(factor.scope()) != set(self.nodes()):
ValueError("Factor for all the random variables not specified")
all_vars = set(self.nodes())
for node in clique_trees.nodes():
marginalised_nodes = all_vars - set(node)
factor_copy = factor.marginalize(list(marginalised_nodes),
inplace=False)
clique_trees.add_factors(factor_copy)
return clique_trees
After Change
is_used = {factor: False for factor in self.factors}
for node in clique_trees.nodes():
clique_factors = []
for factor in self.factors:
if not is_used[factor] and set(factor.scope()).issubset(node):
clique_factors.append(factor)
is_used[factor] = True
clique_potential = factor_product(*clique_factors)
clique_trees.add_factors(clique_potential)