libDAI
include/dai/lc.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_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