示例#1
0
    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_
示例#2
0
    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