libDAI
include/dai/daialg.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_daialg_h
00014 #define __defined_libdai_daialg_h
00015 
00016 
00017 #include <string>
00018 #include <iostream>
00019 #include <vector>
00020 #include <dai/factorgraph.h>
00021 #include <dai/regiongraph.h>
00022 #include <dai/properties.h>
00023 
00024 
00025 namespace dai {
00026 
00027 
00029 
00034 class InfAlg {
00035     public:
00037 
00038 
00039         virtual ~InfAlg() {}
00040 
00042         virtual InfAlg* clone() const = 0;
00043 
00045 
00048         virtual InfAlg* construct( const FactorGraph &fg, const PropertySet &opts ) const = 0;
00050 
00052 
00053 
00054         virtual std::string name() const = 0;
00055 
00057         virtual std::string identify() const {
00058             return name() + printProperties();
00059         }
00060 
00062         virtual FactorGraph &fg() = 0;
00063 
00065         virtual const FactorGraph &fg() const = 0;
00067 
00069 
00070 
00071 
00073         virtual void init() = 0;
00074 
00076 
00080         virtual void init( const VarSet &vs ) = 0;
00081 
00083 
00085         virtual Real run() = 0;
00086 
00088 
00090         virtual Factor belief( const Var &v ) const { return belief( VarSet(v) ); }
00091 
00093 
00097         virtual Factor belief( const VarSet &vs ) const = 0;
00098 
00100 
00103         virtual Factor beliefV( size_t i ) const { return belief( fg().var(i) ); }
00104 
00106 
00109         virtual Factor beliefF( size_t I ) const { return belief( fg().factor(I).vars() ); }
00110 
00112 
00114         virtual std::vector<Factor> beliefs() const = 0;
00115 
00117 
00120         virtual Real logZ() const = 0;
00121 
00123 
00126         virtual std::vector<std::size_t> findMaximum() const { DAI_THROW(NOT_IMPLEMENTED); }
00127 
00129 
00131         virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); };
00132 
00134 
00136         virtual size_t Iterations() const { DAI_THROW(NOT_IMPLEMENTED); };
00137 
00139 
00141         virtual void setMaxIter( size_t /*maxiter*/ ) { DAI_THROW(NOT_IMPLEMENTED); }
00143 
00145 
00146 
00147 
00149         virtual void clamp( size_t i, size_t x, bool backup = false ) = 0;
00150 
00152 
00154         virtual void makeCavity( size_t i, bool backup = false ) = 0;
00156 
00158 
00159 
00160 
00162         virtual void backupFactor( size_t I ) = 0;
00164 
00166         virtual void backupFactors( const VarSet &vs ) = 0;
00167 
00169         virtual void restoreFactor( size_t I ) = 0;
00171         virtual void restoreFactors( const VarSet &vs ) = 0;
00173 
00175 
00176 
00177 
00180         virtual void setProperties( const PropertySet &opts ) = 0;
00182         virtual PropertySet getProperties() const = 0;
00184         virtual std::string printProperties() const = 0;
00186 };
00187 
00188 
00190 
00200 template <class GRM>
00201 class DAIAlg : public InfAlg, public GRM {
00202     public:
00204 
00205 
00206         DAIAlg() : InfAlg(), GRM() {}
00207 
00209         DAIAlg( const GRM &grm ) : InfAlg(), GRM(grm) {}
00211 
00213 
00214 
00215         FactorGraph &fg() { return (FactorGraph &)(*this); }
00216 
00218         const FactorGraph &fg() const { return (const FactorGraph &)(*this); }
00220 
00222 
00223 
00224 
00226         void clamp( size_t i, size_t x, bool backup = false ) { GRM::clamp( i, x, backup ); }
00227 
00229 
00231         void makeCavity( size_t i, bool backup = false ) { GRM::makeCavity( i, backup ); }
00233 
00235 
00236 
00237         void backupFactor( size_t I ) { GRM::backupFactor( I ); }
00239         void backupFactors( const VarSet &vs ) { GRM::backupFactors( vs ); }
00240 
00242         void restoreFactor( size_t I ) { GRM::restoreFactor( I ); }
00244         void restoreFactors( const VarSet &vs ) { GRM::restoreFactors( vs ); }
00246 };
00247 
00248 
00250 typedef DAIAlg<FactorGraph> DAIAlgFG;
00251 
00253 typedef DAIAlg<RegionGraph> DAIAlgRG;
00254 
00255 
00257 
00263 Factor calcMarginal( const InfAlg& obj, const VarSet& vs, bool reInit );
00264 
00265 
00267 
00278 std::vector<Factor> calcPairBeliefs( const InfAlg& obj, const VarSet& vs, bool reInit, bool accurate=false );
00279 
00280 
00282 
00284 std::vector<size_t> findMaximum( const InfAlg& obj );
00285 
00286 
00287 } // end of namespace dai
00288 
00289 
00290 #endif