00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00013
00014
00015 #ifndef __defined_libdai_gibbs_h
00016 #define __defined_libdai_gibbs_h
00017
00018
00019 #include <dai/daialg.h>
00020 #include <dai/factorgraph.h>
00021 #include <dai/properties.h>
00022
00023
00024 namespace dai {
00025
00026
00028
00030 class Gibbs : public DAIAlgFG {
00031 private:
00033 typedef std::vector<size_t> _count_t;
00035 typedef std::vector<size_t> _state_t;
00037 size_t _sample_count;
00039 std::vector<_count_t> _var_counts;
00041 std::vector<_count_t> _factor_counts;
00043 _state_t _state;
00044
00045 public:
00047 struct Properties {
00049 size_t iters;
00050
00052 size_t burnin;
00053
00055 size_t verbose;
00056 } props;
00057
00059 static const char *Name;
00060
00061 public:
00063 Gibbs() : DAIAlgFG(), _sample_count(0), _var_counts(), _factor_counts(), _state() {}
00064
00066
00068 Gibbs( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _sample_count(0), _var_counts(), _factor_counts(), _state() {
00069 setProperties( opts );
00070 construct();
00071 }
00072
00073
00075
00076 virtual Gibbs* clone() const { return new Gibbs(*this); }
00077 virtual std::string identify() const { return std::string(Name) + printProperties(); }
00078 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00079 virtual Factor belief( const VarSet &vs ) const;
00080 virtual Factor beliefV( size_t i ) const;
00081 virtual Factor beliefF( size_t I ) const;
00082 virtual std::vector<Factor> beliefs() const;
00083 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00084 virtual void init();
00085 virtual void init( const VarSet & ) { init(); }
00086 virtual Real run();
00087 virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00088 virtual size_t Iterations() const { return props.iters; }
00089 virtual void setProperties( const PropertySet &opts );
00090 virtual PropertySet getProperties() const;
00091 virtual std::string printProperties() const;
00093
00094
00096
00097
00098 void randomizeState();
00100 std::vector<size_t>& state() { return _state; }
00102 const std::vector<size_t>& state() const { return _state; }
00104
00105 private:
00107 void construct();
00109 void updateCounts();
00111 Prob getVarDist( size_t i );
00113 void resampleVar( size_t i );
00115 size_t getFactorEntry( size_t I );
00117 size_t getFactorEntryDiff( size_t I, size_t i );
00118 };
00119
00120
00122
00124 std::vector<size_t> getGibbsState( const FactorGraph &fg, size_t iters );
00125
00126
00127 }
00128
00129
00135 #endif