Finished a new release: libDAI 0.2.7.
[libdai.git] / include / dai / exactinf.h
1 /* This file is part of libDAI - http://www.libdai.org/
2 *
3 * libDAI is licensed under the terms of the GNU General Public License version
4 * 2, or (at your option) any later version. libDAI is distributed without any
5 * warranty. See the file COPYING for more details.
6 *
7 * Copyright (C) 2006-2009 Joris Mooij [joris dot mooij at libdai dot org]
8 * Copyright (C) 2006-2007 Radboud University Nijmegen, The Netherlands
9 */
10
11
12 /// \file
13 /// \brief Defines ExactInf class, which can be used for exact inference on small factor graphs.
14
15
16 #ifndef __defined_libdai_exactinf_h
17 #define __defined_libdai_exactinf_h
18
19
20 #include <dai/daialg.h>
21 #include <dai/properties.h>
22 #include <dai/factorgraph.h>
23 #include <dai/enum.h>
24
25
26 namespace dai {
27
28
29 /// Exact inference algorithm using brute force enumeration (mainly useful for testing purposes)
30 /** Inference is done simply by multiplying all factors together into one large factor,
31 * and then calculating marginals and partition sum from the product.
32 * \note This inference method can easily exhaust all available memory; in that case, one
33 * may try the JTree class instead.
34 */
35 class ExactInf : public DAIAlgFG {
36 public:
37 /// Parameters for ExactInf
38 struct Properties {
39 /// Verbosity (amount of output sent to stderr)
40 size_t verbose;
41 } props;
42
43 /// Name of this inference algorithm
44 static const char *Name;
45
46 private:
47 /// All single variable marginals
48 std::vector<Factor> _beliefsV;
49 /// All factor variable marginals
50 std::vector<Factor> _beliefsF;
51 /// Logarithm of partition sum
52 Real _logZ;
53
54 public:
55 /// \name Constructors/destructors
56 //@{
57 /// Default constructor
58 ExactInf() : DAIAlgFG(), props(), _beliefsV(), _beliefsF(), _logZ(0) {}
59
60 /// Construct from FactorGraph \a fg and PropertySet \a opts
61 /** \param fg Factor graph.
62 * \param opts Parameters @see Properties
63 */
64 ExactInf( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), props(), _beliefsV(), _beliefsF(), _logZ() {
65 setProperties( opts );
66 construct();
67 }
68 //@}
69
70 /// \name General InfAlg interface
71 //@{
72 virtual ExactInf* clone() const { return new ExactInf(*this); }
73 virtual std::string identify() const;
74 virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
75 virtual Factor belief( const VarSet &vs ) const;
76 virtual Factor beliefV( size_t i ) const { return _beliefsV[i]; }
77 virtual Factor beliefF( size_t I ) const { return _beliefsF[I]; }
78 virtual std::vector<Factor> beliefs() const;
79 virtual Real logZ() const { return _logZ; }
80 /** \note The complexity of this calculation is exponential in the number of variables.
81 */
82 std::vector<std::size_t> findMaximum() const;
83 virtual void init();
84 virtual void init( const VarSet &/*ns*/ ) {}
85 virtual Real run();
86 virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
87 virtual size_t Iterations() const { DAI_THROW(NOT_IMPLEMENTED); return 0; }
88 virtual void setProperties( const PropertySet &opts );
89 virtual PropertySet getProperties() const;
90 virtual std::string printProperties() const;
91 //@}
92
93 /// \name Additional interface specific for ExactInf
94 //@{
95 /// Calculates marginal probability distribution for variables \a vs
96 /** \note The complexity of this calculation is exponential in the number of variables.
97 */
98 Factor calcMarginal( const VarSet &vs ) const;
99 //@}
100
101 private:
102 /// Helper function for constructors
103 void construct();
104 };
105
106
107 } // end of namespace dai
108
109
110 #endif