85df931367b564665e97f228b7fd9ff9831efbb0
1 /* This file is part of libDAI - http://www.libdai.org/
3 * libDAI is licensed under the terms of the GNU General Public License version
4 * 2, or (at your option) any later version. libDAI is distributed without any
5 * warranty. See the file COPYING for more details.
7 * Copyright (C) 2008-2009 Joris Mooij [joris dot mooij at libdai dot org]
11 #include <dai/factorgraph.h>
18 // This example program illustrates how to construct a factorgraph
19 // by means of the sprinkler network example discussed at
20 // http://www.cs.ubc.ca/~murphyk/Bayes/bnintro.html
22 Var
C(0, 2); // Define binary variable Cloudy (with label 0)
23 Var
S(1, 2); // Define binary variable Sprinkler (with label 1)
24 Var
R(2, 2); // Define binary variable Rain (with label 2)
25 Var
W(3, 2); // Define binary variable Wetgrass (with label 3)
27 // Define probability distribution for C
29 P_C
[0] = 0.5; // C = 0
30 P_C
[1] = 0.5; // C = 1
32 // Define conditional probability of S given C
33 Factor
P_S_given_C( VarSet( S
, C
) );
34 P_S_given_C
[0] = 0.5; // C = 0, S = 0
35 P_S_given_C
[1] = 0.9; // C = 1, S = 0
36 P_S_given_C
[2] = 0.5; // C = 0, S = 1
37 P_S_given_C
[3] = 0.1; // C = 1, S = 1
39 // Define conditional probability of R given C
40 Factor
P_R_given_C( VarSet( R
, C
) );
41 P_R_given_C
[0] = 0.8; // C = 0, R = 0
42 P_R_given_C
[1] = 0.2; // C = 1, R = 0
43 P_R_given_C
[2] = 0.2; // C = 0, R = 1
44 P_R_given_C
[3] = 0.8; // C = 1, R = 1
46 // Define conditional probability of W given S and R
47 Factor
P_W_given_S_R( VarSet( S
, R
) | W
);
48 P_W_given_S_R
[0] = 1.0; // S = 0, R = 0, W = 0
49 P_W_given_S_R
[1] = 0.1; // S = 1, R = 0, W = 0
50 P_W_given_S_R
[2] = 0.1; // S = 0, R = 1, W = 0
51 P_W_given_S_R
[3] = 0.01; // S = 1, R = 1, W = 0
52 P_W_given_S_R
[4] = 0.0; // S = 0, R = 0, W = 1
53 P_W_given_S_R
[5] = 0.9; // S = 1, R = 0, W = 1
54 P_W_given_S_R
[6] = 0.9; // S = 0, R = 1, W = 1
55 P_W_given_S_R
[7] = 0.99; // S = 1, R = 1, W = 1
57 // Build factor graph consisting of those four factors
58 vector
<Factor
> SprinklerFactors
;
59 SprinklerFactors
.push_back( P_C
);
60 SprinklerFactors
.push_back( P_R_given_C
);
61 SprinklerFactors
.push_back( P_S_given_C
);
62 SprinklerFactors
.push_back( P_W_given_S_R
);
63 FactorGraph
SprinklerNetwork( SprinklerFactors
);
65 // Write factorgraph to a file
66 SprinklerNetwork
.WriteToFile( "sprinkler.fg" );
68 // Reread the factorgraph from the file
69 SprinklerNetwork
.ReadFromFile( "sprinkler.fg" );
71 // Output some information about the factorgraph
72 cout
<< SprinklerNetwork
.nrVars() << " variables" << endl
;
73 cout
<< SprinklerNetwork
.nrFactors() << " factors" << endl
;
75 // Calculate joint probability of all four variables
77 for( size_t I
= 0; I
< SprinklerNetwork
.nrFactors(); I
++ ) {
78 P
*= SprinklerNetwork
.factor( I
);
80 // P.normalize(); // Not necessary: a Bayesian network is already normalized by definition
82 // Calculate some probabilities
83 double denom
= P
.marginal( W
)[1];
84 cout
<< "P(W=1) = " << denom
<< endl
;
85 cout
<< "P(S=1 | W=1) = " << P
.marginal( VarSet( S
, W
) )[3] / denom
<< endl
;
86 cout
<< "P(R=1 | W=1) = " << P
.marginal( VarSet( R
, W
) )[3] / denom
<< endl
;