Added example_sprinkler.py, a python port of examples/example_sprinkler.cpp and added...
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Tue, 13 Oct 2009 14:39:41 +0000 (16:39 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Tue, 13 Oct 2009 14:39:41 +0000 (16:39 +0200)
python/Makefile
python/dai.i
python/example_sprinkler.py [new file with mode: 0644]
python/test.py

index fef22fb..6dfc7a4 100644 (file)
@@ -1,3 +1,12 @@
+# This file is part of libDAI - http://www.libdai.org/
+#
+# libDAI is licensed under the terms of the GNU General Public License version
+# 2, or (at your option) any later version. libDAI is distributed without any
+# warranty. See the file COPYING for more details.
+#
+# Copyright (C) 2009  Patrick Pletscher  [pletscher at inf dot ethz dot ch]
+
+
 include ../Makefile.conf
 
 .PHONY:        all
 include ../Makefile.conf
 
 .PHONY:        all
@@ -12,4 +21,4 @@ _dai.so:              ../lib/libdai.a dai.i
 .PHONY: clean
 
 clean:         
 .PHONY: clean
 
 clean:         
-                       rm -f dai_wrap.cxx dai_wrap.o _dai.so dai.py dai.pyc
+                       rm -f dai_wrap.cxx dai_wrap.o _dai.so dai.py dai.pyc sprinkler.fg
index 3fe7db5..cfdfe85 100644 (file)
@@ -1,3 +1,13 @@
+/*  This file is part of libDAI - http://www.libdai.org/
+ *
+ *  libDAI is licensed under the terms of the GNU General Public License version
+ *  2, or (at your option) any later version. libDAI is distributed without any
+ *  warranty. See the file COPYING for more details.
+ *
+ *  Copyright (C) 2009  Patrick Pletscher  [pletscher at inf dot ethz dot ch]
+ */
+
+
 %module dai
 
         struct Neighbor {
 %module dai
 
         struct Neighbor {
 %include "../include/dai/smallset.h"
 %template(SmallSetVar) dai::SmallSet< dai::Var >;
 %include "../include/dai/varset.h"
 %include "../include/dai/smallset.h"
 %template(SmallSetVar) dai::SmallSet< dai::Var >;
 %include "../include/dai/varset.h"
+%extend dai::VarSet {
+        inline void append(const dai::Var &v) { (*self) |= v; }
+};
+
 %include "../include/dai/prob.h"
 %template(Prob) dai::TProb<Real>;
 %extend dai::TProb<Real> {
 %include "../include/dai/prob.h"
 %template(Prob) dai::TProb<Real>;
 %extend dai::TProb<Real> {
diff --git a/python/example_sprinkler.py b/python/example_sprinkler.py
new file mode 100644 (file)
index 0000000..a94a795
--- /dev/null
@@ -0,0 +1,83 @@
+# This file is part of libDAI - http://www.libdai.org/
+#
+# libDAI is licensed under the terms of the GNU General Public License version
+# 2, or (at your option) any later version. libDAI is distributed without any
+# warranty. See the file COPYING for more details.
+#
+# Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
+
+
+# This example program illustrates how to construct a factorgraph
+# by means of the sprinkler network example discussed at
+# http://www.cs.ubc.ca/~murphyk/Bayes/bnintro.html
+# using the SWIG python wrapper of libDAI
+
+
+import dai
+
+C = dai.Var(0, 2)  # Define binary variable Cloudy (with label 0)
+S = dai.Var(1, 2)  # Define binary variable Sprinkler (with label 1)
+R = dai.Var(2, 2)  # Define binary variable Rain (with label 2)
+W = dai.Var(3, 2)  # Define binary variable Wetgrass (with label 3)
+
+# Define probability distribution for C
+P_C = dai.Factor(C)
+P_C[0] = 0.5            # C = 0
+P_C[1] = 0.5            # C = 1
+
+# Define conditional probability of S given C
+P_S_given_C = dai.Factor(dai.VarSet(S,C))
+P_S_given_C[0] = 0.5    # C = 0, S = 0
+P_S_given_C[1] = 0.9    # C = 1, S = 0
+P_S_given_C[2] = 0.5    # C = 0, S = 1
+P_S_given_C[3] = 0.1    # C = 1, S = 1
+
+# Define conditional probability of R given C
+P_R_given_C = dai.Factor(dai.VarSet(R,C))
+P_R_given_C[0] = 0.8    # C = 0, R = 0
+P_R_given_C[1] = 0.2    # C = 1, R = 0
+P_R_given_C[2] = 0.2    # C = 0, R = 1
+P_R_given_C[3] = 0.8    # C = 1, R = 1
+
+# Define conditional probability of W given S and R
+SRW = dai.VarSet(S,R)
+SRW.append(W)
+P_W_given_S_R = dai.Factor(SRW)
+P_W_given_S_R[0] = 1.0  # S = 0, R = 0, W = 0
+P_W_given_S_R[1] = 0.1  # S = 1, R = 0, W = 0
+P_W_given_S_R[2] = 0.1  # S = 0, R = 1, W = 0
+P_W_given_S_R[3] = 0.01 # S = 1, R = 1, W = 0
+P_W_given_S_R[4] = 0.0  # S = 0, R = 0, W = 1
+P_W_given_S_R[5] = 0.9  # S = 1, R = 0, W = 1
+P_W_given_S_R[6] = 0.9  # S = 0, R = 1, W = 1
+P_W_given_S_R[7] = 0.99 # S = 1, R = 1, W = 1
+
+# Build factor graph consisting of those four factors
+SprinklerFactors = dai.VecFactor()
+SprinklerFactors.append(P_C)
+SprinklerFactors.append(P_R_given_C)
+SprinklerFactors.append(P_S_given_C)
+SprinklerFactors.append(P_W_given_S_R)
+SprinklerNetwork = dai.FactorGraph(SprinklerFactors)
+
+# Write factorgraph to a file
+SprinklerNetwork.WriteToFile('sprinkler.fg')
+
+# Reread the factorgraph from the file
+SprinklerNetwork.ReadFromFile('sprinkler.fg')
+
+# Output some information about the factorgraph
+print SprinklerNetwork.nrVars(), 'variables'
+print SprinklerNetwork.nrFactors(), 'factors'
+
+# Calculate joint probability of all four variables
+P = dai.Factor()
+for I in range(SprinklerNetwork.nrFactors()):
+    P *= SprinklerNetwork.factor(I)
+P.normalize()  # Not necessary: a Bayesian network is already normalized by definition
+
+# Calculate some probabilities
+denom = P.marginal(dai.VarSet(W))[1]
+print 'P(W=1) =', denom
+print 'P(S=1 | W=1) =', P.marginal(dai.VarSet(S,W))[3] / denom
+print 'P(R=1 | W=1) =', P.marginal(dai.VarSet(R,W))[3] / denom
index f8d9365..970efdc 100644 (file)
@@ -7,4 +7,3 @@ f = dai.Factor(vs)
 fVec = dai.VecFactor()
 fVec.append(f)
 fg = dai.FactorGraph(fVec)
 fVec = dai.VecFactor()
 fVec.append(f)
 fg = dai.FactorGraph(fVec)
-print fg.nrVars()