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) 2006-2009 Joris Mooij [joris dot mooij at libdai dot org]
8 * Copyright (C) 2006-2007 Radboud University Nijmegen, The Netherlands
12 #include <dai/exactinf.h>
22 const char *ExactInf::Name
= "EXACT";
25 void ExactInf::setProperties( const PropertySet
&opts
) {
26 assert( opts
.hasKey("verbose") );
28 props
.verbose
= opts
.getStringAs
<size_t>("verbose");
32 PropertySet
ExactInf::getProperties() const {
34 opts
.Set( "verbose", props
.verbose
);
39 string
ExactInf::printProperties() const {
40 stringstream
s( stringstream::out
);
42 s
<< "verbose=" << props
.verbose
<< "]";
47 void ExactInf::construct() {
48 // clear variable beliefs and reserve space
50 _beliefsV
.reserve( nrVars() );
51 for( size_t i
= 0; i
< nrVars(); i
++ )
52 _beliefsV
.push_back( Factor( var(i
) ) );
54 // clear factor beliefs and reserve space
56 _beliefsF
.reserve( nrFactors() );
57 for( size_t I
= 0; I
< nrFactors(); I
++ )
58 _beliefsF
.push_back( Factor( factor(I
).vars() ) );
62 void ExactInf::init() {
63 for( size_t i
= 0; i
< nrVars(); i
++ )
64 _beliefsV
[i
].fill( 1.0 );
65 for( size_t I
= 0; I
< nrFactors(); I
++ )
66 _beliefsF
[I
].fill( 1.0 );
70 double ExactInf::run() {
71 if( props
.verbose
>= 1 )
72 cerr
<< "Starting " << identify() << "...";
75 for( size_t I
= 0; I
< nrFactors(); I
++ )
80 for( size_t i
= 0; i
< nrVars(); i
++ )
81 _beliefsV
[i
] = P
.marginal(var(i
));
82 for( size_t I
= 0; I
< nrFactors(); I
++ )
83 _beliefsF
[I
] = P
.marginal(factor(I
).vars());
85 if( props
.verbose
>= 1 )
86 cerr
<< "finished" << endl
;
92 vector
<Factor
> ExactInf::beliefs() const {
93 vector
<Factor
> result
= _beliefsV
;
94 result
.insert( result
.end(), _beliefsF
.begin(), _beliefsF
.end() );
99 Factor
ExactInf::belief( const VarSet
&ns
) const {
102 else if( ns
.size() == 1 ) {
103 return belief( *(ns
.begin()) );
106 for( I
= 0; I
< nrFactors(); I
++ )
107 if( factor(I
).vars() >> ns
)
109 assert( I
!= nrFactors() );
110 return beliefF(I
).marginal(ns
);
115 string
ExactInf::identify() const {
116 return string(Name
) + printProperties();
120 } // end of namespace dai