Implemented FBP::logZ()
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Fri, 8 Jan 2010 11:02:16 +0000 (12:02 +0100)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Fri, 8 Jan 2010 11:02:16 +0000 (12:02 +0100)
ChangeLog
include/dai/fbp.h
src/bp.cpp
src/fbp.cpp

index 749f22a..9d2d51c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* Implemented FBP::logZ()
 * Fixed bug in HAK for trivial region graphs (with only one outer region
   and no inner regions), reported by Alejandro Lage.
 * tests/testdai option "marginals" now has three possible values: NONE
index fa394dc..dd0ee15 100644 (file)
@@ -47,7 +47,6 @@ namespace dai {
  *  and the factor beliefs are calculated by:
  *    \f[ b_I(x_I) \propto f_I(x_I)^{1/c_I} \prod_{j \in N_I} m_{I\to j}^{1-1/c_I} \prod_{J\in N_j\setminus\{I\}} m_{J\to j} \f]
  *
- *  \todo Implement logZ
  *  \todo Add nice way to set scale parameters
  *
  *  \author Frederik Eaton
@@ -80,6 +79,7 @@ class FBP : public BP {
     //@{
         virtual FBP* clone() const { return new FBP(*this); }
         virtual std::string identify() const;
+        virtual Real logZ() const;
     //@}
 
     /// \name FBP accessors/mutators for scale parameters
index 8c6c760..fda4c39 100644 (file)
@@ -443,7 +443,7 @@ Factor BP::belief( const VarSet &ns ) const {
 
 Real BP::logZ() const {
     Real sum = 0.0;
-    for(size_t i = 0; i < nrVars(); ++i )
+    for( size_t i = 0; i < nrVars(); ++i )
         sum += (1.0 - nbV(i).size()) * beliefV(i).entropy();
     for( size_t I = 0; I < nrFactors(); ++I )
         sum -= dist( beliefF(I), factor(I), Prob::DISTKL );
index cc16223..0e67cc5 100644 (file)
@@ -4,7 +4,8 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2009 Frederik Eaton
+ *  Copyright (C) 2009  Frederik Eaton
+ *  Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
  */
 
 
@@ -28,6 +29,23 @@ string FBP::identify() const {
 }
 
 
+/* This code has been copied from bp.cpp, except where comments indicate FBP-specific behaviour */
+Real FBP::logZ() const {
+    Real sum = 0.0;
+    for( size_t I = 0; I < nrFactors(); I++ ) {
+        sum += (beliefF(I) * factor(I).log(true)).sum();  // FBP
+        sum += scaleF(I) * beliefF(I).entropy();  // FBP
+    }
+    for( size_t i = 0; i < nrVars(); ++i ) {
+        Real c_i = 0.0;
+        foreach( const Neighbor &I, nbV(i) )
+            c_i += scaleF(I);
+        sum += (1.0 - c_i) * beliefV(i).entropy();  // FBP
+    }
+    return sum;
+}
+
+
 /* This code has been copied from bp.cpp, except where comments indicate FBP-specific behaviour */
 void FBP::calcNewMessage( size_t i, size_t _I ) {
     // calculate updated message I->i