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
00104 LC( const FactorGraph &fg, const PropertySet &opts );
00105
00106
00108
00109 virtual LC* clone() const { return new LC(*this); }
00110 virtual std::string identify() const;
00111 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
00112 virtual Factor belief( const VarSet & ) const { DAI_THROW(NOT_IMPLEMENTED); return Factor(); }
00113 virtual Factor beliefV( size_t i ) const { return _beliefs[i]; }
00114 virtual std::vector<Factor> beliefs() const { return _beliefs; }
00115 virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
00116 virtual void init();
00117 virtual void init( const VarSet & ) { init(); }
00118 virtual Real run();
00119 virtual Real maxDiff() const { return _maxdiff; }
00120 virtual size_t Iterations() const { return _iters; }
00121 virtual void setProperties( const PropertySet &opts );
00122 virtual PropertySet getProperties() const;
00123 virtual std::string printProperties() const;
00125
00127
00128
00129 Real CalcCavityDist( size_t i, const std::string &name, const PropertySet &opts );
00131 Real InitCavityDists( const std::string &name, const PropertySet &opts );
00133 long SetCavityDists( std::vector<Factor> &Q );
00135 Factor NewPancake (size_t i, size_t _I, bool & hasNaNs);
00137 void CalcBelief (size_t i);
00139 const Factor &pancake (size_t i) const { return _pancakes[i]; };
00141 const Factor &cavitydist (size_t i) const { return _cavitydists[i]; };
00143 };
00144
00145
00146 }
00147
00148
00149 #endif