Misc changes
authorJoris Mooij <jorism@marvin.jorismooij.nl>
Tue, 30 Sep 2008 07:45:51 +0000 (09:45 +0200)
committerJoris Mooij <jorism@marvin.jorismooij.nl>
Tue, 30 Sep 2008 07:45:51 +0000 (09:45 +0200)
Makefile
Makefile.win
TODO
src/lc.cpp
tests/test.cpp [deleted file]
tests/testall
tests/testall.bat
tests/testdai.cpp [new file with mode: 0644]
tests/testfast.out

index b43d620..672d80c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -54,9 +54,11 @@ BOOSTLIBS=-lboost_program_options
 
 # Compile using GNU C++ Compiler
 CC=g++
+# Output filename option
+CCO=-o
 
 # Flags for the C++ compiler
-CCFLAGS=-Wno-deprecated -Wall -W -Wextra -fpic -I./include -Llib -O3 #-pg #-static #-DVERBOSE
+CCFLAGS=-Wno-deprecated -Wall -W -Wextra -fpic -I./include -Llib -O3 #-pg
 ifdef DEBUG
 CCFLAGS:=$(CCFLAGS) -g -DDAI_DEBUG
 endif
@@ -124,121 +126,27 @@ all : $(TARGETS)
 matlabs : matlab/dai.$(ME) matlab/dai_readfg.$(ME) matlab/dai_writefg.$(ME) matlab/dai_potstrength.$(ME)
 
 $(LIB)/libdai$(LE) : bipgraph$(OE) daialg$(OE) alldai$(OE) clustergraph$(OE) factorgraph$(OE) properties$(OE) regiongraph$(OE) util$(OE) weightedgraph$(OE) exceptions$(OE) varset$(OE) $(OBJECTS)
+       -mkdir -p lib
        ar rcus $(LIB)/libdai$(LE) bipgraph$(OE) daialg$(OE) alldai$(OE) clustergraph$(OE) factorgraph$(OE) properties$(OE) regiongraph$(OE) util$(OE) weightedgraph$(OE) exceptions$(OE) varset$(OE) $(OBJECTS)
 
-tests : tests/test$(EE)
+tests : tests/testdai$(EE)
 
 utils : utils/createfg$(EE) utils/fg2dot$(EE) utils/fginfo$(EE)
 
