1 # This file is part of libDAI - http://www.libdai.org/
2 #
4 # 2, or (at your option) any later version. libDAI is distributed without any
5 # warranty. See the file COPYING for more details.
6 #
7 # Copyright (C) 2009 Joris Mooij [joris dot mooij at libdai dot org]
10 # This example program illustrates how to construct a factorgraph
11 # by means of the sprinkler network example discussed at
12 # http://www.cs.ubc.ca/~murphyk/Bayes/bnintro.html
13 # using the SWIG python wrapper of libDAI
16 import dai
18 C = dai.Var(0, 2) # Define binary variable Cloudy (with label 0)
19 S = dai.Var(1, 2) # Define binary variable Sprinkler (with label 1)
20 R = dai.Var(2, 2) # Define binary variable Rain (with label 2)
21 W = dai.Var(3, 2) # Define binary variable Wetgrass (with label 3)
23 # Define probability distribution for C
24 P_C = dai.Factor(C)
25 P_C = 0.5 # C = 0
26 P_C = 0.5 # C = 1
28 # Define conditional probability of S given C
29 P_S_given_C = dai.Factor(dai.VarSet(S,C))
30 P_S_given_C = 0.5 # C = 0, S = 0
31 P_S_given_C = 0.9 # C = 1, S = 0
32 P_S_given_C = 0.5 # C = 0, S = 1
33 P_S_given_C = 0.1 # C = 1, S = 1
35 # Define conditional probability of R given C
36 P_R_given_C = dai.Factor(dai.VarSet(R,C))
37 P_R_given_C = 0.8 # C = 0, R = 0
38 P_R_given_C = 0.2 # C = 1, R = 0
39 P_R_given_C = 0.2 # C = 0, R = 1
40 P_R_given_C = 0.8 # C = 1, R = 1
42 # Define conditional probability of W given S and R
43 SRW = dai.VarSet(S,R)
44 SRW.append(W)
45 P_W_given_S_R = dai.Factor(SRW)
46 P_W_given_S_R = 1.0 # S = 0, R = 0, W = 0
47 P_W_given_S_R = 0.1 # S = 1, R = 0, W = 0
48 P_W_given_S_R = 0.1 # S = 0, R = 1, W = 0
49 P_W_given_S_R = 0.01 # S = 1, R = 1, W = 0
50 P_W_given_S_R = 0.0 # S = 0, R = 0, W = 1
51 P_W_given_S_R = 0.9 # S = 1, R = 0, W = 1
52 P_W_given_S_R = 0.9 # S = 0, R = 1, W = 1
53 P_W_given_S_R = 0.99 # S = 1, R = 1, W = 1
55 # Build factor graph consisting of those four factors
56 SprinklerFactors = dai.VecFactor()
57 SprinklerFactors.append(P_C)
58 SprinklerFactors.append(P_R_given_C)
59 SprinklerFactors.append(P_S_given_C)
60 SprinklerFactors.append(P_W_given_S_R)
61 SprinklerNetwork = dai.FactorGraph(SprinklerFactors)
63 # Write factorgraph to a file
64 SprinklerNetwork.WriteToFile('sprinkler.fg')
65 print 'Sprinkler network written to sprinkler.fg'
67 # Output some information about the factorgraph
68 print SprinklerNetwork.nrVars(), 'variables'
69 print SprinklerNetwork.nrFactors(), 'factors'
71 # Calculate joint probability of all four variables
72 P = dai.Factor()
73 for I in range(SprinklerNetwork.nrFactors()):
74 P *= SprinklerNetwork.factor(I)
75 P.normalize() # Not necessary: a Bayesian network is already normalized by definition
77 # Calculate some probabilities
78 denom = P.marginal(dai.VarSet(W))
79 print 'P(W=1) =', denom
80 print 'P(S=1 | W=1) =', P.marginal(dai.VarSet(S,W)) / denom
81 print 'P(R=1 | W=1) =', P.marginal(dai.VarSet(R,W)) / denom