Beispiel #1
0
 def __call__(self, var_and_param_names_and_values={}, **kw_var_and_param_names_and_values):
     var_and_param_names_and_values = combine_dict_and_kwargs(var_and_param_names_and_values,
                                                              kw_var_and_param_names_and_values)
     if var_and_param_names_and_values:
         if self.CompyledFunc is None:
             self.compile()
         return self.CompyledFunc(var_and_param_names_and_values)
     elif isinstance(self.Mapping, MathDict):
         return self.Mapping()
     else:
         return self.Mapping
Beispiel #2
0
def gauss_neg_log_dens(pdf, var_and_param_names_and_values={}, **kw_var_and_param_names_and_values):
    var_and_param_names_and_values = combine_dict_and_kwargs(var_and_param_names_and_values,
                                                             kw_var_and_param_names_and_values)
    if not pdf.PreProcessed:
        pdf.preprocess()
    if pdf.LogDetCov is None:
        neg_log_dens = (pdf.NumDims * log(2 * pi) + log(det(pdf.Cov)) +
                        det(pdf.DemeanedVarVector * pdf.Cov.inverse() * pdf.DemeanedVarVector.T)) / 2
    else:
        neg_log_dens = (pdf.NumDims * log(2 * pi) + pdf.LogDetCov +
                        det(pdf.DemeanedVarVector * Matrix(pdf.InvCov) * pdf.DemeanedVarVector.T)) / 2
    return sympy_xreplace(neg_log_dens, var_and_param_names_and_values)
Beispiel #3
0
def gauss_neg_log_dens(pdf, var_and_param_names_and_values={}, **kw_var_and_param_names_and_values):
    var_and_param_names_and_values = combine_dict_and_kwargs(var_and_param_names_and_values,
                                                             kw_var_and_param_names_and_values)
    if not pdf.PreProcessed:
        pdf.preprocess()
    if pdf.LogDetCov is None:
        neg_log_dens = (pdf.NumDims * log(2 * pi) + log(det(pdf.Cov)) +
                        det(pdf.DemeanedVarVector * pdf.Cov.inverse() * pdf.DemeanedVarVector.T)) / 2
    else:
        neg_log_dens = (pdf.NumDims * log(2 * pi) + pdf.LogDetCov +
                        det(pdf.DemeanedVarVector * Matrix(pdf.InvCov) * pdf.DemeanedVarVector.T)) / 2
    return sympy_xreplace(neg_log_dens, var_and_param_names_and_values)
 def __call__(self, var_names_and_values={}, **kw_var_names_and_values):
     if isinstance(self.Compyled, float):
         return self.Compyled
     else:
         var_names_and_values = combine_dict_and_kwargs(var_names_and_values, kw_var_names_and_values)
         if hasattr(self.Compyled, 'keys'):
             d = self.Compyled.copy()
             for k, v in d:
                 d[k] = v(var_names_and_values=var_names_and_values)
             return d
         else:
             return self.Compyled(*(var_names_and_values[var] for var in self.Vars))
Beispiel #5
0
 def cond(self, conds={}, **kw_conds):
     conds = combine_dict_and_kwargs(conds, kw_conds)
     mapping = {}
     s0 = set(conds.items())
     for vars_and_values___frozen_dict, func_value in self.Mapping().items():
         s = set(vars_and_values___frozen_dict.items())
         if s >= s0:
             mapping[frozendict(s - s0)] = func_value
     new_conds = self.Cond.copy()
     new_conds.update(conds)
     new_scope = self.Scope.copy()
     for var in conds:
         del new_scope[var]
     return MathFunc(self.Vars.copy(), mapping, cond=new_conds, scope=new_scope)
Beispiel #6
0
 def __call__(self, var_names_and_values={}, **kw_var_names_and_values):
     if isinstance(self.Compyled, float):
         return self.Compyled
     else:
         var_names_and_values = combine_dict_and_kwargs(
             var_names_and_values, kw_var_names_and_values)
         if hasattr(self.Compyled, 'keys'):
             d = self.Compyled.copy()
             for k, v in d:
                 d[k] = v(var_names_and_values=var_names_and_values)
             return d
         else:
             return self.Compyled(*(var_names_and_values[var]
                                    for var in self.Vars))
