In [20]:
from scipy2015_cbnx_demo_code import *

Defining Operations over sets of graphs


In [21]:
nodes=["a","b","c","d"]
known_ancestral_relations = [("a","b"),("a","c"),("a","d")]
orphan_nodes = ["a"]

In [22]:
G = completeDiGraph(nodes)

c1 = create_path_complete_condition(known_ancestral_relations)
c2 = create_no_input_node_condition(orphan_nodes)
c3 = create_no_self_loops_condition()

graph_set = conditionalSubgraphs(G,[c1,c2,c3])

len(list(graph_set))


Out[22]:
304

In [23]:
""" Use filters! They speed up the process.
"""

G = completeDiGraph(nodes)

f1 = extract_remove_self_loops()
G_filtered = filter_Graph(G,[f1])

c1 = create_path_complete_condition(known_ancestral_relations)
c2 = create_no_input_node_condition(orphan_nodes)
graph_set = conditionalSubgraphs(G_filtered,[c1,c2])

len(list(graph_set))


Out[23]:
304

Bayesian Network format and sampler


In [ ]:
from scipy2015_cbnx_demo_code import *

In [24]:
node_prop_list = [
    
    ("rain", {
        "state_space":("yes","no"), 
        "sample_function": "choice",
        "parents":[], 
        "distribution":[.2,.8]
     }),
    
    ("sprinkler",{
        "state_space":("on","off"),
        "sample_function": "choice",
        "parents":["rain"], 
        "distribution":{
            (("rain","yes"),):[.01,.99],
            (("rain","no"),):[.4,.6]}
     }),
    
    ("grass_wet",{
        "state_space":("wet","dry"),
        "sample_function": "choice",
        "parents":["rain","sprinkler"],
        "distribution":{
            (("rain","yes"),("sprinkler","on")):[.99,.01],
            (("rain","yes"),("sprinkler","off")):[.8,.2],
            (("rain","no"),("sprinkler","on")):[.9,.1],
            (("rain","no"),("sprinkler","off")):[0,1]}
     })
]

In [25]:
dist_dict = {"choice": np.random.choice}

edge_list = [
    ("sprinkler","grass_wet"),
    ("rain","sprinkler"),
    ("rain","grass_wet")
]

In [26]:
func_dictionary = dist_dict
k = 10000 # number of samples

G = nx.DiGraph()
G.clear()
G.add_edges_from(edge_list)
G.add_nodes_from(node_prop_list)
bn_sample = sample_from_graph(G,func_dictionary,k)


for key,value in bn_sample.items():
    print(str(key) + ": " + str(value),"\n")


grass_wet: ['wet' 'wet' 'dry' ..., 'dry' 'dry' 'wet'] 

rain: ['no' 'no' 'yes' ..., 'no' 'no' 'yes'] 

sprinkler: ['on' 'on' 'off' ..., 'off' 'off' 'off'] 


In [27]:
print_prob_est(bn_sample)


p̂(grass_wet=dry) = 0.5457 ± 7.39e-03
p̂(grass_wet=wet) = 0.4543 ± 6.74e-03


p̂(rain=no) = 0.7983 ± 8.93e-03
p̂(rain=yes) = 0.2017 ± 4.49e-03


p̂(sprinkler=off) = 0.6762 ± 8.22e-03
p̂(sprinkler=on) = 0.3238 ± 5.69e-03



In [ ]: