Declared class Diffs as obsolete
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Tue, 3 Nov 2009 16:15:50 +0000 (17:15 +0100)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Tue, 3 Nov 2009 16:15:50 +0000 (17:15 +0100)
14 files changed:
ChangeLog
OBSOLETE
TODO
include/dai/mf.h
include/dai/util.h
src/bp.cpp
src/cbp.cpp
src/hak.cpp
src/lc.cpp
src/mf.cpp
src/mr.cpp
src/treeep.cpp
src/util.cpp
tests/testfast.out

index 7a70370..e47d40f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* Declared class Diffs as obsolete
 * Declared calcPairBeliefsNew() as obsolete (its functionality is now part
   of calcPairBeliefs())
 * Declared calcMarginal2ndO() as obsolete
index df7e4d3..ce6c62e 100644 (file)
--- a/OBSOLETE
+++ b/OBSOLETE
@@ -27,3 +27,4 @@ bool RegionGraph::Check_Counting_Numbers();
 void RegionGraph::Calc_Counting_Numbers();
 std::vector<Factor> calcPairBeliefsNew( const InfAlg& obj, const VarSet& vs, bool reInit );
 Factor calcMarginal2ndO( const InfAlg& obj, const VarSet& vs, bool reInit );
+class Diffs;
diff --git a/TODO b/TODO
index 633d2d7..d7d354a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -19,11 +19,8 @@ Improve documentation:
        doc.h
 
 Write a concept/notations page for the documentation,
