Extended SWIG python interface (inspired by Kyle Ellrott): inference is possible...
[libdai.git] / include / dai / exactinf.h
index ca21ce4..52268f4 100644 (file)
@@ -1,22 +1,13 @@
-/*  Copyright (C) 2006-2008  Joris Mooij  [j dot mooij at science dot ru dot nl]
-    Radboud University Nijmegen, The Netherlands
-    
-    This file is part of libDAI.
+/*  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.
+ */
 
-    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
-*/
+/// \file
+/// \brief Defines ExactInf class, which can be used for exact inference on small factor graphs.
 
 
 #ifndef __defined_libdai_exactinf_h
 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 for ExactInf
         struct Properties {
+            /// Verbosity (amount of output sent to stderr)
             size_t verbose;
         } props;
 
     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) {}
-
-        /// Clone (virtual copy constructor)
-        virtual ExactInf* clone() const {
-            return new ExactInf(*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 );
-            create();
-        }
-        
-        /// 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;
-        }
-
-/*        /// Create (virtual constructor)
-        virtual ExactInf* create() const {
-            return new ExactInf();
+            construct();
         }
-*/
-        /// Return maximum difference between single node 
-        /// beliefs for two consecutive iterations
-        virtual double maxDiff() const {
-            DAI_THROW(NOT_IMPLEMENTED);
-            return 0.0;
-        }
-        
-        /// Identifies itself for logging purposes
-        virtual std::string identify() const;
-
-        /// Get single node belief
-        virtual Factor belief( const Var &n ) const {
-            return beliefV( findVar( n ) ); 
-        }
-
-        /// Get general belief
-        virtual Factor belief( const VarSet &n ) const;
-
-        /// Get all beliefs
+    //@}
+
+    /// \name General InfAlg interface
+    //@{
+        virtual ExactInf* clone() const { return new ExactInf(*this); }
+        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;
-
-        /// Get log partition sum
-        virtual Real logZ() const {
-            return _logZ;
-        }
-
-        /// Clear messages and beliefs
+        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();
-
-        /// Clear messages and beliefs corresponding to the nodes in ns
         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; }
+        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;
+    //@}
 
-        /// The actual approximate inference algorithm
-        virtual double run();
-
-        /// Name of this inference method
-        static const char *Name;
-
-        void create();
-        void undoProbs( const VarSet &ns ) { FactorGraph::undoProbs(ns); init(ns); }
-        void setProperties( const PropertySet &opts );
-        PropertySet getProperties() const;
-
-        Factor beliefV( size_t i ) const { 
-            return _beliefsV[i]; 
-        }
-
-        Factor beliefF( size_t I ) const { 
-            return _beliefsF[I]; 
-        }
+    private:
+        /// Helper function for constructors
+        void construct();
 };