-testregression : tests/test
-       echo Testing...this can take a while...
+testregression : tests/testdai
+       @echo Starting regression test...this can take a minute or so!
        cd tests; time ./testregression; cd ..
 
 doc : $(INC)/*.h $(SRC)/*.cpp doxygen.conf
+       -mkdir -p doc
        doxygen doxygen.conf
 
+.PHONY : clean
 clean :
-       rm *$(OE) example$(EE) matlab/*.$(ME) matlab/*$(OE) tests/test$(EE) utils/fg2dot$(EE) utils/createfg$(EE) utils/fginfo$(EE) $(LIB)/libdai$(LE); echo
-       rm -R doc; echo
+       -rm *$(OE) 
+       -rm matlab/*.$(ME) matlab/*$(OE) 
+       -rm example$(EE) tests/testdai$(EE) utils/fg2dot$(EE) utils/createfg$(EE) utils/fginfo$(EE)
+       -rm -R doc
+       -rm -R lib
 
-bipgraph$(OE) : $(SRC)/bipgraph.cpp $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/bipgraph.cpp
-
-daialg$(OE) : $(SRC)/daialg.cpp $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/daialg.cpp
-
-exactinf$(OE) : $(SRC)/exactinf.cpp $(INC)/exactinf.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/exactinf.cpp
-
-bp$(OE) : $(SRC)/bp.cpp $(INC)/bp.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/bp.cpp
-
-lc$(OE) : $(SRC)/lc.cpp $(INC)/lc.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/lc.cpp
-
-mf$(OE) : $(SRC)/mf.cpp $(INC)/mf.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/mf.cpp
-
-factorgraph$(OE) : $(SRC)/factorgraph.cpp $(INC)/factorgraph.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/factorgraph.cpp
-
-util$(OE) : $(SRC)/util.cpp $(INC)/util.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/util.cpp
-
-regiongraph$(OE) : $(SRC)/regiongraph.cpp $(INC)/regiongraph.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/regiongraph.cpp
-
-hak$(OE) : $(SRC)/hak.cpp $(INC)/hak.h $(HEADERS) $(INC)/regiongraph.h
-       $(CC) $(CCFLAGS) -c $(SRC)/hak.cpp
-
-clustergraph$(OE) : $(SRC)/clustergraph.cpp $(INC)/clustergraph.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/clustergraph.cpp
-
-jtree$(OE) : $(SRC)/jtree.cpp $(INC)/jtree.h $(HEADERS) $(INC)/weightedgraph.h $(INC)/clustergraph.h $(INC)/regiongraph.h
-       $(CC) $(CCFLAGS) -c $(SRC)/jtree.cpp
-
-treeep$(OE) : $(SRC)/treeep.cpp $(INC)/treeep.h $(HEADERS) $(INC)/weightedgraph.h $(INC)/clustergraph.h $(INC)/regiongraph.h $(INC)/jtree.h
-       $(CC) $(CCFLAGS) -c $(SRC)/treeep.cpp
-
-weightedgraph$(OE) : $(SRC)/weightedgraph.cpp $(INC)/weightedgraph.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/weightedgraph.cpp
-
-mr$(OE) : $(SRC)/mr.cpp $(INC)/mr.h $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/mr.cpp
-
-properties$(OE) : $(SRC)/properties.cpp $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/properties.cpp
-
-exceptions$(OE) : $(SRC)/exceptions.cpp $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/exceptions.cpp
-
-alldai$(OE) : $(SRC)/alldai.cpp $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/alldai.cpp
-
-varset$(OE) : $(SRC)/varset.cpp $(HEADERS)
-       $(CC) $(CCFLAGS) -c $(SRC)/varset.cpp
-
-
-# EXAMPLE
-##########
-
-example$(EE) : example.cpp $(HEADERS) $(LIB)/libdai$(LE)
-       $(CC) $(CCFLAGS) -o example$(EE) example.cpp $(LIBS)
-
-# TESTS
-########
-
-tests/test$(EE) : tests/test.cpp $(HEADERS) $(LIB)/libdai$(LE)
-       $(CC) $(CCFLAGS) -o tests/test$(EE) tests/test.cpp $(LIBS) $(BOOSTLIBS)
-
-
-# MATLAB INTERFACE
-###################
-
-matlab/dai.$(ME) : matlab/dai.cpp $(HEADERS) matlab/matlab$(OE) $(LIB)/libdai$(LE)
-       $(MEX) $(MEXFLAGS) -o matlab/dai matlab/dai.cpp matlab/matlab$(OE) $(LIB)/libdai$(LE)
-
-matlab/dai_readfg.$(ME) : matlab/dai_readfg.cpp $(HEADERS) factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)
-       $(MEX) $(MEXFLAGS) -o matlab/dai_readfg matlab/dai_readfg.cpp factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)
-
-matlab/dai_writefg.$(ME) : matlab/dai_writefg.cpp $(HEADERS) factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)
-       $(MEX) $(MEXFLAGS) -o matlab/dai_writefg matlab/dai_writefg.cpp factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)
-
-matlab/dai_potstrength.$(ME) : matlab/dai_potstrength.cpp $(HEADERS) matlab/matlab$(OE) exceptions$(OE) varset$(OE)
-       $(MEX) $(MEXFLAGS) -o matlab/dai_potstrength matlab/dai_potstrength.cpp matlab/matlab$(OE) exceptions$(OE) varset$(OE)
-
-matlab/matlab$(OE) : matlab/matlab.cpp matlab/matlab.h $(HEADERS)
-       $(MEX) $(MEXFLAGS) -outdir matlab -c matlab/matlab.cpp
-
-
-# UTILS
-########
-
-utils/createfg$(EE) : utils/createfg.cpp $(HEADERS) $(LIB)/libdai$(LE)
-       $(CC) $(CCFLAGS) -o utils/createfg utils/createfg.cpp $(LIBS) $(BOOSTLIBS)
-
-utils/fg2dot$(EE) : utils/fg2dot.cpp $(HEADERS) $(LIB)/libdai$(LE)
-       $(CC) $(CCFLAGS) -o utils/fg2dot utils/fg2dot.cpp $(LIBS)
-
-utils/fginfo$(EE) : utils/fginfo.cpp $(HEADERS) $(LIB)/libdai$(LE)
-       $(CC) $(CCFLAGS) -o utils/fginfo utils/fginfo.cpp $(LIBS)
+include Makefile.shared
index e8a1b80..b0a1754 100755 (executable)
@@ -54,6 +54,8 @@ BOOSTLIBS=/LIBPATH:C:\boost_1_36_0\stage\lib
 \r
 # Compile using GNU C++ Compiler\r
 CC=cl\r
+# Output filename option\r
+CCO=/Fe\r
 \r
 # Flags for the C++ compiler\r
 CCFLAGS=/I./include /IC:\boost_1_36_0 /EHsc /Ox\r
@@ -127,11 +129,11 @@ matlabs : matlab/dai.$(ME) matlab/dai_readfg.$(ME) matlab/dai_writefg.$(ME) matl
 $(LIB)/libdai$(LE) : bipgraph$(OE) daialg$(OE) alldai$(OE) clustergraph$(OE) factorgraph$(OE) properties$(OE) regiongraph$(OE) util$(OE) weightedgraph$(OE) exceptions$(OE) varset$(OE) $(OBJECTS)\r
        lib /out:$(LIB)/libdai$(LE) bipgraph$(OE) daialg$(OE) alldai$(OE) clustergraph$(OE) factorgraph$(OE) properties$(OE) regiongraph$(OE) util$(OE) weightedgraph$(OE) exceptions$(OE) varset$(OE) $(OBJECTS)\r
 \r
-tests : tests/test$(EE)\r
+tests : tests/testdai$(EE)\r
 \r
 utils : utils/createfg$(EE) utils/fg2dot$(EE) utils/fginfo$(EE)\r
 \r
-testregression : tests/test\r
+testregression : tests/testdai\r
        echo Testing...this can take a while...\r
        cd tests; time ./testregression; cd ..\r
 \r
@@ -139,108 +141,6 @@ doc : $(INC)/*.h $(SRC)/*.cpp doxygen.conf
        doxygen doxygen.conf\r
 \r
 clean :\r
-       del *$(OE) *.ilk *.pdb *$(EE) matlab\*.$(ME) matlab\*$(OE) tests\test$(EE) tests\*.pdb tests\*.ilk utils\*$(EE) utils\*.pdb utils\*.ilk $(LIB)\libdai$(LE)\r
+       del *$(OE) *.ilk *.pdb *$(EE) matlab\*.$(ME) matlab\*$(OE) tests\testdai$(EE) tests\*.pdb tests\*.ilk utils\*$(EE) utils\*.pdb utils\*.ilk $(LIB)\libdai$(LE)\r
 \r
-\r
-bipgraph$(OE) : $(SRC)/bipgraph.cpp $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/bipgraph.cpp\r
-\r
-daialg$(OE) : $(SRC)/daialg.cpp $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/daialg.cpp\r
-\r
-exactinf$(OE) : $(SRC)/exactinf.cpp $(INC)/exactinf.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/exactinf.cpp\r
-\r
-bp$(OE) : $(SRC)/bp.cpp $(INC)/bp.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/bp.cpp\r
-\r
-lc$(OE) : $(SRC)/lc.cpp $(INC)/lc.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/lc.cpp\r
-\r
-mf$(OE) : $(SRC)/mf.cpp $(INC)/mf.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/mf.cpp\r
-\r
-factorgraph$(OE) : $(SRC)/factorgraph.cpp $(INC)/factorgraph.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/factorgraph.cpp\r
-\r
-util$(OE) : $(SRC)/util.cpp $(INC)/util.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/util.cpp\r
-\r
-regiongraph$(OE) : $(SRC)/regiongraph.cpp $(INC)/regiongraph.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/regiongraph.cpp\r
-\r
-hak$(OE) : $(SRC)/hak.cpp $(INC)/hak.h $(HEADERS) $(INC)/regiongraph.h\r
-       $(CC) $(CCFLAGS) -c $(SRC)/hak.cpp\r
-\r
-clustergraph$(OE) : $(SRC)/clustergraph.cpp $(INC)/clustergraph.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/clustergraph.cpp\r
-\r
-jtree$(OE) : $(SRC)/jtree.cpp $(INC)/jtree.h $(HEADERS) $(INC)/weightedgraph.h $(INC)/clustergraph.h $(INC)/regiongraph.h\r
-       $(CC) $(CCFLAGS) -c $(SRC)/jtree.cpp\r
-\r
-treeep$(OE) : $(SRC)/treeep.cpp $(INC)/treeep.h $(HEADERS) $(INC)/weightedgraph.h $(INC)/clustergraph.h $(INC)/regiongraph.h $(INC)/jtree.h\r
-       $(CC) $(CCFLAGS) -c $(SRC)/treeep.cpp\r
-\r
-weightedgraph$(OE) : $(SRC)/weightedgraph.cpp $(INC)/weightedgraph.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/weightedgraph.cpp\r
-\r
-mr$(OE) : $(SRC)/mr.cpp $(INC)/mr.h $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/mr.cpp\r
-\r
-properties$(OE) : $(SRC)/properties.cpp $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/properties.cpp\r
-\r
-exceptions$(OE) : $(SRC)/exceptions.cpp $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/exceptions.cpp\r
-\r
-alldai$(OE) : $(SRC)/alldai.cpp $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/alldai.cpp\r
-\r
-varset$(OE) : $(SRC)/varset.cpp $(HEADERS)\r
-       $(CC) $(CCFLAGS) -c $(SRC)/varset.cpp\r
-\r
-\r
-# EXAMPLE\r
-##########\r
-\r
-example$(EE) : example.cpp $(HEADERS) $(LIB)/libdai$(LE)\r
-       $(CC) $(CCFLAGS) /Feexample example.cpp $(LIBS)\r
-\r
-\r
-# TESTS\r
-########\r
-\r
-tests/test$(EE) : tests/test.cpp $(HEADERS) $(LIB)/libdai$(LE)\r
-       $(CC) $(CCFLAGS) /Fetests/test tests/test.cpp $(LIBS) $(BOOSTLIBS)\r
-\r
-\r
-# MATLAB INTERFACE\r
-###################\r
-\r
-matlab/dai.$(ME) : matlab/dai.cpp $(HEADERS) matlab/matlab$(OE) $(LIB)/libdai$(LE)\r
-       $(MEX) $(MEXFLAGS) -o matlab/dai matlab/dai.cpp matlab/matlab$(OE) $(LIB)/libdai$(LE)\r
-\r
-matlab/dai_readfg.$(ME) : matlab/dai_readfg.cpp $(HEADERS) factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)\r
-       $(MEX) $(MEXFLAGS) -o matlab/dai_readfg matlab/dai_readfg.cpp factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)\r
-\r
-matlab/dai_writefg.$(ME) : matlab/dai_writefg.cpp $(HEADERS) factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)\r
-       $(MEX) $(MEXFLAGS) -o matlab/dai_writefg matlab/dai_writefg.cpp factorgraph$(OE) matlab/matlab$(OE) exceptions$(OE) varset$(OE)\r
-\r
-matlab/dai_potstrength.$(ME) : matlab/dai_potstrength.cpp $(HEADERS) matlab/matlab$(OE) exceptions$(OE) varset$(OE)\r
-       $(MEX) $(MEXFLAGS) -o matlab/dai_potstrength matlab/dai_potstrength.cpp matlab/matlab$(OE) exceptions$(OE) varset$(OE)\r
-\r
-matlab/matlab$(OE) : matlab/matlab.cpp matlab/matlab.h $(HEADERS)\r
-       $(MEX) $(MEXFLAGS) -outdir matlab -c matlab/matlab.cpp\r
-\r
-\r
-# UTILS\r
-########\r
-\r
-utils/createfg$(EE) : utils/createfg.cpp $(HEADERS) $(LIB)/libdai$(LE)\r
-       $(CC) $(CCFLAGS) /Feutils/createfg utils/createfg.cpp $(LIBS) $(BOOSTLIBS)\r
-\r
-utils/fg2dot$(EE) : utils/fg2dot.cpp $(HEADERS) $(LIB)/libdai$(LE)\r
-       $(CC) $(CCFLAGS) /Feutils/fg2dot utils/fg2dot.cpp $(LIBS)\r
-\r
-utils/fginfo$(EE) : utils/fginfo.cpp $(HEADERS) $(LIB)/libdai$(LE)\r
-       $(CC) $(CCFLAGS) /Feutils/fginfo utils/fginfo.cpp $(LIBS)\r
+!INCLUDE Makefile.shared\r
diff --git a/TODO b/TODO
index 003e9ff..bc83a2f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -11,6 +11,8 @@ OPTIMIZATION:
 - A DAIAlg<T> should not inherit from a FactorGraph/RegionGraph, but should store a reference to it
 
 IDEAS:
+- Use "gcc -MM" to generate dependencies for targets.
+
 - Use a PropertySet as output of a DAIAlg, instead of functions like maxDiff and Iterations().
 
 - A FactorGraph and a RegionGraph are often equipped with
index c37c9fd..13f9300 100644 (file)
@@ -184,7 +184,6 @@ double LC::InitCavityDists( const std::string &name, const PropertySet &opts ) {
         if( md > maxdiff )
             maxdiff = md;
     }
-    init();
 
     if( props.verbose >= 1 ) {
         cout << Name << "::InitCavityDists used " << toc() - tic << " seconds." << endl;
@@ -205,7 +204,6 @@ long LC::SetCavityDists( std::vector<Factor> &Q ) {
         } else
             _cavitydists[i] = Q[i];
     }
-    init();
     return 0;
 }
 
@@ -217,19 +215,6 @@ void LC::init() {
                 _phis[i][I.iter].randomize();
             else
                 _phis[i][I.iter].fill(1.0);
-    for( size_t i = 0; i < nrVars(); i++ ) {
-        _pancakes[i] = _cavitydists[i];
-        
-        foreach( const Neighbor &I, nbV(i) ) {
-            _pancakes[i] *= factor(I);
-            if( props.updates == Properties::UpdateType::SEQRND )
-              _pancakes[i] *= _phis[i][I.iter];
-        }
-        
-        _pancakes[i].normalize();
-
-        CalcBelief(i);
-    }
 }
 
 
@@ -277,6 +262,20 @@ double LC::run() {
     if( md > _maxdiff )
         _maxdiff = md;
 
+    for( size_t i = 0; i < nrVars(); i++ ) {
+        _pancakes[i] = _cavitydists[i];
+        
+        foreach( const Neighbor &I, nbV(i) ) {
+            _pancakes[i] *= factor(I);
+            if( props.updates == Properties::UpdateType::SEQRND )
+              _pancakes[i] *= _phis[i][I.iter];
+        }
+        
+        _pancakes[i].normalize();
+
+        CalcBelief(i);
+    }
+
     vector<Factor> old_beliefs;
     for(size_t i=0; i < nrVars(); i++ )
         old_beliefs.push_back(belief(i));
diff --git a/tests/test.cpp b/tests/test.cpp
deleted file mode 100644 (file)
index 4e8117e..0000000
+++ /dev/null
@@ -1,372 +0,0 @@
-/*  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
-*/
-
-
-#include <iostream>
-#include <fstream>
-#include <map>
-#include <numeric>
-#include <cmath>
-#include <cstdlib>
-#include <cstring>
-#include <boost/program_options.hpp>
-#include <dai/util.h>
-#include <dai/alldai.h>
-
-
-using namespace std;
-using namespace dai;
-namespace po = boost::program_options;
-
-
-class TestDAI {
-    protected:
-        InfAlg          *obj;
-        string          name;
-        vector<double>  err;
-
-    public:
-        vector<Factor>  q;
-        double          logZ;
-        double          maxdiff;
-        double          time;
-        size_t          iters;
-        bool            has_logZ;
-        bool            has_maxdiff;
-        bool            has_iters;
-
-        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), err(), q(), 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" ) {
-                double zero[2] = {1.0, 0.0};
-                q.clear();
-                for( size_t i = 0; i < fg.nrVars(); i++ )
-                    q.push_back( Factor(Var(i,2), zero) );
-                logZ = 0.0;
-                maxdiff = 0.0;
-                iters = 1;
-                has_logZ = false;
-                has_maxdiff = false;
-                has_iters = false;
-            } else
-                obj = newInfAlg( name, fg, opts );
-            time += toc() - tic;
-        }
-
-        ~TestDAI() { 
-            if( obj != NULL )
-                delete obj;
-        }
-
-        string identify() { 
-            if( obj != NULL )
-                return obj->identify(); 
-            else
-                return "NULL";
-        }
-
-        vector<Factor> allBeliefs() {
-            vector<Factor> result;
-            for( size_t i = 0; i < obj->fg().nrVars(); i++ )
-                result.push_back( obj->belief( obj->fg().var(i) ) );
-            return result;
-        }
-
-        void doDAI() {
-            double tic = toc();
-            if( obj != NULL ) {
-                obj->init();
-                obj->run();
-                time += toc() - tic;
-                try {
-                    logZ = obj->logZ();
-                    has_logZ = true;
-                } catch( Exception &e ) {
-                    has_logZ = false;
-                }
-                try {
-                    maxdiff = obj->maxDiff();
-                    has_maxdiff = true;
-                } catch( Exception &e ) {
-                    has_maxdiff = false;
-                }
-                try {
-                    iters = obj->Iterations();
-                    has_iters = true;
-                } catch( Exception &e ) {
-                    has_iters = false;
-                }
-                q = allBeliefs();
-            };
-        }
-
-        void calcErrs( const TestDAI &x ) {
-            err.clear();
-            err.reserve( q.size() );
-            for( size_t i = 0; i < q.size(); i++ )
-                err.push_back( dist( q[i], x.q[i], Prob::DISTTV ) );
-        }
-
-        void calcErrs( const vector<Factor> &x ) {
-            err.clear();
-            err.reserve( q.size() );
-            for( size_t i = 0; i < q.size(); i++ )
-                err.push_back( dist( q[i], x[i], Prob::DISTTV ) );
-        }
-
-        double maxErr() { 
-            return( *max_element( err.begin(), err.end() ) );
-        }
-        
-        double avgErr() { 
-            return( accumulate( err.begin(), err.end(), 0.0 ) / err.size() );
-        }
-};
-
-
-pair<string, PropertySet> parseMethod( const string &_s, const map<string,string> & aliases ) {
-    // s = first part of _s, until '['
-    string::size_type pos = _s.find_first_of('[');
-    string s;
-    if( pos == string::npos )
-        s = _s;
-    else
-        s = _s.substr(0,pos);
-
-    // if the first part is an alias, substitute
-    if( aliases.find(s) != aliases.end() )
-        s = aliases.find(s)->second;
-
-    // attach second part, merging properties if necessary
-    if( pos != string::npos ) {
-        if( s.at(s.length()-1) == ']' ) {
-            s = s.erase(s.length()-1,1) + ',' + _s.substr(pos+1);
-        } else
-            s = s + _s.substr(pos);
-    }
-
-    pair<string, PropertySet> result;
-    string & name = result.first;
-    PropertySet & opts = result.second;
-
-    pos = s.find_first_of('[');
-    if( pos == string::npos )
-        throw "Malformed method";
-    name = s.substr( 0, pos );
-    size_t n = 0;
-    for( ; strlen( DAINames[n] ) != 0; n++ )
-        if( name == DAINames[n] )
-            break;
-    if( strlen( DAINames[n] ) == 0 && (name != "LDPC") )
-        DAI_THROW(UNKNOWN_DAI_ALGORITHM);
-
-    stringstream ss;
-    ss << s.substr(pos,s.length());
-    ss >> opts;
-    
-    return result;
-}
-
-
-double clipdouble( double x, double minabs ) {
-    if( fabs(x) < minabs )
-        return minabs;
-    else
-        return x;
-}
-
-
-int main( int argc, char *argv[] ) {
-    try {
-        string filename;
-        string aliases;
-        vector<string> methods;
-        double tol;
-        size_t maxiter;
-        size_t verbose;
-        bool marginals = false;
-        bool report_time = true;
-
-        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")
-        ;
-
-        po::options_description opts_optional("Allowed options");
-        opts_optional.add_options()
-            ("help", "produce help message")
-            ("aliases", po::value< string >(&aliases), "Filename for aliases")
-            ("tol", po::value< double >(&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< bool >(&marginals), "Output single node marginals?")
-            ("report-time", po::value< bool >(&report_time), "Report calculation time")
-        ;
-
-        po::options_description cmdline_options;
-        cmdline_options.add(opts_required).add(opts_optional);
-
-        po::variables_map vm;
-        po::store(po::parse_command_line(argc, argv, cmdline_options), vm);
-        po::notify(vm);
-
-        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 << opts_required << opts_optional << endl;
-            return 1;
-        }
-
-        // Read aliases
-        map<string,string> Aliases;
-        if( !aliases.empty() ) {
-            ifstream infile;
-            infile.open (aliases.c_str());
-            if (infile.is_open()) {
-                while( true ) {
-                    string line;
-                    getline(infile,line);
-                    if( infile.fail() )
-                        break;
-                    if( (!line.empty()) && (line[0] != '#') ) {
-                        string::size_type pos = line.find(':',0);
-                        if( pos == string::npos )
-                            throw "Invalid alias";
-                        else {
-                            string::size_type posl = line.substr(0, pos).find_last_not_of(" \t");
-                            string key = line.substr(0, posl + 1);
-                            string::size_type posr = line.substr(pos + 1, line.length()).find_first_not_of(" \t");
-                            string val = line.substr(pos + 1 + posr, line.length());
-                            Aliases[key] = val;
-                        }
-                    }
-                }
-                infile.close();
-            } else
-                throw "Error opening aliases file";
-        }
-
-        FactorGraph fg;
-        fg.ReadFromFile( filename.c_str() );
-
-        vector<Factor> q0;
-        double logZ0 = 0.0;
-
-        cout << "# " << filename << endl;
-        cout.width( 40 );
-        cout << left << "# METHOD" << "  ";
-        if( report_time ) {
-            cout.width( 10 );
-            cout << right << "SECONDS" << "   ";
-        }
-        cout.width( 10 );
-        cout << "MAX ERROR" << "  ";
-        cout.width( 10 );
-        cout << "AVG ERROR" << "  ";
-        cout.width( 10 );
-        cout << "LOGZ ERROR" << "  ";
-        cout.width( 10 );
-        cout << "MAXDIFF" << "  ";
-        cout.width( 10 );
-        cout << "ITERS" << endl;
-
-        for( size_t m = 0; m < methods.size(); m++ ) {
-            pair<string, PropertySet> meth = parseMethod( methods[m], Aliases );
-
-            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);
-            TestDAI piet(fg, meth.first, meth.second );
-            piet.doDAI();
-            if( m == 0 ) {
-                q0 = piet.q;
-                logZ0 = piet.logZ;
-            }
-            piet.calcErrs(q0);
-
-            cout.width( 40 );
-//                cout << left << piet.identify() << "  ";
-            cout << left << methods[m] << "  ";
-            if( report_time ) {
-                cout.width( 10 );
-                cout << right << piet.time << "    ";
-            }
-
-            if( m > 0 ) {
-                cout.setf( ios_base::scientific );
-                cout.precision( 3 );
-                cout.width( 10 ); 
-                double me = clipdouble( piet.maxErr(), 1e-9 );
-                cout << me << "  ";
-                cout.width( 10 );
-                double ae = clipdouble( piet.avgErr(), 1e-9 );
-                cout << ae << "  ";
-                cout.width( 10 );
-                if( piet.has_logZ ) {
-                    double le = clipdouble( piet.logZ / logZ0 - 1.0, 1e-9 );
-                    cout << le << "  ";
-                } else {
-                    cout << "N/A         ";
-                }
-                cout.width( 10 );
-                if( piet.has_maxdiff ) {
-                    double md = clipdouble( piet.maxdiff, 1e-9 );
-                    if( isnan( me ) )
-                        md = me;
-                    if( isnan( ae ) )
-                        md = ae;
-                    cout << md << "  ";
-                } else {
-                    cout << "N/A         ";
-                }
-                cout.width( 10 );
-                if( piet.has_iters ) {
-                    cout << piet.iters << "  ";
-                } else {
-                    cout << "N/A         ";
-                }
-            }
-            cout << endl;
-
-            if( marginals ) {
-                for( size_t i = 0; i < piet.q.size(); i++ )
-                    cout << "# " << piet.q[i] << endl;
-            }
-        }
-    } catch(const char *e) {
-        cerr << "Exception: " << e << endl;
-        return 1;
-    } catch(exception& e) {
-        cerr << "Exception: " << e.what() << endl;
-        return 1;
-    }
-    catch(...) {
-        cerr << "Exception of unknown type!" << endl;
-    }
-
-    return 0;
-}
index 8e8b9b7..e3ada79 100755 (executable)
@@ -1,2 +1,2 @@
 #!/bin/bash
