00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00018
00019
00020 #ifndef __defined_libdai_hak_h
00021 #define __defined_libdai_hak_h
00022
00023
00024 #include <string>
00025 #include <dai/daialg.h>
00026 #include <dai/regiongraph.h>
00027 #include <dai/enum.h>
00028 #include <dai/properties.h>
00029
00030
00031 namespace dai {
00032
00033
00035 class HAK : public DAIAlgRG {
00036 private:
00038 std::vector<Factor> _Qa;
00040 std::vector<Factor> _Qb;
00042 std::vector<std::vector<Factor> > _muab;
00044 std::vector<std::vector<Factor> > _muba;
00046 Real _maxdiff;
00048 size_t _iters;
00049
00050 public:
00052 struct Properties {
00054
00060 DAI_ENUM(ClustersType,MIN,BETHE,DELTA,LOOP);
00061
00063 DAI_ENUM(InitType,UNIFORM,RANDOM);
00064
00066 size_t verbose;
00067
00069 size_t maxiter;
00070
00072 Real tol;
00073
00075 Real damping;
00076
00078 ClustersType clusters;
00079
00081 InitType init;
00082
00084 bool doubleloop;
00085
00087 size_t loopdepth;
00088 } props;
00089
00091 static const char *Name;
00092
00093 public:
00095
00096
00097 HAK() : DAIAlgRG(), _Qa(), _Qb(), _muab(), _muba(), _maxdiff(0.0), _iters(0U), props() {}
00098
00100
00103 HAK( const FactorGraph &fg, const PropertySet &opts );
00104
00106 HAK( const RegionGraph &rg, const PropertySet &opts );
00108
00109
00111
00112 virtual HAK* clone() const { return new HAK(*this); }
00113 virtual std::string identify() const;
00114 virtual Factor belief( const VarSet &vs ) const;
00115 virtual std::vector<Factor> beliefs() const;
00116 virtual Real logZ() const;
00117 virtual void init();
00118 virtual void init( const VarSet &vs );
00119 virtual Real run();
00120 virtual Real maxDiff() const { return _maxdiff; }
00121 virtual size_t Iterations() const { return _iters; }
00122 virtual void setProperties( const PropertySet &opts );
00123 virtual PropertySet getProperties() const;
00124 virtual std::string printProperties() const;
00126
00127
00129
00130
00131 Factor & muab( size_t alpha, size_t _beta ) { return _muab[alpha][_beta]; }
00133 Factor & muba( size_t alpha, size_t _beta ) { return _muba[alpha][_beta]; }
00135 const Factor& Qa( size_t alpha ) const { return _Qa[alpha]; };
00137 const Factor& Qb( size_t beta ) const { return _Qb[beta]; };
00138
00140 Real doGBP();
00142 Real doDoubleLoop();
00144
00145 private:
00147 void construct();
00149
00157 void findLoopClusters( const FactorGraph &fg, std::set<VarSet> &allcl, VarSet newcl, const Var & root, size_t length, VarSet vars );
00158 };
00159
00160
00161 }
00162
00163
00164 #endif