Merge branch 'master' of git@git.tuebingen.mpg.de:libdai
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 19 Apr 2010 16:00:34 +0000 (18:00 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 19 Apr 2010 16:00:34 +0000 (18:00 +0200)
Conflicts:

ChangeLog
tests/testfast.out

12 files changed:
ChangeLog
include/dai/jtree.h
include/dai/lc.h
include/dai/mr.h
include/dai/treeep.h
src/jtree.cpp
src/lc.cpp
src/mr.cpp
src/treeep.cpp
tests/testdai.cpp
tests/testfast.out
utils/createfg.cpp

index 7d9fac3..67b73a8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,14 +10,22 @@ git master HEAD
   - Added an "init" option that allows to initialize randomly
   - Added an "updates" option that allows to choose between standard
     mean field and "hard-spin" mean field
+* utils/createfg now has a new factor type ('ISINGUNIFORM') and the old
+  'ISING' factor type has been renamed to 'ISINGGAUSS'
+* tests/testdai option "marginals" now has five possible values: NONE
+  outputs no marginals, VAR only variable marginals, FAC only factor
+  marginals, VARFAC both types of marginals, and ALL outputs all
+  marginals calculated by the algorithm.
 * Improved treeep.h/cpp:
   - changed TreeEP::construct( const RootedTree& ) into
     TreeEP::construct( const FactorGraph&, const RootedTree& )
+  - Now also supports disconnected factor graphs
 * Improved jtree.h/cpp:
   - changed JTree::construct( const std::vector<VarSet>&, bool ) into
     JTree::construct( const FactorGraph&, const std::vector<VarSet>&, bool )
   - changed JTree::GenerateJT( const std::vector<VarSet> & )
     into JTree::GenerateJT( const FactorGraph &, const std::vector<VarSet> & )
+  - Now also supports disconnected factor graphs
 * Improved regiongraph.h/cpp:
   - Made (previously public) members RegionGraph::G, RegionGraph::ORs,
     RegionGraph::IRs and RegionGraph::fac2OR protected.
index 3c6d926..1693fa2 100644 (file)
@@ -110,10 +110,9 @@ class JTree : public DAIAlgRG {
         JTree() : DAIAlgRG(), _mes(), _logZ(), RTree(), Qa(), Qb(), props() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param fg factor graph (which has to be connected);
+        /** \param fg factor graph
          ** \param opts Parameters @see Properties
          *  \param automatic if \c true, construct the junction tree automatically, using the heuristic in opts['heuristic'].
-         *  \throw FACTORGRAPH_NOT_CONNECTED if \a fg is not connected
          */
         JTree( const FactorGraph &fg, const PropertySet &opts, bool automatic=true );
     //@}
@@ -146,7 +145,8 @@ class JTree : public DAIAlgRG {
          *  Subsequently, a corresponding region graph is built:
          *    - the outer regions correspond with the cliques and have counting number 1;
          *    - the inner regions correspond with the seperators, i.e., the intersections of two 
-         *      cliques that are neighbors in the spanning tree, and have counting number -1;
+         *      cliques that are neighbors in the spanning tree, and have counting number -1
+         *      (except empty ones, which have counting number 0);
          *    - inner and outer regions are connected by an edge if the inner region is a
          *      seperator for the outer region.
          *  Finally, Beliefs are constructed.
index 180df48..04b2f1b 100644 (file)
@@ -110,7 +110,7 @@ class LC : public DAIAlgFG {
         virtual LC* clone() const { return new LC(*this); }
         virtual std::string identify() const;
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
-        virtual Factor belief( const VarSet &/*vs*/ ) const { DAI_THROW(NOT_IMPLEMENTED); return Factor(); }
+        virtual Factor belief( const VarSet &/*vs*/ ) const;
         virtual Factor beliefV( size_t i ) const { return _beliefs[i]; }
         virtual std::vector<Factor> beliefs() const { return _beliefs; }
         virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
index 1d8a1be..02daa7e 100644 (file)
@@ -120,7 +120,7 @@ class MR : public DAIAlgFG {
         virtual MR* clone() const { return new MR(*this); }
         virtual std::string identify() const;
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
-        virtual Factor belief( const VarSet &/*vs*/ ) const { DAI_THROW(NOT_IMPLEMENTED); return Factor(); }
+        virtual Factor belief( const VarSet &/*vs*/ ) const;
         virtual Factor beliefV( size_t i ) const;
         virtual std::vector<Factor> beliefs() const;
         virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
index 63291b9..469f8bb 100644 (file)
@@ -175,8 +175,6 @@ class TreeEP : public JTree {
         /// Construct from FactorGraph \a fg and PropertySet \a opts
         /** \param fg Factor graph.
          *  \param opts Parameters @see Properties
-         *  \note The factor graph has to be connected.
-         *  \throw FACTORGRAPH_NOT_CONNECTED if \a fg is not connected
          */
         TreeEP( const FactorGraph &fg, const PropertySet &opts );
 
index 20c021f..f106e90 100644 (file)
@@ -66,9 +66,6 @@ string JTree::printProperties() const {
 JTree::JTree( const FactorGraph &fg, const PropertySet &opts, bool automatic ) : DAIAlgRG(), _mes(), _logZ(), RTree(), Qa(), Qb(), props() {
     setProperties( opts );
 
-    if( !fg.isConnected() )
-        DAI_THROW(FACTORGRAPH_NOT_CONNECTED);
-
     if( automatic ) {
         // Create ClusterGraph which contains factors as clusters
         vector<VarSet> cl;
@@ -120,12 +117,22 @@ void JTree::construct( const FactorGraph &fg, const std::vector<VarSet> &cl, boo
     // Construct a weighted graph (each edge is weighted with the cardinality
     // of the intersection of the nodes, where the nodes are the elements of cl).
     WeightedGraph<int> JuncGraph;
-    for( size_t i = 0; i < cl.size(); i++ )
-        for( size_t j = i+1; j < cl.size(); j++ ) {
+    std::vector<bool> connected( cl.size(), false );
+    for( size_t i = 0; i < cl.size(); i++ ) {
+        for( size_t j = i + 1; j < cl.size(); j++ ) {
             size_t w = (cl[i] & cl[j]).size();
-            if( w )
+            if( w ) {
                 JuncGraph[UEdge(i,j)] = w;
+                connected[i] = true;
+                connected[j] = true;
+            }
         }
+    }
+    // for clusters that have no overlap with other clusters,
+    // connect them with the zeroth cluster
+    for( size_t i = 1; i < cl.size(); i++ )
+        if( !connected[i] )
+            JuncGraph[UEdge(i,0)] = 0;
 
     // Construct maximal spanning tree using Prim's algorithm
     RTree = MaxSpanningTree( JuncGraph, true );
@@ -162,8 +169,9 @@ void JTree::construct( const FactorGraph &fg, const std::vector<VarSet> &cl, boo
     for( size_t i = 0; i < RTree.size(); i++ ) {
         edges.push_back( Edge( RTree[i].first, nrIRs() ) );
         edges.push_back( Edge( RTree[i].second, nrIRs() ) );
-        // inner clusters have counting number -1
-        _IRs.push_back( Region( cl[RTree[i].first] & cl[RTree[i].second], -1.0 ) );
+        // inner clusters have counting number -1, except if they are empty
+        VarSet intersection = cl[RTree[i].first] & cl[RTree[i].second];
+        _IRs.push_back( Region( intersection, intersection.size() ? -1.0 : 0.0 ) );
     }
 
     // create bipartite graph
index 0f71507..09034e9 100644 (file)
@@ -121,6 +121,18 @@ void LC::CalcBelief (size_t i) {
 }
 
 
+Factor LC::belief (const VarSet &ns) const {
+    if( ns.size() == 0 )
+        return Factor();
+    else if( ns.size() == 1 )
+        return beliefV( findVar( *(ns.begin()) ) );
+    else {
+        DAI_THROW(BELIEF_NOT_AVAILABLE);
+        return Factor();
+    }
+}
+
+
 Real LC::CalcCavityDist (size_t i, const std::string &name, const PropertySet &opts) {
     Factor Bi;
     Real maxdiff = 0;
index e780e26..e25599d 100644 (file)
@@ -389,6 +389,18 @@ Factor MR::beliefV( size_t i ) const {
         return Factor();
 }
 
+    
+Factor MR::belief (const VarSet &ns) const {
+    if( ns.size() == 0 )
+        return Factor();
+    else if( ns.size() == 1 )
+        return beliefV( findVar( *(ns.begin()) ) );
+    else {
+        DAI_THROW(BELIEF_NOT_AVAILABLE);
+        return Factor();
+    }
+}
+
 
 vector<Factor> MR::beliefs() const {
     vector<Factor> result;
index 8cfa611..238df1b 100644 (file)
@@ -65,9 +65,6 @@ string TreeEP::printProperties() const {
 TreeEP::TreeEP( const FactorGraph &fg, const PropertySet &opts ) : JTree(fg, opts("updates",string("HUGIN")), false), _maxdiff(0.0), _iters(0), props(), _Q() {
     setProperties( opts );
 
-    if( !fg.isConnected() )
-       DAI_THROW(FACTORGRAPH_NOT_CONNECTED);
-
     if( opts.hasKey("tree") ) {
         construct( fg, opts.getAs<RootedTree>("tree") );
     } else {
@@ -81,14 +78,16 @@ TreeEP::TreeEP( const FactorGraph &fg, const PropertySet &opts ) : JTree(fg, opt
             for( size_t i = 0; i < fg.nrVars(); ++i ) {
                 Var v_i = fg.var(i);
                 VarSet di = fg.delta(i);
-                for( VarSet::const_iterator j = di.begin(); j != di.end(); j++ )
-                    if( v_i < *j ) {
-                        VarSet ij(v_i,*j);
+                if( i )
+                    wg[UEdge(i,0)] = 0.0;
+                for( VarSet::const_iterator cit_j = di.begin(); cit_j != di.end(); cit_j++ )
+                    if( v_i < *cit_j ) {
+                        VarSet ij(v_i,*cit_j);
                         Factor piet;
                         for( size_t I = 0; I < fg.nrFactors(); I++ ) {
                             VarSet Ivars = fg.factor(I).vars();
                             if( props.type == Properties::TypeType::ORG ) {
-                                if( (Ivars == v_i) || (Ivars == *j) )
+                                if( (Ivars == v_i) || (Ivars == *cit_j) )
                                     piet *= fg.factor(I);
                                 else if( Ivars >> ij )
                                     piet *= fg.factor(I).marginal( ij );
@@ -97,24 +96,29 @@ TreeEP::TreeEP( const FactorGraph &fg, const PropertySet &opts ) : JTree(fg, opt
                                     piet *= fg.factor(I);
                             }
                         }
+                        size_t j = fg.findVar( *cit_j );
                         if( props.type == Properties::TypeType::ORG ) {
                             if( piet.vars() >> ij ) {
                                 piet = piet.marginal( ij );
-                                Factor pietf = piet.marginal(v_i) * piet.marginal(*j);
-                                wg[UEdge(i,fg.findVar(*j))] = dist( piet, pietf, DISTKL );
+                                Factor pietf = piet.marginal(v_i) * piet.marginal(*cit_j);
+                                wg[UEdge(i,j)] = dist( piet, pietf, DISTKL );
                             } else {
                                 // this should never happen...
                                 DAI_ASSERT( 0 == 1 );
-                                wg[UEdge(i,fg.findVar(*j))] = 0;
+                                wg[UEdge(i,j)] = 0;
                             }
-                        } else {
-                            wg[UEdge(i,fg.findVar(*j))] = piet.strength(v_i, *j);
-                        }
+                        } else
+                            wg[UEdge(i,j)] = piet.strength(v_i, *cit_j);
                     }
             }
 
             // find maximal spanning tree
-            construct( fg, MaxSpanningTree( wg, true ) );
+            if( props.verbose >= 3 )
+                cerr << "WeightedGraph: " << wg << endl;
+            RootedTree t = MaxSpanningTree( wg, true );
+            if( props.verbose >= 3 )
+                cerr << "Spanningtree: " << t << endl;
+            construct( fg, t );
         } else
             DAI_THROW(UNKNOWN_ENUM_VALUE);
     }
index 64f936c..93416e0 100644 (file)
@@ -26,6 +26,16 @@ using namespace dai;
 namespace po = boost::program_options;
 
 
+std::vector<Real> calcDists( const vector<Factor> &x, const vector<Factor> &y ) {
+    vector<Real> errs;
+    errs.reserve( x.size() );
+    DAI_ASSERT( x.size() == y.size() );
+    for( size_t i = 0; i < x.size(); i++ )
+        errs.push_back( dist( x[i], y[i], DISTTV ) );
+    return errs;
+}
+
+
 /// Wrapper class for DAI approximate inference algorithms
 class TestDAI {
     protected:
@@ -34,11 +44,15 @@ class TestDAI {
         /// Stores the name of the InfAlg algorithm
         string          name;
         /// Stores the total variation distances of the variable marginals
-        vector<Real>    err;
+        vector<Real>    varErr;
+        /// Stores the total variation distances of the factor marginals
+        vector<Real>    facErr;
 
     public:
         /// Stores the variable marginals
         vector<Factor>  varMarginals;
+        /// Stores the factor marginals
+        vector<Factor>  facMarginals;
         /// Stores all marginals
         vector<Factor>  allMarginals;
         /// Stores the logarithm of the partition sum
@@ -57,7 +71,7 @@ class TestDAI {
         bool            has_iters;
 
         /// 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) {
+        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), varErr(), facErr(), varMarginals(), facMarginals(), 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" ) {
@@ -143,35 +157,47 @@ class TestDAI {
                 for( size_t i = 0; i < obj->fg().nrVars(); i++ )
                     varMarginals.push_back( obj->beliefV( i ) );
 
+                // Store factor marginals
+                facMarginals.clear();
+                for( size_t I = 0; I < obj->fg().nrFactors(); I++ )
+                    try {
+                        facMarginals.push_back( obj->beliefF( I ) );
+                    } catch( Exception &e ) {
+                        if( e.code() == Exception::BELIEF_NOT_AVAILABLE )
+                            facMarginals.push_back( Factor( obj->fg().factor(I).vars(), INFINITY ) );
+                        else
+                            throw;
+                    }
+
                 // 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( varMarginals.size() );
-            for( size_t i = 0; i < varMarginals.size(); i++ )
-                err.push_back( dist( varMarginals[i], x.varMarginals[i], DISTTV ) );
+        /// Calculate total variation distance of variable and factor marginals with respect to those in \a varMargs and \a facMargs
+        void calcErrors( const vector<Factor>& varMargs, const vector<Factor>& facMargs ) {
+            varErr = calcDists( varMarginals, varMargs );
+            facErr = calcDists( facMarginals, facMargs );
+        }
+
+        /// Return maximum variable error
+        Real maxVarErr() {
+            return( *max_element( varErr.begin(), varErr.end() ) );
         }
 
-        /// Calculate total variation distance of variable marginals with respect to those in \a x
-        void calcErrs( const vector<Factor> &x ) {
-            err.clear();
-            err.reserve( varMarginals.size() );
-            for( size_t i = 0; i < varMarginals.size(); i++ )
-                err.push_back( dist( varMarginals[i], x[i], DISTTV ) );
+        /// Return average variable error
+        Real avgVarErr() {
+            return( accumulate( varErr.begin(), varErr.end(), 0.0 ) / varErr.size() );
         }
 
-        /// Return maximum error
-        Real maxErr() {
-            return( *max_element( err.begin(), err.end() ) );
+        /// Return maximum factor error
+        Real maxFacErr() {
+            return( *max_element( facErr.begin(), facErr.end() ) );
         }
 
-        /// Return average error
-        Real avgErr() {
-            return( accumulate( err.begin(), err.end(), 0.0 ) / err.size() );
+        /// Return average factor error
+        Real avgFacErr() {
+            return( accumulate( facErr.begin(), facErr.end(), 0.0 ) / facErr.size() );
         }
 };
 
@@ -185,8 +211,8 @@ Real clipReal( Real x, Real minabs ) {
 }
 
 
-/// Whether to output no marginals, only variable marginals, or all calculated marginals
-DAI_ENUM(MarginalsOutputType,NONE,VAR,ALL);
+/// Which marginals to outpu (none, only variable, only factor, variable and factor, all)
+DAI_ENUM(MarginalsOutputType,NONE,VAR,FAC,VARFAC,ALL);
 
 
 /// Main function
@@ -217,7 +243,7 @@ int main( int argc, char *argv[] ) {
     opts_optional.add_options()
         ("help", "Produce help message")
         ("aliases", po::value< string >(&aliases), "Filename for aliases")
-        ("marginals", po::value< MarginalsOutputType >(&marginals), "Output marginals? (NONE/VAR/ALL, default=NONE)")
+        ("marginals", po::value< MarginalsOutputType >(&marginals), "Output marginals? (NONE/VAR/FAC/VARFAC/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)?")
     ;
@@ -241,11 +267,14 @@ int main( int argc, char *argv[] ) {
         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 maximum (over all factors) total variation error in the factor marginals;" << endl;
+        cout << "  o the average (over all factors) total variation error in the factor 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 << "output consists of the variable marginals, if marginals==FAC, the factor marginals" << endl;
+        cout << "if marginals==VARFAC, both variable and factor marginals, and if marginals==ALL, all" << endl;
+        cout << "marginals 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;
@@ -273,8 +302,9 @@ int main( int argc, char *argv[] ) {
         FactorGraph fg;
         fg.ReadFromFile( filename.c_str() );
 
-        // Declare variables used for storing variable marginals and log partition sum of base method
+        // Declare variables used for storing variable factor marginals and log partition sum of base method
         vector<Factor> varMarginals0;
+        vector<Factor> facMarginals0;
         Real logZ0 = 0.0;
 
         // Output header
@@ -287,8 +317,10 @@ int main( int argc, char *argv[] ) {
             cout << right << "SECONDS  " << "\t";
         if( report_iters )
             cout << "ITERS" << "\t";
-        cout << "MAX ERROR" << "\t";
-        cout << "AVG ERROR" << "\t";
+        cout << "MAX VAR ERR" << "\t";
+        cout << "AVG VAR ERR" << "\t";
+        cout << "MAX FAC ERR" << "\t";
+        cout << "AVG FAC ERR" << "\t";
         cout << "LOGZ ERROR" << "\t";
         cout << "MAXDIFF" << "\t";
         cout << endl;
@@ -315,11 +347,12 @@ int main( int argc, char *argv[] ) {
             // For the base method, store its variable marginals and logarithm of the partition sum
             if( m == 0 ) {
                 varMarginals0 = testdai.varMarginals;
+                facMarginals0 = testdai.facMarginals;
                 logZ0 = testdai.logZ;
             }
 
             // Calculate errors relative to base method
-            testdai.calcErrs( varMarginals0 );
+            testdai.calcErrors( varMarginals0, facMarginals0 );
 
             // Output method name
             cout.width( 39 );
@@ -342,12 +375,26 @@ int main( int argc, char *argv[] ) {
                 cout.precision( 3 );
 
                 // Output maximum error in variable marginals
-                Real me = clipReal( testdai.maxErr(), 1e-9 );
-                cout << me << "\t";
+                Real mev = clipReal( testdai.maxVarErr(), 1e-9 );
+                cout << mev << "\t";
 
                 // Output average error in variable marginals
-                Real ae = clipReal( testdai.avgErr(), 1e-9 );
-                cout << ae << "\t";
+                Real aev = clipReal( testdai.avgVarErr(), 1e-9 );
+                cout << aev << "\t";
+
+                // Output maximum error in factor marginals
+                Real mef = clipReal( testdai.maxFacErr(), 1e-9 );
+                if( mef == INFINITY )
+                    cout << "N/A       \t";
+                else
+                    cout << mef << "\t";
+
+                // Output average error in factor marginals
+                Real aef = clipReal( testdai.avgFacErr(), 1e-9 );
+                if( aef == INFINITY )
+                    cout << "N/A       \t";
+                else
+                    cout << aef << "\t";
 
                 // Output error in log partition sum
                 if( testdai.has_logZ ) {
@@ -361,10 +408,10 @@ int main( int argc, char *argv[] ) {
                 // Output maximum difference in last iteration
                 if( testdai.has_maxdiff ) {
                     Real md = clipReal( testdai.maxdiff, 1e-9 );
-                    if( isnan( me ) )
-                        md = me;
-                    if( isnan( ae ) )
-                        md = ae;
+                    if( isnan( mev ) )
+                        md = mev;
+                    if( isnan( aev ) )
+                        md = aev;
                     if( md == INFINITY )
                         md = 1.0;
                     cout << md << "\t";
@@ -374,13 +421,15 @@ int main( int argc, char *argv[] ) {
             cout << endl;
 
             // Output marginals, if requested
-            if( marginals == MarginalsOutputType::VAR ) {
+            if( marginals == MarginalsOutputType::VAR || marginals == MarginalsOutputType::VARFAC )
                 for( size_t i = 0; i < testdai.varMarginals.size(); i++ )
                     cout << "# " << testdai.varMarginals[i] << endl;
-            } else if( marginals == MarginalsOutputType::ALL ) {
+            if( marginals == MarginalsOutputType::FAC || marginals == MarginalsOutputType::VARFAC )
+                for( size_t I = 0; I < testdai.facMarginals.size(); I++ )
+                    cout << "# " << testdai.facMarginals[I] << endl;
+            if( marginals == MarginalsOutputType::ALL )
                 for( size_t I = 0; I < testdai.allMarginals.size(); I++ )
                     cout << "# " << testdai.allMarginals[I] << endl;
-            }
         }
 
         return 0;
index 000e249..4e92604 100644 (file)
@@ -1,5 +1,5 @@
 # testfast.fg
-# METHOD                                       MAX ERROR       AVG ERROR       LOGZ ERROR      MAXDIFF 
+# METHOD                                       MAX VAR ERR     AVG VAR ERR     MAX FAC ERR     AVG FAC ERR     LOGZ ERROR      MAXDIFF 
 EXACT                                          
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
@@ -17,7 +17,7 @@ EXACT
 # ({x13}, (5.348e-01, 4.652e-01))
 # ({x14}, (6.291e-01, 3.709e-01))
 # ({x15}, (1.357e-01, 8.643e-01))
-JTREE_HUGIN                                    1.000e-09       1.000e-09       +1.000e-09      1.000e-09       
+JTREE_HUGIN                                    1.000e-09       1.000e-09       1.000e-09       1.000e-09       +1.000e-09      1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
 # ({x2}, (4.587e-01, 5.413e-01))
@@ -34,7 +34,7 @@ JTREE_HUGIN                                   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))
-JTREE_SHSH                                     1.000e-09       1.000e-09       +1.000e-09      1.000e-09       
+JTREE_SHSH                                     1.000e-09       1.000e-09       1.000e-09       1.000e-09       +1.000e-09      1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
 # ({x2}, (4.587e-01, 5.413e-01))
@@ -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       +2.969e-01      1.000e-09       
+BP_SEQFIX                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_SEQRND                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_SEQMAX                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_PARALL                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_SEQFIX_LOG                                  9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_SEQRND_LOG                                  9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_SEQMAX_LOG                                  9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+BP_PARALL_LOG                                  9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+FBP                                            9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+TRWBP                                          9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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                                             3.607e-01       1.904e-01       -1.608e+00      1.000e-09       
+MF                                             3.607e-01       1.904e-01       N/A             N/A             -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                                          3.607e-01       1.904e-01       -1.608e+00      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       +1.084e-02      1.000e-09       
+TREEEP                                         3.268e-02       8.023e-03       N/A             N/A             +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       +1.084e-02      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       +8.334e-02      1.000e-09       
+TREEEPWC                                       2.356e-02       1.026e-02       N/A             N/A             +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       +8.334e-02      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       +2.969e-01      1.000e-09       
+GBP_MIN                                        9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+GBP_BETHE                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       -5.645e+00      1.000e-09       
+GBP_DELTA                                      6.291e-01       3.350e-01       8.273e-01       4.628e-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       -5.645e+00      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       +2.969e-01      1.000e-09       
+GBP_LOOP3                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       -9.954e+00      1.000e-09       
+GBP_LOOP4                                      7.893e-01       3.728e-01       9.324e-01       5.220e-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       -9.954e+00      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       -9.954e+00      1.000e-09       
+GBP_LOOP5                                      7.893e-01       3.728e-01       9.324e-01       5.220e-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       -9.954e+00      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       -7.000e+00      1.000e-09       
+GBP_LOOP6                                      7.948e-01       4.458e-01       9.321e-01       5.838e-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       -7.000e+00      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       -7.000e+00      1.000e-09       
+GBP_LOOP7                                      7.948e-01       4.458e-01       9.321e-01       5.838e-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       -7.000e+00      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       +2.969e-01      1.000e-09       
+HAK_MIN                                        9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +2.969e-01      1.000e-09       
+HAK_BETHE                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       +1.654e+01      1.000e-09       
+HAK_DELTA                                      3.684e-01       1.892e-01       8.157e-01       3.459e-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       +1.654e+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       +2.969e-01      1.000e-09       
+HAK_LOOP3                                      9.483e-02       3.078e-02       1.308e-01       4.806e-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       +2.969e-01      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       -4.277e-03      1.000e-09       
+HAK_LOOP4                                      4.970e-03       1.486e-03       8.511e-03       2.899e-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       -4.277e-03      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       -4.277e-03      1.000e-09       
+HAK_LOOP5                                      4.970e-03       1.486e-03       8.511e-03       2.899e-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))
@@ -510,7 +510,7 @@ HAK_LOOP5                                   4.970e-03       1.486e-03       -4.277e-03      1.000e-09
 # ({x13}, (5.351e-01, 4.649e-01))
 # ({x14}, (6.319e-01, 3.681e-01))
 # ({x15}, (1.307e-01, 8.693e-01))
-MR_RESPPROP_FULL                               1.676e-02       4.933e-03       N/A             1.000e-09       
+MR_RESPPROP_FULL                               1.676e-02       4.933e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.941e-01, 6.059e-01))
 # ({x1}, (5.534e-01, 4.466e-01))
 # ({x2}, (4.602e-01, 5.398e-01))
@@ -527,7 +527,7 @@ MR_RESPPROP_FULL                            1.676e-02       4.933e-03       N/A             1.000e-09
 # ({x13}, (5.407e-01, 4.593e-01))
 # ({x14}, (6.252e-01, 3.748e-01))
 # ({x15}, (1.346e-01, 8.654e-01))
-MR_CLAMPING_FULL                               6.060e-03       1.754e-03       N/A             1.000e-09       
+MR_CLAMPING_FULL                               6.060e-03       1.754e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.872e-01, 6.128e-01))
 # ({x1}, (5.585e-01, 4.415e-01))
 # ({x2}, (4.575e-01, 5.425e-01))
@@ -544,7 +544,7 @@ MR_CLAMPING_FULL                            6.060e-03       1.754e-03       N/A             1.000e-09
 # ({x13}, (5.409e-01, 4.591e-01))
 # ({x14}, (6.292e-01, 3.708e-01))
 # ({x15}, (1.338e-01, 8.662e-01))
-MR_EXACT_FULL                                  3.527e-03       1.038e-03       N/A             1.000e-09       
+MR_EXACT_FULL                                  3.527e-03       1.038e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.867e-01, 6.133e-01))
 # ({x1}, (5.572e-01, 4.428e-01))
 # ({x2}, (4.585e-01, 5.415e-01))
@@ -561,7 +561,7 @@ MR_EXACT_FULL                               3.527e-03       1.038e-03       N/A             1.000e-09
 # ({x13}, (5.384e-01, 4.616e-01))
 # ({x14}, (6.296e-01, 3.704e-01))
 # ({x15}, (1.344e-01, 8.656e-01))
-MR_RESPPROP_LINEAR                             1.932e-02       5.506e-03       N/A             1.000e-09       
+MR_RESPPROP_LINEAR                             1.932e-02       5.506e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.923e-01, 6.077e-01))
 # ({x1}, (5.529e-01, 4.471e-01))
 # ({x2}, (4.608e-01, 5.392e-01))
@@ -578,7 +578,7 @@ MR_RESPPROP_LINEAR                          1.932e-02       5.506e-03       N/A             1.000e-09
 # ({x13}, (5.388e-01, 4.612e-01))
 # ({x14}, (6.239e-01, 3.761e-01))
 # ({x15}, (1.369e-01, 8.631e-01))
-MR_CLAMPING_LINEAR                             5.992e-03       1.960e-03       N/A             1.000e-09       
+MR_CLAMPING_LINEAR                             5.992e-03       1.960e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.856e-01, 6.144e-01))
 # ({x1}, (5.573e-01, 4.427e-01))
 # ({x2}, (4.586e-01, 5.414e-01))
@@ -595,7 +595,7 @@ MR_CLAMPING_LINEAR                          5.992e-03       1.960e-03       N/A             1.000e-09
 # ({x13}, (5.388e-01, 4.612e-01))
 # ({x14}, (6.275e-01, 3.725e-01))
 # ({x15}, (1.366e-01, 8.634e-01))
-MR_EXACT_LINEAR                                5.617e-03       1.742e-03       N/A             1.000e-09       
+MR_EXACT_LINEAR                                5.617e-03       1.742e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.853e-01, 6.147e-01))
 # ({x1}, (5.560e-01, 4.440e-01))
 # ({x2}, (4.596e-01, 5.404e-01))
@@ -612,7 +612,7 @@ MR_EXACT_LINEAR                             5.617e-03       1.742e-03       N/A             1.000e-09
 # ({x13}, (5.362e-01, 4.638e-01))
 # ({x14}, (6.279e-01, 3.721e-01))
 # ({x15}, (1.372e-01, 8.628e-01))
-LCBP_FULLCAV_SEQFIX                            1.225e-03       5.589e-04       N/A             1.000e-09       
+LCBP_FULLCAV_SEQFIX                            1.225e-03       5.589e-04       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.559e-01, 4.441e-01))
 # ({x2}, (4.583e-01, 5.417e-01))
@@ -629,7 +629,7 @@ LCBP_FULLCAV_SEQFIX                         1.225e-03       5.589e-04       N/A             1.000e-09
 # ({x13}, (5.358e-01, 4.642e-01))
 # ({x14}, (6.285e-01, 3.715e-01))
 # ({x15}, (1.359e-01, 8.641e-01))
-LCBP_FULLCAVin_SEQFIX                          1.225e-03       5.589e-04       N/A             1.000e-09       
+LCBP_FULLCAVin_SEQFIX                          1.225e-03       5.589e-04       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.559e-01, 4.441e-01))
 # ({x2}, (4.583e-01, 5.417e-01))
@@ -646,7 +646,7 @@ LCBP_FULLCAVin_SEQFIX                       1.225e-03       5.589e-04       N/A             1.000e-09
 # ({x13}, (5.358e-01, 4.642e-01))
 # ({x14}, (6.285e-01, 3.715e-01))
 # ({x15}, (1.359e-01, 8.641e-01))
-LCBP_FULLCAV_SEQRND                            1.225e-03       5.589e-04       N/A             1.000e-09       
+LCBP_FULLCAV_SEQRND                            1.225e-03       5.589e-04       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.559e-01, 4.441e-01))
 # ({x2}, (4.583e-01, 5.417e-01))
@@ -663,7 +663,7 @@ LCBP_FULLCAV_SEQRND                         1.225e-03       5.589e-04       N/A             1.000e-09
 # ({x13}, (5.358e-01, 4.642e-01))
 # ({x14}, (6.285e-01, 3.715e-01))
 # ({x15}, (1.359e-01, 8.641e-01))
-LCBP_FULLCAVin_SEQRND                          1.225e-03       5.589e-04       N/A             1.000e-09       
+LCBP_FULLCAVin_SEQRND                          1.225e-03       5.589e-04       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.559e-01, 4.441e-01))
 # ({x2}, (4.583e-01, 5.417e-01))
@@ -680,7 +680,7 @@ LCBP_FULLCAVin_SEQRND                       1.225e-03       5.589e-04       N/A             1.000e-09
 # ({x13}, (5.358e-01, 4.642e-01))
 # ({x14}, (6.285e-01, 3.715e-01))
 # ({x15}, (1.359e-01, 8.641e-01))
-LCBP_FULLCAV_NONE                              1.318e-02       2.644e-03       N/A             1.000e+00       
+LCBP_FULLCAV_NONE                              1.318e-02       2.644e-03       N/A             N/A             N/A             1.000e+00       
 # ({x0}, (3.859e-01, 6.141e-01))
 # ({x1}, (5.569e-01, 4.431e-01))
 # ({x2}, (4.719e-01, 5.281e-01))
@@ -697,7 +697,7 @@ LCBP_FULLCAV_NONE                           1.318e-02       2.644e-03       N/A             1.000e+00
 # ({x13}, (5.350e-01, 4.650e-01))
 # ({x14}, (6.290e-01, 3.710e-01))
 # ({x15}, (1.364e-01, 8.636e-01))
-LCBP_FULLCAVin_NONE                            1.318e-02       2.644e-03       N/A             1.000e+00       
+LCBP_FULLCAVin_NONE                            1.318e-02       2.644e-03       N/A             N/A             N/A             1.000e+00       
 # ({x0}, (3.859e-01, 6.141e-01))
 # ({x1}, (5.569e-01, 4.431e-01))
 # ({x2}, (4.719e-01, 5.281e-01))
@@ -714,7 +714,7 @@ LCBP_FULLCAVin_NONE                         1.318e-02       2.644e-03       N/A             1.000e+00
 # ({x13}, (5.350e-01, 4.650e-01))
 # ({x14}, (6.290e-01, 3.710e-01))
 # ({x15}, (1.364e-01, 8.636e-01))
-LCBP_PAIRCAV_SEQFIX                            1.564e-02       5.284e-03       N/A             1.000e-09       
+LCBP_PAIRCAV_SEQFIX                            1.564e-02       5.284e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.872e-01, 6.128e-01))
 # ({x1}, (5.540e-01, 4.460e-01))
 # ({x2}, (4.596e-01, 5.404e-01))
@@ -731,7 +731,7 @@ LCBP_PAIRCAV_SEQFIX                         1.564e-02       5.284e-03       N/A             1.000e-09
 # ({x13}, (5.282e-01, 4.718e-01))
 # ({x14}, (6.240e-01, 3.760e-01))
 # ({x15}, (1.409e-01, 8.591e-01))
-LCBP_PAIRCAVin_SEQFIX                          1.564e-02       5.284e-03       N/A             1.000e-09       
+LCBP_PAIRCAVin_SEQFIX                          1.564e-02       5.284e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.872e-01, 6.128e-01))
 # ({x1}, (5.540e-01, 4.460e-01))
 # ({x2}, (4.596e-01, 5.404e-01))
@@ -748,7 +748,7 @@ LCBP_PAIRCAVin_SEQFIX                       1.564e-02       5.284e-03       N/A             1.000e-09
 # ({x13}, (5.282e-01, 4.718e-01))
 # ({x14}, (6.240e-01, 3.760e-01))
 # ({x15}, (1.409e-01, 8.591e-01))
-LCBP_PAIRCAV_SEQRND                            1.564e-02       5.284e-03       N/A             1.000e-09       
+LCBP_PAIRCAV_SEQRND                            1.564e-02       5.284e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.872e-01, 6.128e-01))
 # ({x1}, (5.540e-01, 4.460e-01))
 # ({x2}, (4.596e-01, 5.404e-01))
@@ -765,7 +765,7 @@ LCBP_PAIRCAV_SEQRND                         1.564e-02       5.284e-03       N/A             1.000e-09
 # ({x13}, (5.282e-01, 4.718e-01))
 # ({x14}, (6.240e-01, 3.760e-01))
 # ({x15}, (1.409e-01, 8.591e-01))
-LCBP_PAIRCAVin_SEQRND                          1.564e-02       5.284e-03       N/A             1.000e-09       
+LCBP_PAIRCAVin_SEQRND                          1.564e-02       5.284e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.872e-01, 6.128e-01))
 # ({x1}, (5.540e-01, 4.460e-01))
 # ({x2}, (4.596e-01, 5.404e-01))