Beispiel #7
0
def discrete_finite_cond(pmf, cond={}, **kw_cond):
    cond = combine_dict_and_kwargs(cond, kw_cond)
    mappings = pmf.Param['NegLogP'].copy()
    d = {}
    s0 = set(cond.items())
    for var_values___frozen_dict, mapping_value in list(mappings.items()):
        s = set(var_values___frozen_dict.items())
        if s >= s0:
            d[frozendict(s - s0)] = mapping_value
    new_cond = deepcopy(pmf.Cond)
    new_cond.update(cond)
    scope = deepcopy(pmf.Scope)
    for var in cond:
        del scope[var]
    return DiscreteFinitePMF(pmf.Vars.copy(), d, cond=new_cond, scope=scope, p=False)
Beispiel #8
0
def discrete_finite_cond(pmf, cond={}, **kw_cond):
    cond = combine_dict_and_kwargs(cond, kw_cond)
    mappings = pmf.Param['NegLogP'].copy()
    d = {}
    s0 = set(cond.items())
    for var_values___frozen_dict, mapping_value in mappings.items():
        s = set(var_values___frozen_dict.items())
        if s >= s0:
            d[frozendict(s - s0)] = mapping_value
    new_cond = deepcopy(pmf.Cond)
    new_cond.update(cond)
    scope = deepcopy(pmf.Scope)
    for var in cond:
        del scope[var]
    return DiscreteFinitePMF(pmf.Vars.copy(), d, cond=new_cond, scope=scope, p=False)
Beispiel #9
0
    def at(self, var_and_param_names_and_values={}, **kw_var_and_param_names_and_values):
        var_and_param_names_and_values =\
            combine_dict_and_kwargs(var_and_param_names_and_values, kw_var_and_param_names_and_values)

        cond = deepcopy(self.Cond)   # just to be careful
        scope = deepcopy(self.Scope)   # just to be careful
        param = self.Param.copy()
        syms_and_values = {}
        for var, value in list(var_and_param_names_and_values.items()):
            if var in self.Vars:
                if var in cond:
                    cond[var] = value
                if var in scope:
                    scope[var] = value
                syms_and_values[self.Vars[var]] = value
            if var in param:
                try:
                    syms_and_values[param[var]] = value
                except:
                    pass
                param[var] = value

        cond = sympy_xreplace(cond, syms_and_values)
        scope = sympy_xreplace(scope, syms_and_values)

        self.CompyledFunc = None   # remove compiled version because many things can be changing

        if self.is_discrete_finite():
            neg_log_p = {}
            s = set(var_and_param_names_and_values)
            s_items = set(var_and_param_names_and_values.items())
            for var_values___frozen_dict, mapping_value in list(param['NegLogP'].items()):
                other_items___dict = dict(set(var_values___frozen_dict.items()) - s_items)
                if not (set(other_items___dict) & s):
                    neg_log_p[frozendict(set(var_values___frozen_dict.items()) - set(cond.items()))] =\
                        sympy_xreplace(mapping_value, syms_and_values)
            return DiscreteFinitePMF(var_names_and_syms=self.Vars.copy(), p_or_neg_log_p=neg_log_p, p=False,
                                     cond=cond, scope=scope)
        else:
            pdf = self.copy()
            pdf.Cond = cond
            pdf.Scope = scope
            pdf.Param = sympy_xreplace(param, syms_and_values)
            #print(pdf.Mapping)
            #print(syms_and_values)
            #print(type(syms_and_values.keys().pop()))
            pdf.Mapping = sympy_xreplace(pdf.Mapping, syms_and_values)
            return pdf
