<< Click to Display Table of Contents >> Navigation: Tutorials > Tutorial 6: Dynamic model > Tutorial6.py |
import pysmile
# Tutorial6 creates a dynamic Bayesian network (DBN),
# performs the inference, then saves the model to disk.
class Tutorial6:
def __init__(self):
print("Starting Tutorial6...")
net = pysmile.Network()
loc = self.create_cpt_node(net,
"Location", "Location",
["Pittsburgh", "Sahara"],
160, 360)
rain = self.create_cpt_node(net,
"Rain", "Rain",
["true", "false"],
380, 240)
umb = self.create_cpt_node(net,
"Umbrella", "Umbrella",
["true", "false"],
300, 100)
net.set_node_temporal_type(rain, pysmile.NodeTemporalType.PLATE)
net.set_node_temporal_type(umb, pysmile.NodeTemporalType.PLATE)
net.add_arc(loc, rain)
net.add_temporal_arc(rain, rain, 1)
net.add_arc(rain, umb)
rain_def = [
0.7, # P(Rain=true |Location=Pittsburgh)
0.3, # P(Rain=false|Location=Pittsburgh)
0.01, # P(Rain=true |Location=Sahara)
0.99 # P(Rain=false|Location=Sahara)
]
net.set_node_definition(rain, rain_def)
rain_def_temporal = [
0.7, # P(Rain=true |Location=Pittsburgh,Rain[t-1]=true)
0.3, # P(Rain=false|Location=Pittsburgh,Rain[t-1]=true)
0.3, # P(Rain=true |Location=Pittsburgh,Rain[t-1]=false)
0.7, # P(Rain=false|Location=Pittsburgh,Rain[t-1]=false)
0.001, # P(Rain=true |Location=Sahara,Rain[t-1]=true)
0.999, # P(Rain=false|Location=Sahara,Rain[t-1]=true)
0.01, # P(Rain=true |Location=Sahara,Rain[t-1]=false)
0.99 # P(Rain=false|Location=Sahara,Rain[t-1]=false)
]
net.set_node_temporal_definition(rain, 1, rain_def_temporal)
umb_def = [
0.9, # P(Umbrella=true |Rain=true)
0.1, # P(Umbrella=false|Rain=true)
0.2, # P(Umbrella=true |Rain=false)
0.8 # P(Umbrella=false|Rain=false)
]
net.set_node_definition(umb, umb_def)
net.set_slice_count(5)
print("Performing update without evidence.")
self.update_and_show_temporal_results(net)
print("Setting Umbrella[t=1], to true and Umbrella[t=3] to false.")
net.set_temporal_evidence(umb, 1, 0)
net.set_temporal_evidence(umb, 3, 1)
self.update_and_show_temporal_results(net)
net.write_file("tutorial6.xdsl")
print("Tutorial6 complete: Network written to tutorial6.xsdl")
def update_and_show_temporal_results(self, net):
net.update_beliefs()
slice_count = net.get_slice_count()
for h in net.get_all_nodes():
if net.get_node_temporal_type(h) == pysmile.NodeTemporalType.PLATE:
outcome_count = net.get_outcome_count(h)
print("Temporal beliefs for " + net.get_node_id(h) + ":")
v = net.get_node_value(h)
for slice_idx in range(0, slice_count):
s = "\tt=" + str(slice_idx) + ":"
for i in range(0, outcome_count):
s = s + " " + str(v[slice_idx * outcome_count + i])
print(s)
print("")
def create_cpt_node(self, net, id, name, outcomes, x_pos, y_pos):
handle = net.add_node(pysmile.NodeType.CPT, id)
net.set_node_name(handle, name)
net.set_node_position(handle, x_pos, y_pos, 85, 55)
initial_outcome_count = net.get_outcome_count(handle)
for i in range(0, initial_outcome_count):
net.set_outcome_id(handle, i, outcomes[i])
for i in range(initial_outcome_count, len(outcomes)):
net.add_outcome(handle, outcomes[i])
return handle