@@ -782,7 +782,7 @@ LCBP_PAIRCAVin_SEQRND                       1.564e-02       5.284e-03       N/A             1.000e-09
 # ({x13}, (5.282e-01, 4.718e-01))
 # ({x14}, (6.240e-01, 3.760e-01))
 # ({x15}, (1.409e-01, 8.591e-01))
-LCBP_PAIRCAV_NONE                              1.869e-01       6.816e-02       N/A             1.000e+00       
+LCBP_PAIRCAV_NONE                              1.869e-01       6.816e-02       N/A             N/A             N/A             1.000e+00       
 # ({x0}, (3.558e-01, 6.442e-01))
 # ({x1}, (5.320e-01, 4.680e-01))
 # ({x2}, (4.581e-01, 5.419e-01))
@@ -799,7 +799,7 @@ LCBP_PAIRCAV_NONE                           1.869e-01       6.816e-02       N/A             1.000e+00
 # ({x13}, (6.323e-01, 3.677e-01))
 # ({x14}, (8.161e-01, 1.839e-01))
 # ({x15}, (1.676e-01, 8.324e-01))
-LCBP_PAIRCAVin_NONE                            1.869e-01       6.816e-02       N/A             1.000e+00       
+LCBP_PAIRCAVin_NONE                            1.869e-01       6.816e-02       N/A             N/A             N/A             1.000e+00       
 # ({x0}, (3.558e-01, 6.442e-01))
 # ({x1}, (5.320e-01, 4.680e-01))
 # ({x2}, (4.581e-01, 5.419e-01))
