Merged mf.* from SVN head (which implements damping)...
[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 MF object from FactorGraph
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 /// Assignment operator
66 MF & operator=( const MF &x ) {
67 if( this != &x ) {
68 DAIAlgFG::operator=( x );
69 _beliefs = x._beliefs;
70 _maxdiff = x._maxdiff;
71 _iters = x._iters;
72 props = x.props;
73 }
74 return *this;
75 }
76
77 /// Clone *this (virtual copy constructor)
78 virtual MF* clone() const { return new MF(*this); }
79
80 /// Create (virtual constructor)
81 virtual MF* create() const { return new MF(); }
82
83 /// Return number of passes over the factorgraph needed
84 virtual size_t Iterations() const { return _iters; }
85
86 /// Return maximum difference between single node beliefs for two consecutive iterations
87 double maxDiff() const { return _maxdiff; }
88
89 /// Identify *this for logging purposes
90 std::string identify() const;
91
92 /// Get single node belief
93 Factor belief( const Var &n ) const;
94
95 /// Get general belief
96 Factor belief( const VarSet &ns ) const;
97
98 /// Get all beliefs
99 std::vector<Factor> beliefs() const;
100
101 /// Get log partition sum
102 Real logZ() const;
103
104 void construct();
105
106 void init();
107
108 /// Clear messages and beliefs corresponding to the nodes in ns
109 virtual void init( const VarSet &ns );
110
111 /// The actual approximate inference algorithm
112 double run();
113
114 void setProperties( const PropertySet &opts );
115 PropertySet getProperties() const;
116 std::string printProperties() const;
117
118 Factor beliefV( size_t i ) const;
119 };
120
121
122 } // end of namespace dai
123
124
125 #endif