00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00014
00015
00016 #ifndef __defined_libdai_daialg_h
00017 #define __defined_libdai_daialg_h
00018
00019
00020 #include <string>
00021 #include <iostream>
00022 #include <vector>
00023 #include <dai/factorgraph.h>
00024 #include <dai/regiongraph.h>
00025 #include <dai/properties.h>
00026
00027
00028 namespace dai {
00029
00030
00032
00037 class InfAlg {
00038 public:
00040
00041
00042 virtual ~InfAlg() {}
00043
00045 virtual InfAlg* clone() const = 0;
00047
00049
00050
00051 virtual std::string identify() const = 0;
00052
00054 virtual FactorGraph &fg() = 0;
00055
00057 virtual const FactorGraph &fg() const = 0;
00059
00061
00062
00063
00065 virtual void init() = 0;
00066
00068
00072 virtual void init( const VarSet &vs ) = 0;
00073
00075
00077 virtual Real run() = 0;
00078
00080
00082 virtual Factor belief( const Var &v ) const { return belief( VarSet(v) ); }
00083
00085
00089 virtual Factor belief( const VarSet &vs ) const = 0;
00090
00092
00095 virtual Factor beliefV( size_t i ) const { return belief( fg().var(i) ); }
00096
00098
00101 virtual Factor beliefF( size_t I ) const { return belief( fg().factor(I).vars() ); }
00102
00104
00106 virtual std::vector<Factor> beliefs() const = 0;
00107
00109
00112 virtual Real logZ() const = 0;
00113
00115
00117 virtual Real maxDiff() const = 0;
00118
00120
00122 virtual size_t Iterations() const = 0;
00124
00126
00127
00128
00130 virtual void clamp( size_t i, size_t x, bool backup = false ) = 0;
00131
00133
00135 virtual void makeCavity( size_t i, bool backup = false ) = 0;
00137
00139
00140
00141
00143 virtual void backupFactor( size_t I ) = 0;
00145
00147 virtual void backupFactors( const VarSet &vs ) = 0;
00148
00150 virtual void restoreFactor( size_t I ) = 0;
00152 virtual void restoreFactors( const VarSet &vs ) = 0;
00154
00156
00157
00158
00161 virtual void setProperties( const PropertySet &opts ) = 0;
00163 virtual PropertySet getProperties() const = 0;
00165 virtual std::string printProperties() const = 0;
00167 };
00168
00169
00171
00181 template <class GRM>
00182 class DAIAlg : public InfAlg, public GRM {
00183 public:
00185
00186
00187 DAIAlg() : InfAlg(), GRM() {}
00188
00190 DAIAlg( const GRM &grm ) : InfAlg(), GRM(grm) {}
00192
00194
00195
00196 FactorGraph &fg() { return (FactorGraph &)(*this); }
00197
00199 const FactorGraph &fg() const { return (const FactorGraph &)(*this); }
00201
00203
00204
00205
00207 void clamp( size_t i, size_t x, bool backup = false ) { GRM::clamp( i, x, backup ); }
00208
00210
00212 void makeCavity( size_t i, bool backup = false ) { GRM::makeCavity( i, backup ); }
00214
00216
00217
00218 void backupFactor( size_t I ) { GRM::backupFactor( I ); }
00220 void backupFactors( const VarSet &vs ) { GRM::backupFactors( vs ); }
00221
00223 void restoreFactor( size_t I ) { GRM::restoreFactor( I ); }
00225 void restoreFactors( const VarSet &vs ) { GRM::restoreFactors( vs ); }
00227 };
00228
00229
00231 typedef DAIAlg<FactorGraph> DAIAlgFG;
00232
00234 typedef DAIAlg<RegionGraph> DAIAlgRG;
00235
00236
00238
00244 Factor calcMarginal( const InfAlg& obj, const VarSet& vs, bool reInit );
00245
00247
00258 std::vector<Factor> calcPairBeliefs( const InfAlg& obj, const VarSet& vs, bool reInit, bool accurate=false );
00259
00260
00261 }
00262
00263
00264 #endif