@@ -816,7 +816,7 @@ LCBP_PAIRCAVin_NONE                         1.869e-01       6.816e-02       N/A             1.000e+00
 # ({x13}, (6.323e-01, 3.677e-01))
 # ({x14}, (8.161e-01, 1.839e-01))
 # ({x15}, (1.676e-01, 8.324e-01))
-LCBP_PAIR2CAV_SEQFIX                           1.535e-02       4.445e-03       N/A             1.000e-09       
+LCBP_PAIR2CAV_SEQFIX                           1.535e-02       4.445e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.844e-01, 6.156e-01))
 # ({x1}, (5.557e-01, 4.443e-01))
 # ({x2}, (4.588e-01, 5.412e-01))
@@ -833,7 +833,7 @@ LCBP_PAIR2CAV_SEQFIX                        1.535e-02       4.445e-03       N/A             1.000e-09
 # ({x13}, (5.280e-01, 4.720e-01))
 # ({x14}, (6.250e-01, 3.750e-01))
 # ({x15}, (1.411e-01, 8.589e-01))
-LCBP_PAIR2CAVin_SEQFIX                         1.535e-02       4.445e-03       N/A             1.000e-09       
+LCBP_PAIR2CAVin_SEQFIX                         1.535e-02       4.445e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.844e-01, 6.156e-01))
 # ({x1}, (5.557e-01, 4.443e-01))
 # ({x2}, (4.588e-01, 5.412e-01))
