def _update_mean_fields(self):
        variable_order = np.random.permutation(self.model.variables)
        for var in variable_order:
            next_mean_field = Factor.full_like_(self.mean_fields[var], 0.0)
            for fac in self.model.get_adj_factors(var):
                tmp = Factor(name = 'tmp', variables = [var], values = np.ones(self.model.get_cardinality_for_(var)))
                tmp = product_over_(tmp, *[self.mean_fields[var1] for var1 in fac.variables if var1 != var])
                tmp.transpose_by_(fac.variables)
                tmp.log_values = fac.log_values * tmp.values
                next_mean_field = next_mean_field + tmp.marginalize_except_([var], inplace = False)

            self.mean_fields[var] = next_mean_field.exp(inplace = False).normalize(inplace = False)
            self.mean_fields[var].log_values = np.nan_to_num(self.mean_fields[var].log_values)