message[BN.vars[var].index(vals_assignment[tgt_index])] += factor.funct(vals_assignment) * prod_value incoming_messages[var][edges[var].index(factor)] = np.array(copy.copy(message)) #put the message in the "queue" #move messages from incoming_messages to states for var in incoming_messages: states[var] = copy.copy(incoming_messages[var]) for vect in states[var]: #normalize the vectors vect = (1.0/sum(vect))*vect #our final states are just a product of all of the state vectors for each var distributions = {} for var in states: dist = np.array([1 for _ in xrange(len(BN.vars[var]))]) for vect in states[var]: dist = dist * vect distributions[var] = [x/float(sum(dist)) for x in dist] #write our results to a file f = open(output, "w") for var in BN.vars_in_order: f.write("{} ".format(var)) for n in distributions[var]: f.write("{} ".format(n)) f.write("\n") f.close() if __name__== '__main__': net_name = sys.argv[1] net = BNet(net_name) sum_product(net, output = "{}-results.txt".format(net_name.replace(".bif", "")))