New git HEAD version
[libdai.git] / src / mf.cpp
index 42ede4a..4c1d932 100644 (file)
@@ -1,14 +1,15 @@
 /*  This file is part of libDAI - http://www.libdai.org/
  *
- *  libDAI is licensed under the terms of the GNU General Public License version
- *  2, or (at your option) any later version. libDAI is distributed without any
- *  warranty. See the file COPYING for more details.
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
  *
- *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
- *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  */
 
 
+#include <dai/dai_config.h>
+#ifdef DAI_WITH_MF
+
+
 #include <iostream>
 #include <sstream>
 #include <map>
@@ -94,14 +95,14 @@ void MF::init() {
 
 Factor MF::calcNewBelief( size_t i ) {
     Factor result;
-    foreach( const Neighbor &I, nbV(i) ) {
+    bforeach( const Neighbor &I, nbV(i) ) {
         Factor belief_I_minus_i;
-        foreach( const Neighbor &j, nbF(I) ) // for all j in I \ i
+        bforeach( const Neighbor &j, nbF(I) ) // for all j in I \ i
             if( j != i )
                 belief_I_minus_i *= _beliefs[j];
         Factor f_I = factor(I);
         if( props.updates == Properties::UpdateType::NAIVE )
-            f_I.takeLog();
+            f_I.takeLog(true);
         Factor msg_I_i = (belief_I_minus_i * f_I).marginal( var(i), false );
         if( props.updates == Properties::UpdateType::NAIVE )
             result *= msg_I_i.exp();
@@ -128,10 +129,10 @@ Real MF::run() {
     // been reached or until the maximum belief difference is smaller than tolerance
     Real maxDiff = INFINITY;
     for( _iters = 0; _iters < props.maxiter && maxDiff > props.tol; _iters++ ) {
-        random_shuffle( update_seq.begin(), update_seq.end() );
+        random_shuffle( update_seq.begin(), update_seq.end(), rnd );
 
         maxDiff = -INFINITY;
-        foreach( const size_t &i, update_seq ) {
+        bforeach( const size_t &i, update_seq ) {
             Factor nb = calcNewBelief( i );
 
             if( nb.hasNaNs() ) {
@@ -201,7 +202,7 @@ Real MF::logZ() const {
         s -= beliefV(i).entropy();
     for( size_t I = 0; I < nrFactors(); I++ ) {
         Factor henk;
-        foreach( const Neighbor &j, nbF(I) )  // for all j in I
+        bforeach( const Neighbor &j, nbF(I) )  // for all j in I
             henk *= _beliefs[j];
         henk.normalize();
         Factor piet;
@@ -226,3 +227,6 @@ void MF::init( const VarSet &ns ) {
 
 
 } // end of namespace dai
+
+
+#endif