def product_of_OnePDF_and_GaussPDF(one_pdf, gauss_pdf): cond = merge_dicts_ignoring_dup_keys_and_none_values(gauss_pdf.Cond, one_pdf.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(gauss_pdf.Scope, one_pdf.Scope) for var in (set(cond) & set(scope)): del cond[var] var_names_and_symbols = merge_dicts_ignoring_dup_keys_and_none_values(gauss_pdf.Vars, one_pdf.Vars) return GaussPDF(var_names_and_syms=var_names_and_symbols, param=gauss_pdf.Param.copy(), cond=cond, scope=scope)
def product_of_2_GaussPDFs(pdf0, pdf1): cond = merge_dicts_ignoring_dup_keys_and_none_values(pdf0.Cond, pdf1.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(pdf0.Scope, pdf1.Scope) for var in (set(cond) & set(scope)): del cond[var] var_names_and_symbols = merge_dicts_ignoring_dup_keys_and_none_values(pdf0.Vars, pdf1.Vars) param = {} return GaussPDF(var_names_and_syms=var_names_and_symbols, param=param, cond=cond, scope=scope)
def product_of_DiscreteFinitePMF_and_continuousPDF(pmf, pdf): cond = merge_dicts_ignoring_dup_keys_and_none_values(pmf.Cond, pdf.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(pmf.Scope, pdf.Scope) for var in (set(cond) & set(scope)): del cond[var] var_names_and_symbols = merge_dicts_ignoring_dup_keys_and_none_values(pmf.Vars, pdf.Vars) neg_log_p = {} for var_names_and_values___frozen_dict, func_value in list(pmf.Param['NegLogP'].items()): neg_log_p[var_names_and_values___frozen_dict] = func_value - log(pdf.Mapping) return DiscreteFinitePMF(var_names_and_syms=var_names_and_symbols, p_or_neg_log_p=neg_log_p, p=False, cond=cond, scope=scope)
def product_of_DiscreteFinitePMF_and_continuousPDF(pmf, pdf): cond = merge_dicts_ignoring_dup_keys_and_none_values(pmf.Cond, pdf.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(pmf.Scope, pdf.Scope) for var in (set(cond) & set(scope)): del cond[var] var_names_and_symbols = merge_dicts_ignoring_dup_keys_and_none_values(pmf.Vars, pdf.Vars) neg_log_p = {} for var_names_and_values___frozen_dict, func_value in pmf.Param['NegLogP'].items(): neg_log_p[var_names_and_values___frozen_dict] = func_value - log(pdf.Mapping) return DiscreteFinitePMF(var_names_and_syms=var_names_and_symbols, p_or_neg_log_p=neg_log_p, p=False, cond=cond, scope=scope)
def op(self, op=mul, other=None, r=False, **kwargs): if isinstance(other, MathFunc): conds = merge_dicts_ignoring_dup_keys_and_none_values(self.Cond, other.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(self.Scope, other.Scope) for var in (set(conds) & set(scope)): del conds[var] var_names_and_symbols = merge_dicts_ignoring_dup_keys_and_none_values(self.Vars, other.Vars) other_mapping = other.Mapping else: var_names_and_symbols = self.Vars.copy() conds = self.Cond.copy() scope = self.Scope.copy() other_mapping = other if isinstance(self.Mapping, MathDict): mapping = self.Mapping.op(op, other_mapping, r=r, **kwargs) elif isinstance(other_mapping, MathDict): mapping = other_mapping.op(op, self.Mapping, r=not r, **kwargs) else: mapping = op(self.Mapping, other_mapping, **kwargs) return MathFunc(var_names_and_symbols, mapping, conds, scope)
def product_of_2_DiscreteFinitePMFs(pmf0, pmf1): cond = merge_dicts_ignoring_dup_keys_and_none_values(pmf0.Cond, pmf1.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(pmf0.Scope, pmf1.Scope) for var in (set(cond) & set(scope)): del cond[var] var_names_and_syms = merge_dicts_ignoring_dup_keys_and_none_values(pmf0.Vars, pmf1.Vars) neg_log_p0 = pmf0.Param['NegLogP'].copy() neg_log_p1 = pmf1.Param['NegLogP'].copy() neg_log_p = {} for item_0, item_1 in product(list(neg_log_p0.items()), list(neg_log_p1.items())): var_names_and_values_0___frozen_dict, func_value_0 = item_0 var_names_and_values_1___frozen_dict, func_value_1 = item_1 same_vars_same_values = True for var in (set(var_names_and_values_0___frozen_dict) & set(var_names_and_values_1___frozen_dict)): if not (var_names_and_values_0___frozen_dict[var] == var_names_and_values_1___frozen_dict[var]): same_vars_same_values = False break if same_vars_same_values: neg_log_p[frozendict(set(var_names_and_values_0___frozen_dict.items()) | set(var_names_and_values_1___frozen_dict.items()))] = func_value_0 + func_value_1 return DiscreteFinitePMF(var_names_and_syms=var_names_and_syms, p_or_neg_log_p=neg_log_p, p=False, cond=cond, scope=scope)
def product_of_2_DiscreteFinitePMFs(pmf0, pmf1): cond = merge_dicts_ignoring_dup_keys_and_none_values(pmf0.Cond, pmf1.Cond) scope = merge_dicts_ignoring_dup_keys_and_none_values(pmf0.Scope, pmf1.Scope) for var in (set(cond) & set(scope)): del cond[var] var_names_and_syms = merge_dicts_ignoring_dup_keys_and_none_values(pmf0.Vars, pmf1.Vars) neg_log_p0 = pmf0.Param['NegLogP'].copy() neg_log_p1 = pmf1.Param['NegLogP'].copy() neg_log_p = {} for item_0, item_1 in product(neg_log_p0.items(), neg_log_p1.items()): var_names_and_values_0___frozen_dict, func_value_0 = item_0 var_names_and_values_1___frozen_dict, func_value_1 = item_1 same_vars_same_values = True for var in (set(var_names_and_values_0___frozen_dict) & set(var_names_and_values_1___frozen_dict)): if not (var_names_and_values_0___frozen_dict[var] == var_names_and_values_1___frozen_dict[var]): same_vars_same_values = False break if same_vars_same_values: neg_log_p[frozendict(set(var_names_and_values_0___frozen_dict.items()) | set(var_names_and_values_1___frozen_dict.items()))] = func_value_0 + func_value_1 return DiscreteFinitePMF(var_names_and_syms=var_names_and_syms, p_or_neg_log_p=neg_log_p, p=False, cond=cond, scope=scope)
def compile(self): self.CompyledFunc = CompyledFunc(merge_dicts_ignoring_dup_keys_and_none_values(self.Vars, self.Param), self.Mapping)