libDAI
|
00001 /* This file is part of libDAI - http://www.libdai.org/ 00002 * 00003 * Copyright (c) 2006-2011, The libDAI authors. All rights reserved. 00004 * 00005 * Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 00006 */ 00007 00008 00011 00012 00013 #ifndef __defined_libdai_gibbs_h 00014 #define __defined_libdai_gibbs_h 00015 00016 00017 #include <dai/daialg.h> 00018 #include <dai/factorgraph.h> 00019 #include <dai/properties.h> 00020 00021 00022 namespace dai { 00023 00024 00026 00028 class Gibbs : public DAIAlgFG { 00029 private: 00031 typedef std::vector<size_t> _count_t; 00033 typedef std::vector<size_t> _state_t; 00035 size_t _sample_count; 00037 std::vector<_count_t> _var_counts; 00039 std::vector<_count_t> _factor_counts; 00041 size_t _iters; 00043 _state_t _state; 00045 _state_t _max_state; 00047 Real _max_score; 00048 00049 public: 00051 struct Properties { 00053 size_t maxiter; 00054 00056 double maxtime; 00057 00059 size_t restart; 00060 00062 size_t burnin; 00063 00065 size_t verbose; 00066 } props; 00067 00068 public: 00070 Gibbs() : DAIAlgFG(), _sample_count(0), _var_counts(), _factor_counts(), _iters(0), _state(), _max_state(), _max_score(-INFINITY) {} 00071 00073 00076 Gibbs( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _sample_count(0), _var_counts(), _factor_counts(), _iters(0), _state(), _max_state(), _max_score(-INFINITY) { 00077 setProperties( opts ); 00078 construct(); 00079 } 00080 00081 00083 00084 virtual Gibbs* clone() const { return new Gibbs(*this); } 00085 virtual Gibbs* construct( const FactorGraph &fg, const PropertySet &opts ) const { return new Gibbs( fg, opts ); } 00086 virtual std::string name() const { return "GIBBS"; } 00087 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); } 00088 virtual Factor belief( const VarSet &vs ) const; 00089 virtual Factor beliefV( size_t i ) const; 00090 virtual Factor beliefF( size_t I ) const; 00091 virtual std::vector<Factor> beliefs() const; 00092 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; } 00093 std::vector<std::size_t> findMaximum() const { return _max_state; } 00094 virtual void init(); 00095 virtual void init( const VarSet &/*ns*/ ) { init(); } 00096 virtual Real run(); 00097 virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; } 00098 virtual size_t Iterations() const { return _iters; } 00099 virtual void setMaxIter( size_t maxiter ) { props.maxiter = maxiter; } 00100 virtual void setProperties( const PropertySet &opts ); 00101 virtual PropertySet getProperties() const; 00102 virtual std::string printProperties() const; 00104 00105 00107 00108 00109 void randomizeState(); 00111 std::vector<size_t>& state() { return _state; } 00113 const std::vector<size_t>& state() const { return _state; } 00115 00116 private: 00118 void construct(); 00120 void updateCounts(); 00122 Prob getVarDist( size_t i ); 00124 void resampleVar( size_t i ); 00126 size_t getFactorEntry( size_t I ); 00128 size_t getFactorEntryDiff( size_t I, size_t i ); 00129 }; 00130 00131 00133 00135 std::vector<size_t> getGibbsState( const FactorGraph &fg, size_t maxiter ); 00136 00137 00138 } // end of namespace dai 00139 00140 00146 #endif