00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00015
00016
00017 #ifndef __defined_libdai_mr_h
00018 #define __defined_libdai_mr_h
00019
00020
00021 #include <vector>
00022 #include <string>
00023 #include <dai/factorgraph.h>
00024 #include <dai/daialg.h>
00025 #include <dai/enum.h>
00026 #include <dai/properties.h>
00027 #include <dai/exceptions.h>
00028 #include <dai/graph.h>
00029 #include <boost/dynamic_bitset.hpp>
00030
00031
00032 namespace dai {
00033
00034
00036
00038 class MR : public DAIAlgFG {
00039 private:
00041 bool supported;
00042
00044 GraphAL G;
00045
00047 typedef GraphAL::Neighbor Neighbor;
00048
00050 std::vector<std::vector<Real> > tJ;
00052 std::vector<Real> theta;
00053
00055 std::vector<std::vector<Real> > M;
00057 std::vector<std::vector<std::vector<Real> > > cors;
00058
00060 typedef boost::dynamic_bitset<> sub_nb;
00061
00063 std::vector<Real> Mag;
00064
00066 Real _maxdiff;
00067
00069 size_t _iters;
00070
00071 public:
00073 struct Properties {
00075
00079 DAI_ENUM(UpdateType,FULL,LINEAR);
00080
00082
00087 DAI_ENUM(InitType,RESPPROP,CLAMPING,EXACT);
00088
00090 size_t verbose;
00091
00093 Real tol;
00094
00096 UpdateType updates;
00097
00099 InitType inits;
00100 } props;
00101
00103 static const char *Name;
00104
00105 public:
00107 MR() : DAIAlgFG(), supported(), G(), tJ(), theta(), M(), cors(), Mag(), _maxdiff(), _iters(), props() {}
00108
00110
00115 MR( const FactorGraph &fg, const PropertySet &opts );
00116
00117
00119
00120 virtual MR* clone() const { return new MR(*this); }
00121 virtual std::string identify() const;
00122 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00123 virtual Factor belief( const VarSet & ) const;
00124 virtual Factor beliefV( size_t i ) const;
00125 virtual std::vector<Factor> beliefs() const;
00126 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00127 virtual void init() {}
00128 virtual void init( const VarSet & ) { DAI_THROW(NOT_IMPLEMENTED); }
00129 virtual Real run();
00130 virtual Real maxDiff() const { return _maxdiff; }
00131 virtual size_t Iterations() const { return _iters; }
00132 virtual void setProperties( const PropertySet &opts );
00133 virtual PropertySet getProperties() const;
00134 virtual std::string printProperties() const;
00136
00137 private:
00139 Real calcCavityCorrelations();
00140
00142 void propagateCavityFields();
00143
00145 void calcMagnetizations();
00146
00148
00151 Real _tJ(size_t i, sub_nb A);
00152
00154 Real Omega(size_t i, size_t _j, size_t _l);
00155
00157
00160 Real T(size_t i, sub_nb A);
00161
00163 Real T(size_t i, size_t _j);
00164
00166 Real Gamma(size_t i, size_t _j, size_t _l1, size_t _l2);
00167
00169 Real Gamma(size_t i, size_t _l1, size_t _l2);
00170
00172
00180 Real appM(size_t i, sub_nb A);
00181
00183
00188 void sum_subs(size_t j, sub_nb A, Real *sum_even, Real *sum_odd);
00189 };
00190
00191
00192 }
00193
00194
00195 #endif