Beispiel #10
0
    def at(self, var_and_param_names_and_values={}, **kw_var_and_param_names_and_values):
        var_and_param_names_and_values =\
            combine_dict_and_kwargs(var_and_param_names_and_values, kw_var_and_param_names_and_values)

        cond = deepcopy(self.Cond)   # just to be careful
        scope = deepcopy(self.Scope)   # just to be careful
        param = self.Param.copy()
        syms_and_values = {}
        for var, value in var_and_param_names_and_values.items():
            if var in self.Vars:
                if var in cond:
                    cond[var] = value
                if var in scope:
                    scope[var] = value
                syms_and_values[self.Vars[var]] = value
            if var in param:
                try:
                    syms_and_values[param[var]] = value
                except:
                    pass
                param[var] = value

        cond = sympy_xreplace(cond, syms_and_values)
        scope = sympy_xreplace(scope, syms_and_values)

        self.CompyledFunc = None   # remove compiled version because many things can be changing

        if self.is_discrete_finite():
            neg_log_p = {}
            s = set(var_and_param_names_and_values)
            s_items = set(var_and_param_names_and_values.items())
            for var_values___frozen_dict, mapping_value in param['NegLogP'].items():
                other_items___dict = dict(set(var_values___frozen_dict.items()) - s_items)
                if not (set(other_items___dict) & s):
                    neg_log_p[frozendict(set(var_values___frozen_dict.items()) - set(cond.items()))] =\
                        sympy_xreplace(mapping_value, syms_and_values)
            return DiscreteFinitePMF(var_names_and_syms=self.Vars.copy(), p_or_neg_log_p=neg_log_p, p=False,
                                     cond=cond, scope=scope)
        else:
            pdf = self.copy()
            pdf.Cond = cond
            pdf.Scope = scope
            pdf.Param = sympy_xreplace(param, syms_and_values)
            #print(pdf.Mapping)
            #print(syms_and_values)
            #print(type(syms_and_values.keys().pop()))
            pdf.Mapping = sympy_xreplace(pdf.Mapping, syms_and_values)
            return pdf
Beispiel #11
0
 def at(self, vars_and_values___dict={}, **kw_vars_and_values___dict):
     vars_and_values___dict = combine_dict_and_kwargs(vars_and_values___dict, kw_vars_and_values___dict)
     for var in (set(self.Vars) & set(vars_and_values___dict)):
         vars_and_values___dict[self.Vars[var]] = vars_and_values___dict[var]
     conds = self.Cond.copy()
     scope = self.Scope.copy()
     for var, value in vars_and_values___dict.items():
         if var in conds:
             conds.update({var: value})
         if var in scope:
             scope.update({var: value})
     conds = sympy_xreplace(conds, vars_and_values___dict)
     scope = sympy_xreplace(scope, vars_and_values___dict)
     if hasattr(self.Mapping, 'keys'):
         mapping = {}
         for vars_and_values___frozen_dict, func_value in self.Mapping.items():
             other_items___dict = dict(set(vars_and_values___frozen_dict.items()) -
                                       set(vars_and_values___dict.items()))
             if not (set(other_items___dict) and set(vars_and_values___dict)):
                 mapping[frozendict(set(vars_and_values___frozen_dict.items()) - set(conds.items()))] =\
                     sympy_xreplace(func_value, vars_and_values___dict)
     else:
         mapping = sympy_xreplace(self.Mapping, vars_and_values___dict)
     return MathFunc(self.Vars.copy(), mapping, cond=conds, scope=scope)
