Added sprinkler example
authorJoris Mooij <joris@jorismooij.nl>
Fri, 6 Feb 2009 09:05:53 +0000 (10:05 +0100)
committerJoris Mooij <joris@jorismooij.nl>
Fri, 6 Feb 2009 09:05:53 +0000 (10:05 +0100)
Makefile
examples/example_sprinkler.cpp [new file with mode: 0644]
examples/example_sprinkler.dot [new file with mode: 0644]
examples/example_sprinkler.png [new file with mode: 0644]

index 367dcfa..0c71239 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -208,7 +208,7 @@ MEX:=$(MEX) $(CCLIB) $(CCINC) $(MEXFLAGS)
 
 all : $(TARGETS)
 
-examples : examples/example$(EE) examples/example_bipgraph$(EE) examples/example_varset$(EE)
+examples : examples/example$(EE) examples/example_bipgraph$(EE) examples/example_varset$(EE) examples/example_sprinkler$(EE)
 
 matlabs : matlab/dai$(ME) matlab/dai_readfg$(ME) matlab/dai_writefg$(ME) matlab/dai_potstrength$(ME)
 
@@ -290,6 +290,9 @@ examples/example_bipgraph$(EE) : examples/example_bipgraph.cpp $(HEADERS) $(LIB)
 examples/example_varset$(EE) : examples/example_varset.cpp $(HEADERS) $(LIB)/libdai$(LE)
        $(CC) $(CCO)examples/example_varset$(EE) examples/example_varset.cpp $(LIBS)
 
+examples/example_sprinkler$(EE) : examples/example_sprinkler.cpp $(HEADERS) $(LIB)/libdai$(LE)
+       $(CC) $(CCO)examples/example_sprinkler$(EE) examples/example_sprinkler.cpp $(LIBS)
+
 
 # TESTS
 ########
@@ -373,7 +376,7 @@ ifneq ($(OS),WINDOWS)
 clean :
        -rm *$(OE)
        -rm matlab/*$(ME)
-       -rm examples/example$(EE) examples/example_bipgraph$(EE) examples/example_varset$(EE)
+       -rm examples/example$(EE) examples/example_bipgraph$(EE) examples/example_varset$(EE) examples/example_sprinkler$(EE)
        -rm tests/testdai$(EE)
        -rm utils/fg2dot$(EE) utils/createfg$(EE) utils/fginfo$(EE)
        -rm -R doc
diff --git a/examples/example_sprinkler.cpp b/examples/example_sprinkler.cpp
new file mode 100644 (file)
index 0000000..84c62e4
--- /dev/null
@@ -0,0 +1,79 @@
+#include <dai/factorgraph.h>
+#include <iostream>
+
+using namespace std;
+using namespace dai;
+
+int main() {
+    // 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
+
+    Var C(0, 2);  // Define binary variable Cloudy (with label 0)
+    Var S(1, 2);  // Define binary variable Sprinkler (with label 1)
+    Var R(2, 2);  // Define binary variable Rain (with label 2)
+    Var W(3, 2);  // Define binary variable Wetgrass (with label 3)
+    // Define probability distribution for C
+    Factor P_C( C );
+    P_C[0] = 0.5;   // C = 0
+    P_C[1] = 0.5;   // C = 1
+
+    // Define conditional probability of S given C
+    Factor P_S_given_C( 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
+    Factor P_R_given_C( 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
+    Factor P_W_given_S_R( VarSet( S, R ) | W );
+    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
+    vector<Factor> SprinklerFactors;
+    SprinklerFactors.push_back( P_C );
+    SprinklerFactors.push_back( P_R_given_C );
+    SprinklerFactors.push_back( P_S_given_C );
+    SprinklerFactors.push_back( P_W_given_S_R );
+    FactorGraph SprinklerNetwork( 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
+    cout << SprinklerNetwork.nrVars() << " variables" << endl;
+    cout << SprinklerNetwork.nrFactors() << " factors" << endl;
+
+    // Calculate joint probability of all four variables
+    Factor P;
+    for( size_t I = 0; I < SprinklerNetwork.nrFactors(); I++ ) {
+        P *= SprinklerNetwork.factor( I );
+    }
+    // P.normalize();  // Not necessary: a Bayesian network is already normalized by definition
+
+    // Calculate some probabilities
+    double denom = P.marginal( W )[1];
+    cout << "P(W=1) = " << denom << endl;
+    cout << "P(S=1 | W=1) = " << P.marginal( VarSet( S, W ) )[3] / denom << endl;
+    cout << "P(R=1 | W=1) = " << P.marginal( VarSet( R, W ) )[3] / denom << endl;
+
+       return 0;
+}
diff --git a/examples/example_sprinkler.dot b/examples/example_sprinkler.dot
new file mode 100644 (file)
index 0000000..06536f7
--- /dev/null
@@ -0,0 +1,21 @@
+graph Sprinkler {
+  node[shape=circle];
+    C;
+    S;
+    R;
+    W;
+  node[shape=box];
+    f0 [label="P (C)"];
+    f1 [label="P (S|C)"];
+    f2 [label="P (R|C)"];
+    f3 [label="P (W|S,R)"];
+
+    f0 -- C;
+    f1 -- S;
+    f1 -- C;
+    f2 -- R;
+    f2 -- C;
+    f3 -- W;
+    f3 -- S;
+    f3 -- R;
+};
diff --git a/examples/example_sprinkler.png b/examples/example_sprinkler.png
new file mode 100644 (file)
index 0000000..3838fe3
Binary files /dev/null and b/examples/example_sprinkler.png differ