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 size_t _iters;
00045 _state_t _state;
00047 _state_t _max_state;
00049 Real _max_score;
00050
00051 public:
00053 struct Properties {
00055 size_t maxiter;
00056
00058 double maxtime;
00059
00061 size_t restart;
00062
00064 size_t burnin;
00065
00067 size_t verbose;
00068 } props;
00069
00071 static const char *Name;
00072
00073 public:
00075 Gibbs() : DAIAlgFG(), _sample_count(0), _var_counts(), _factor_counts(), _iters(0), _state(), _max_state(), _max_score(-INFINITY) {}
00076
00078
00081 Gibbs( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _sample_count(0), _var_counts(), _factor_counts(), _iters(0), _state(), _max_state(), _max_score(-INFINITY) {
00082 setProperties( opts );
00083 construct();
00084 }
00085
00086
00088
00089 virtual Gibbs* clone() const { return new Gibbs(*this); }
00090 virtual std::string identify() const { return std::string(Name) + printProperties(); }
00091 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00092 virtual Factor belief( const VarSet &vs ) const;
00093 virtual Factor beliefV( size_t i ) const;
00094 virtual Factor beliefF( size_t I ) const;
00095 virtual std::vector<Factor> beliefs() const;
00096 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00097 std::vector<std::size_t> findMaximum() const { return _max_state; }
00098 virtual void init();
00099 virtual void init( const VarSet & ) { init(); }
00100 virtual Real run();
00101 virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00102 virtual size_t Iterations() const { return _iters; }
00103 virtual void setMaxIter( size_t maxiter ) { props.maxiter = maxiter; }
00104 virtual void setProperties( const PropertySet &opts );
00105 virtual PropertySet getProperties() const;
00106 virtual std::string printProperties() const;
00108
00109
00111
00112
00113 void randomizeState();
00115 std::vector<size_t>& state() { return _state; }
00117 const std::vector<size_t>& state() const { return _state; }
00119
00120 private:
00122 void construct();
00124 void updateCounts();
00126 Prob getVarDist( size_t i );
00128 void resampleVar( size_t i );
00130 size_t getFactorEntry( size_t I );
00132 size_t getFactorEntryDiff( size_t I, size_t i );
00133 };
00134
00135
00137
00139 std::vector<size_t> getGibbsState( const FactorGraph &fg, size_t iters );
00140
00141
00142 }
00143
00144
00150 #endif