libDAI
daialg.h
Go to the documentation of this file.
1 /* This file is part of libDAI - http://www.libdai.org/
2  *
3  * Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
4  *
5  * Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
6  */
7 
8 
11 
12 
13 #ifndef __defined_libdai_daialg_h
14 #define __defined_libdai_daialg_h
15 
16 
17 #include <string>
18 #include <iostream>
19 #include <vector>
20 #include <dai/factorgraph.h>
21 #include <dai/regiongraph.h>
22 #include <dai/properties.h>
23 
24 
25 namespace dai {
26 
27 
29 
34 class InfAlg {
35  public:
37 
38 
39  virtual ~InfAlg() {}
40 
42  virtual InfAlg* clone() const = 0;
43 
45 
48  virtual InfAlg* construct( const FactorGraph &fg, const PropertySet &opts ) const = 0;
50 
52 
53 
54  virtual std::string name() const = 0;
55 
57  virtual std::string identify() const {
58  return name() + printProperties();
59  }
60 
62  virtual FactorGraph &fg() = 0;
63 
65  virtual const FactorGraph &fg() const = 0;
67 
69 
70 
71 
73  virtual void init() = 0;
74 
76 
80  virtual void init( const VarSet &vs ) = 0;
81 
83 
85  virtual Real run() = 0;
86 
88 
90  virtual Factor belief( const Var &v ) const { return belief( VarSet(v) ); }
91 
93 
97  virtual Factor belief( const VarSet &vs ) const = 0;
98 
100 
103  virtual Factor beliefV( size_t i ) const { return belief( fg().var(i) ); }
104 
106 
109  virtual Factor beliefF( size_t I ) const { return belief( fg().factor(I).vars() ); }
110 
112 
114  virtual std::vector<Factor> beliefs() const = 0;
115 
117 
120  virtual Real logZ() const = 0;
121 
123 
126  virtual std::vector<std::size_t> findMaximum() const { DAI_THROW(NOT_IMPLEMENTED); }
127 
129 
131  virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); };
132 
134 
136  virtual size_t Iterations() const { DAI_THROW(NOT_IMPLEMENTED); };
137 
139 
141  virtual void setMaxIter( size_t /*maxiter*/ ) { DAI_THROW(NOT_IMPLEMENTED); }
143 
145 
146 
147 
149  virtual void clamp( size_t i, size_t x, bool backup = false ) = 0;
150 
152 
154  virtual void makeCavity( size_t i, bool backup = false ) = 0;
156 
158 
159 
160 
162  virtual void backupFactor( size_t I ) = 0;
164 
166  virtual void backupFactors( const VarSet &vs ) = 0;
167 
169  virtual void restoreFactor( size_t I ) = 0;
171  virtual void restoreFactors( const VarSet &vs ) = 0;
173 
175 
176 
177 
180  virtual void setProperties( const PropertySet &opts ) = 0;
182  virtual PropertySet getProperties() const = 0;
184  virtual std::string printProperties() const = 0;
186 };
187 
188 
190 
200 template <class GRM>
201 class DAIAlg : public InfAlg, public GRM {
202  public:
204 
205 
206  DAIAlg() : InfAlg(), GRM() {}
207 
209  DAIAlg( const GRM &grm ) : InfAlg(), GRM(grm) {}
211 
213 
214 
215  FactorGraph &fg() { return (FactorGraph &)(*this); }
216 
218  const FactorGraph &fg() const { return (const FactorGraph &)(*this); }
220 
222 
223 
224 
226  void clamp( size_t i, size_t x, bool backup = false ) { GRM::clamp( i, x, backup ); }
227 
229 
231  void makeCavity( size_t i, bool backup = false ) { GRM::makeCavity( i, backup ); }
233 
235 
236 
237  void backupFactor( size_t I ) { GRM::backupFactor( I ); }
239  void backupFactors( const VarSet &vs ) { GRM::backupFactors( vs ); }
240 
242  void restoreFactor( size_t I ) { GRM::restoreFactor( I ); }
244  void restoreFactors( const VarSet &vs ) { GRM::restoreFactors( vs ); }
246 };
247 
248 
251 
254 
255 
257 
263 Factor calcMarginal( const InfAlg& obj, const VarSet& vs, bool reInit );
264 
265 
267 
278 std::vector<Factor> calcPairBeliefs( const InfAlg& obj, const VarSet& vs, bool reInit, bool accurate=false );
279 
280 
282 
284 std::vector<size_t> findMaximum( const InfAlg& obj );
285 
286 
287 } // end of namespace dai
288 
289 
290 #endif