Beispiel #12
0
def gauss_cond(pdf, cond={}, **kw_cond):
    cond = combine_dict_and_kwargs(cond, kw_cond)
    new_cond = pdf.Cond.copy()
    new_cond.update(cond)
    scope = pdf.Scope.copy()
    for var in cond:
        del scope[var]
    point_cond = {}
    for var, value in list(cond.items()):
        if value is not None:
            point_cond[pdf.Vars[var]] = value
    cond_vars = tuple(cond)
    num_cond_vars = len(cond_vars)
    scope_vars = tuple(set(pdf.VarsList) - set(cond))
    num_scope_vars = len(scope_vars)
    x_c = BlockMatrix((tuple(pdf.Vars[cond_var] for cond_var in cond_vars),))
    m_c = BlockMatrix((tuple(pdf.Param[('Mean', cond_var)] for cond_var in cond_vars),))
    m_s = BlockMatrix((tuple(pdf.Param[('Mean', scope_var)] for scope_var in scope_vars),))

    S_c = [num_cond_vars * [None] for _ in range(num_cond_vars)]   # careful not to create same mutable object
    for i in range(num_cond_vars):
        for j in range(i):
            if ('Cov', cond_vars[i], cond_vars[j]) in pdf.Param:
                S_c[i][j] = pdf.Param[('Cov', cond_vars[i], cond_vars[j])]
                S_c[j][i] = S_c[i][j].T
            else:
                S_c[j][i] = pdf.Param[('Cov', cond_vars[j], cond_vars[i])]
                S_c[i][j] = S_c[j][i].T
        S_c[i][i] = pdf.Param[('Cov', cond_vars[i])]
    S_c = BlockMatrix(S_c)

    S_s = [num_scope_vars * [None] for _ in range(num_scope_vars)]   # careful not to create same mutable object
    for i in range(num_scope_vars):
        for j in range(i):
            if ('Cov', scope_vars[i], scope_vars[j]) in pdf.Param:
                S_s[i][j] = pdf.Param[('Cov', scope_vars[i], scope_vars[j])]
                S_s[j][i] = S_s[i][j].T
            else:
                S_s[j][i] = pdf.Param[('Cov', scope_vars[j], scope_vars[i])]
                S_s[i][j] = S_s[j][i].T
        S_s[i][i] = pdf.Param[('Cov', scope_vars[i])]
    S_s = BlockMatrix(S_s)

    S_cs = [num_scope_vars * [None] for _ in range(num_cond_vars)]   # careful not to create same mutable object
    for i, j in product(list(range(num_cond_vars)), list(range(num_scope_vars))):
        if ('Cov', cond_vars[i], scope_vars[j]) in pdf.Param:
            S_cs[i][j] = pdf.Param[('Cov', cond_vars[i], scope_vars[j])]
        else:
            S_cs[i][j] = pdf.Param[('Cov', scope_vars[j], cond_vars[i])].T
    S_cs = BlockMatrix(S_cs)
    S_sc = S_cs.T

    m = (m_s + (x_c - m_c) * S_c.inverse() * S_cs).xreplace(point_cond)
    S = S_s - S_sc * S_c.inverse() * S_cs

    param = {}
    index_ranges_from = []
    index_ranges_to = []
    k = 0
    for i in range(num_scope_vars):
        l = k + pdf.Vars[scope_vars[i]].shape[1]
        index_ranges_from += [k]
        index_ranges_to += [l]
        param[('Mean', scope_vars[i])] = m[0, index_ranges_from[i]:index_ranges_to[i]]
        for j in range(i):
            param[('Cov', scope_vars[j], scope_vars[i])] =\
                S[index_ranges_from[j]:index_ranges_to[j], index_ranges_from[i]:index_ranges_to[i]]
        param[('Cov', scope_vars[i])] =\
            S[index_ranges_from[i]:index_ranges_to[i], index_ranges_from[i]:index_ranges_to[i]]
        k = l

    return GaussPDF(var_names_and_syms=pdf.Vars.copy(), param=param, cond=new_cond, scope=scope)
Beispiel #13
0
 def cond(self, cond={}, **kw_cond):
     cond = combine_dict_and_kwargs(cond, kw_cond)
     return self.CondFunc(self, cond)
