Fixed bug in HAK and changed tests/testdai "marginals" option
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 30 Dec 2009 11:49:45 +0000 (12:49 +0100)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 30 Dec 2009 11:49:45 +0000 (12:49 +0100)
14 files changed:
ChangeLog
include/dai/daialg.h
include/dai/exceptions.h
src/bp.cpp
src/exactinf.cpp
src/exceptions.cpp
src/gibbs.cpp
src/hak.cpp
src/jtree.cpp
src/mf.cpp
tests/testall
tests/testall.bat
tests/testdai.cpp
tests/testfast.out

index 17b91bf..749f22a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+* Fixed bug in HAK for trivial region graphs (with only one outer region
+  and no inner regions), reported by Alejandro Lage.
+* tests/testdai option "marginals" now has three possible values: NONE
+  outputs no marginals, VAR only variable marginals, and ALL outputs all
+  marginals calculated by the algorithm.
 * [Frederik Eaton] Added Fractional Belief Propagation
 * [Alexander Gerhard Schwing] Fixed error in BP that occured with damping
   and using log-domain updates
index 9a128a8..41da1dc 100644 (file)
@@ -83,7 +83,8 @@ class InfAlg {
 
         /// Returns the (approximate) marginal probability distribution of a set of variables.
         /** \note Before this method is called, run() should have been called.
-         *  \throw NOT_IMPLEMENTED if not implemented/supported
+         *  \throw NOT_IMPLEMENTED if not implemented/supported.
+         *  \throw BELIEF_NOT_AVAILABLE if the requested belief cannot be calculated with this algorithm.
          */
         virtual Factor belief( const VarSet &vs ) const = 0;
 
index 7961d2f..df75624 100644 (file)
@@ -79,6 +79,7 @@ class Exception : public std::runtime_error {
                    ASSERTION_FAILED,
                    IMPOSSIBLE_TYPECAST,
                    OBJECT_NOT_FOUND,
+                   BELIEF_NOT_AVAILABLE,
                    UNKNOWN_ENUM_VALUE,
                    UNKNOWN_DAI_ALGORITHM,
                    UNKNOWN_PARAMETER_ESTIMATION_METHOD,
index 7020726..8c6c760 100644 (file)
@@ -434,7 +434,8 @@ Factor BP::belief( const VarSet &ns ) const {
         for( I = 0; I < nrFactors(); I++ )
             if( factor(I).vars() >> ns )
                 break;
-        DAI_ASSERT( I != nrFactors() );
+        if( I == nrFactors() )
+            DAI_THROW(BELIEF_NOT_AVAILABLE);
         return beliefF(I).marginal(ns);
     }
 }
index f4a60d3..ffa2e92 100644 (file)
@@ -114,7 +114,8 @@ Factor ExactInf::belief( const VarSet &ns ) const {
         for( I = 0; I < nrFactors(); I++ )
             if( factor(I).vars() >> ns )
                 break;
-        DAI_ASSERT( I != nrFactors() );
+        if( I == nrFactors() )
+            DAI_THROW(BELIEF_NOT_AVAILABLE);
         return beliefF(I).marginal(ns);
     }
 }
index f3d7c02..6a24138 100644 (file)
@@ -20,6 +20,7 @@ namespace dai {
         "Assertion failed",
         "Impossible typecast",
         "Requested object not found",
+        "Requested belief not available",
         "Unknown ENUM value",
         "Unknown DAI algorithm",
         "Unrecognized parameter estimation method",
index e4bf112..854fbb3 100644 (file)
@@ -228,7 +228,8 @@ Factor Gibbs::belief( const VarSet &ns ) const {
         for( I = 0; I < nrFactors(); I++ )
             if( factor(I).vars() >> ns )
                 break;
-        DAI_ASSERT( I != nrFactors() );
+        if( I == nrFactors() )
+            DAI_THROW(BELIEF_NOT_AVAILABLE);
         return beliefF(I).marginal(ns);
     }
 }