-explaing the concepts of "state" (index into a 
+explaining the concepts of "state" (index into a 
 multi-dimensional array, e.g., one corresponding
 to the Cartesian product of statespaces of variables)
 and "linear index". This should make it easier to
 document index.h and varset.h
-
-The Diffs object can probably be replaced by a simple
-std::vector.
index c5fca87..39755c3 100644 (file)
@@ -72,6 +72,7 @@ class MF : public DAIAlgFG {
         virtual std::string identify() const;
         virtual Factor belief( const Var &n ) const;
         virtual Factor belief( const VarSet &ns ) const;
+        virtual Factor beliefV( size_t i ) const;
         virtual std::vector<Factor> beliefs() const;
         virtual Real logZ() const;
         virtual void init();
@@ -84,7 +85,7 @@ class MF : public DAIAlgFG {
 
         /// @name Additional interface specific for MF
         //@{
-        Factor beliefV( size_t i ) const;
+        Factor calcNewBelief( size_t i );
         //@}
 
     private:
index 6b0fef6..05c55f8 100644 (file)
@@ -94,6 +94,9 @@ inline Real exp( Real x ) {
     return std::exp(x);
 }
 
+/// Returns maximum value of a std::vector<Real>
+Real max( std::vector<Real> v );
+
 
 #ifdef WINDOWS
     /// hash_map is an alias for \c std::map.
@@ -191,18 +194,9 @@ std::vector<T> concat( const std::vector<T>& u, const std::vector<T>& v ) {
 /// Split a string into tokens delimited by characters in \a delim
 void tokenizeString( const std::string& s, std::vector<std::string>& outTokens, const std::string& delim="\t\n" );
 
+// OBSOLETE
 /// Used to keep track of the progress made by iterative algorithms.
-/** A Diffs object stores an array of fixed size, containing the 
- *  history of certain values (for example, the \f$\ell_\infty\f$ 
- *  differences between all the old beliefs and the new beliefs 
- *  in one pass of belief propagation updates). A new value can be
- *  registered by calling Diffs::push(); the BP algorithm would use
- *  this to register the difference between the old and a newly 
- *  calculated belief. The Diffs object keeps track of the maximum 
- *  value encountered in the last Diffs::maxSize() values registered.
- *  The maximum value can then be queried by Diffs::maxDiff(). The
- *  BP algorithm would use this maximum value to compare it with a
- *  given tolerance in order to decide whether the algorithm has converged.
+/** \note Obsolete, to be removed soon
  */
 class Diffs : public std::vector<Real> {
     private:
index 39c70ce..b1b921c 100644 (file)
@@ -232,9 +232,8 @@ Real BP::run() {
         cerr << endl;
 
     double tic = toc();
-    Diffs diffs(nrVars(), 1.0);
-
-    vector<Edge> update_seq;
+    vector<Real> diffs( nrVars(), INFINITY );
+    Real maxDiff = INFINITY;
 
     vector<Factor> old_beliefs;
     old_beliefs.reserve( nrVars() );
@@ -242,13 +241,12 @@ Real BP::run() {
         old_beliefs.push_back( beliefV(i) );
 
     size_t nredges = nrEdges();
-
+    vector<Edge> update_seq;
     if( props.updates == Properties::UpdateType::SEQMAX ) {
         // do the first pass
         for( size_t i = 0; i < nrVars(); ++i )
-            foreach( const Neighbor &I, nbV(i) ) {
+            foreach( const Neighbor &I, nbV(i) )
                 calcNewMessage( i, I.iter );
-            }
     } else {
         update_seq.reserve( nredges );
         /// \todo Investigate whether performance increases by switching the order of following two loops:
@@ -259,7 +257,7 @@ Real BP::run() {
 
     // do several passes over the network until maximum number of iterations has
     // been reached or until the maximum belief difference is smaller than tolerance
-    for( _iters=0; _iters < props.maxiter && diffs.maxDiff() > props.tol; ++_iters ) {
+    for( _iters=0; _iters < props.maxiter && maxDiff > props.tol; ++_iters ) {
         if( props.updates == Properties::UpdateType::SEQMAX ) {
             // Residuals-BP by Koller et al.
             for( size_t t = 0; t < nredges; ++t ) {
@@ -303,22 +301,23 @@ Real BP::run() {
         // calculate new beliefs and compare with old ones
         for( size_t i = 0; i < nrVars(); ++i ) {
             Factor nb( beliefV(i) );
-            diffs.push( dist( nb, old_beliefs[i], Prob::DISTLINF ) );
+            diffs[i] = dist( nb, old_beliefs[i], Prob::DISTLINF );
             old_beliefs[i] = nb;
         }
+        maxDiff = max( diffs );
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
-    if( diffs.maxDiff() > _maxdiff )
-        _maxdiff = diffs.maxDiff();
+    if( maxDiff > _maxdiff )
+        _maxdiff = maxDiff;
 
     if( props.verbose >= 1 ) {
-        if( diffs.maxDiff() > props.tol ) {
+        if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-                cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+                cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 3 )
                 cerr << Name << "::run:  ";
@@ -326,7 +325,7 @@ Real BP::run() {
         }
     }
 
-    return diffs.maxDiff();
+    return maxDiff;
 }
 
 
index 3cba00f..b33bb9e 100644 (file)
@@ -89,7 +89,7 @@ static vector<Factor> mixBeliefs( Real p, const vector<Factor> &b, const vector<
 
 Real CBP::run() {
     size_t seed = props.rand_seed;
-    if( seed > 0)
+    if( seed > 0 )
         rnd_seed( seed );
 
     InfAlg *bp = getInfAlg();
index dab801a..319e047 100644 (file)
@@ -267,11 +267,12 @@ Real HAK::doGBP() {
         old_beliefs.push_back( belief( var(i) ) );
 
     // Differences in single node beliefs
-    Diffs diffs(nrVars(), 1.0);
+    vector<Real> diffs( nrVars(), INFINITY );
+    Real maxDiff = INFINITY;
 
     // do several passes over the network until maximum number of iterations has
     // been reached or until the maximum belief difference is smaller than tolerance
-    for( _iters = 0; _iters < props.maxiter && diffs.maxDiff() > props.tol; _iters++ ) {
+    for( _iters = 0; _iters < props.maxiter && maxDiff > props.tol; _iters++ ) {
         for( size_t beta = 0; beta < nrIRs(); beta++ ) {
             foreach( const Neighbor &alpha, nbIR(beta) ) {
                 size_t _beta = alpha.dual;
@@ -346,22 +347,23 @@ Real HAK::doGBP() {
         // Calculate new single variable beliefs and compare with old ones
         for( size_t i = 0; i < nrVars(); i++ ) {
             Factor new_belief = belief( var( i ) );
-            diffs.push( dist( new_belief, old_beliefs[i], Prob::DISTLINF ) );
+            diffs[i] = dist( new_belief, old_beliefs[i], Prob::DISTLINF );
             old_beliefs[i] = new_belief;
         }
+        maxDiff = max( diffs );
 
         if( props.verbose >= 3 )
-            cerr << Name << "::doGBP:  maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+            cerr << Name << "::doGBP:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
-    if( diffs.maxDiff() > _maxdiff )
-        _maxdiff = diffs.maxDiff();
+    if( maxDiff > _maxdiff )
+        _maxdiff = maxDiff;
 
     if( props.verbose >= 1 ) {
-        if( diffs.maxDiff() > props.tol ) {
+        if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-            cerr << Name << "::doGBP:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+            cerr << Name << "::doGBP:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 2 )
                 cerr << Name << "::doGBP:  ";
@@ -369,7 +371,7 @@ Real HAK::doGBP() {
         }
     }
 
-    return diffs.maxDiff();
+    return maxDiff;
 }
 
 
@@ -399,7 +401,8 @@ Real HAK::doDoubleLoop() {
         old_beliefs.push_back( belief( var(i) ) );
 
     // Differences in single node beliefs
-    Diffs diffs(nrVars(), 1.0);
+    vector<Real> diffs( nrVars(), INFINITY );
+    Real maxDiff = INFINITY;
 
     size_t outer_maxiter   = props.maxiter;
     Real   outer_tol       = props.tol;
@@ -412,7 +415,7 @@ Real HAK::doDoubleLoop() {
 
     size_t outer_iter = 0;
     size_t total_iter = 0;
-    for( outer_iter = 0; outer_iter < outer_maxiter && diffs.maxDiff() > outer_tol; outer_iter++ ) {
+    for( outer_iter = 0; outer_iter < outer_maxiter && maxDiff > outer_tol; outer_iter++ ) {
         // Calculate new outer regions
         for( size_t alpha = 0; alpha < nrORs(); alpha++ ) {
             OR(alpha) = org_ORs[alpha];
@@ -427,14 +430,15 @@ Real HAK::doDoubleLoop() {
         // Calculate new single variable beliefs and compare with old ones
         for( size_t i = 0; i < nrVars(); ++i ) {
             Factor new_belief = belief( var( i ) );
-            diffs.push( dist( new_belief, old_beliefs[i], Prob::DISTLINF ) );
+            diffs[i] = dist( new_belief, old_beliefs[i], Prob::DISTLINF );
             old_beliefs[i] = new_belief;
         }
+        maxDiff = max( diffs );
 
         total_iter += Iterations();
 
         if( props.verbose >= 3 )
-            cerr << Name << "::doDoubleLoop:  maxdiff " << diffs.maxDiff() << " after " << total_iter << " passes" << endl;
+            cerr << Name << "::doDoubleLoop:  maxdiff " << maxDiff << " after " << total_iter << " passes" << endl;
     }
 
     // restore _maxiter, _verbose and _maxdiff
@@ -443,8 +447,8 @@ Real HAK::doDoubleLoop() {
     _maxdiff = org_maxdiff;
 
     _iters = total_iter;
-    if( diffs.maxDiff() > _maxdiff )
-        _maxdiff = diffs.maxDiff();
+    if( maxDiff > _maxdiff )
+        _maxdiff = maxDiff;
 
     // Restore original outer regions
     ORs = org_ORs;
@@ -454,10 +458,10 @@ Real HAK::doDoubleLoop() {
         IR(beta).c() = org_IR_cs[beta];
 
     if( props.verbose >= 1 ) {
-        if( diffs.maxDiff() > props.tol ) {
+        if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-                cerr << Name << "::doDoubleLoop:  WARNING: not converged within " << outer_maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+                cerr << Name << "::doDoubleLoop:  WARNING: not converged within " << outer_maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
             } else {
                 if( props.verbose >= 3 )
                     cerr << Name << "::doDoubleLoop:  ";
@@ -465,7 +469,7 @@ Real HAK::doDoubleLoop() {
             }
         }
 
-    return diffs.maxDiff();
+    return maxDiff;
 }
 
 
index 4595c8f..1cc0c1b 100644 (file)
@@ -246,7 +246,8 @@ Real LC::run() {
         cerr << endl;
 
     double tic = toc();
-    Diffs diffs(nrVars(), 1.0);
+    vector<Real> diffs( nrVars(), INFINITY );
+    Real maxDiff = INFINITY;
 
     Real md = InitCavityDists( props.cavainame, props.cavaiopts );
     if( md > _maxdiff )
@@ -290,7 +291,7 @@ Real LC::run() {
 
     // do several passes over the network until maximum number of iterations has
     // been reached or until the maximum belief difference is smaller than tolerance
-    for( _iters=0; _iters < props.maxiter && diffs.maxDiff() > props.tol; _iters++ ) {
+    for( _iters=0; _iters < props.maxiter && maxDiff > props.tol; _iters++ ) {
         // Sequential updates
         if( props.updates == Properties::UpdateType::SEQRND )
             random_shuffle( update_seq.begin(), update_seq.end() );
@@ -306,22 +307,23 @@ Real LC::run() {
 
         // compare new beliefs with old ones
         for(size_t i=0; i < nrVars(); i++ ) {
-            diffs.push( dist( belief(i), old_beliefs[i], Prob::DISTLINF ) );
+            diffs[i] = dist( belief(i), old_beliefs[i], Prob::DISTLINF );
             old_beliefs[i] = belief(i);
         }
+        maxDiff = max( diffs );
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
-    if( diffs.maxDiff() > _maxdiff )
-        _maxdiff = diffs.maxDiff();
+    if( maxDiff > _maxdiff )
+        _maxdiff = maxDiff;
 
     if( props.verbose >= 1 ) {
-        if( diffs.maxDiff() > props.tol ) {
+        if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-                cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+                cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 2 )
                 cerr << Name << "::run:  ";
@@ -329,7 +331,7 @@ Real LC::run() {
         }
     }
 
-    return diffs.maxDiff();
+    return maxDiff;
 }
 
 
index 3e96c82..7a927a7 100644 (file)
@@ -84,65 +84,78 @@ void MF::init() {
 }
 
 
-Real MF::run() {
-    double tic = toc();
+Factor MF::calcNewBelief( size_t i ) {
+    Factor result;
+    foreach( const Neighbor &I, nbV(i) ) {
+        Factor henk;
+        foreach( const Neighbor &j, nbF(I) ) // for all j in I \ i
+            if( j != i )
+                henk *= _beliefs[j];
+        Factor piet = factor(I).log(true);
+        piet *= henk;
+        piet = piet.marginal(var(i), false);
+        piet = piet.exp();
+        result *= piet;
+    }
+    result.normalize();
+    return result;
+}
+
 
+Real MF::run() {
     if( props.verbose >= 1 )
         cerr << "Starting " << identify() << "...";
 
-    size_t pass_size = _beliefs.size();
-    Diffs diffs(pass_size * 3, 1.0);
+    double tic = toc();
+    vector<Real> diffs( nrVars(), INFINITY );
+    Real maxDiff = INFINITY;
 
-    size_t t=0;
-    for( t=0; t < (props.maxiter*pass_size) && diffs.maxDiff() > props.tol; t++ ) {
-        // choose random Var i
-        size_t i = (size_t) (nrVars() * rnd_uniform());
+    vector<size_t> update_seq;
+    update_seq.reserve( nrVars() );
+    for( size_t i = 0; i < nrVars(); i++ )
+        update_seq.push_back( i );
 
-        Factor jan;
-        Factor piet;
-        foreach( const Neighbor &I, nbV(i) ) {
-            Factor henk;
-            foreach( const Neighbor &j, nbF(I) ) // for all j in I \ i
-                if( j != i )
-                    henk *= _beliefs[j];
-            piet = factor(I).log(true);
-            piet *= henk;
-            piet = piet.marginal(var(i), false);
-            piet = piet.exp();
-            jan *= piet;
-        }
+    // do several passes over the network until maximum number of iterations has
+    // been reached or until the maximum belief difference is smaller than tolerance
+    for( _iters = 0; _iters < props.maxiter && maxDiff > props.tol; _iters++ ) {
+        random_shuffle( update_seq.begin(), update_seq.end() );
 
-        jan.normalize();
+        foreach( const size_t &i, update_seq ) {
+            Factor nb = calcNewBelief( i );
 
-        if( jan.hasNaNs() ) {
-            cerr << Name << "::run():  ERROR: jan has NaNs!" << endl;
-            return 1.0;
-        }
+            if( nb.hasNaNs() ) {
+                cerr << Name << "::run():  ERROR: new belief of variable " << var(i) << " has NaNs!" << endl;
+                return 1.0;
+            }
 
-        if( props.damping != 0.0 )
-            jan = (jan^(1.0 - props.damping)) * (_beliefs[i]^props.damping);
-        diffs.push( dist( jan, _beliefs[i], Prob::DISTLINF ) );
+            if( props.damping != 0.0 )
+                nb = (nb^(1.0 - props.damping)) * (_beliefs[i]^props.damping);
+            diffs[i] = dist( nb, _beliefs[i], Prob::DISTLINF );
+
+            _beliefs[i] = nb;
+        }
+        maxDiff = max( diffs );
 
-        _beliefs[i] = jan;
+        if( props.verbose >= 3 )
+            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
-    _iters = t / pass_size;
-    if( diffs.maxDiff() > _maxdiff )
-        _maxdiff = diffs.maxDiff();
+    if( maxDiff > _maxdiff )
+        _maxdiff = maxDiff;
 
     if( props.verbose >= 1 ) {
-        if( diffs.maxDiff() > props.tol ) {
+        if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-            cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+            cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
-            if( props.verbose >= 2 )
+            if( props.verbose >= 3 )
                 cerr << Name << "::run:  ";
-            cerr << "converged in " << t / pass_size << " passes (" << toc() - tic << " seconds)." << endl;
+            cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
         }
     }
 
-    return diffs.maxDiff();
+    return maxDiff;
 }
 
 
index fde5f0f..8bfe9c1 100644 (file)
@@ -521,7 +521,6 @@ Real MR::run() {
             cerr << "Starting " << identify() << "...";
 
         double tic = toc();
-//        Diffs diffs(nrVars(), 1.0);
 
         M.resize(N);
         for(size_t i=0; i<N; i++)
index a914223..989d37e 100644 (file)
@@ -372,7 +372,8 @@ Real TreeEP::run() {
         cerr << endl;
 
     double tic = toc();
-    Diffs diffs(nrVars(), 1.0);
+    vector<Real> diffs( nrVars(), INFINITY );
+    Real maxDiff = INFINITY;
 
     vector<Factor> old_beliefs;
     old_beliefs.reserve( nrVars() );
@@ -381,7 +382,7 @@ Real TreeEP::run() {
 
     // do several passes over the network until maximum number of iterations has
     // been reached or until the maximum belief difference is smaller than tolerance
-    for( _iters=0; _iters < props.maxiter && diffs.maxDiff() > props.tol; _iters++ ) {
+    for( _iters=0; _iters < props.maxiter && maxDiff > props.tol; _iters++ ) {
         for( size_t I = 0; I < nrFactors(); I++ )
             if( offtree(I) ) {
                 _Q[I].InvertAndMultiply( Qa, Qb );
@@ -392,22 +393,23 @@ Real TreeEP::run() {
         // calculate new beliefs and compare with old ones
         for( size_t i = 0; i < nrVars(); i++ ) {
             Factor nb( belief(var(i)) );
-            diffs.push( dist( nb, old_beliefs[i], Prob::DISTLINF ) );
+            diffs[i] = dist( nb, old_beliefs[i], Prob::DISTLINF );
             old_beliefs[i] = nb;
         }
+        maxDiff = max( diffs );
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << diffs.maxDiff() << " after " << _iters+1 << " passes" << endl;
+            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
-    if( diffs.maxDiff() > _maxdiff )
-        _maxdiff = diffs.maxDiff();
+    if( maxDiff > _maxdiff )
+        _maxdiff = maxDiff;
 
     if( props.verbose >= 1 ) {
-        if( diffs.maxDiff() > props.tol ) {
+        if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-            cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << diffs.maxDiff() << endl;
+            cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 3 )
                 cerr << Name << "::run:  ";
@@ -415,7 +417,7 @@ Real TreeEP::run() {
         }
     }
 
-    return diffs.maxDiff();
+    return maxDiff;
 }
 
 
index d2a67b7..e72b0b3 100644 (file)
@@ -48,6 +48,13 @@ double log1p( double x ) {
 namespace dai {
 
 
+Real max( std::vector<Real> v ) {
+    if( v.size() == 0 )
+        return INFINITY;
+    else
+        return *std::max_element( v.begin(), v.end() );
+}
+
 // Returns user+system time in seconds
 double toc() {
 #ifdef WINDOWS
index ae8f3bb..ff968e5 100644 (file)
@@ -612,7 +612,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             inf     
 # ({x0}, (3.859e-01, 6.141e-01))
 # ({x1}, (5.569e-01, 4.431e-01))
 # ({x2}, (4.719e-01, 5.281e-01))
@@ -629,7 +629,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             inf     
 # ({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_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             inf     
 # ({x0}, (3.558e-01, 6.442e-01))
 # ({x1}, (5.320e-01, 4.680e-01))
 # ({x2}, (4.581e-01, 5.419e-01))
@@ -731,7 +731,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             inf     
 # ({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_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             inf     
 # ({x0}, (3.525e-01, 6.475e-01))
 # ({x1}, (5.395e-01, 4.605e-01))
 # ({x2}, (4.567e-01, 5.433e-01))
@@ -833,7 +833,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             inf     
 # ({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 @@ BBP                                         7.049e-04       2.319e-04       +7.075e-05      1.000e-09
 # ({x13}, (5.351e-01, 4.649e-01))
 # ({x14}, (6.284e-01, 3.716e-01))
 # ({x15}, (1.355e-01, 8.645e-01))
-CBP                                            2.160e-05       1.082e-05       +1.720e-06      1.000e-09       
+CBP                                            3.294e-06       8.863e-07       +2.066e-07      1.000e-09       
 # ({x0}, (3.888e-01, 6.112e-01))
 # ({x1}, (5.556e-01, 4.444e-01))
 # ({x2}, (4.587e-01, 5.413e-01))
@@ -912,7 +912,7 @@ CBP                                         2.160e-05       1.082e-05       +1.720e-06      1.000e-09
 # ({x7}, (2.327e-01, 7.673e-01))
 # ({x8}, (2.171e-01, 7.829e-01))
 # ({x9}, (2.052e-01, 7.948e-01))
-# ({x10}, (7.664e-01, 2.336e-01))
+# ({x10}, (7.665e-01, 2.335e-01))
 # ({x11}, (1.217e-01, 8.783e-01))
 # ({x12}, (4.214e-01, 5.786e-01))
 # ({x13}, (5.348e-01, 4.652e-01))