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
00069 Gibbs( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _sample_count(0), _var_counts(), _factor_counts(), _state() {
00070 setProperties( opts );
00071 construct();
00072 }
00073
00074
00076
00077 virtual Gibbs* clone() const { return new Gibbs(*this); }
00078 virtual std::string identify() const { return std::string(Name) + printProperties(); }
00079 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00080 virtual Factor belief( const VarSet &vs ) const;
00081 virtual Factor beliefV( size_t i ) const;
00082 virtual Factor beliefF( size_t I ) const;
00083 virtual std::vector<Factor> beliefs() const;
00084 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00085 virtual void init();
00086 virtual void init( const VarSet & ) { init(); }
00087 virtual Real run();
00088 virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00089 virtual size_t Iterations() const { return props.iters; }
00090 virtual void setProperties( const PropertySet &opts );
00091 virtual PropertySet getProperties() const;
00092 virtual std::string printProperties() const;
00094
00095
00097
00098
00099 void randomizeState();
00101 std::vector<size_t>& state() { return _state; }
00103 const std::vector<size_t>& state() const { return _state; }
00105
00106 private:
00108 void construct();
00110 void updateCounts();
00112 Prob getVarDist( size_t i );
00114 void resampleVar( size_t i );
00116 size_t getFactorEntry( size_t I );
00118 size_t getFactorEntryDiff( size_t I, size_t i );
00119 };
00120
00121
00123
00125 std::vector<size_t> getGibbsState( const FactorGraph &fg, size_t iters );
00126
00127
00128 }
00129
00130
00136 #endif