-./test --report-time false --marginals true --aliases aliases.conf --filename $1 --methods EXACT[verbose=0] JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND
+./testdai --report-iters false --report-time false --marginals true --aliases aliases.conf --filename $1 --methods EXACT[verbose=0] JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND
index 9cc3229..2e45185 100755 (executable)
@@ -1 +1 @@
-test --report-time false --marginals true --aliases aliases.conf --filename %1 --methods EXACT[verbose=0] JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND
+testdai --report-iters false --report-time false --marginals true --aliases aliases.conf --filename %1 --methods EXACT[verbose=0] JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND
diff --git a/tests/testdai.cpp b/tests/testdai.cpp
new file mode 100644 (file)
index 0000000..e0b467e
--- /dev/null
@@ -0,0 +1,383 @@
+/*  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
+*/
+
+
+#include <iostream>
+#include <fstream>
+#include <map>
+#include <numeric>
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+#include <boost/program_options.hpp>
+#include <dai/util.h>
+#include <dai/alldai.h>
+
+
+using namespace std;
+using namespace dai;
+namespace po = boost::program_options;
+
+
+class TestDAI {
+    protected:
+        InfAlg          *obj;
+        string          name;
+        vector<double>  err;
+
+    public:
+        vector<Factor>  q;
+        double          logZ;
+        double          maxdiff;
+        double          time;
+        size_t          iters;
+        bool            has_logZ;
+        bool            has_maxdiff;
+        bool            has_iters;
+
+        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), err(), q(), 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" ) {
+                double zero[2] = {1.0, 0.0};
+                q.clear();
+                for( size_t i = 0; i < fg.nrVars(); i++ )
+                    q.push_back( Factor(Var(i,2), zero) );
+                logZ = 0.0;
+                maxdiff = 0.0;
+                iters = 1;
+                has_logZ = false;
+                has_maxdiff = false;
+                has_iters = false;
+            } else
+                obj = newInfAlg( name, fg, opts );
+            time += toc() - tic;
+        }
+
+        ~TestDAI() { 
+            if( obj != NULL )
+                delete obj;
+        }
+
+        string identify() { 
+            if( obj != NULL )
+                return obj->identify(); 
+            else
+                return "NULL";
+        }
+
+        vector<Factor> allBeliefs() {
+            vector<Factor> result;
+            for( size_t i = 0; i < obj->fg().nrVars(); i++ )
+                result.push_back( obj->belief( obj->fg().var(i) ) );
+            return result;
+        }
+
+        void doDAI() {
+            double tic = toc();
+            if( obj != NULL ) {
+                obj->init();
+                obj->run();
+                time += toc() - tic;
+                try {
+                    logZ = obj->logZ();
+                    has_logZ = true;
+                } catch( Exception &e ) {
+                    has_logZ = false;
+                }
+                try {
+                    maxdiff = obj->maxDiff();
+                    has_maxdiff = true;
+                } catch( Exception &e ) {
+                    has_maxdiff = false;
+                }
+                try {
+                    iters = obj->Iterations();
+                    has_iters = true;
+                } catch( Exception &e ) {
+                    has_iters = false;
+                }
+                q = allBeliefs();
+            };
+        }
+
+        void calcErrs( const TestDAI &x ) {
+            err.clear();
+            err.reserve( q.size() );
+            for( size_t i = 0; i < q.size(); i++ )
+                err.push_back( dist( q[i], x.q[i], Prob::DISTTV ) );
+        }
+
+        void calcErrs( const vector<Factor> &x ) {
+            err.clear();
+            err.reserve( q.size() );
+            for( size_t i = 0; i < q.size(); i++ )
+                err.push_back( dist( q[i], x[i], Prob::DISTTV ) );
+        }
+
+        double maxErr() { 
+            return( *max_element( err.begin(), err.end() ) );
+        }
+        
+        double avgErr() { 
+            return( accumulate( err.begin(), err.end(), 0.0 ) / err.size() );
+        }
+};
+
+
+pair<string, PropertySet> parseMethod( const string &_s, const map<string,string> & aliases ) {
+    // s = first part of _s, until '['
+    string::size_type pos = _s.find_first_of('[');
+    string s;
+    if( pos == string::npos )
+        s = _s;
+    else
+        s = _s.substr(0,pos);
+
+    // if the first part is an alias, substitute
+    if( aliases.find(s) != aliases.end() )
+        s = aliases.find(s)->second;
+
+    // attach second part, merging properties if necessary
+    if( pos != string::npos ) {
+        if( s.at(s.length()-1) == ']' ) {
+            s = s.erase(s.length()-1,1) + ',' + _s.substr(pos+1);
+        } else
+            s = s + _s.substr(pos);
+    }
+
+    pair<string, PropertySet> result;
+    string & name = result.first;
+    PropertySet & opts = result.second;
+
+    pos = s.find_first_of('[');
+    if( pos == string::npos )
+        throw "Malformed method";
+    name = s.substr( 0, pos );
+    size_t n = 0;
+    for( ; strlen( DAINames[n] ) != 0; n++ )
+        if( name == DAINames[n] )
+            break;
+    if( strlen( DAINames[n] ) == 0 && (name != "LDPC") )
+        DAI_THROW(UNKNOWN_DAI_ALGORITHM);
+
+    stringstream ss;
+    ss << s.substr(pos,s.length());
+    ss >> opts;
+    
+    return result;
+}
+
+
+double clipdouble( double x, double minabs ) {
+    if( fabs(x) < minabs )
+        return minabs;
+    else
+        return x;
+}
+
+
+int main( int argc, char *argv[] ) {
+    try {
+        string filename;
+        string aliases;
+        vector<string> methods;
+        double tol;
+        size_t maxiter;
+        size_t verbose;
+        bool marginals = false;
+        bool report_iters = true;
+        bool report_time = true;
+
+        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")
+        ;
+
+        po::options_description opts_optional("Allowed options");
+        opts_optional.add_options()
+            ("help", "produce help message")
+            ("aliases", po::value< string >(&aliases), "Filename for aliases")
+            ("tol", po::value< double >(&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< bool >(&marginals), "Output single node marginals?")
+            ("report-time", po::value< bool >(&report_time), "Report calculation time")
+            ("report-iters", po::value< bool >(&report_iters), "Report iterations needed")
+        ;
+
+        po::options_description cmdline_options;
+        cmdline_options.add(opts_required).add(opts_optional);
+
+        po::variables_map vm;
+        po::store(po::parse_command_line(argc, argv, cmdline_options), vm);
+        po::notify(vm);
+
+        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 << opts_required << opts_optional << endl;
+            return 1;
+        }
+
+        // Read aliases
+        map<string,string> Aliases;
+        if( !aliases.empty() ) {
+            ifstream infile;
+            infile.open (aliases.c_str());
+            if (infile.is_open()) {
+                while( true ) {
+                    string line;
+                    getline(infile,line);
+                    if( infile.fail() )
+                        break;
+                    if( (!line.empty()) && (line[0] != '#') ) {
+                        string::size_type pos = line.find(':',0);
+                        if( pos == string::npos )
+                            throw "Invalid alias";
+                        else {
+                            string::size_type posl = line.substr(0, pos).find_last_not_of(" \t");
+                            string key = line.substr(0, posl + 1);
+                            string::size_type posr = line.substr(pos + 1, line.length()).find_first_not_of(" \t");
+                            string val = line.substr(pos + 1 + posr, line.length());
+                            Aliases[key] = val;
+                        }
+                    }
+                }
+                infile.close();
+            } else
+                throw "Error opening aliases file";
+        }
+
+        FactorGraph fg;
+        fg.ReadFromFile( filename.c_str() );
+
+        vector<Factor> q0;
+        double logZ0 = 0.0;
+
+        cout.setf( ios_base::scientific );
+        cout.precision( 3 );
+
+        cout << "# " << filename << endl;
+        cout.width( 40 );
+        cout << left << "# METHOD" << "  ";
+        if( report_time ) {
+            cout.width( 10 );
+            cout << right << "SECONDS" << "   ";
+        }
+        if( report_iters ) {
+            cout.width( 10 );
+            cout << "ITERS" << "  ";
+        }
+        cout.width( 10 );
+        cout << "MAX ERROR" << "  ";
+        cout.width( 10 );
+        cout << "AVG ERROR" << "  ";
+        cout.width( 10 );
+        cout << "LOGZ ERROR" << "  ";
+        cout.width( 10 );
+        cout << "MAXDIFF" << "  ";
+        cout << endl;
+
+        for( size_t m = 0; m < methods.size(); m++ ) {
+            pair<string, PropertySet> meth = parseMethod( methods[m], Aliases );
+
+            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);
+            TestDAI piet(fg, meth.first, meth.second );
+            piet.doDAI();
+            if( m == 0 ) {
+                q0 = piet.q;
+                logZ0 = piet.logZ;
+            }
+            piet.calcErrs(q0);
+
+            cout.width( 40 );
+            cout << left << methods[m] << "  ";
+            if( report_time ) {
+                cout.width( 10 );
+                cout << right << piet.time << "    ";
+            }
+            if( report_iters ) {
+                cout.width( 10 );
+                if( piet.has_iters ) {
+                    cout << piet.iters << "  ";
+                } else {
+                    cout << "N/A         ";
+                }
+            }
+
+            if( m > 0 ) {
+                cout.setf( ios_base::scientific );
+                cout.precision( 3 );
+                
+                cout.width( 10 ); 
+                double me = clipdouble( piet.maxErr(), 1e-9 );
+                cout << me << "  ";
+                
+                cout.width( 10 );
+                double ae = clipdouble( piet.avgErr(), 1e-9 );
+                cout << ae << "  ";
+                
+                cout.width( 10 );
+                if( piet.has_logZ ) {
+                    double le = clipdouble( piet.logZ / logZ0 - 1.0, 1e-9 );
+                    cout << le << "  ";
+                } else
+                    cout << "N/A         ";
+
+                cout.width( 10 );
+                if( piet.has_maxdiff ) {
+                    double md = clipdouble( piet.maxdiff, 1e-9 );
+                    if( isnan( me ) )
+                        md = me;
+                    if( isnan( ae ) )
+                        md = ae;
+                    cout << md << "  ";
+                } else
+                    cout << "N/A         ";
+            }
+            cout << endl;
+
+            if( marginals ) {
+                for( size_t i = 0; i < piet.q.size(); i++ )
+                    cout << "# " << piet.q[i] << endl;
+            }
+        }
+    } catch(const char *e) {
+        cerr << "Exception: " << e << endl;
+        return 1;
+    } catch(exception& e) {
+        cerr << "Exception: " << e.what() << endl;
+        return 1;
+    }
+    catch(...) {
+        cerr << "Exception of unknown type!" << endl;
+    }
+
+    return 0;
+}
index 0f02e9f..e800289 100644 (file)
@@ -1,23 +1,6 @@
 # testfast.fg
