Extended SWIG python interface (inspired by Kyle Ellrott): inference is possible...
[libdai.git] / include / dai / exactinf.h
index 1286c0f..52268f4 100644 (file)
@@ -1,28 +1,13 @@
-/*  Copyright (C) 2006-2008  Joris Mooij  [joris dot mooij at tuebingen dot mpg dot de]
-    Radboud University Nijmegen, The Netherlands /
-    Max Planck Institute for Biological Cybernetics, Germany
-
-    This file is part of libDAI.
-
-    libDAI is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    libDAI is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with libDAI; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-*/
+/*  This file is part of libDAI - http://www.libdai.org/
+ *
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+ */
 
 
 /// \file
-/// \brief Defines ExactInf class
-/// \todo Improve documentation
+/// \brief Defines ExactInf class, which can be used for exact inference on small factor graphs.
 
 
 #ifndef __defined_libdai_exactinf_h
@@ -39,76 +24,78 @@ namespace dai {
 
 
 /// Exact inference algorithm using brute force enumeration (mainly useful for testing purposes)
+/** Inference is done simply by multiplying all factors together into one large factor,
+ *  and then calculating marginals and partition sum from the product.
+ *  \note This inference method can easily exhaust all available memory; in that case, one
+ *  may try the JTree class instead.
+ */
 class ExactInf : public DAIAlgFG {
     public:
-        /// Parameters of this inference algorithm
+        /// Parameters for ExactInf
         struct Properties {
-            /// Verbosity
+            /// Verbosity (amount of output sent to stderr)
             size_t verbose;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     private:
+        /// All single variable marginals
         std::vector<Factor> _beliefsV;
+        /// All factor variable marginals
         std::vector<Factor> _beliefsF;
+        /// Logarithm of partition sum
         Real                _logZ;
 
     public:
+    /// \name Constructors/destructors
+    //@{
         /// Default constructor
         ExactInf() : DAIAlgFG(), props(), _beliefsV(), _beliefsF(), _logZ(0) {}
 
-        /// Copy constructor
-        ExactInf( const ExactInf &x ) : DAIAlgFG(x), props(x.props), _beliefsV(x._beliefsV), _beliefsF(x._beliefsF), _logZ(x._logZ) {}
-
-        /// Assignment operator
-        ExactInf& operator=( const ExactInf &x ) {
-            if( this != &x ) {
-                DAIAlgFG::operator=( x );
-                props     = x.props;
-                _beliefsV = x._beliefsV;
-                _beliefsF = x._beliefsF;
-                _logZ     = x._logZ;
-            }
-            return *this;
-        }
-
-        /// Construct from FactorGraph fg and PropertySet opts
+        /// Construct from FactorGraph \a fg and PropertySet \a opts
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
+         */
         ExactInf( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), props(), _beliefsV(), _beliefsF(), _logZ() {
             setProperties( opts );
             construct();
         }
+    //@}
 
-        
-        /// @name General InfAlg interface
-        //@{
+    /// \name General InfAlg interface
+    //@{
         virtual ExactInf* clone() const { return new ExactInf(*this); }
-        virtual ExactInf* create() const { return new ExactInf(); }
-        virtual std::string identify() const;
-        virtual Factor belief( const Var &n ) const { return beliefV( findVar( n ) ); }
-        virtual Factor belief( const VarSet &ns ) const;
+        virtual ExactInf* construct( const FactorGraph &fg, const PropertySet &opts ) const { return new ExactInf( fg, opts ); }
+        virtual std::string name() const { return "EXACT"; }
+        virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
+        virtual Factor belief( const VarSet &vs ) const;
+        virtual Factor beliefV( size_t i ) const { return _beliefsV[i]; }
+        virtual Factor beliefF( size_t I ) const { return _beliefsF[I]; }
         virtual std::vector<Factor> beliefs() const;
         virtual Real logZ() const { return _logZ; }
+        /** \note The complexity of this calculation is exponential in the number of variables.
+         */
+        std::vector<size_t> findMaximum() const;
         virtual void init();
-        virtual void init( const VarSet &/*ns*/ ) { DAI_THROW(NOT_IMPLEMENTED); }
-        virtual double run();
-        virtual double maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
+        virtual void init( const VarSet &/*ns*/ ) {}
+        virtual Real run();
+        virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
         virtual size_t Iterations() const { DAI_THROW(NOT_IMPLEMENTED); return 0; }
-        //@}
-        
-
-        /// @name Additional interface specific for ExactInf
-        //@{ 
-        Factor beliefV( size_t i ) const { return _beliefsV[i]; }
-        Factor beliefF( size_t I ) const { return _beliefsF[I]; }
-        //@}
+        virtual void setProperties( const PropertySet &opts );
+        virtual PropertySet getProperties() const;
+        virtual std::string printProperties() const;
+    //@}
+
+    /// \name Additional interface specific for ExactInf
+    //@{
+        /// Calculates marginal probability distribution for variables \a vs
+        /** \note The complexity of this calculation is exponential in the number of variables.
+         */
+        Factor calcMarginal( const VarSet &vs ) const;
+    //@}
 
     private:
+        /// Helper function for constructors
         void construct();
-        void setProperties( const PropertySet &opts );
-        PropertySet getProperties() const;
-        std::string printProperties() const;
 };