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)