Moved platform independent build options into Makefile.ALL and documented tests/testdai
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Thu, 4 Feb 2010 12:53:34 +0000 (13:53 +0100)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Thu, 4 Feb 2010 12:53:34 +0000 (13:53 +0100)
27 files changed:
ChangeLog
Makefile
Makefile.CYGWIN
Makefile.LINUX
Makefile.MACOSX
Makefile.WINDOWS
README
include/dai/alldai.h
include/dai/bbp.h
include/dai/bp.h
include/dai/cbp.h
include/dai/clustergraph.h
include/dai/doc.h
include/dai/exceptions.h
include/dai/fbp.h
include/dai/hak.h
include/dai/mr.h
include/dai/trwbp.h
include/dai/util.h
src/alldai.cpp
src/bp.cpp
src/clustergraph.cpp
src/exceptions.cpp
src/fbp.cpp
src/hak.cpp
tests/testdai.cpp
tests/testfast.out

index a89cb03..69132e6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+* Documented tests/testdai
+* Moved platform independent build options into Makefile.ALL
 * Windows platform now needs boost 1.37 or higher
 * Implemented Tree-Reweighted BP
 * Implemented various heuristics for choosing a variable elimination sequence 
index 40ebcbe..5a4a690 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,16 +4,19 @@
 # 2, or (at your option) any later version. libDAI is distributed without any
 # warranty. See the file COPYING for more details.
 #
-# Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+# Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
 # Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
 
 
+# Load the platform independent build configuration file
+include Makefile.ALL
+
 # Load the local configuration from Makefile.conf
 include Makefile.conf
 
 # Set version and date
 DAI_VERSION="git HEAD"
-DAI_DATE="January 12, 2010 - or later"
+DAI_DATE="February 4, 2010 - or later"
 
 # Directories of libDAI sources
 # Location libDAI headers
index 296cc73..7ca8342 100644 (file)
@@ -4,38 +4,14 @@
 # 2, or (at your option) any later version. libDAI is distributed without any
 # warranty. See the file COPYING for more details.
 #
-# Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
+# Copyright (C) 2009-2010  Joris Mooij  [joris dot mooij at libdai dot org]
 
 
 # This template contains configurations for compiling libDAI under CygWin
 #
 # To use it, simply copy this file to 'Makefile.conf' and adapt 'Makefile.conf'
 # to your local setup
-#
-# A boolean variable VAR can be set to true ("VAR=true") or to false ("VAR=")
-
 
-# COMPILATION AND BUILD FLAGS
-# Enable/disable various approximate inference methods
-WITH_BP=true
-WITH_FBP=true
-WITH_TRWBP=true
-WITH_MF=true
-WITH_HAK=true
-WITH_LC=true
-WITH_TREEEP=true
-WITH_JTREE=true
-WITH_MR=true
-WITH_GIBBS=true
-WITH_CBP=true
-# Build doxygen documentation?
-WITH_DOC=true
-# Build with debug info?
-DEBUG=true
-# Build matlab interface?
-WITH_MATLAB=
-# MatLab version 7.3 (R2006b) or newer?
-NEW_MATLAB=true
 
 # OPERATING SYSTEM
 # Choose OS from {LINUX, WINDOWS, CYGWIN, MACOSX}
index 657b39f..d885bac 100644 (file)
@@ -4,38 +4,15 @@
 # 2, or (at your option) any later version. libDAI is distributed without any
 # warranty. See the file COPYING for more details.
 #
-# Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
+# Copyright (C) 2009-2010  Joris Mooij  [joris dot mooij at libdai dot org]
 
 
-# This template contains configurations for compiling libDAI under GNU/Linux and other UNIX variants
+# This template contains configurations for compiling libDAI under GNU/Linux
+# and other UNIX variants
 #
 # To use it, simply copy this file to 'Makefile.conf' and adapt 'Makefile.conf'
 # to your local setup
-#
-# A boolean variable VAR can be set to true ("VAR=true") or to false ("VAR=")
-
 
-# COMPILATION AND BUILD FLAGS
-# Enable/disable various approximate inference methods
-WITH_BP=true
-WITH_FBP=true
-WITH_TRWBP=true
-WITH_MF=true
-WITH_HAK=true
-WITH_LC=true
-WITH_TREEEP=true
-WITH_JTREE=true
-WITH_MR=true
-WITH_GIBBS=true
-WITH_CBP=true
-# Build doxygen documentation?
-WITH_DOC=true
-# Build with debug info?
-DEBUG=true
-# Build matlab interface?
-WITH_MATLAB=
-# MatLab version 7.3 (R2006b) or newer?
-NEW_MATLAB=true
 
 # OPERATING SYSTEM
 # Choose OS from {LINUX, WINDOWS, CYGWIN, MACOSX}
index d0066ae..129d7b6 100644 (file)
@@ -4,38 +4,14 @@
 # 2, or (at your option) any later version. libDAI is distributed without any
 # warranty. See the file COPYING for more details.
 #
-# Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
+# Copyright (C) 2009-2010  Joris Mooij  [joris dot mooij at libdai dot org]
 
 
 # This template contains configurations for compiling libDAI under Mac OS X
 #
 # To use it, simply copy this file to 'Makefile.conf' and adapt 'Makefile.conf'
 # to your local setup
-#
-# A boolean variable VAR can be set to true ("VAR=true") or to false ("VAR=")
-
 
-# COMPILATION AND BUILD FLAGS
-# Enable/disable various approximate inference methods
-WITH_BP=true
-WITH_FBP=true
-WITH_TRWBP=true
-WITH_MF=true
-WITH_HAK=true
-WITH_LC=true
-WITH_TREEEP=true
-WITH_JTREE=true
-WITH_MR=true
-WITH_GIBBS=true
-WITH_CBP=true
-# Build doxygen documentation?
-WITH_DOC=true
-# Build with debug info?
-DEBUG=true
-# Build matlab interface?
-WITH_MATLAB=
-# MatLab version 7.3 (R2006b) or newer?
-NEW_MATLAB=true
 
 # OPERATING SYSTEM
 # Choose OS from {LINUX, WINDOWS, CYGWIN, MACOSX}
index 24fa9c9..5f7ae9e 100644 (file)
@@ -4,7 +4,7 @@
 # 2, or (at your option) any later version. libDAI is distributed without any
 # warranty. See the file COPYING for more details.
 #
-# Copyright (C) 2009  Joris Mooij  [joris dot mooij at libdai dot org]
+# Copyright (C) 2009-2010  Joris Mooij  [joris dot mooij at libdai dot org]
 
 
 # This template contains configurations for compiling libDAI with Visual C++
 #
 # To use it, simply copy this file to 'Makefile.conf' and adapt 'Makefile.conf'
 # to your local setup
-#
-# A boolean variable VAR can be set to true ("VAR=true") or to false ("VAR=")
-
 
-# COMPILATION AND BUILD FLAGS
-# Enable/disable various approximate inference methods
-WITH_BP=true
-WITH_FBP=true
-WITH_TRWBP=true
-WITH_MF=true
-WITH_HAK=true
-WITH_LC=true
-WITH_TREEEP=true
-WITH_JTREE=true
-WITH_MR=true
-WITH_GIBBS=true
-WITH_CBP=true
-# Build doxygen documentation?
-WITH_DOC=
-# Build with debug info?
-DEBUG=true
-# Build matlab interface?
-WITH_MATLAB=
-# MatLab version 7.3 (R2006b) or newer?
-NEW_MATLAB=true
 
 # OPERATING SYSTEM
 # Choose OS from {LINUX, WINDOWS, CYGWIN, MACOSX}
diff --git a/README b/README
index 375e1dc..d5d4011 100644 (file)
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ libDAI  -  A free/open source C++ library for Discrete Approximate Inference
 -------------------------------------------------------------------------------
 
 Version:  git HEAD
-Date:     November 16, 2009 - or later
+Date:     February 4, 2010 - or later
 See also: http://www.libdai.org
 
 -------------------------------------------------------------------------------
@@ -74,6 +74,7 @@ Currently, libDAI supports the following (approximate) inference methods:
   * Mean Field;
   * Loopy Belief Propagation [KFL01];
   * Fractional Belief Propagation [WiH03];
+  * Tree-Reweighted Belief Propagation [WJW03];
   * Tree Expectation Propagation [MiQ04];
   * Generalized Belief Propagation [YFW05];
   * Double-loop GBP [HAK03];
@@ -151,8 +152,9 @@ You need:
   * GNU make
   * doxygen
   * graphviz
-  * recent boost C++ libraries (at least version 1.34, or 1.37 for cygwin;
-    version 1.37 shipped with Ubuntu 9.04 is known not to work)
+  * recent boost C++ libraries (at least version 1.34 if you have a recent
+    version of GCC, otherwise at least version 1.37; however, version 1.37
+    shipped with Ubuntu 9.04 is known not to work)
 
 On Debian/Ubuntu, you can easily install all these packages with a single
 command:
@@ -201,8 +203,8 @@ Building libDAI under Windows
 
 You need:
 
