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_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