@@ -850,7 +850,7 @@ LCBP_PAIR2CAVin_SEQFIX                      1.535e-02       4.445e-03       N/A             1.000e-09
 # ({x13}, (5.280e-01, 4.720e-01))
 # ({x14}, (6.250e-01, 3.750e-01))
 # ({x15}, (1.411e-01, 8.589e-01))
-LCBP_PAIR2CAV_SEQRND                           1.535e-02       4.445e-03       N/A             1.000e-09       
+LCBP_PAIR2CAV_SEQRND                           1.535e-02       4.445e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.844e-01, 6.156e-01))
 # ({x1}, (5.557e-01, 4.443e-01))
 # ({x2}, (4.588e-01, 5.412e-01))
@@ -867,7 +867,7 @@ LCBP_PAIR2CAV_SEQRND                        1.535e-02       4.445e-03       N/A             1.000e-09
 # ({x13}, (5.280e-01, 4.720e-01))
 # ({x14}, (6.250e-01, 3.750e-01))
 # ({x15}, (1.411e-01, 8.589e-01))
-LCBP_PAIR2CAVin_SEQRND                         1.535e-02       4.445e-03       N/A             1.000e-09       
+LCBP_PAIR2CAVin_SEQRND                         1.535e-02       4.445e-03       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (3.844e-01, 6.156e-01))
 # ({x1}, (5.557e-01, 4.443e-01))
 # ({x2}, (4.588e-01, 5.412e-01))
