diff --git a/gen-bn b/gen_bn similarity index 100% rename from gen-bn rename to gen_bn diff --git a/main.py b/main.py index 01981f0..9465f83 100644 --- a/main.py +++ b/main.py @@ -5,23 +5,74 @@ import json import random -from collections import defaultdict +import math +import sys +import os + +#pwd = os.getcwd() +#sys.path.append(pwd +'/gen-bn/') +#sys.path.append("./gen-bn") + +import gen_bn.gen_bn + +#from collections import defaultdict def main(): + #Generate a new BN. Specify type and number of nodes in network + gen_json("dag", 5) + + #Get our BN bayes_net = import_bayes() - ev = {"0" : True, "4" : True} - W = likelihood_weighting(1, ev, bayes_net, 10) + + #Generate random evidence + E = gen_ev(bayes_net) + + #Get W from LW + W = likelihood_weighting(1, E, bayes_net, 10) + + #Print if desired print() for key, value in W.items(): print(key, ' : ', value) +#Generate a new BN. +#Input: Type ("dag", or "polytree") +#Input: Number of nodes in the network +def gen_json(type, num_nodes): + os.chdir("./gen_bn") + os.system('python gen_bn.py' + ' ' + type + ' ' + str(num_nodes)) + #Import the BN from the json def import_bayes(): - with open ("gen-bn/bn.json") as json_file: + with open ("gen_bn/bn.json") as json_file: bayes_json = json.load(json_file) json_file.close() return bayes_json +#Generate a random set of evidence +def gen_ev(bayes_net): + total_nodes = len(bayes_net) + #Arbitrarily, let's only generate total_nodes/2 (rounded up) evidence variables at most, but at least 1 + num_ev = random.randint(1, int(math.ceil(total_nodes/2))) + fixed_ev = [] + #Go through and generate nodes that will be fixed + for i in range(num_ev): + fixed_var = random.randint(0, total_nodes-1) + if fixed_var not in fixed_ev: + fixed_ev.append(fixed_var) + #Now generate random values for the ev + #Randomly generate a double. >=0.5 will be "True", <0.5 will be "False" + E = {} + for i in fixed_ev: + val_p = random.random() + if val_p >= 0.5: + E[str(i)] = True + else: + E[str(i)] = False + + return E + + #Checks if node has parents def is_root(node, BN): return (BN[node]["parents"]) == []