Merged SVN head ...
[libdai.git] / include / dai / mf.h
1 /* Copyright (C) 2006-2008 Joris Mooij [j dot mooij at science dot ru dot nl]
2 Radboud University Nijmegen, The Netherlands
3
4 This file is part of libDAI.
5
6 libDAI is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 libDAI is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with libDAI; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21
22 #ifndef __defined_libdai_mf_h
23 #define __defined_libdai_mf_h
24
25
26 #include <string>
27 #include <dai/daialg.h>
28 #include <dai/factorgraph.h>
29 #include <dai/properties.h>
30
31
32 namespace dai {
33
34
35 class MF : public DAIAlgFG {
36 protected:
37 std::vector<Factor> _beliefs;
38 /// Maximum difference encountered so far
39 double _maxdiff;
40 /// Number of iterations needed
41 size_t _iters;
42
43 public:
44 struct Properties {
45 size_t verbose;
46 size_t maxiter;
47 double tol;
48 double damping;
49 } props;
50 static const char *Name;
51
52 public:
53 /// Default constructor
54 MF() : DAIAlgFG(), _beliefs(), _maxdiff(0.0), _iters(0U), props() {}
55
56 /// Construct from FactorGraph fg and PropertySet opts
57 MF( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _beliefs(), _maxdiff(0.0), _iters(0U), props() {
58 setProperties( opts );
59 construct();
60 }
61
62 /// Copy constructor
63 MF( const MF &x ) : DAIAlgFG(x), _beliefs(x._beliefs), _maxdiff(x._maxdiff), _iters(x._iters), props(x.props) {}
64
65 /// Clone *this (virtual copy constructor)
66 virtual MF* clone() const { return new MF(*this); }
67
68 /// Create (virtual default constructor)
69 virtual MF* create() const { return new MF(); }
70
71 /// Assignment operator
72 MF& operator=( const MF &x ) {
73 if( this != &x ) {
74 DAIAlgFG::operator=( x );
75 _beliefs = x._beliefs;
76 _maxdiff = x._maxdiff;
77 _iters = x._iters;
78 props = x.props;
79 }
80 return *this;
81 }
82
83 /// Identifies itself for logging purposes
84 virtual std::string identify() const;
85
86 /// Get single node belief
87 virtual Factor belief( const Var &n ) const;
88
89 /// Get general belief
90 virtual Factor belief( const VarSet &ns ) const;
91
92 /// Get all beliefs
93 virtual std::vector<Factor> beliefs() const;
94
95 /// Get log partition sum
96 virtual Real logZ() const;
97
98 /// Clear messages and beliefs
99 virtual void init();
100
101 /// Clear messages and beliefs corresponding to the nodes in ns
102 virtual void init( const VarSet &ns );
103
104 /// The actual approximate inference algorithm
105 virtual double run();
106
107 /// Return maximum difference between single node beliefs in the last pass
108 virtual double maxDiff() const { return _maxdiff; }
109
110 /// Return number of passes over the factorgraph
111 virtual size_t Iterations() const { return _iters; }
112
113
114 void construct();
115
116 void setProperties( const PropertySet &opts );
117 PropertySet getProperties() const;
118 std::string printProperties() const;
119
120 Factor beliefV( size_t i ) const;
121 };
122
123
124 } // end of namespace dai
125
126
127 #endif