@@ -884,7 +884,7 @@ LCBP_PAIR2CAVin_SEQRND                      1.535e-02       4.445e-03       N/A             1.000e-09
 # ({x13}, (5.280e-01, 4.720e-01))
 # ({x14}, (6.250e-01, 3.750e-01))
 # ({x15}, (1.411e-01, 8.589e-01))
-LCBP_PAIR2CAV_NONE                             1.894e-01       7.196e-02       N/A             1.000e+00       
+LCBP_PAIR2CAV_NONE                             1.894e-01       7.196e-02       N/A             N/A             N/A             1.000e+00       
 # ({x0}, (3.525e-01, 6.475e-01))
 # ({x1}, (5.395e-01, 4.605e-01))
 # ({x2}, (4.567e-01, 5.433e-01))
@@ -901,7 +901,7 @@ LCBP_PAIR2CAV_NONE                          1.894e-01       7.196e-02       N/A             1.000e+00
 # ({x13}, (6.444e-01, 3.556e-01))
 # ({x14}, (8.185e-01, 1.815e-01))
 # ({x15}, (1.841e-01, 8.159e-01))
-LCBP_PAIR2CAVin_NONE                           1.894e-01       7.196e-02       N/A             1.000e+00       
+LCBP_PAIR2CAVin_NONE                           1.894e-01       7.196e-02       N/A             N/A             N/A             1.000e+00       
 # ({x0}, (3.525e-01, 6.475e-01))
 # ({x1}, (5.395e-01, 4.605e-01))
 # ({x2}, (4.567e-01, 5.433e-01))
