def initialize_relation(self): variable_upper_to_ = { var: None for var in self.renormalized_model.variables } variables_lower_to_ = { var: [] for var in self.renormalized_model.variables } factor_upper_to_ = { var: Factor.scalar(1.0) for var in self.renormalized_model.variables } upper_candidate_for_ = { var: set() for var in self.renormalized_model.variables } for fac in self.renormalized_model.factors: lower_var = min(fac.variables, key=self.renormalized_elimination_order.index) factor_upper_to_[lower_var] = fac upper_candidate_for_[lower_var] = upper_candidate_for_[ lower_var].union(set(fac.variables)) for var in self.renormalized_elimination_order: m_vars = sorted(upper_candidate_for_[var], key=self.renormalized_elimination_order.index) upper_candidate_for_[var] = copy(m_vars[m_vars.index(var) + 1:]) if m_vars.index(var) + 1 < len(m_vars): upper_var = m_vars[m_vars.index(var) + 1] variable_upper_to_[var] = upper_var variables_lower_to_[upper_var].append(var) upper_candidate_for_[upper_var] = upper_candidate_for_[ upper_var].union(m_vars[m_vars.index(var) + 1:]) self.variable_upper_to_ = variable_upper_to_ self.variables_lower_to_ = variables_lower_to_ self.factors_adj_to_ = { var: self.renormalized_model.get_adj_factors(var) for var in self.renormalized_model.variables } self.factor_upper_to_ = factor_upper_to_
def run(self, elimination_order_method="random", **kwargs): if elimination_order_method == "random": elimination_order = copy(self.model.variables) random.shuffle(elimination_order) elif elimination_order_method == "not_random": elimination_order = copy(self.model.variables) elif elimination_order_method == "given": elimination_order = kwargs["elimination_order"] eliminated_model = self.model.copy() max_ibound = 0 for var in elimination_order: max_ibound = max( max_ibound, get_bucket_size( [fac for fac in eliminated_model.get_adj_factors(var)])) eliminated_model.contract_variable(var) Z = Factor.scalar(1.0) for fac in eliminated_model.factors: Z = Z * fac return Z.log_values