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
00118 virtual std::vector<std::size_t> findMaximum() const { DAI_THROW(NOT_IMPLEMENTED); }
00119
00121
00123 virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); };
00124
00126
00128 virtual size_t Iterations() const { DAI_THROW(NOT_IMPLEMENTED); };
00129
00131
00133 virtual void setMaxIter( size_t ) { DAI_THROW(NOT_IMPLEMENTED); }
00135
00137
00138
00139
00141 virtual void clamp( size_t i, size_t x, bool backup = false ) = 0;
00142
00144
00146 virtual void makeCavity( size_t i, bool backup = false ) = 0;
00148
00150
00151
00152
00154 virtual void backupFactor( size_t I ) = 0;
00156
00158 virtual void backupFactors( const VarSet &vs ) = 0;
00159
00161 virtual void restoreFactor( size_t I ) = 0;
00163 virtual void restoreFactors( const VarSet &vs ) = 0;
00165
00167
00168
00169
00172 virtual void setProperties( const PropertySet &opts ) = 0;
00174 virtual PropertySet getProperties() const = 0;
00176 virtual std::string printProperties() const = 0;
00178 };
00179
00180
00182
00192 template <class GRM>
00193 class DAIAlg : public InfAlg, public GRM {
00194 public:
00196
00197
00198 DAIAlg() : InfAlg(), GRM() {}
00199
00201 DAIAlg( const GRM &grm ) : InfAlg(), GRM(grm) {}
00203
00205
00206
00207 FactorGraph &fg() { return (FactorGraph &)(*this); }
00208
00210 const FactorGraph &fg() const { return (const FactorGraph &)(*this); }
00212
00214
00215
00216
00218 void clamp( size_t i, size_t x, bool backup = false ) { GRM::clamp( i, x, backup ); }
00219
00221
00223 void makeCavity( size_t i, bool backup = false ) { GRM::makeCavity( i, backup ); }
00225
00227
00228
00229 void backupFactor( size_t I ) { GRM::backupFactor( I ); }
00231 void backupFactors( const VarSet &vs ) { GRM::backupFactors( vs ); }
00232
00234 void restoreFactor( size_t I ) { GRM::restoreFactor( I ); }
00236 void restoreFactors( const VarSet &vs ) { GRM::restoreFactors( vs ); }
00238 };
00239
00240
00242 typedef DAIAlg<FactorGraph> DAIAlgFG;
00243
00245 typedef DAIAlg<RegionGraph> DAIAlgRG;
00246
00247
00249
00255 Factor calcMarginal( const InfAlg& obj, const VarSet& vs, bool reInit );
00256
00258
00269 std::vector<Factor> calcPairBeliefs( const InfAlg& obj, const VarSet& vs, bool reInit, bool accurate=false );
00270
00271
00272 }
00273
00274
00275 #endif