-  * A recent version of MicroSoft Visual Studio (2008 works)
-  * recent boost C++ libraries (version 1.34 or higher)
+  * A recent version of MicroSoft Visual Studio (2008 is known to work)
+  * recent boost C++ libraries (version 1.37 or higher)
   * GNU make (can be obtained from http://gnuwin32.sourceforge.net)
 
 For the regression test, you need:
index 9a52f3b..716b0a7 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index 18fd489..2b78e46 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 [frederik at ofb dot net]
+ *  Copyright (C) 2009       Frederik Eaton [frederik at ofb dot net]
+ *  Copyright (C) 2009-2010  Joris Mooij [joris dot mooij at libdai dot org]
  */
 
 
index aa3e329..7750443 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index bf1d04a..35bc771 100644 (file)
@@ -4,7 +4,7 @@
  *  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 [frederik at ofb dot net]
+ *  Copyright (C) 2009  Frederik Eaton  [frederik at ofb dot net]
  */
 
 
index 8be220b..e453647 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index ea2c1b1..c315946 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2008-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2008-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  */
 
 
index d3e7034..b52ac27 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index 85382d3..b7cb940 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  [frederik at ofb dot net]
+ *  Copyright (C) 2010 Joris Mooij  [joris dot mooij at libdai dot org]
  */
 
 
index 9aa8bb0..03ff0e1 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index d5a109f..a3c75d8 100644 (file)
@@ -5,7 +5,7 @@
  *  warranty. See the file COPYING for more details.
  *
  *  Copyright (C) 2007       Bastian Wemmenhove
- *  Copyright (C) 2007-2009  Joris Mooij         [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2007-2009  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2007       Radboud University Nijmegen, The Netherlands
  */
 
index 57625de..572f463 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2010 Joris Mooij
+ *  Copyright (C) 2010  Joris Mooij  [joris dot mooij at libdai dot org]
  */
 
 
index fb34f6b..7ce3362 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index d6837d1..b7a2421 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index 9c2ea90..de26d1d 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index c947f13..96d424c 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index 0ddd130..0fabc6a 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index b5e1a2b..0135899 100644 (file)
@@ -4,8 +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  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2009  Frederik Eaton  [frederik at ofb dot net]
+ *  Copyright (C) 2009-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  */
 
 
index 81698dc..b19c936 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
index e180c2c..4cfa78b 100644 (file)
@@ -4,7 +4,7 @@
  *  2, or (at your option) any later version. libDAI is distributed without any
  *  warranty. See the file COPYING for more details.
  *
- *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
  *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
  */
 
@@ -26,31 +26,47 @@ using namespace dai;
 namespace po = boost::program_options;
 
 
+/// Wrapper class for DAI approximate inference algorithms
 class TestDAI {
     protected:
+        /// Stores a pointer to an InfAlg object, managed by this class
         InfAlg          *obj;
+        /// Stores the name of the InfAlg algorithm
         string          name;
+        /// Stores the total variation distances of the variable marginals
         vector<Real>    err;
 
     public:
-        vector<Factor>  varmargs;
-        vector<Factor>  marginals;
+        /// Stores the variable marginals
+        vector<Factor>  varMarginals;
+        /// Stores all marginals
+        vector<Factor>  allMarginals;
+        /// Stores the logarithm of the partition sum
         Real            logZ;
+        /// Stores the maximum difference in the last iteration
         Real            maxdiff;
+        /// Stores the computation time (in seconds)
         double          time;
+        /// Stores the number of iterations needed
         size_t          iters;
+        /// Does the InfAlg support logZ()?
         bool            has_logZ;
+        /// Does the InfAlg support maxDiff()?
         bool            has_maxdiff;
+        /// Does the InfAlg support Iterations()?
         bool            has_iters;
 
-        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), err(), varmargs(), marginals(), logZ(0.0), maxdiff(0.0), time(0), iters(0U), has_logZ(false), has_maxdiff(false), has_iters(false) {
+        /// Construct from factor graph \a fg, name \a _name, and set of properties \a opts
+        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), err(), varMarginals(), allMarginals(), logZ(0.0), maxdiff(0.0), time(0), iters(0U), has_logZ(false), has_maxdiff(false), has_iters(false) {
             double tic = toc();
+
             if( name == "LDPC" ) {
+                // special case: simulating a Low Density Parity Check code
                 Prob zero(2,0.0);
                 zero[0] = 1.0;
                 for( size_t i = 0; i < fg.nrVars(); i++ )
-                    varmargs.push_back( Factor(fg.var(i), zero) );
-                marginals = varmargs;
+                    varMarginals.push_back( Factor(fg.var(i), zero) );
+                allMarginals = varMarginals;
                 logZ = 0.0;
                 maxdiff = 0.0;
                 iters = 1;
@@ -58,15 +74,20 @@ class TestDAI {
                 has_maxdiff = false;
                 has_iters = false;
             } else
+                // create a corresponding InfAlg object
                 obj = newInfAlg( name, fg, opts );
+
+            // Add the time needed to create the object
             time += toc() - tic;
         }
 
+        /// Destructor
         ~TestDAI() {
             if( obj != NULL )
                 delete obj;
         }
 
+        /// Identify
         string identify() const {
             if( obj != NULL )
                 return obj->identify();
@@ -74,13 +95,18 @@ class TestDAI {
                 return "NULL";
         }
 
+        /// Run the algorithm and store its results
         void doDAI() {
             double tic = toc();
             if( obj != NULL ) {
+                // Initialize
                 obj->init();
+                // Run
                 obj->run();
+                // Record the time
                 time += toc() - tic;
 
+                // Store logarithm of the partition sum (if supported)
                 try {
                     logZ = obj->logZ();
                     has_logZ = true;
@@ -91,6 +117,7 @@ class TestDAI {
                         throw;
                 }
 
+                // Store maximum difference encountered in last iteration (if supported)
                 try {
                     maxdiff = obj->maxDiff();
                     has_maxdiff = true;
@@ -101,6 +128,7 @@ class TestDAI {
                         throw;
                 }
 
+                // Store number of iterations needed (if supported)
                 try {
                     iters = obj->Iterations();
                     has_iters = true;
@@ -111,38 +139,45 @@ class TestDAI {
                         throw;
                 }
 
-                varmargs.clear();
+                // Store variable marginals
+                varMarginals.clear();
                 for( size_t i = 0; i < obj->fg().nrVars(); i++ )
-                    varmargs.push_back( obj->beliefV( i ) );
+                    varMarginals.push_back( obj->beliefV( i ) );
 
-                marginals = obj->beliefs();
+                // Store all marginals calculated by the method
+                allMarginals = obj->beliefs();
             };
         }
 
+        /// Calculate total variation distance of variable marginals with respect to those in \a x
         void calcErrs( const TestDAI &x ) {
             err.clear();
-            err.reserve( varmargs.size() );
-            for( size_t i = 0; i < varmargs.size(); i++ )
-                err.push_back( dist( varmargs[i], x.varmargs[i], Prob::DISTTV ) );
+            err.reserve( varMarginals.size() );
+            for( size_t i = 0; i < varMarginals.size(); i++ )
+                err.push_back( dist( varMarginals[i], x.varMarginals[i], Prob::DISTTV ) );
         }
 
+        /// Calculate total variation distance of variable marginals with respect to those in \a x
         void calcErrs( const vector<Factor> &x ) {
             err.clear();
-            err.reserve( varmargs.size() );
-            for( size_t i = 0; i < varmargs.size(); i++ )
-                err.push_back( dist( varmargs[i], x[i], Prob::DISTTV ) );
+            err.reserve( varMarginals.size() );
+            for( size_t i = 0; i < varMarginals.size(); i++ )
+                err.push_back( dist( varMarginals[i], x[i], Prob::DISTTV ) );
         }
 
+        /// Return maximum error
         Real maxErr() {
             return( *max_element( err.begin(), err.end() ) );
         }
 
+        /// Return average error
         Real avgErr() {
             return( accumulate( err.begin(), err.end(), 0.0 ) / err.size() );
         }
 };
 
 
+/// Clips a real number: if the absolute value of \a x is less than \a minabs, return \a minabs, else return \a x
 Real clipReal( Real x, Real minabs ) {
     if( abs(x) < minabs )
         return minabs;
@@ -151,54 +186,81 @@ Real clipReal( Real x, Real minabs ) {
 }
 
 
+/// Whether to output no marginals, only variable marginals, or all calculated marginals
 DAI_ENUM(MarginalsOutputType,NONE,VAR,ALL);
 
 
+/// Main function
 int main( int argc, char *argv[] ) {
+    // Variables to store command line options
+    // Filename of factor graph
     string filename;
+    // Filename for aliases
     string aliases;
+    // Approximate Inference methods to use
     vector<string> methods;
-    Real tol;
-    size_t maxiter;
-    size_t verbose;
+    // Which marginals to output
     MarginalsOutputType marginals;
+    // Output number of iterations?
     bool report_iters = true;
+    // Output calculation time?
     bool report_time = true;
 
+    // Define required command line options
     po::options_description opts_required("Required options");
     opts_required.add_options()
-        ("filename", po::value< string >(&filename), "Filename of FactorGraph")
-        ("methods", po::value< vector<string> >(&methods)->multitoken(), "DAI methods to test")
+        ("filename", po::value< string >(&filename), "Filename of factor graph")
+        ("methods", po::value< vector<string> >(&methods)->multitoken(), "DAI methods to perform")
     ;
 
+    // Define allowed command line options
     po::options_description opts_optional("Allowed options");
     opts_optional.add_options()
-        ("help", "produce help message")
+        ("help", "Produce help message")
         ("aliases", po::value< string >(&aliases), "Filename for aliases")
-        ("tol", po::value< Real >(&tol), "Override tolerance")
-        ("maxiter", po::value< size_t >(&maxiter), "Override maximum number of iterations")
-        ("verbose", po::value< size_t >(&verbose), "Override verbosity")
-        ("marginals", po::value< MarginalsOutputType >(&marginals), "Output marginals? (NONE,VAR,ALL)")
-        ("report-time", po::value< bool >(&report_time), "Report calculation time")
-        ("report-iters", po::value< bool >(&report_iters), "Report iterations needed")
+        ("marginals", po::value< MarginalsOutputType >(&marginals), "Output marginals? (NONE/VAR/ALL, default=NONE)")
+        ("report-time", po::value< bool >(&report_time), "Output calculation time (default==1)?")
+        ("report-iters", po::value< bool >(&report_iters), "Output iterations needed (default==1)?")
     ;
 
+    // Define all command line options
     po::options_description cmdline_options;
     cmdline_options.add(opts_required).add(opts_optional);
 
+    // Parse command line
     po::variables_map vm;
     po::store(po::parse_command_line(argc, argv, cmdline_options), vm);
     po::notify(vm);
 
+    // Display help message if necessary
     if( vm.count("help") || !(vm.count("filename") && vm.count("methods")) ) {
-        cout << "Reads factorgraph <filename.fg> and performs the approximate" << endl;
-        cout << "inference algorithms <method*>, reporting calculation time, max and average" << endl;
-        cout << "error and relative logZ error (comparing with the results of" << endl;
-        cout << "<method0>, the base method, for which one can use JTREE_HUGIN)." << endl << endl;
+        cout << "This program is part of libDAI - http://www.libdai.org/" << endl << endl;
+        cout << "Usage: ./testdai --filename <filename.fg> --methods <method1> [<method2> <method3> ...]" << endl << endl;
+        cout << "Reads factor graph <filename.fg> and performs the approximate inference algorithms" << endl;
+        cout << "<method*>, reporting for each method:" << endl;
+        cout << "  o the calculation time needed, in seconds (if report-time == 1);" << endl;
+        cout << "  o the number of iterations needed (if report-iters == 1);" << endl;
+        cout << "  o the maximum (over all variables) total variation error in the variable marginals;" << endl;
+        cout << "  o the average (over all variables) total variation error in the variable marginals;" << endl;
+        cout << "  o the error (difference) of the logarithm of the partition sums;" << endl << endl;
+        cout << "All errors are calculated by comparing the results of the current method with" << endl; 
+        cout << "the results of the first method (the base method). If marginals==VAR, additional" << endl;
+        cout << "output consists of the variable marginals, and if marginals==ALL, all marginals" << endl;
+        cout << "calculated by the method are reported." << endl << endl;
+        cout << "<method*> should be a list of one or more methods, seperated by spaces, in the format:" << endl << endl;
+        cout << "    name[key1=val1,key2=val2,key3=val3,...,keyn=valn]" << endl << endl;
+        cout << "where name should be the name of an algorithm in libDAI (or an alias, if an alias" << endl;
+        cout << "filename is provided), followed by a list of properties (surrounded by rectangular" << endl;
+        cout << "brackets), where each property consists of a key=value pair and the properties are" << endl;
+        cout << "seperated by commas. If an alias file is specified, alias substitution is performed." << endl;
+        cout << "This is done by looking up the name in the alias file and substituting the alias" << endl;
+        cout << "by its corresponding method as defined in the alias file. Properties are parsed from" << endl;
+        cout << "left to right, so if a property occurs repeatedly, the right-most value is used." << endl << endl;
         cout << opts_required << opts_optional << endl;
 #ifdef DAI_DEBUG
-        cout << "This is a debugging (unoptimised) build of libDAI." << endl;
+        cout << "Note: this is a debugging build of libDAI." << endl << endl;
 #endif
+        cout << "Example:  ./testdai --filename testfast.fg --aliases aliases.conf --methods JTREE_HUGIN BP_SEQFIX BP_PARALL[maxiter=5]" << endl;
         return 1;
     }
 
@@ -212,12 +274,13 @@ int main( int argc, char *argv[] ) {
         FactorGraph fg;
         fg.ReadFromFile( filename.c_str() );
 
-        vector<Factor> varmargs0;
+        // Declare variables used for storing variable marginals and log partition sum of base method
+        vector<Factor> varMarginals0;
         Real logZ0 = 0.0;
 
+        // Output header
         cout.setf( ios_base::scientific );
         cout.precision( 3 );
-
         cout << "# " << filename << endl;
         cout.width( 39 );
         cout << left << "# METHOD" << "\t";
@@ -231,11 +294,12 @@ int main( int argc, char *argv[] ) {
         cout << "MAXDIFF" << "\t";
         cout << endl;
 
+        // For each method...
         for( size_t m = 0; m < methods.size(); m++ ) {
-            // parse method
+            // Parse method
             pair<string, PropertySet> meth = parseNameProperties( methods[m], Aliases );
 
-            // check whether name is valid
+            // Check whether name is valid
             size_t n = 0;
             for( ; strlen( DAINames[n] ) != 0; n++ )
                 if( meth.first == DAINames[n] )
@@ -243,24 +307,28 @@ int main( int argc, char *argv[] ) {
             if( strlen( DAINames[n] ) == 0 )
                 DAI_THROWE(UNKNOWN_DAI_ALGORITHM,string("Unknown DAI algorithm \"") + meth.first + string("\" in \"") + methods[m] + string("\""));
 
-            if( vm.count("tol") )
-                meth.second.Set("tol",tol);
-            if( vm.count("maxiter") )
-                meth.second.Set("maxiter",maxiter);
-            if( vm.count("verbose") )
-                meth.second.Set("verbose",verbose);
+            // Construct object for running the method
             TestDAI testdai(fg, meth.first, meth.second );
+
+            // Run the method
             testdai.doDAI();
+
+            // For the base method, store its variable marginals and logarithm of the partition sum
             if( m == 0 ) {
-                varmargs0 = testdai.varmargs;
+                varMarginals0 = testdai.varMarginals;
                 logZ0 = testdai.logZ;
             }
-            testdai.calcErrs(varmargs0);
 
+            // Calculate errors relative to base method
+            testdai.calcErrs( varMarginals0 );
+
+            // Output method name
             cout.width( 39 );
             cout << left << methods[m] << "\t";
+            // Output calculation time, if requested
             if( report_time )
                 cout << right << testdai.time << "\t";
+            // Output number of iterations, if requested
             if( report_iters ) {
                 if( testdai.has_iters ) {
                     cout << testdai.iters << "\t";
@@ -269,24 +337,29 @@ int main( int argc, char *argv[] ) {
                 }
             }
 
+            // If this is not the base method
             if( m > 0 ) {
                 cout.setf( ios_base::scientific );
                 cout.precision( 3 );
 
+                // Output maximum error in variable marginals
                 Real me = clipReal( testdai.maxErr(), 1e-9 );
                 cout << me << "\t";
 
+                // Output average error in variable marginals
                 Real ae = clipReal( testdai.avgErr(), 1e-9 );
                 cout << ae << "\t";
 
+                // Output error in log partition sum
                 if( testdai.has_logZ ) {
                     cout.setf( ios::showpos );
-                    Real le = clipReal( testdai.logZ / logZ0 - 1.0, 1e-9 );
+                    Real le = clipReal( testdai.logZ - logZ0, 1e-9 );
                     cout << le << "\t";
                     cout.unsetf( ios::showpos );
                 } else
                     cout << "N/A       \t";
 
+                // Output maximum difference in last iteration
                 if( testdai.has_maxdiff ) {
                     Real md = clipReal( testdai.maxdiff, 1e-9 );
                     if( isnan( me ) )
@@ -301,17 +374,19 @@ int main( int argc, char *argv[] ) {
             }
             cout << endl;
 
+            // Output marginals, if requested
             if( marginals == MarginalsOutputType::VAR ) {
-                for( size_t i = 0; i < testdai.varmargs.size(); i++ )
-                    cout << "# " << testdai.varmargs[i] << endl;
+                for( size_t i = 0; i < testdai.varMarginals.size(); i++ )
+                    cout << "# " << testdai.varMarginals[i] << endl;
             } else if( marginals == MarginalsOutputType::ALL ) {
-                for( size_t I = 0; I < testdai.marginals.size(); I++ )
-                    cout << "# " << testdai.marginals[I] << endl;
+                for( size_t I = 0; I < testdai.allMarginals.size(); I++ )
+                    cout << "# " << testdai.allMarginals[I] << endl;
             }
         }
 
         return 0;
     } catch( string &s ) {
+        // Abort with error message
         cerr << "Exception: " << s << endl;
         return 2;
     }
index 30c1492..c3f5bbf 100644 (file)
@@ -51,7 +51,7 @@ JTREE_SHSH                                    1.000e-09       1.000e-09       +1.000e-09      1.000e-09
 # ({x13}, (5.348e-01, 4.652e-01))
 # ({x14}, (6.291e-01, 3.709e-01))
 # ({x15}, (1.357e-01, 8.643e-01))
-BP_SEQFIX                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_SEQFIX                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -68,7 +68,7 @@ BP_SEQFIX                                     9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_SEQRND                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_SEQRND                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -85,7 +85,7 @@ BP_SEQRND                                     9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_SEQMAX                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_SEQMAX                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -102,7 +102,7 @@ BP_SEQMAX                                   9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_PARALL                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_PARALL                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -119,7 +119,7 @@ BP_PARALL                                   9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_SEQFIX_LOG                                  9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_SEQFIX_LOG                                  9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -136,7 +136,7 @@ BP_SEQFIX_LOG                               9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_SEQRND_LOG                                  9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_SEQRND_LOG                                  9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -153,7 +153,7 @@ BP_SEQRND_LOG                               9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_SEQMAX_LOG                                  9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_SEQMAX_LOG                                  9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -170,7 +170,7 @@ BP_SEQMAX_LOG                               9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BP_PARALL_LOG                                  9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+BP_PARALL_LOG                                  9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -187,7 +187,7 @@ BP_PARALL_LOG                               9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-FBP                                            9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+FBP                                            9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -204,7 +204,7 @@ FBP                                         9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-TRWBP                                          9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+TRWBP                                          9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -221,7 +221,7 @@ TRWBP                                       9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-MF_SEQRND                                      3.607e-01       1.904e-01       -9.409e-02      1.000e-09       
+MF_SEQRND                                      3.607e-01       1.904e-01       -1.608e+00      1.000e-09       
 # ({x0}, (2.053e-01, 7.947e-01))
 # ({x1}, (9.163e-01, 8.373e-02))
 # ({x2}, (1.579e-01, 8.421e-01))
@@ -238,7 +238,7 @@ MF_SEQRND                                   3.607e-01       1.904e-01       -9.409e-02      1.000e-09
 # ({x13}, (8.148e-01, 1.852e-01))
 # ({x14}, (8.338e-01, 1.662e-01))
 # ({x15}, (5.661e-03, 9.943e-01))
-TREEEP                                         3.268e-02       8.023e-03       +6.340e-04      1.000e-09       
+TREEEP                                         3.268e-02       8.023e-03       +1.084e-02      1.000e-09       
 # ({x0}, (3.980e-01, 6.020e-01))
 # ({x1}, (5.520e-01, 4.480e-01))
 # ({x2}, (4.620e-01, 5.380e-01))
@@ -255,7 +255,7 @@ TREEEP                                      3.268e-02       8.023e-03       +6.340e-04      1.000e-09
 # ({x13}, (5.293e-01, 4.707e-01))
 # ({x14}, (6.409e-01, 3.591e-01))
 # ({x15}, (1.364e-01, 8.636e-01))
-TREEEPWC                                       2.356e-02       1.026e-02       +4.876e-03      1.000e-09       
+TREEEPWC                                       2.356e-02       1.026e-02       +8.334e-02      1.000e-09       
 # ({x0}, (4.091e-01, 5.909e-01))
 # ({x1}, (5.429e-01, 4.571e-01))
 # ({x2}, (4.697e-01, 5.303e-01))
@@ -272,7 +272,7 @@ TREEEPWC                                    2.356e-02       1.026e-02       +4.876e-03      1.000e-09
 # ({x13}, (5.298e-01, 4.702e-01))
 # ({x14}, (6.299e-01, 3.701e-01))
 # ({x15}, (1.384e-01, 8.616e-01))
-GBP_MIN                                        9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+GBP_MIN                                        9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -289,7 +289,7 @@ GBP_MIN                                     9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-GBP_BETHE                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+GBP_BETHE                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -306,7 +306,7 @@ GBP_BETHE                                   9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-GBP_DELTA                                      6.291e-01       3.350e-01       -3.303e-01      1.000e-09       
+GBP_DELTA                                      6.291e-01       3.350e-01       -5.645e+00      1.000e-09       
 # ({x0}, (0.000e+00, 1.000e+00))
 # ({x1}, (1.000e+00, 0.000e+00))
 # ({x2}, (0.000e+00, 1.000e+00))
@@ -323,7 +323,7 @@ GBP_DELTA                                   6.291e-01       3.350e-01       -3.303e-01      1.000e-09
 # ({x13}, (0.000e+00, 1.000e+00))
 # ({x14}, (0.000e+00, 1.000e+00))
 # ({x15}, (0.000e+00, 1.000e+00))
-GBP_LOOP3                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+GBP_LOOP3                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -340,7 +340,7 @@ GBP_LOOP3                                   9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-GBP_LOOP4                                      7.893e-01       3.728e-01       -5.824e-01      1.000e-09       
+GBP_LOOP4                                      7.893e-01       3.728e-01       -9.954e+00      1.000e-09       
 # ({x0}, (0.000e+00, 1.000e+00))
 # ({x1}, (1.000e+00, 0.000e+00))
 # ({x2}, (0.000e+00, 1.000e+00))
@@ -357,7 +357,7 @@ GBP_LOOP4                                   7.893e-01       3.728e-01       -5.824e-01      1.000e-09
 # ({x13}, (1.000e+00, 0.000e+00))
 # ({x14}, (0.000e+00, 1.000e+00))
 # ({x15}, (0.000e+00, 1.000e+00))
-GBP_LOOP5                                      7.893e-01       3.728e-01       -5.824e-01      1.000e-09       
+GBP_LOOP5                                      7.893e-01       3.728e-01       -9.954e+00      1.000e-09       
 # ({x0}, (0.000e+00, 1.000e+00))
 # ({x1}, (1.000e+00, 0.000e+00))
 # ({x2}, (0.000e+00, 1.000e+00))
@@ -374,7 +374,7 @@ GBP_LOOP5                                   7.893e-01       3.728e-01       -5.824e-01      1.000e-09
 # ({x13}, (1.000e+00, 0.000e+00))
 # ({x14}, (0.000e+00, 1.000e+00))
 # ({x15}, (0.000e+00, 1.000e+00))
-GBP_LOOP6                                      7.948e-01       4.458e-01       -4.096e-01      1.000e-09       
+GBP_LOOP6                                      7.948e-01       4.458e-01       -7.000e+00      1.000e-09       
 # ({x0}, (1.000e+00, 0.000e+00))
 # ({x1}, (0.000e+00, 1.000e+00))
 # ({x2}, (1.000e+00, 0.000e+00))
@@ -391,7 +391,7 @@ GBP_LOOP6                                   7.948e-01       4.458e-01       -4.096e-01      1.000e-09
 # ({x13}, (1.000e+00, 0.000e+00))
 # ({x14}, (0.000e+00, 1.000e+00))
 # ({x15}, (0.000e+00, 1.000e+00))
-GBP_LOOP7                                      7.948e-01       4.458e-01       -4.096e-01      1.000e-09       
+GBP_LOOP7                                      7.948e-01       4.458e-01       -7.000e+00      1.000e-09       
 # ({x0}, (1.000e+00, 0.000e+00))
 # ({x1}, (0.000e+00, 1.000e+00))
 # ({x2}, (1.000e+00, 0.000e+00))
@@ -408,7 +408,7 @@ GBP_LOOP7                                   7.948e-01       4.458e-01       -4.096e-01      1.000e-09
 # ({x13}, (1.000e+00, 0.000e+00))
 # ({x14}, (0.000e+00, 1.000e+00))
 # ({x15}, (0.000e+00, 1.000e+00))
-HAK_MIN                                        9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+HAK_MIN                                        9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -425,7 +425,7 @@ HAK_MIN                                     9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-HAK_BETHE                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+HAK_BETHE                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -442,7 +442,7 @@ HAK_BETHE                                   9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-HAK_DELTA                                      3.684e-01       1.892e-01       +9.675e-01      1.000e-09       
+HAK_DELTA                                      3.684e-01       1.892e-01       +1.654e+01      1.000e-09       
 # ({x0}, (4.902e-01, 5.098e-01))
 # ({x1}, (5.098e-01, 4.902e-01))
 # ({x2}, (4.902e-01, 5.098e-01))
@@ -459,7 +459,7 @@ HAK_DELTA                                   3.684e-01       1.892e-01       +9.675e-01      1.000e-09
 # ({x13}, (5.098e-01, 4.902e-01))
 # ({x14}, (5.098e-01, 4.902e-01))
 # ({x15}, (4.902e-01, 5.098e-01))
-HAK_LOOP3                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+HAK_LOOP3                                      9.483e-02       3.078e-02       +2.969e-01      1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -476,7 +476,7 @@ HAK_LOOP3                                   9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-HAK_LOOP4                                      4.970e-03       1.486e-03       -2.503e-04      1.000e-09       
+HAK_LOOP4                                      4.970e-03       1.486e-03       -4.277e-03      1.000e-09       
 # ({x0}, (3.909e-01, 6.091e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
 # ({x2}, (4.585e-01, 5.415e-01))
@@ -493,7 +493,7 @@ HAK_LOOP4                                   4.970e-03       1.486e-03       -2.503e-04      1.000e-09
 # ({x13}, (5.351e-01, 4.649e-01))
 # ({x14}, (6.319e-01, 3.681e-01))
 # ({x15}, (1.307e-01, 8.693e-01))
-HAK_LOOP5                                      4.970e-03       1.486e-03       -2.503e-04      1.000e-09       
+HAK_LOOP5                                      4.970e-03       1.486e-03       -4.277e-03      1.000e-09       
 # ({x0}, (3.909e-01, 6.091e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
 # ({x2}, (4.585e-01, 5.415e-01))
@@ -952,7 +952,7 @@ LCBP_UNICAV_SEQRND                          9.483e-02       3.078e-02       N/A             1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-BBP                                            7.049e-04       2.319e-04       +7.075e-05      1.000e-09       
+BBP                                            7.049e-04       2.319e-04       +1.209e-03      1.000e-09       
 # ({x0}, (3.890e-01, 6.110e-01))
 # ({x1}, (5.555e-01, 4.445e-01))
 # ({x2}, (4.587e-01, 5.413e-01))
@@ -969,7 +969,7 @@ BBP                                         7.049e-04       2.319e-04       +7.075e-05      1.000e-09
 # ({x13}, (5.351e-01, 4.649e-01))
 # ({x14}, (6.284e-01, 3.716e-01))
 # ({x15}, (1.355e-01, 8.645e-01))
-CBP                                            3.294e-06       8.863e-07       +2.066e-07      1.000e-09       
+CBP                                            3.294e-06       8.863e-07       +3.531e-06      1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
 # ({x2}, (4.587e-01, 5.413e-01))