-# METHOD                                  MAX ERROR   AVG ERROR   LOGZ ERROR  MAXDIFF     ITERS     
+# METHOD                                  MAX ERROR   AVG ERROR   LOGZ ERROR  MAXDIFF     
 EXACT[verbose=0]                          
-# ([0] <0.388774 0.611226 >)
-# ([1] <0.555571 0.444429 >)
-# ([2] <0.458706 0.541294 >)
-# ([3] <0.54801 0.45199 >)
-# ([4] <0.666005 0.333995 >)
-# ([5] <0.210731 0.789269 >)
-# ([6] <0.81782 0.18218 >)
-# ([7] <0.232711 0.767289 >)
-# ([8] <0.217101 0.782899 >)
-# ([9] <0.205196 0.794804 >)
-# ([10] <0.766453 0.233547 >)
-# ([11] <0.121723 0.878277 >)
-# ([12] <0.421411 0.578589 >)
-# ([13] <0.534838 0.465162 >)
-# ([14] <0.62914 0.37086 >)
-# ([15] <0.135686 0.864314 >)
-JTREE_HUGIN                               1.000e-09   1.000e-09   1.000e-09   1.000e-09   1           
 # ([0] <3.888e-01 6.112e-01 >)
 # ([1] <5.556e-01 4.444e-01 >)
 # ([2] <4.587e-01 5.413e-01 >)
