libDAI
include/dai/gibbs.h
Go to the documentation of this file.
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