00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00014
00015
00016 #ifndef __defined_libdai_mf_h
00017 #define __defined_libdai_mf_h
00018
00019
00020 #include <string>
00021 #include <dai/enum.h>
00022 #include <dai/daialg.h>
00023 #include <dai/factorgraph.h>
00024 #include <dai/properties.h>
00025
00026
00027 namespace dai {
00028
00029
00031
00040 class MF : public DAIAlgFG {
00041 private:
00043 std::vector<Factor> _beliefs;
00045 Real _maxdiff;
00047 size_t _iters;
00048
00049 public:
00051 struct Properties {
00053 DAI_ENUM(InitType,UNIFORM,RANDOM);
00054
00056 DAI_ENUM(UpdateType,NAIVE,HARDSPIN);
00057
00059 size_t verbose;
00060
00062 size_t maxiter;
00063
00065 Real tol;
00066
00068 Real damping;
00069
00071 InitType init;
00072
00074 UpdateType updates;
00075 } props;
00076
00078 static const char *Name;
00079
00080 public:
00082
00083
00084 MF() : DAIAlgFG(), _beliefs(), _maxdiff(0.0), _iters(0U), props() {}
00085
00087
00090 MF( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _beliefs(), _maxdiff(0.0), _iters(0U), props() {
00091 setProperties( opts );
00092 construct();
00093 }
00095
00097
00098 virtual MF* clone() const { return new MF(*this); }
00099 virtual std::string identify() const;
00100 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00101 virtual Factor belief( const VarSet &vs ) const;
00102 virtual Factor beliefV( size_t i ) const;
00103 virtual std::vector<Factor> beliefs() const;
00104 virtual Real logZ() const;
00105 virtual void init();
00106 virtual void init( const VarSet &ns );
00107 virtual Real run();
00108 virtual Real maxDiff() const { return _maxdiff; }
00109 virtual size_t Iterations() const { return _iters; }
00110 virtual void setMaxIter( size_t maxiter ) { props.maxiter = maxiter; }
00111 virtual void setProperties( const PropertySet &opts );
00112 virtual PropertySet getProperties() const;
00113 virtual std::string printProperties() const;
00115
00116 private:
00118 void construct();
00119
00121 Factor calcNewBelief( size_t i );
00122 };
00123
00124
00125 }
00126
00127
00128 #endif