@@ -34,7 +17,7 @@ JTREE_HUGIN                               1.000e-09   1.000e-09   1.000e-09   1.
 # ([13] <5.348e-01 4.652e-01 >)
 # ([14] <6.291e-01 3.709e-01 >)
 # ([15] <1.357e-01 8.643e-01 >)
-JTREE_SHSH                                1.000e-09   1.000e-09   1.000e-09   1.000e-09   1           
+JTREE_HUGIN                               1.000e-09   1.000e-09   1.000e-09   1.000e-09   
 # ([0] <3.888e-01 6.112e-01 >)
 # ([1] <5.556e-01 4.444e-01 >)
 # ([2] <4.587e-01 5.413e-01 >)
@@ -51,7 +34,24 @@ JTREE_SHSH                                1.000e-09   1.000e-09   1.000e-09   1.
 # ([13] <5.348e-01 4.652e-01 >)
 # ([14] <6.291e-01 3.709e-01 >)
 # ([15] <1.357e-01 8.643e-01 >)
-BP_SEQFIX                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   45          
+JTREE_SHSH                                1.000e-09   1.000e-09   1.000e-09   1.000e-09   
+# ([0] <3.888e-01 6.112e-01 >)
+# ([1] <5.556e-01 4.444e-01 >)
+# ([2] <4.587e-01 5.413e-01 >)
+# ([3] <5.480e-01 4.520e-01 >)
+# ([4] <6.660e-01 3.340e-01 >)
+# ([5] <2.107e-01 7.893e-01 >)
+# ([6] <8.178e-01 1.822e-01 >)
+# ([7] <2.327e-01 7.673e-01 >)
+# ([8] <2.171e-01 7.829e-01 >)
+# ([9] <2.052e-01 7.948e-01 >)
+# ([10] <7.665e-01 2.335e-01 >)
+# ([11] <1.217e-01 8.783e-01 >)
+# ([12] <4.214e-01 5.786e-01 >)
+# ([13] <5.348e-01 4.652e-01 >)
+# ([14] <6.291e-01 3.709e-01 >)
+# ([15] <1.357e-01 8.643e-01 >)
+BP_SEQFIX                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -68,7 +68,7 @@ BP_SEQFIX                                 9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_SEQRND                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   43          
+BP_SEQRND                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -85,7 +85,7 @@ BP_SEQRND                                 9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_SEQMAX                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   13          
+BP_SEQMAX                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -102,7 +102,7 @@ BP_SEQMAX                                 9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_PARALL                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   71          
+BP_PARALL                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -119,7 +119,7 @@ BP_PARALL                                 9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_SEQFIX_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   45          
+BP_SEQFIX_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -136,7 +136,7 @@ BP_SEQFIX_LOG                             9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_SEQRND_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   43          
+BP_SEQRND_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -153,7 +153,7 @@ BP_SEQRND_LOG                             9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_SEQMAX_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   13          
+BP_SEQMAX_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -170,7 +170,7 @@ BP_SEQMAX_LOG                             9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-BP_PARALL_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   71          
+BP_PARALL_LOG                             9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -187,7 +187,7 @@ BP_PARALL_LOG                             9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-MF_SEQRND                                 3.607e-01   1.904e-01   -9.409e-02  1.000e-09   58          
+MF_SEQRND                                 3.607e-01   1.904e-01   -9.409e-02  1.000e-09   
 # ([0] <2.053e-01 7.947e-01 >)
 # ([1] <9.163e-01 8.373e-02 >)
 # ([2] <1.579e-01 8.421e-01 >)