@@ -918,7 +918,7 @@ LCBP_PAIR2CAVin_NONE                        1.894e-01       7.196e-02       N/A             1.000e+00
 # ({x13}, (6.444e-01, 3.556e-01))
 # ({x14}, (8.185e-01, 1.815e-01))
 # ({x15}, (1.841e-01, 8.159e-01))
-LCBP_UNICAV_SEQFIX                             9.483e-02       3.078e-02       N/A             1.000e-09       
+LCBP_UNICAV_SEQFIX                             9.483e-02       3.078e-02       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-01))
@@ -935,7 +935,7 @@ LCBP_UNICAV_SEQFIX                          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))
-LCBP_UNICAV_SEQRND                             9.483e-02       3.078e-02       N/A             1.000e-09       
+LCBP_UNICAV_SEQRND                             9.483e-02       3.078e-02       N/A             N/A             N/A             1.000e-09       
 # ({x0}, (4.233e-01, 5.767e-01))
 # ({x1}, (5.422e-01, 4.578e-01))
 # ({x2}, (4.662e-01, 5.338e-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       +1.209e-03      1.000e-09       
+BBP                                            7.049e-04       2.319e-04       2.813e-03       4.214e-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       +1.209e-03      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                                            5.336e-06       2.335e-06       -6.764e-06      1.000e-09       
+CBP                                            5.336e-06       2.335e-06       1.154e-05       3.541e-06       -6.764e-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))
index ee1e2ec..2530492 100644 (file)
@@ -29,7 +29,7 @@ namespace po = boost::program_options;
 
 
 /// Possible factor types