index 3d91cbb..309e051 100644 (file)
@@ -105,7 +105,7 @@ void HAK::construct() {
     _Qa.clear();
     _Qa.reserve(nrORs());
     for( size_t alpha = 0; alpha < nrORs(); alpha++ )
-        _Qa.push_back( Factor( OR(alpha).vars() ) );
+        _Qa.push_back( Factor( OR(alpha) ) );
 
     // Create inner beliefs
     _Qb.clear();
@@ -191,12 +191,14 @@ string HAK::identify() const {
 
 
 void HAK::init( const VarSet &ns ) {
-    for( vector<Factor>::iterator alpha = _Qa.begin(); alpha != _Qa.end(); alpha++ )
-        if( alpha->vars().intersects( ns ) ) {
+    for( size_t alpha = 0; alpha < nrORs(); alpha++ )
+        if( _Qa[alpha].vars().intersects( ns ) ) {
             if( props.init == Properties::InitType::UNIFORM )
-                alpha->fill( 1.0 / alpha->states() );
+                _Qa[alpha].setUniform();
             else
-                alpha->randomize();
+                _Qa[alpha].randomize();
+            _Qa[alpha] *= OR(alpha);
+            _Qa[alpha].normalize();
         }
 
     for( size_t beta = 0; beta < nrIRs(); beta++ )
@@ -220,24 +222,27 @@ void HAK::init( const VarSet &ns ) {
 
 
 void HAK::init() {
-    for( vector<Factor>::iterator alpha = _Qa.begin(); alpha != _Qa.end(); alpha++ )
+    for( size_t alpha = 0; alpha < nrORs(); alpha++ ) {
         if( props.init == Properties::InitType::UNIFORM )
-            alpha->fill( 1.0 / alpha->states() );
+            _Qa[alpha].setUniform();
         else
-            alpha->randomize();
+            _Qa[alpha].randomize();
+        _Qa[alpha] *= OR(alpha);
+        _Qa[alpha].normalize();
+    }
 
-    for( vector<Factor>::iterator beta = _Qb.begin(); beta != _Qb.end(); beta++ )
+    for( size_t beta = 0; beta < nrIRs(); beta++ )
         if( props.init == Properties::InitType::UNIFORM )
-            beta->fill( 1.0 / beta->states() );
+            _Qb[beta].setUniform();
         else
-            beta->randomize();
+            _Qb[beta].randomize();
 
     for( size_t alpha = 0; alpha < nrORs(); alpha++ )
         foreach( const Neighbor &beta, nbOR(alpha) ) {
             size_t _beta = beta.iter;
             if( props.init == Properties::InitType::UNIFORM ) {
-                muab( alpha, _beta ).fill( 1.0 / muab( alpha, _beta ).states() );
-                muba( alpha, _beta ).fill( 1.0 / muab( alpha, _beta ).states() );
+                muab( alpha, _beta ).setUniform();
+                muba( alpha, _beta ).setUniform();
             } else {
                 muab( alpha, _beta ).randomize();
                 muba( alpha, _beta ).randomize();
@@ -491,7 +496,8 @@ Factor HAK::belief( const VarSet &ns ) const {
         for( alpha = _Qa.begin(); alpha != _Qa.end(); alpha++ )
             if( alpha->vars() >> ns )
                 break;
-        DAI_ASSERT( alpha != _Qa.end() );
+        if( alpha == _Qa.end() )
+            DAI_THROW(BELIEF_NOT_AVAILABLE);
         return( alpha->marginal(ns) );
     }
 }
index 9a0cac9..1c05b5e 100644 (file)
@@ -184,8 +184,11 @@ Factor JTree::belief( const VarSet &vs ) const {
         for( alpha = Qa.begin(); alpha != Qa.end(); alpha++ )
             if( alpha->vars() >> vs )
                 break;
-        DAI_ASSERT( alpha != Qa.end() );
-        return( alpha->marginal(vs) );
+        if( alpha == Qa.end() ) {
+            DAI_THROW(BELIEF_NOT_AVAILABLE);
+            return Factor();
+        } else
+            return( alpha->marginal(vs) );
     }
 }
 
index 7a927a7..213da2b 100644 (file)
@@ -171,7 +171,7 @@ Factor MF::belief (const VarSet &ns) const {
     if( ns.size() == 1 )
         return belief( *(ns.begin()) );
     else {
-        DAI_ASSERT( ns.size() == 1 );
+        DAI_THROW(BELIEF_NOT_AVAILABLE);
         return Factor();
     }
 }
index f42ebf5..2324a94 100755 (executable)
@@ -1,2 +1,2 @@
 #!/bin/bash
-./testdai --report-iters false --report-time false --marginals true --aliases aliases.conf --filename $1 --methods EXACT JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND BBP CBP
+./testdai --report-iters false --report-time false --marginals VAR --aliases aliases.conf --filename $1 --methods EXACT JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND BBP CBP
index ea88958..efc79de 100755 (executable)
@@ -1 +1 @@
-@testdai --report-iters false --report-time false --marginals true --aliases aliases.conf --filename %1 --methods EXACT JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND BBP CBP
+@testdai --report-iters false --report-time false --marginals VAR --aliases aliases.conf --filename %1 --methods EXACT JTREE_HUGIN JTREE_SHSH BP_SEQFIX BP_SEQRND BP_SEQMAX BP_PARALL BP_SEQFIX_LOG BP_SEQRND_LOG BP_SEQMAX_LOG BP_PARALL_LOG MF_SEQRND TREEEP TREEEPWC GBP_MIN GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_DELTA HAK_LOOP3 HAK_LOOP4 HAK_LOOP5 MR_RESPPROP_FULL MR_CLAMPING_FULL MR_EXACT_FULL MR_RESPPROP_LINEAR MR_CLAMPING_LINEAR MR_EXACT_LINEAR LCBP_FULLCAV_SEQFIX LCBP_FULLCAVin_SEQFIX LCBP_FULLCAV_SEQRND LCBP_FULLCAVin_SEQRND LCBP_FULLCAV_NONE LCBP_FULLCAVin_NONE LCBP_PAIRCAV_SEQFIX LCBP_PAIRCAVin_SEQFIX LCBP_PAIRCAV_SEQRND LCBP_PAIRCAVin_SEQRND LCBP_PAIRCAV_NONE LCBP_PAIRCAVin_NONE LCBP_PAIR2CAV_SEQFIX LCBP_PAIR2CAVin_SEQFIX LCBP_PAIR2CAV_SEQRND LCBP_PAIR2CAVin_SEQRND LCBP_PAIR2CAV_NONE LCBP_PAIR2CAVin_NONE LCBP_UNICAV_SEQFIX LCBP_UNICAV_SEQRND BBP CBP
index 1f2b59f..b43adda 100644 (file)
@@ -33,7 +33,8 @@ class TestDAI {
         vector<Real>    err;
 
     public:
-        vector<Factor>  q;
+        vector<Factor>  varmargs;
+        vector<Factor>  marginals;
         Real            logZ;
         Real            maxdiff;
         double          time;
@@ -42,14 +43,14 @@ class TestDAI {
         bool            has_maxdiff;
         bool            has_iters;
 
-        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), err(), q(), logZ(0.0), maxdiff(0.0), time(0), iters(0U), has_logZ(false), has_maxdiff(false), has_iters(false) {
+        TestDAI( const FactorGraph &fg, const string &_name, const PropertySet &opts ) : obj(NULL), name(_name), err(), varmargs(), marginals(), logZ(0.0), maxdiff(0.0), time(0), iters(0U), has_logZ(false), has_maxdiff(false), has_iters(false) {
             double tic = toc();
             if( name == "LDPC" ) {
                 Prob zero(2,0.0);
                 zero[0] = 1.0;
-                q.clear();
                 for( size_t i = 0; i < fg.nrVars(); i++ )
-                    q.push_back( Factor(Var(i,2), zero) );
+                    varmargs.push_back( Factor(fg.var(i), zero) );
+                marginals = varmargs;
                 logZ = 0.0;
                 maxdiff = 0.0;
                 iters = 1;
@@ -73,13 +74,6 @@ class TestDAI {
                 return "NULL";
         }
 
-        vector<Factor> allBeliefs() {
-            vector<Factor> result;
-            for( size_t i = 0; i < obj->fg().nrVars(); i++ )
-                result.push_back( obj->belief( obj->fg().var(i) ) );
-            return result;
-        }
-
         void doDAI() {
             double tic = toc();
             if( obj != NULL ) {
@@ -117,22 +111,26 @@ class TestDAI {
                         throw;
                 }
 
-                q = allBeliefs();
+                varmargs.clear();
+                for( size_t i = 0; i < obj->fg().nrVars(); i++ )
+                    varmargs.push_back( obj->beliefV( i ) );
+
+                marginals = obj->beliefs();
             };
         }
 
         void calcErrs( const TestDAI &x ) {
             err.clear();
-            err.reserve( q.size() );
-            for( size_t i = 0; i < q.size(); i++ )
-                err.push_back( dist( q[i], x.q[i], Prob::DISTTV ) );
+            err.reserve( varmargs.size() );
+            for( size_t i = 0; i < varmargs.size(); i++ )
+                err.push_back( dist( varmargs[i], x.varmargs[i], Prob::DISTTV ) );
         }
 
         void calcErrs( const vector<Factor> &x ) {
             err.clear();
-            err.reserve( q.size() );
-            for( size_t i = 0; i < q.size(); i++ )
-                err.push_back( dist( q[i], x[i], Prob::DISTTV ) );
+            err.reserve( varmargs.size() );
+            for( size_t i = 0; i < varmargs.size(); i++ )
+                err.push_back( dist( varmargs[i], x[i], Prob::DISTTV ) );
         }
 
         Real maxErr() {
@@ -201,6 +199,9 @@ Real clipReal( Real x, Real minabs ) {
 }
 
 
+DAI_ENUM(MarginalsOutputType,NONE,VAR,ALL);
+
+
 int main( int argc, char *argv[] ) {
     string filename;
     string aliases;
@@ -208,7 +209,7 @@ int main( int argc, char *argv[] ) {
     Real tol;
     size_t maxiter;
     size_t verbose;
-    bool marginals = false;
+    MarginalsOutputType marginals;
     bool report_iters = true;
     bool report_time = true;
 
@@ -225,7 +226,7 @@ int main( int argc, char *argv[] ) {
         ("tol", po::value< Real >(&tol), "Override tolerance")
         ("maxiter", po::value< size_t >(&maxiter), "Override maximum number of iterations")
         ("verbose", po::value< size_t >(&verbose), "Override verbosity")
-        ("marginals", po::value< bool >(&marginals), "Output single node marginals?")
+        ("marginals", po::value< MarginalsOutputType >(&marginals), "Output marginals? (NONE,VAR,ALL)")
         ("report-time", po::value< bool >(&report_time), "Report calculation time")
         ("report-iters", po::value< bool >(&report_iters), "Report iterations needed")
     ;
@@ -282,7 +283,7 @@ int main( int argc, char *argv[] ) {
         FactorGraph fg;
         fg.ReadFromFile( filename.c_str() );
 
-        vector<Factor> q0;
+        vector<Factor> varmargs0;
         Real logZ0 = 0.0;
 
         cout.setf( ios_base::scientific );
@@ -310,21 +311,21 @@ int main( int argc, char *argv[] ) {
                 meth.second.Set("maxiter",maxiter);
             if( vm.count("verbose") )
                 meth.second.Set("verbose",verbose);
-            TestDAI piet(fg, meth.first, meth.second );
-            piet.doDAI();
+            TestDAI testdai(fg, meth.first, meth.second );
+            testdai.doDAI();
             if( m == 0 ) {
-                q0 = piet.q;
-                logZ0 = piet.logZ;
+                varmargs0 = testdai.varmargs;
+                logZ0 = testdai.logZ;
             }
-            piet.calcErrs(q0);
+            testdai.calcErrs(varmargs0);
 
             cout.width( 39 );
             cout << left << methods[m] << "\t";
             if( report_time )
-                cout << right << piet.time << "\t";
+                cout << right << testdai.time << "\t";
             if( report_iters ) {
-                if( piet.has_iters ) {
-                    cout << piet.iters << "\t";
+                if( testdai.has_iters ) {
+                    cout << testdai.iters << "\t";
                 } else {
                     cout << "N/A  \t";
                 }
@@ -334,22 +335,22 @@ int main( int argc, char *argv[] ) {
                 cout.setf( ios_base::scientific );
                 cout.precision( 3 );
 
-                Real me = clipReal( piet.maxErr(), 1e-9 );
+                Real me = clipReal( testdai.maxErr(), 1e-9 );
                 cout << me << "\t";
 
-                Real ae = clipReal( piet.avgErr(), 1e-9 );
+                Real ae = clipReal( testdai.avgErr(), 1e-9 );
                 cout << ae << "\t";
 
-                if( piet.has_logZ ) {
+                if( testdai.has_logZ ) {
                     cout.setf( ios::showpos );
-                    Real le = clipReal( piet.logZ / logZ0 - 1.0, 1e-9 );
+                    Real le = clipReal( testdai.logZ / logZ0 - 1.0, 1e-9 );
                     cout << le << "\t";
                     cout.unsetf( ios::showpos );
                 } else
                     cout << "N/A       \t";
 
-                if( piet.has_maxdiff ) {
-                    Real md = clipReal( piet.maxdiff, 1e-9 );
+                if( testdai.has_maxdiff ) {
+                    Real md = clipReal( testdai.maxdiff, 1e-9 );
                     if( isnan( me ) )
                         md = me;
                     if( isnan( ae ) )
@@ -362,9 +363,12 @@ int main( int argc, char *argv[] ) {
             }
             cout << endl;
 
-            if( marginals ) {
-                for( size_t i = 0; i < piet.q.size(); i++ )
-                    cout << "# " << piet.q[i] << endl;
+            if( marginals == MarginalsOutputType::VAR ) {
+                for( size_t i = 0; i < testdai.varmargs.size(); i++ )
+                    cout << "# " << testdai.varmargs[i] << endl;
+            } else if( marginals == MarginalsOutputType::ALL ) {
+                for( size_t I = 0; I < testdai.marginals.size(); I++ )
+                    cout << "# " << testdai.marginals[I] << endl;
             }
         }
 
index 5a7ba58..e21329b 100644 (file)
@@ -289,39 +289,39 @@ GBP_LOOP3                                 9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
-GBP_LOOP4                                      7.893e-01       3.408e-01       -2.745e-01      1.000e-09       
-# ({x0}, (0.000e+00, 1.000e+00))
+GBP_LOOP4                                      7.893e-01       3.569e-01       -4.651e-01      1.000e-09       
+# ({x0}, (4.731e-106, 1.000e+00))
 # ({x1}, (1.000e+00, 0.000e+00))
 # ({x2}, (0.000e+00, 1.000e+00))
-# ({x3}, (1.000e+00, 4.777e-212))
+# ({x3}, (1.000e+00, 2.962e-28))
 # ({x4}, (1.000e+00, 0.000e+00))
-# ({x5}, (1.000e+00, 7.579e-78))
+# ({x5}, (1.000e+00, 0.000e+00))
 # ({x6}, (1.000e+00, 0.000e+00))
 # ({x7}, (0.000e+00, 1.000e+00))
 # ({x8}, (0.000e+00, 1.000e+00))
 # ({x9}, (0.000e+00, 1.000e+00))
 # ({x10}, (1.000e+00, 0.000e+00))
 # ({x11}, (0.000e+00, 1.000e+00))
-# ({x12}, (1.338e-115, 1.000e+00))
-# ({x13}, (1.000e+00, 3.513e-118))
-# ({x14}, (1.000e+00, 0.000e+00))
+# ({x12}, (6.472e-20, 1.000e+00))
+# ({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.408e-01       -2.745e-01      1.000e-09       
-# ({x0}, (0.000e+00, 1.000e+00))
+GBP_LOOP5                                      7.893e-01       3.569e-01       -4.651e-01      1.000e-09       
+# ({x0}, (4.731e-106, 1.000e+00))
 # ({x1}, (1.000e+00, 0.000e+00))
 # ({x2}, (0.000e+00, 1.000e+00))
-# ({x3}, (1.000e+00, 4.777e-212))
+# ({x3}, (1.000e+00, 2.962e-28))
 # ({x4}, (1.000e+00, 0.000e+00))
-# ({x5}, (1.000e+00, 7.579e-78))
+# ({x5}, (1.000e+00, 0.000e+00))
 # ({x6}, (1.000e+00, 0.000e+00))
 # ({x7}, (0.000e+00, 1.000e+00))
 # ({x8}, (0.000e+00, 1.000e+00))
 # ({x9}, (0.000e+00, 1.000e+00))
 # ({x10}, (1.000e+00, 0.000e+00))
 # ({x11}, (0.000e+00, 1.000e+00))
-# ({x12}, (1.338e-115, 1.000e+00))
-# ({x13}, (1.000e+00, 3.513e-118))
-# ({x14}, (1.000e+00, 0.000e+00))
+# ({x12}, (6.472e-20, 1.000e+00))
+# ({x13}, (1.000e+00, 0.000e+00))
+# ({x14}, (0.000e+00, 1.000e+00))
 # ({x15}, (0.000e+00, 1.000e+00))
 GBP_LOOP6                                      7.948e-01       4.458e-01       -4.096e-01      1.000e-09       
 # ({x0}, (1.000e+00, 0.000e+00))