@@ -204,7 +204,7 @@ MF_SEQRND                                 3.607e-01   1.904e-01   -9.409e-02  1.
 # ([13] <8.148e-01 1.852e-01 >)
 # ([14] <8.338e-01 1.662e-01 >)
 # ([15] <5.661e-03 9.943e-01 >)
-TREEEP                                    3.268e-02   8.023e-03   6.340e-04   1.000e-09   15          
+TREEEP                                    3.268e-02   8.023e-03   6.340e-04   1.000e-09   
 # ([0] <3.980e-01 6.020e-01 >)
 # ([1] <5.520e-01 4.480e-01 >)
 # ([2] <4.620e-01 5.380e-01 >)
@@ -221,7 +221,7 @@ TREEEP                                    3.268e-02   8.023e-03   6.340e-04   1.
 # ([13] <5.293e-01 4.707e-01 >)
 # ([14] <6.409e-01 3.591e-01 >)
 # ([15] <1.364e-01 8.636e-01 >)
-TREEEPWC                                  2.356e-02   1.026e-02   4.876e-03   1.000e-09   14          
+TREEEPWC                                  2.356e-02   1.026e-02   4.876e-03   1.000e-09   
 # ([0] <4.091e-01 5.909e-01 >)
 # ([1] <5.429e-01 4.571e-01 >)
 # ([2] <4.697e-01 5.303e-01 >)
@@ -238,7 +238,7 @@ TREEEPWC                                  2.356e-02   1.026e-02   4.876e-03   1.
 # ([13] <5.298e-01 4.702e-01 >)
 # ([14] <6.299e-01 3.701e-01 >)
 # ([15] <1.384e-01 8.616e-01 >)
-GBP_MIN                                   9.483e-02   3.078e-02   1.737e-02   1.000e-09   44          
+GBP_MIN                                   9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -255,7 +255,7 @@ GBP_MIN                                   9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-GBP_DELTA                                 6.291e-01   3.350e-01   -3.303e-01  1.000e-09   6           
+GBP_DELTA                                 6.291e-01   3.350e-01   -3.303e-01  1.000e-09   
 # ([0] <0.000e+00 1.000e+00 >)
 # ([1] <1.000e+00 0.000e+00 >)
 # ([2] <0.000e+00 1.000e+00 >)
@@ -272,7 +272,7 @@ GBP_DELTA                                 6.291e-01   3.350e-01   -3.303e-01  1.
 # ([13] <0.000e+00 1.000e+00 >)
 # ([14] <0.000e+00 1.000e+00 >)
 # ([15] <0.000e+00 1.000e+00 >)
-GBP_LOOP3                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   44          
+GBP_LOOP3                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -289,7 +289,7 @@ GBP_LOOP3                                 9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-GBP_LOOP4                                 7.893e-01   3.408e-01   -2.745e-01  1.000e-09   12          
+GBP_LOOP4                                 7.893e-01   3.408e-01   -2.745e-01  1.000e-09   
 # ([0] <0.000e+00 1.000e+00 >)
 # ([1] <1.000e+00 0.000e+00 >)
 # ([2] <0.000e+00 1.000e+00 >)
@@ -306,7 +306,7 @@ GBP_LOOP4                                 7.893e-01   3.408e-01   -2.745e-01  1.
 # ([13] <1.000e+00 3.513e-118 >)
 # ([14] <1.000e+00 0.000e+00 >)
 # ([15] <0.000e+00 1.000e+00 >)
-GBP_LOOP5                                 7.893e-01   3.408e-01   -2.745e-01  1.000e-09   12          
+GBP_LOOP5                                 7.893e-01   3.408e-01   -2.745e-01  1.000e-09   
 # ([0] <0.000e+00 1.000e+00 >)
 # ([1] <1.000e+00 0.000e+00 >)
 # ([2] <0.000e+00 1.000e+00 >)
@@ -323,7 +323,7 @@ GBP_LOOP5                                 7.893e-01   3.408e-01   -2.745e-01  1.
 # ([13] <1.000e+00 3.513e-118 >)
 # ([14] <1.000e+00 0.000e+00 >)
 # ([15] <0.000e+00 1.000e+00 >)
-GBP_LOOP6                                 7.948e-01   4.458e-01   -4.096e-01  1.000e-09   4           
+GBP_LOOP6                                 7.948e-01   4.458e-01   -4.096e-01  1.000e-09   
 # ([0] <1.000e+00 0.000e+00 >)
 # ([1] <0.000e+00 1.000e+00 >)
 # ([2] <1.000e+00 0.000e+00 >)
@@ -340,7 +340,7 @@ GBP_LOOP6                                 7.948e-01   4.458e-01   -4.096e-01  1.
 # ([13] <1.000e+00 0.000e+00 >)
 # ([14] <0.000e+00 1.000e+00 >)
 # ([15] <0.000e+00 1.000e+00 >)
-GBP_LOOP7                                 7.948e-01   4.458e-01   -4.096e-01  1.000e-09   4           
+GBP_LOOP7                                 7.948e-01   4.458e-01   -4.096e-01  1.000e-09   
 # ([0] <1.000e+00 0.000e+00 >)
 # ([1] <0.000e+00 1.000e+00 >)
 # ([2] <1.000e+00 0.000e+00 >)
@@ -357,7 +357,7 @@ GBP_LOOP7                                 7.948e-01   4.458e-01   -4.096e-01  1.
 # ([13] <1.000e+00 0.000e+00 >)
 # ([14] <0.000e+00 1.000e+00 >)
 # ([15] <0.000e+00 1.000e+00 >)
-HAK_MIN                                   9.483e-02   3.078e-02   1.737e-02   1.000e-09   618         
+HAK_MIN                                   9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -374,7 +374,7 @@ HAK_MIN                                   9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-HAK_DELTA                                 3.684e-01   1.892e-01   9.675e-01   1.000e-09   319         
+HAK_DELTA                                 3.684e-01   1.892e-01   9.675e-01   1.000e-09   
 # ([0] <4.902e-01 5.098e-01 >)
 # ([1] <5.098e-01 4.902e-01 >)
 # ([2] <4.902e-01 5.098e-01 >)
@@ -391,7 +391,7 @@ HAK_DELTA                                 3.684e-01   1.892e-01   9.675e-01   1.
 # ([13] <5.098e-01 4.902e-01 >)
 # ([14] <5.098e-01 4.902e-01 >)
 # ([15] <4.902e-01 5.098e-01 >)
-HAK_LOOP3                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   618         
+HAK_LOOP3                                 9.483e-02   3.078e-02   1.737e-02   1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -408,7 +408,7 @@ HAK_LOOP3                                 9.483e-02   3.078e-02   1.737e-02   1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-HAK_LOOP4                                 4.970e-03   1.486e-03   -2.503e-04  1.000e-09   1580        
+HAK_LOOP4                                 4.970e-03   1.486e-03   -2.503e-04  1.000e-09   
 # ([0] <3.909e-01 6.091e-01 >)
 # ([1] <5.556e-01 4.444e-01 >)
 # ([2] <4.585e-01 5.415e-01 >)
@@ -425,7 +425,7 @@ HAK_LOOP4                                 4.970e-03   1.486e-03   -2.503e-04  1.
 # ([13] <5.351e-01 4.649e-01 >)
 # ([14] <6.319e-01 3.681e-01 >)
 # ([15] <1.307e-01 8.693e-01 >)
-HAK_LOOP5                                 4.970e-03   1.486e-03   -2.503e-04  1.000e-09   1580        
+HAK_LOOP5                                 4.970e-03   1.486e-03   -2.503e-04  1.000e-09   
 # ([0] <3.909e-01 6.091e-01 >)
 # ([1] <5.556e-01 4.444e-01 >)
 # ([2] <4.585e-01 5.415e-01 >)
@@ -442,7 +442,7 @@ HAK_LOOP5                                 4.970e-03   1.486e-03   -2.503e-04  1.
 # ([13] <5.351e-01 4.649e-01 >)
 # ([14] <6.319e-01 3.681e-01 >)
 # ([15] <1.307e-01 8.693e-01 >)
-MR_RESPPROP_FULL                          1.676e-02   4.933e-03   N/A         1.000e-09   45          
+MR_RESPPROP_FULL                          1.676e-02   4.933e-03   N/A         1.000e-09   
 # ([0] <3.941e-01 6.059e-01 >)
 # ([1] <5.534e-01 4.466e-01 >)
 # ([2] <4.602e-01 5.398e-01 >)
