Esempio n. 1
0
def ve(Phi, q, E, Z, m):
    for z in Z:
        Phi = eliminate(Phi, z, E, m)
    q.value = True
    S = reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi])
    q.value = False
    T = reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi])
    w_X[q.name] = S/(S + T)
    return S + T
Esempio n. 2
0
def weighted_sample(model, evidence, tobn):
    w = 1
    for node in tobn:
        if node in evidence:
            w = w * bn.likelihood(model[node])
        else:
            model[node].random()
    return w
Esempio n. 3
0
def draw_sample():
    global m, tobn
    f = g = 0
    for node in tobn:
        if not node.name in e:
            node.random()
            n = m[node.name]
            n.value = node.value
            f += math.log(bn.likelihood(node))
            g += math.log(bn.likelihood(n))
    f = math.exp(f)
    g = math.exp(g)
    g *= reduce(mul, [bn.likelihood(m[node]) for node in e])
    if g == 0:
        return bn.as_sample(m), 0, 0
    else:
        return bn.as_sample(m), g, f
Esempio n. 4
0
def p(phi, query):
    global w_X
    result = 0
    if phi:
        head = bndict[phi.pop(0)]
        if str(head) in e:
            m[head].value = e[str(head)]
            result = bayesnet.likelihood(m[head]) * p(list(phi), query)
        else:
            m[head].value = True
            tmp = bayesnet.likelihood(m[head]) * p(list(phi), query)

            m[head].value = False
            result = tmp + bayesnet.likelihood(m[head]) * p(list(phi), query) 
            
            if m[head].name == query:
                w_X[m[head].name][0] = result - tmp
                w_X[m[head].name][1] = tmp
        return result
    else:
        return 1
Esempio n. 5
0
 def lam(z=z):
     z.value = True
     s = reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi_1])
     z.value = False
     t = s + reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi_1])
     return t
Esempio n. 6
0
def init(X, evidence, model):
    t0 = time.time()
    # global types
    global N, Y, MB, O, iteration, M, tobn, nonev, mnonev, rnodes, roots, observables, E, M, enodes
    N = { str(x): [0, 0] for x in X }
    Y = { str(x): [] for x in X }
    enodes = [model[e] for e in evidence]
    M = model
    EC = []

    #init important sets
    tobn = bn.topo_ordered(model)
    nonev = [node for node in tobn if node not in evidence]
    mnonev = [model[n] for n in nonev]
    rnodes = [model[x] for x in X]
    roots = [r for r in bn.roots(model)]

    MB = { str(x): [] for x in tobn if x not in evidence }

    # init net
    # the initial net might be improper as likelihood of evidence nodes can be 0
    for e in evidence:
        model[e].value = evidence[e]
        for p in model[e].parents:
            if p in evidence:
                continue
            par = model[p]
            par.value = True
            if MB[p] == []:
                MB[p] = [model[c] for c in par.children]
            if p in nonev:
                nonev.remove(p)
        #if bn.likelihood(n) == 0:
        #    print "still something wrong with initialization at node " + node

    for node in nonev:
        n = model[node]
        # P = [0]*2
        # prod = 1
        # if n.children and MB[node] == []:
        #     MB[node] = [model[c] for c in n.children]
        # if n.children:
        #     EC = [model[e] for e in n.children if e in evidence]
        #     if EC == []:
        #         n.random()
        #         continue
        #     else:
        #         n.value = True
        #         if bn.likelihood(n) == 0:
        #             print n.name
        #             n.value = False
        #             continue
        #         print "here"
        #         P[0] = log(bn.likelihood(n))
        #         for e in EC:
        #             if e.name == 'v':
        #                 print bn.likelihood(e)
        #             if bn.likelihood(e) == 0:
        #                 n.value = False
        #                 break
        #             P[0] += log(bn.likelihood(e))
        #         else:
        #             n.value = False
        #             if bn.likelihood(n) == 0:
        #                 n.value = True
        #                 continue
        #             P[1] = log(bn.likelihood(n))
        #             for e in EC:
        #                 if bn.likelihood(e) == 0:
        #                     n.value = True
        #                     break
        #                 P[1] += log(bn.likelihood(e))
        #             else:
        #                 likelihood = exp(P[0]) / (exp(P[0]) + exp(P[1]))
        #                 if likelihood > random.random():
        #                     n.value = True
        #                 else:
        #                     n.value = False
        
        # if random.random() > .5:
        #     n.value = True
        # else:
        #     n.value = False
        if n.children != [] and MB[node] == []:
            MB[node] = [model[c] for c in n.children]
        #n.random()
        n.value = True

    for node in tobn:
        n = model[node]
        if node not in evidence:
            flip_mb(n)
        else:
            if bn.likelihood(n) == 0:
                print "straaaaaange " + node

    print "time to init: " + str(time.time() - t0)

    return
Esempio n. 7
0
def flip_mb(node):
    P = [0]*2

    #if node.name == 'alc':
    #    print bn.likelihood(node)

    #print node.name
    if node.children:
        # P( node | pa( node ) ) * \prod_{c \in ch( node )} P( c | pa( c ) )
        node.value = True
        
        # check if this is impossible
        if bn.likelihood(node) == 0:
            #print "Set " + node.name + " = False: P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node))
            node.value = False
            #print "---> P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node))
            return 0
        else:
            P[0] = log(bn.likelihood(node))

        # ...also for all children
        for n in MB[node.name]:
            if bn.likelihood(n) == 0:
                #print "Set " + node.name + " = False: P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents }) + " ) = " + str(bn.likelihood(n))
                node.value = False
                #print "---> P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents }) + " ) = " + str(bn.likelihood(n))
                return 1
            else:
                P[0] += log(bn.likelihood(n))

        # for normalization 
        node.value = False

        # check if this is impossible
        if bn.likelihood(node) == 0:
            #print "Set " + node.name + " = True: P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node))
            node.value = True
            #print "---> P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node))
            return 2
        else:
            P[1] = log(bn.likelihood(node))

        # ...also for all children
        for n in MB[node.name]:
            if bn.likelihood(n) == 0:
                #print "Set " + node.name + " = True: P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents}) + " ) = " + str(bn.likelihood(n))
                node.value = True
                #print "---> P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents }) + " ) = " + str(bn.likelihood(n))
                return 3
            else:
                P[1] += log(bn.likelihood(n))

        #print iteration
        #print "case 4, " + node.name + " " + str(exp(P[0]) + exp(P[1]))
        likelihood = exp(P[0]) / (exp(P[0]) + exp(P[1]))
        #print "P( "+ node.name + " | " + str({M[p].name: M[p].value for p in node.parents}) + str({c.name: c.value for c in MB[node.name]}) + " ) = " + str(likelihood)
        if likelihood > random.random():
            node.value = True
        else:
            node.value = False
        return 4
    else:
        node.random()
        return 5