00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00014
00015
00016 #ifndef __defined_libdai_lc_h
00017 #define __defined_libdai_lc_h
00018
00019
00020 #include <string>
00021 #include <dai/daialg.h>
00022 #include <dai/enum.h>
00023 #include <dai/factorgraph.h>
00024 #include <dai/properties.h>
00025 #include <dai/exceptions.h>
00026
00027
00028 namespace dai {
00029
00030
00032 class LC : public DAIAlgFG {
00033 private:
00035 std::vector<Factor> _pancakes;
00037 std::vector<Factor> _cavitydists;
00039 std::vector<std::vector<Factor> > _phis;
00041 std::vector<Factor> _beliefs;
00043 Real _maxdiff;
00045 size_t _iters;
00046
00047 public:
00049 struct Properties {
00051
00057 DAI_ENUM(CavityType,FULL,PAIR,PAIR2,UNIFORM);
00058
00060
00064 DAI_ENUM(UpdateType,SEQFIX,SEQRND);
00065
00067 size_t verbose;
00068
00070 size_t maxiter;
00071
00073 Real tol;
00074
00076 bool reinit;
00077
00079 Real damping;
00080
00082 CavityType cavity;
00083
00085 UpdateType updates;
00086
00088 std::string cavainame;
00089
00091 PropertySet cavaiopts;
00092 } props;
00093
00095 static const char *Name;
00096
00097 public:
00099 LC() : DAIAlgFG(), _pancakes(), _cavitydists(), _phis(), _beliefs(), _maxdiff(), _iters(), props() {}
00100
00102
00105 LC( const FactorGraph &fg, const PropertySet &opts );
00106
00107
00109
00110 virtual LC* clone() const { return new LC(*this); }
00111 virtual std::string identify() const;
00112 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00113 virtual Factor belief( const VarSet & ) const;
00114 virtual Factor beliefV( size_t i ) const { return _beliefs[i]; }
00115 virtual std::vector<Factor> beliefs() const { return _beliefs; }
00116 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00117 virtual void init();
00118 virtual void init( const VarSet & ) { init(); }
00119 virtual Real run();
00120 virtual Real maxDiff() const { return _maxdiff; }
00121 virtual size_t Iterations() const { return _iters; }
00122 virtual void setMaxIter( size_t maxiter ) { props.maxiter = maxiter; }
00123 virtual void setProperties( const PropertySet &opts );
00124 virtual PropertySet getProperties() const;
00125 virtual std::string printProperties() const;
00127
00129
00130
00131 Real CalcCavityDist( size_t i, const std::string &name, const PropertySet &opts );
00133 Real InitCavityDists( const std::string &name, const PropertySet &opts );
00135 long SetCavityDists( std::vector<Factor> &Q );
00137 Factor NewPancake (size_t i, size_t _I, bool & hasNaNs);
00139 void CalcBelief (size_t i);
00141 const Factor &pancake (size_t i) const { return _pancakes[i]; };
00143 const Factor &cavitydist (size_t i) const { return _cavitydists[i]; };
00145 };
00146
00147
00148 }
00149
00150
00151 #endif