@@ -459,7 +459,7 @@ MR_RESPPROP_FULL                          1.676e-02   4.933e-03   N/A         1.
 # ([13] <5.407e-01 4.593e-01 >)
 # ([14] <6.252e-01 3.748e-01 >)
 # ([15] <1.346e-01 8.654e-01 >)
-MR_CLAMPING_FULL                          8.359e-03   2.508e-03   N/A         1.000e-09   45          
+MR_CLAMPING_FULL                          8.359e-03   2.508e-03   N/A         1.000e-09   
 # ([0] <3.900e-01 6.100e-01 >)
 # ([1] <5.560e-01 4.440e-01 >)
 # ([2] <4.589e-01 5.411e-01 >)
@@ -476,7 +476,7 @@ MR_CLAMPING_FULL                          8.359e-03   2.508e-03   N/A         1.
 # ([13] <5.404e-01 4.596e-01 >)
 # ([14] <6.273e-01 3.727e-01 >)
 # ([15] <1.344e-01 8.656e-01 >)
-MR_EXACT_FULL                             3.527e-03   1.038e-03   N/A         1.000e-09   44          
+MR_EXACT_FULL                             3.527e-03   1.038e-03   N/A         1.000e-09   
 # ([0] <3.867e-01 6.133e-01 >)
 # ([1] <5.572e-01 4.428e-01 >)
 # ([2] <4.585e-01 5.415e-01 >)
@@ -493,7 +493,7 @@ MR_EXACT_FULL                             3.527e-03   1.038e-03   N/A         1.
 # ([13] <5.384e-01 4.616e-01 >)
 # ([14] <6.296e-01 3.704e-01 >)
 # ([15] <1.344e-01 8.656e-01 >)
-MR_RESPPROP_LINEAR                        1.932e-02   5.506e-03   N/A         1.000e-09   45          
+MR_RESPPROP_LINEAR                        1.932e-02   5.506e-03   N/A         1.000e-09   
 # ([0] <3.923e-01 6.077e-01 >)
 # ([1] <5.529e-01 4.471e-01 >)
 # ([2] <4.608e-01 5.392e-01 >)
@@ -510,7 +510,7 @@ MR_RESPPROP_LINEAR                        1.932e-02   5.506e-03   N/A         1.
 # ([13] <5.388e-01 4.612e-01 >)
 # ([14] <6.239e-01 3.761e-01 >)
 # ([15] <1.369e-01 8.631e-01 >)
-MR_CLAMPING_LINEAR                        1.089e-02   3.076e-03   N/A         1.000e-09   45          
+MR_CLAMPING_LINEAR                        1.089e-02   3.076e-03   N/A         1.000e-09   
 # ([0] <3.884e-01 6.116e-01 >)
 # ([1] <5.551e-01 4.449e-01 >)
 # ([2] <4.598e-01 5.402e-01 >)
@@ -527,7 +527,7 @@ MR_CLAMPING_LINEAR                        1.089e-02   3.076e-03   N/A         1.
 # ([13] <5.383e-01 4.617e-01 >)
 # ([14] <6.257e-01 3.743e-01 >)
 # ([15] <1.370e-01 8.630e-01 >)
-MR_EXACT_LINEAR                           5.617e-03   1.742e-03   N/A         1.000e-09   44          
+MR_EXACT_LINEAR                           5.617e-03   1.742e-03   N/A         1.000e-09   
 # ([0] <3.853e-01 6.147e-01 >)
 # ([1] <5.560e-01 4.440e-01 >)
 # ([2] <4.596e-01 5.404e-01 >)
@@ -544,7 +544,7 @@ MR_EXACT_LINEAR                           5.617e-03   1.742e-03   N/A         1.
 # ([13] <5.362e-01 4.638e-01 >)
 # ([14] <6.279e-01 3.721e-01 >)
 # ([15] <1.372e-01 8.628e-01 >)
-LCBP_FULLCAV_SEQFIX                       1.225e-03   5.589e-04   N/A         1.000e-09   39          
+LCBP_FULLCAV_SEQFIX                       1.225e-03   5.589e-04   N/A         1.000e-09   
 # ([0] <3.888e-01 6.112e-01 >)
 # ([1] <5.559e-01 4.441e-01 >)
 # ([2] <4.583e-01 5.417e-01 >)
@@ -561,7 +561,7 @@ LCBP_FULLCAV_SEQFIX                       1.225e-03   5.589e-04   N/A         1.
 # ([13] <5.358e-01 4.642e-01 >)
 # ([14] <6.285e-01 3.715e-01 >)
 # ([15] <1.359e-01 8.641e-01 >)
-LCBP_FULLCAVin_SEQFIX                     1.225e-03   5.589e-04   N/A         1.000e-09   39          
+LCBP_FULLCAVin_SEQFIX                     1.225e-03   5.589e-04   N/A         1.000e-09   
 # ([0] <3.888e-01 6.112e-01 >)
 # ([1] <5.559e-01 4.441e-01 >)
 # ([2] <4.583e-01 5.417e-01 >)
@@ -578,7 +578,7 @@ LCBP_FULLCAVin_SEQFIX                     1.225e-03   5.589e-04   N/A         1.
 # ([13] <5.358e-01 4.642e-01 >)
 # ([14] <6.285e-01 3.715e-01 >)
 # ([15] <1.359e-01 8.641e-01 >)
-LCBP_FULLCAV_SEQRND                       1.225e-03   5.589e-04   N/A         1.000e-09   36          
+LCBP_FULLCAV_SEQRND                       1.225e-03   5.589e-04   N/A         1.000e-09   
 # ([0] <3.888e-01 6.112e-01 >)
 # ([1] <5.559e-01 4.441e-01 >)
 # ([2] <4.583e-01 5.417e-01 >)
@@ -595,7 +595,7 @@ LCBP_FULLCAV_SEQRND                       1.225e-03   5.589e-04   N/A         1.
 # ([13] <5.358e-01 4.642e-01 >)
 # ([14] <6.285e-01 3.715e-01 >)
 # ([15] <1.359e-01 8.641e-01 >)
-LCBP_FULLCAVin_SEQRND                     1.225e-03   5.589e-04   N/A         1.000e-09   35          
+LCBP_FULLCAVin_SEQRND                     1.225e-03   5.589e-04   N/A         1.000e-09   
 # ([0] <3.888e-01 6.112e-01 >)
 # ([1] <5.559e-01 4.441e-01 >)
 # ([2] <4.583e-01 5.417e-01 >)
@@ -612,7 +612,7 @@ LCBP_FULLCAVin_SEQRND                     1.225e-03   5.589e-04   N/A         1.
 # ([13] <5.358e-01 4.642e-01 >)
 # ([14] <6.285e-01 3.715e-01 >)
 # ([15] <1.359e-01 8.641e-01 >)
-LCBP_FULLCAV_NONE                         1.318e-02   2.644e-03   N/A         1.000e+00   0           
+LCBP_FULLCAV_NONE                         1.318e-02   2.644e-03   N/A         1.000e+00   
 # ([0] <3.859e-01 6.141e-01 >)
 # ([1] <5.569e-01 4.431e-01 >)
 # ([2] <4.719e-01 5.281e-01 >)
@@ -629,7 +629,7 @@ LCBP_FULLCAV_NONE                         1.318e-02   2.644e-03   N/A         1.
 # ([13] <5.350e-01 4.650e-01 >)
 # ([14] <6.290e-01 3.710e-01 >)
 # ([15] <1.364e-01 8.636e-01 >)
-LCBP_FULLCAVin_NONE                       1.318e-02   2.644e-03   N/A         1.000e+00   0           
+LCBP_FULLCAVin_NONE                       1.318e-02   2.644e-03   N/A         1.000e+00   
 # ([0] <3.859e-01 6.141e-01 >)
 # ([1] <5.569e-01 4.431e-01 >)
 # ([2] <4.719e-01 5.281e-01 >)
@@ -646,7 +646,7 @@ LCBP_FULLCAVin_NONE                       1.318e-02   2.644e-03   N/A         1.
 # ([13] <5.350e-01 4.650e-01 >)
 # ([14] <6.290e-01 3.710e-01 >)
 # ([15] <1.364e-01 8.636e-01 >)
-LCBP_PAIRCAV_SEQFIX                       1.564e-02   5.284e-03   N/A         1.000e-09   47          
+LCBP_PAIRCAV_SEQFIX                       1.564e-02   5.284e-03   N/A         1.000e-09   
 # ([0] <3.872e-01 6.128e-01 >)
 # ([1] <5.540e-01 4.460e-01 >)
 # ([2] <4.596e-01 5.404e-01 >)
@@ -663,7 +663,7 @@ LCBP_PAIRCAV_SEQFIX                       1.564e-02   5.284e-03   N/A         1.
 # ([13] <5.282e-01 4.718e-01 >)
 # ([14] <6.240e-01 3.760e-01 >)
 # ([15] <1.409e-01 8.591e-01 >)