Beispiel #14
0
def gauss_cond(pdf, cond={}, **kw_cond):
    cond = combine_dict_and_kwargs(cond, kw_cond)
    new_cond = pdf.Cond.copy()
    new_cond.update(cond)
    scope = pdf.Scope.copy()
    for var in cond:
        del scope[var]
    point_cond = {}
    for var, value in cond.items():
        if value is not None:
            point_cond[pdf.Vars[var]] = value
    cond_vars = tuple(cond)
    num_cond_vars = len(cond_vars)
    scope_vars = tuple(set(pdf.VarsList) - set(cond))
    num_scope_vars = len(scope_vars)
    x_c = BlockMatrix((tuple(pdf.Vars[cond_var] for cond_var in cond_vars),))
    m_c = BlockMatrix((tuple(pdf.Param[('Mean', cond_var)] for cond_var in cond_vars),))
    m_s = BlockMatrix((tuple(pdf.Param[('Mean', scope_var)] for scope_var in scope_vars),))

    S_c = [num_cond_vars * [None] for _ in range(num_cond_vars)]   # careful not to create same mutable object
    for i in range(num_cond_vars):
        for j in range(i):
            if ('Cov', cond_vars[i], cond_vars[j]) in pdf.Param:
                S_c[i][j] = pdf.Param[('Cov', cond_vars[i], cond_vars[j])]
                S_c[j][i] = S_c[i][j].T
            else:
                S_c[j][i] = pdf.Param[('Cov', cond_vars[j], cond_vars[i])]
                S_c[i][j] = S_c[j][i].T
        S_c[i][i] = pdf.Param[('Cov', cond_vars[i])]
    S_c = BlockMatrix(S_c)

    S_s = [num_scope_vars * [None] for _ in range(num_scope_vars)]   # careful not to create same mutable object
    for i in range(num_scope_vars):
        for j in range(i):
            if ('Cov', scope_vars[i], scope_vars[j]) in pdf.Param:
                S_s[i][j] = pdf.Param[('Cov', scope_vars[i], scope_vars[j])]
                S_s[j][i] = S_s[i][j].T
            else:
                S_s[j][i] = pdf.Param[('Cov', scope_vars[j], scope_vars[i])]
                S_s[i][j] = S_s[j][i].T
        S_s[i][i] = pdf.Param[('Cov', scope_vars[i])]
    S_s = BlockMatrix(S_s)

    S_cs = [num_scope_vars * [None] for _ in range(num_cond_vars)]   # careful not to create same mutable object
    for i, j in product(range(num_cond_vars), range(num_scope_vars)):
        if ('Cov', cond_vars[i], scope_vars[j]) in pdf.Param:
            S_cs[i][j] = pdf.Param[('Cov', cond_vars[i], scope_vars[j])]
        else:
            S_cs[i][j] = pdf.Param[('Cov', scope_vars[j], cond_vars[i])].T
    S_cs = BlockMatrix(S_cs)
    S_sc = S_cs.T

    m = (m_s + (x_c - m_c) * S_c.inverse() * S_cs).xreplace(point_cond)
    S = S_s - S_sc * S_c.inverse() * S_cs

    param = {}
    index_ranges_from = []
    index_ranges_to = []
    k = 0
    for i in range(num_scope_vars):
        l = k + pdf.Vars[scope_vars[i]].shape[1]
        index_ranges_from += [k]
        index_ranges_to += [l]
        param[('Mean', scope_vars[i])] = m[0, index_ranges_from[i]:index_ranges_to[i]]
        for j in range(i):
            param[('Cov', scope_vars[j], scope_vars[i])] =\
                S[index_ranges_from[j]:index_ranges_to[j], index_ranges_from[i]:index_ranges_to[i]]
        param[('Cov', scope_vars[i])] =\
            S[index_ranges_from[i]:index_ranges_to[i], index_ranges_from[i]:index_ranges_to[i]]
        k = l

    return GaussPDF(var_names_and_syms=pdf.Vars.copy(), param=param, cond=new_cond, scope=scope)
Beispiel #15
0
 def cond(self, cond={}, **kw_cond):
     cond = combine_dict_and_kwargs(cond, kw_cond)
     return self.CondFunc(self, cond)