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_mf_h 00014 #define __defined_libdai_mf_h 00015 00016 00017 #include <string> 00018 #include <dai/enum.h> 00019 #include <dai/daialg.h> 00020 #include <dai/factorgraph.h> 00021 #include <dai/properties.h> 00022 00023 00024 namespace dai { 00025 00026 00028 00037 class MF : public DAIAlgFG { 00038 private: 00040 std::vector<Factor> _beliefs; 00042 Real _maxdiff; 00044 size_t _iters; 00045 00046 public: 00048 struct Properties { 00050 DAI_ENUM(InitType,UNIFORM,RANDOM); 00051 00053 DAI_ENUM(UpdateType,NAIVE,HARDSPIN); 00054 00056 size_t verbose; 00057 00059 size_t maxiter; 00060 00062 Real tol; 00063 00065 Real damping; 00066 00068 InitType init; 00069 00071 UpdateType updates; 00072 } props; 00073 00074 public: 00076 00077 00078 MF() : DAIAlgFG(), _beliefs(), _maxdiff(0.0), _iters(0U), props() {} 00079 00081 00084 MF( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _beliefs(), _maxdiff(0.0), _iters(0U), props() { 00085 setProperties( opts ); 00086 construct(); 00087 } 00089 00091 00092 virtual MF* clone() const { return new MF(*this); } 00093 virtual MF* construct( const FactorGraph &fg, const PropertySet &opts ) const { return new MF( fg, opts ); } 00094 virtual std::string name() const { return "MF"; } 00095 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); } 00096 virtual Factor belief( const VarSet &vs ) const; 00097 virtual Factor beliefV( size_t i ) const; 00098 virtual std::vector<Factor> beliefs() const; 00099 virtual Real logZ() const; 00100 virtual void init(); 00101 virtual void init( const VarSet &ns ); 00102 virtual Real run(); 00103 virtual Real maxDiff() const { return _maxdiff; } 00104 virtual size_t Iterations() const { return _iters; } 00105 virtual void setMaxIter( size_t maxiter ) { props.maxiter = maxiter; } 00106 virtual void setProperties( const PropertySet &opts ); 00107 virtual PropertySet getProperties() const; 00108 virtual std::string printProperties() const; 00110 00111 private: 00113 void construct(); 00114 00116 Factor calcNewBelief( size_t i ); 00117 }; 00118 00119 00120 } // end of namespace dai 00121 00122 00123 #endif