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_lc_h 00014 #define __defined_libdai_lc_h 00015 00016 00017 #include <string> 00018 #include <dai/daialg.h> 00019 #include <dai/enum.h> 00020 #include <dai/factorgraph.h> 00021 #include <dai/properties.h> 00022 #include <dai/exceptions.h> 00023 00024 00025 namespace dai { 00026 00027 00029 class LC : public DAIAlgFG { 00030 private: 00032 std::vector<Factor> _pancakes; 00034 std::vector<Factor> _cavitydists; 00036 std::vector<std::vector<Factor> > _phis; 00038 std::vector<Factor> _beliefs; 00040 Real _maxdiff; 00042 size_t _iters; 00043 00044 public: 00046 struct Properties { 00048 00054 DAI_ENUM(CavityType,FULL,PAIR,PAIR2,UNIFORM); 00055 00057 00061 DAI_ENUM(UpdateType,SEQFIX,SEQRND); 00062 00064 size_t verbose; 00065 00067 size_t maxiter; 00068 00070 Real tol; 00071 00073 bool reinit; 00074 00076 Real damping; 00077 00079 CavityType cavity; 00080 00082 UpdateType updates; 00083 00085 std::string cavainame; 00086 00088 PropertySet cavaiopts; 00089 } props; 00090 00091 public: 00093 LC() : DAIAlgFG(), _pancakes(), _cavitydists(), _phis(), _beliefs(), _maxdiff(), _iters(), props() {} 00094 00096 00099 LC( const FactorGraph &fg, const PropertySet &opts ); 00100 00101 00103 00104 virtual LC* clone() const { return new LC(*this); } 00105 virtual LC* construct( const FactorGraph &fg, const PropertySet &opts ) const { return new LC( fg, opts ); } 00106 virtual std::string name() const { return "LC"; } 00107 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); } 00108 virtual Factor belief( const VarSet &/*vs*/ ) const; 00109 virtual Factor beliefV( size_t i ) const { return _beliefs[i]; } 00110 virtual std::vector<Factor> beliefs() const { return _beliefs; } 00111 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; } 00112 virtual void init(); 00113 virtual void init( const VarSet &/*ns*/ ) { init(); } 00114 virtual Real run(); 00115 virtual Real maxDiff() const { return _maxdiff; } 00116 virtual size_t Iterations() const { return _iters; } 00117 virtual void setMaxIter( size_t maxiter ) { props.maxiter = maxiter; } 00118 virtual void setProperties( const PropertySet &opts ); 00119 virtual PropertySet getProperties() const; 00120 virtual std::string printProperties() const; 00122 00124 00125 00126 Real CalcCavityDist( size_t i, const std::string &name, const PropertySet &opts ); 00128 Real InitCavityDists( const std::string &name, const PropertySet &opts ); 00130 long SetCavityDists( std::vector<Factor> &Q ); 00132 Factor NewPancake (size_t i, size_t _I, bool & hasNaNs); 00134 void CalcBelief (size_t i); 00136 const Factor &pancake (size_t i) const { return _pancakes[i]; }; 00138 const Factor &cavitydist (size_t i) const { return _cavitydists[i]; }; 00140 }; 00141 00142 00143 } // end of namespace dai 00144 00145 00146 #endif