-DAI_ENUM(FactorType,ISING,EXPGAUSS,POTTS);
+DAI_ENUM(FactorType,ISINGGAUSS,ISINGUNIFORM,EXPGAUSS,POTTS);
 
 
 /// Creates a factor graph from a pairwise interactions graph
@@ -42,11 +42,11 @@ FactorGraph createFG( const GraphAL &G, FactorType ft, size_t states, const Prop
     size_t N = G.nrNodes();
 
     if( states > 2 )
-        DAI_ASSERT( ft != FactorType::ISING );
+        DAI_ASSERT( ft != FactorType::ISINGGAUSS && ft != FactorType::ISINGUNIFORM );
 
     // Get inverse temperature
     Real beta = 1.0;
-    if( ft != FactorType::ISING ) 
+    if( ft != FactorType::ISINGGAUSS && ft != FactorType::ISINGUNIFORM ) 
         beta = props.getAs<Real>("beta");
 
     // Get properties for Ising factors
@@ -54,12 +54,22 @@ FactorGraph createFG( const GraphAL &G, FactorType ft, size_t states, const Prop
     Real sigma_h = 0.0;
     Real mean_J = 0.0;
     Real sigma_J = 0.0;
-    if( ft == FactorType::ISING ) {
+    if( ft == FactorType::ISINGGAUSS ) {
         mean_h = props.getAs<Real>("mean_th");
         sigma_h = props.getAs<Real>("sigma_th");
         mean_J = props.getAs<Real>("mean_w");
         sigma_J = props.getAs<Real>("sigma_w");
     }
+    Real min_h = 0.0;
+    Real min_J = 0.0;
+    Real max_h = 0.0;
+    Real max_J = 0.0;
+    if( ft == FactorType::ISINGUNIFORM ) {
+        min_h = props.getAs<Real>("min_th");
+        min_J = props.getAs<Real>("min_w");
+        max_h = props.getAs<Real>("max_th");
+        max_J = props.getAs<Real>("max_w");
+    }
     
     // Create variables
     vector<Var> vars;
@@ -78,17 +88,25 @@ FactorGraph createFG( const GraphAL &G, FactorType ft, size_t states, const Prop
                     factors.push_back( createFactorPotts( vars[i], vars[j], beta ) );
                 else if( ft == FactorType::EXPGAUSS )
                     factors.push_back( createFactorExpGauss( VarSet( vars[i], vars[j] ), beta ) );
-                else if( ft == FactorType::ISING ) {
+                else if( ft == FactorType::ISINGGAUSS ) {
                     Real J = rnd_stdnormal() * sigma_J + mean_J;
                     factors.push_back( createFactorIsing( vars[i], vars[j], J ) );
+                } else if( ft == FactorType::ISINGUNIFORM ) {
+                    Real J = min_J + rnd_uniform() * (max_J - min_J);
+                    factors.push_back( createFactorIsing( vars[i], vars[j], J ) );
                 }
             }
     // Unary factors
-    if( ft == FactorType::ISING )
+    if( ft == FactorType::ISINGGAUSS )
         for( size_t i = 0; i < N; i++ ) {
             Real h = rnd_stdnormal() * sigma_h + mean_h;
             factors.push_back( createFactorIsing( vars[i], h ) );
         }
+    else if( ft == FactorType::ISINGUNIFORM )
+        for( size_t i = 0; i < N; i++ ) {
+            Real h = min_h + rnd_uniform() * (max_h - min_h);
+            factors.push_back( createFactorIsing( vars[i], h ) );
+        }
 
     return FactorGraph( factors.begin(), factors.end(), vars.begin(), vars.end(), factors.size(), vars.size() );
 }
@@ -315,7 +333,7 @@ int main( int argc, char *argv[] ) {
         bool periodic = false;
         FactorType ft;
         LDPCType ldpc;
-        Real beta, sigma_w, sigma_th, mean_w, mean_th, noise;
+        Real beta, sigma_w, sigma_th, mean_w, mean_th, min_w, min_th, max_w, max_th, noise;
 
         // Declare the supported options.
         po::options_description opts("General command line options");
@@ -342,12 +360,16 @@ int main( int argc, char *argv[] ) {
         // Factor options
         po::options_description opts_factors("Options for specifying factors");
         opts_factors.add_options()
-            ("factors",  po::value<FactorType>(&ft), "factor type (one of 'EXPGAUSS','POTTS','ISING')")
-            ("beta",     po::value<Real>(&beta),     "inverse temperature (ignored for factors=='ISING')")
-            ("mean_w",   po::value<Real>(&mean_w),   "mean of pairwise interactions w_{ij} (only for factors=='ISING')")
-            ("mean_th",  po::value<Real>(&mean_th),  "mean of unary interactions th_i (only for factors=='ISING')")
-            ("sigma_w",  po::value<Real>(&sigma_w),  "stddev of pairwise interactions w_{ij} (only for factors=='ISING')")
-            ("sigma_th", po::value<Real>(&sigma_th), "stddev of unary interactions th_i (only for factors=='ISING'")
+            ("factors",  po::value<FactorType>(&ft), "factor type (one of 'EXPGAUSS','POTTS','ISINGGAUSS','ISINGUNIFORM')")
+            ("beta",     po::value<Real>(&beta),     "inverse temperature (ignored for factors=='ISINGGAUSS','ISINGUNIFORM')")
+            ("mean_w",   po::value<Real>(&mean_w),   "mean of pairwise interactions w_{ij} (only for factors=='ISINGGAUSS')")
+            ("mean_th",  po::value<Real>(&mean_th),  "mean of unary interactions th_i (only for factors=='ISINGGAUSS')")
+            ("sigma_w",  po::value<Real>(&sigma_w),  "stddev of pairwise interactions w_{ij} (only for factors=='ISINGGAUSS')")
+            ("sigma_th", po::value<Real>(&sigma_th), "stddev of unary interactions th_i (only for factors=='ISINGGAUSS'")
+            ("min_w",    po::value<Real>(&min_w),    "minimum of pairwise interactions w_{ij} (only for factors=='ISINGUNIFORM')")
+            ("min_th",   po::value<Real>(&min_th),   "minimum of unary interactions th_i (only for factors=='ISINGUNIFORM')")
+            ("max_w",    po::value<Real>(&max_w),    "maximum of pairwise interactions w_{ij} (only for factors=='ISINGUNIFORM')")
+            ("max_th",   po::value<Real>(&max_th),   "maximum of unary interactions th_i (only for factors=='ISINGUNIFORM')")
         ;
 
         // LDPC options
@@ -401,12 +423,15 @@ int main( int argc, char *argv[] ) {
             cout << "In case of pairwise interactions, one can also choose POTTS factors, for which" << endl;
             cout << "the log-factors are simply delta functions multiplied by the strength <beta>." << endl << endl;
 
-            cout << "For pairwise interactions and binary variables, one can also use ISING factors." << endl;
+            cout << "For pairwise interactions and binary variables, one can also use ISINGGAUSS factors." << endl;
             cout << "Here variables x1...xN are assumed to be +1/-1--valued, and unary interactions" << endl;
             cout << "are of the form exp(th*xi) with th drawn from a Gaussian distribution with mean" << endl;
             cout << "<mean_th> and standard deviation <sigma_th>, and pairwise interactions are of the" << endl;
             cout << "form exp(w*xi*xj) with w drawn from a Gaussian distribution with mean <mean_w>" << endl;
             cout << "and standard deviation <sigma_w>." << endl;
+            cout << "Alternatively, one can use ISINGUNIFORM factors: here th is drawn from a uniform" << endl;
+            cout << "distribution on [<min_th>, <max_th>), and w is drawn from a uniform distribution" << endl;
+            cout << "on [<min_w>, <max_w>)." << endl;
             return 1;
         }
 
@@ -421,9 +446,12 @@ int main( int argc, char *argv[] ) {
         if( ft == FactorType::POTTS )
             if( type == HOI_TYPE )
                 throw "For factors=='POTTS', interactions should be pairwise (type!='HOI')";
-        if( ft == FactorType::ISING )
+        if( ft == FactorType::ISINGGAUSS )
             if( ((states != 2) || (type == HOI_TYPE)) )
-                throw "For factors=='ISING', variables should be binary (states==2) and interactions should be pairwise (type!='HOI')";
+                throw "For factors=='ISINGGAUSS', variables should be binary (states==2) and interactions should be pairwise (type!='HOI')";
+        if( ft == FactorType::ISINGUNIFORM )
+            if( ((states != 2) || (type == HOI_TYPE)) )
+                throw "For factors=='ISINGUNIFORM', variables should be binary (states==2) and interactions should be pairwise (type!='HOI')";
 
         // Read random seed
         if( !vm.count("seed") ) {
@@ -457,6 +485,14 @@ int main( int argc, char *argv[] ) {
             options.set("sigma_w", sigma_w);
         if( vm.count("beta") )
             options.set("beta", beta);
+        if( vm.count("min_w") )
+            options.set("min_w", min_w);
+        if( vm.count("min_th") )
+            options.set("min_th", min_th);
+        if( vm.count("max_w") )
+            options.set("max_w", max_w);
+        if( vm.count("max_th") )
+            options.set("max_th", max_th);
 
         // Output some comments
         cout << "# Factor graph made by " << argv[0] << endl;
@@ -484,14 +520,18 @@ int main( int argc, char *argv[] ) {
             } else
                 NEED_ARG("N", "number of variables");
 
-            if( ft != FactorType::ISING ) {
-                NEED_ARG("beta", "stddev of log-factor entries");
-            } else {
+            if( ft == FactorType::ISINGGAUSS ) {
                 NEED_ARG("mean_w", "mean of pairwise interactions");
                 NEED_ARG("mean_th", "mean of unary interactions");
                 NEED_ARG("sigma_w", "stddev of pairwise interactions");
                 NEED_ARG("sigma_th", "stddev of unary interactions");
-            }
+            } else if( ft == FactorType::ISINGUNIFORM ) {
+                NEED_ARG("min_w", "minimum of pairwise interactions");
+                NEED_ARG("min_th", "minimum of unary interactions");
+                NEED_ARG("max_w", "maximum of pairwise interactions");
+                NEED_ARG("max_th", "maximum of unary interactions");
+            } else
+                NEED_ARG("beta", "stddev of log-factor entries");
 
             if( type == DREG_TYPE )
                 NEED_ARG("d", "connectivity (number of neighboring variables of each variable)");