-LCBP_PAIRCAVin_SEQFIX                     1.564e-02   5.284e-03   N/A         1.000e-09   47          
+LCBP_PAIRCAVin_SEQFIX                     1.564e-02   5.284e-03   N/A         1.000e-09   
 # ([0] <3.872e-01 6.128e-01 >)
 # ([1] <5.540e-01 4.460e-01 >)
 # ([2] <4.596e-01 5.404e-01 >)
@@ -680,7 +680,7 @@ LCBP_PAIRCAVin_SEQFIX                     1.564e-02   5.284e-03   N/A         1.
 # ([13] <5.282e-01 4.718e-01 >)
 # ([14] <6.240e-01 3.760e-01 >)
 # ([15] <1.409e-01 8.591e-01 >)
-LCBP_PAIRCAV_SEQRND                       1.564e-02   5.284e-03   N/A         1.000e-09   36          
+LCBP_PAIRCAV_SEQRND                       1.564e-02   5.284e-03   N/A         1.000e-09   
 # ([0] <3.872e-01 6.128e-01 >)
 # ([1] <5.540e-01 4.460e-01 >)
 # ([2] <4.596e-01 5.404e-01 >)
@@ -697,7 +697,7 @@ LCBP_PAIRCAV_SEQRND                       1.564e-02   5.284e-03   N/A         1.
 # ([13] <5.282e-01 4.718e-01 >)
 # ([14] <6.240e-01 3.760e-01 >)
 # ([15] <1.409e-01 8.591e-01 >)
-LCBP_PAIRCAVin_SEQRND                     1.564e-02   5.284e-03   N/A         1.000e-09   38          
+LCBP_PAIRCAVin_SEQRND                     1.564e-02   5.284e-03   N/A         1.000e-09   
 # ([0] <3.872e-01 6.128e-01 >)
 # ([1] <5.540e-01 4.460e-01 >)
 # ([2] <4.596e-01 5.404e-01 >)
@@ -714,7 +714,7 @@ LCBP_PAIRCAVin_SEQRND                     1.564e-02   5.284e-03   N/A         1.
 # ([13] <5.282e-01 4.718e-01 >)
 # ([14] <6.240e-01 3.760e-01 >)
 # ([15] <1.409e-01 8.591e-01 >)
-LCBP_PAIRCAV_NONE                         1.869e-01   6.816e-02   N/A         1.000e+00   0           
+LCBP_PAIRCAV_NONE                         1.869e-01   6.816e-02   N/A         1.000e+00   
 # ([0] <3.558e-01 6.442e-01 >)
 # ([1] <5.320e-01 4.680e-01 >)
 # ([2] <4.581e-01 5.419e-01 >)
@@ -731,7 +731,7 @@ LCBP_PAIRCAV_NONE                         1.869e-01   6.816e-02   N/A         1.
 # ([13] <6.323e-01 3.677e-01 >)
 # ([14] <8.161e-01 1.839e-01 >)
 # ([15] <1.676e-01 8.324e-01 >)
-LCBP_PAIRCAVin_NONE                       1.869e-01   6.816e-02   N/A         1.000e+00   0           
+LCBP_PAIRCAVin_NONE                       1.869e-01   6.816e-02   N/A         1.000e+00   
 # ([0] <3.558e-01 6.442e-01 >)
 # ([1] <5.320e-01 4.680e-01 >)
 # ([2] <4.581e-01 5.419e-01 >)
@@ -748,7 +748,7 @@ LCBP_PAIRCAVin_NONE                       1.869e-01   6.816e-02   N/A         1.
 # ([13] <6.323e-01 3.677e-01 >)
 # ([14] <8.161e-01 1.839e-01 >)
 # ([15] <1.676e-01 8.324e-01 >)
-LCBP_PAIR2CAV_SEQFIX                      1.535e-02   4.445e-03   N/A         1.000e-09   47          
+LCBP_PAIR2CAV_SEQFIX                      1.535e-02   4.445e-03   N/A         1.000e-09   
 # ([0] <3.844e-01 6.156e-01 >)
 # ([1] <5.557e-01 4.443e-01 >)
 # ([2] <4.588e-01 5.412e-01 >)
@@ -765,7 +765,7 @@ LCBP_PAIR2CAV_SEQFIX                      1.535e-02   4.445e-03   N/A         1.
 # ([13] <5.280e-01 4.720e-01 >)
 # ([14] <6.250e-01 3.750e-01 >)
 # ([15] <1.411e-01 8.589e-01 >)
-LCBP_PAIR2CAVin_SEQFIX                    1.535e-02   4.445e-03   N/A         1.000e-09   47          
+LCBP_PAIR2CAVin_SEQFIX                    1.535e-02   4.445e-03   N/A         1.000e-09   
 # ([0] <3.844e-01 6.156e-01 >)
 # ([1] <5.557e-01 4.443e-01 >)
 # ([2] <4.588e-01 5.412e-01 >)
@@ -782,7 +782,7 @@ LCBP_PAIR2CAVin_SEQFIX                    1.535e-02   4.445e-03   N/A         1.
 # ([13] <5.280e-01 4.720e-01 >)
 # ([14] <6.250e-01 3.750e-01 >)
 # ([15] <1.411e-01 8.589e-01 >)
-LCBP_PAIR2CAV_SEQRND                      1.535e-02   4.445e-03   N/A         1.000e-09   39          
+LCBP_PAIR2CAV_SEQRND                      1.535e-02   4.445e-03   N/A         1.000e-09   
 # ([0] <3.844e-01 6.156e-01 >)
 # ([1] <5.557e-01 4.443e-01 >)
 # ([2] <4.588e-01 5.412e-01 >)
@@ -799,7 +799,7 @@ LCBP_PAIR2CAV_SEQRND                      1.535e-02   4.445e-03   N/A         1.
 # ([13] <5.280e-01 4.720e-01 >)
 # ([14] <6.250e-01 3.750e-01 >)
 # ([15] <1.411e-01 8.589e-01 >)
-LCBP_PAIR2CAVin_SEQRND                    1.535e-02   4.445e-03   N/A         1.000e-09   35          
+LCBP_PAIR2CAVin_SEQRND                    1.535e-02   4.445e-03   N/A         1.000e-09   
 # ([0] <3.844e-01 6.156e-01 >)
 # ([1] <5.557e-01 4.443e-01 >)
 # ([2] <4.588e-01 5.412e-01 >)
@@ -816,7 +816,7 @@ LCBP_PAIR2CAVin_SEQRND                    1.535e-02   4.445e-03   N/A         1.
 # ([13] <5.280e-01 4.720e-01 >)
 # ([14] <6.250e-01 3.750e-01 >)
 # ([15] <1.411e-01 8.589e-01 >)
-LCBP_PAIR2CAV_NONE                        1.894e-01   7.196e-02   N/A         1.000e+00   0           
+LCBP_PAIR2CAV_NONE                        1.894e-01   7.196e-02   N/A         1.000e+00   
 # ([0] <3.525e-01 6.475e-01 >)
 # ([1] <5.395e-01 4.605e-01 >)
 # ([2] <4.567e-01 5.433e-01 >)
@@ -833,7 +833,7 @@ LCBP_PAIR2CAV_NONE                        1.894e-01   7.196e-02   N/A         1.
 # ([13] <6.444e-01 3.556e-01 >)
 # ([14] <8.185e-01 1.815e-01 >)
 # ([15] <1.841e-01 8.159e-01 >)
-LCBP_PAIR2CAVin_NONE                      1.894e-01   7.196e-02   N/A         1.000e+00   0           
+LCBP_PAIR2CAVin_NONE                      1.894e-01   7.196e-02   N/A         1.000e+00   
 # ([0] <3.525e-01 6.475e-01 >)
 # ([1] <5.395e-01 4.605e-01 >)
 # ([2] <4.567e-01 5.433e-01 >)
@@ -850,7 +850,7 @@ LCBP_PAIR2CAVin_NONE                      1.894e-01   7.196e-02   N/A         1.
 # ([13] <6.444e-01 3.556e-01 >)
 # ([14] <8.185e-01 1.815e-01 >)
 # ([15] <1.841e-01 8.159e-01 >)
-LCBP_UNICAV_SEQFIX                        9.483e-02   3.078e-02   N/A         1.000e-09   43          
+LCBP_UNICAV_SEQFIX                        9.483e-02   3.078e-02   N/A         1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)
@@ -867,7 +867,7 @@ LCBP_UNICAV_SEQFIX                        9.483e-02   3.078e-02   N/A         1.
 # ([13] <5.266e-01 4.734e-01 >)
 # ([14] <6.033e-01 3.967e-01 >)
 # ([15] <1.558e-01 8.442e-01 >)
-LCBP_UNICAV_SEQRND                        9.483e-02   3.078e-02   N/A         1.000e-09   43          
+LCBP_UNICAV_SEQRND                        9.483e-02   3.078e-02   N/A         1.000e-09   
 # ([0] <4.233e-01 5.767e-01 >)
 # ([1] <5.422e-01 4.578e-01 >)
 # ([2] <4.662e-01 5.338e-01 >)