Added BETHE method for GBP/HAK cluster choice
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 13 Jan 2010 10:57:03 +0000 (11:57 +0100)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 13 Jan 2010 10:57:03 +0000 (11:57 +0100)
13 files changed:
ChangeLog
include/dai/bipgraph.h
include/dai/fbp.h
include/dai/hak.h
include/dai/regiongraph.h
src/hak.cpp
src/regiongraph.cpp
src/weightedgraph.cpp
swig/dai.i
tests/aliases.conf
tests/testall
tests/testall.bat
tests/testfast.out

index e678e04..1e3ea1a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* Added BETHE method for GBP/HAK cluster choice
 * Renamed some functions of BipartiteGraph:
     add1() -> addNode1()
     erase1() -> eraseNode1()
index 62f1f57..815b43e 100644 (file)
@@ -42,6 +42,7 @@ namespace dai {
  *  Thus, each node has an associated variable of type BipartiteGraph::Neighbors, which is a vector of
  *  Neighbor structures, describing its neighboring nodes of the other type.
  *  \idea Cache second-order neighborhoods in BipartiteGraph.
+ *  \todo Check whether BGL isConnected improves performance.
  */
 class BipartiteGraph {
     public:
index dd0ee15..0fdc7a1 100644 (file)
@@ -48,7 +48,6 @@ namespace dai {
  *    \f[ b_I(x_I) \propto f_I(x_I)^{1/c_I} \prod_{j \in N_I} m_{I\to j}^{1-1/c_I} \prod_{J\in N_j\setminus\{I\}} m_{J\to j} \f]
  *
  *  \todo Add nice way to set scale parameters
- *
  *  \author Frederik Eaton
  */
 class FBP : public BP {
index 9069cdf..9aa8bb0 100644 (file)
@@ -11,7 +11,6 @@
 
 /// \file
 /// \brief Defines class HAK, which implements a variant of Generalized Belief Propagation.
-/// \todo Implement Bethe approximation as a standard region graph choice in HAK.
 /// \idea Implement more general region graphs and corresponding Generalized Belief Propagation updates as described in [\ref YFW05].
 
 
@@ -53,8 +52,9 @@ class HAK : public DAIAlgRG {
              *   - MIN minimal clusters, i.e., one outer region for each maximal factor
              *   - DELTA one outer region for each variable and its Markov blanket
              *   - LOOP one cluster for each loop of length at most \a Properties::loopdepth, and in addition one cluster for each maximal factor
+             *   - BETHE Bethe approximation (one outer region for each maximal factor, inner regions are single variables)
              */
-            DAI_ENUM(ClustersType,MIN,DELTA,LOOP);
+            DAI_ENUM(ClustersType,MIN,BETHE,DELTA,LOOP);
 
             /// Enumeration of possible message initializations
             DAI_ENUM(InitType,UNIFORM,RANDOM);
index d1fd888..2c580a5 100644 (file)
@@ -37,7 +37,7 @@ class Region : public VarSet {
         Region() : VarSet(), _c(1.0) {}
 
         /// Construct from a set of variables and a counting number
-        Region(const VarSet &x, Real c) : VarSet(x), _c(c) {}
+        Region( const VarSet &x, Real c ) : VarSet(x), _c(c) {}
 
         /// Returns constant reference to counting number
         const Real & c() const { return _c; }
@@ -111,6 +111,19 @@ class RegionGraph : public FactorGraph {
         /// Constructs a region graph from a factor graph, a vector of outer regions, a vector of inner regions and a vector of edges
         /** The counting numbers for the outer regions are set to 1.
          */
+        RegionGraph( const FactorGraph &fg, const std::vector<VarSet> &ors, const std::vector<Region> &irs, const std::vector<std::pair<size_t,size_t> > &edges ) : FactorGraph(), G(), ORs(), IRs(), fac2OR() {
+            construct( fg, ors, irs, edges );
+
+            // Check counting numbers
+#ifdef DAI_DEBUG
+            checkCountingNumbers();
+#endif
+        }
+
+        /// Constructs a region graph from a factor graph, a vector of outer regions, a vector of inner regions and a vector of edges
+        /** \note The counting numbers for the outer regions need to be 1.
+         *  \deprecated Please use dai::RegionGraph::RegionGraph( const FactorGraph &, const std::vector<VarSet> &, const std::vector<Region> &, const std::vector<std::pair<size_t,size_t> > & ) instead.
+         */
         RegionGraph( const FactorGraph &fg, const std::vector<Region> &ors, const std::vector<Region> &irs, const std::vector<std::pair<size_t,size_t> > &edges );
 
         /// Constructs a region graph from a factor graph and a vector of outer clusters (CVM style)
@@ -125,7 +138,14 @@ class RegionGraph : public FactorGraph {
          *  subset of the variables in the outer region. The counting numbers for the inner
          *  regions are calculated by calcCountingNumbers() and satisfy the Moebius formula.
          */
-        RegionGraph( const FactorGraph &fg, const std::vector<VarSet> &cl );
+        RegionGraph( const FactorGraph &fg, const std::vector<VarSet> &cl ) : FactorGraph(), G(), ORs(), IRs(), fac2OR() {
+            constructCVM( fg, cl );
+
+            // Check counting numbers
+#ifdef DAI_DEBUG
+            checkCountingNumbers();
+#endif
+        }
 
         /// Clone \c *this (virtual copy constructor)
         virtual RegionGraph* clone() const { return new RegionGraph(*this); }
@@ -209,6 +229,13 @@ class RegionGraph : public FactorGraph {
         /// Writes a RegionGraph to an output stream
         friend std::ostream & operator << ( std::ostream & os, const RegionGraph & rg );
     //@}
+
+    protected:
+        /// Helper function for constructors
+        void construct( const FactorGraph &fg, const std::vector<VarSet> &ors, const std::vector<Region> &irs, const std::vector<std::pair<size_t,size_t> > &edges );
+
+        /// Helper function for constructors (CVM style)
+        void constructCVM( const FactorGraph &fg, const std::vector<VarSet> &cl );
 };
 
 
index 6ac23ce..81698dc 100644 (file)
@@ -155,9 +155,12 @@ HAK::HAK(const FactorGraph & fg, const PropertySet &opts) : DAIAlgRG(), _Qa(), _
     vector<VarSet> cl;
     if( props.clusters == Properties::ClustersType::MIN ) {
         cl = fg.Cliques();
+        constructCVM( fg, cl );
     } else if( props.clusters == Properties::ClustersType::DELTA ) {
+        cl.reserve( fg.nrVars() );
         for( size_t i = 0; i < fg.nrVars(); i++ )
-            cl.push_back(fg.Delta(i));
+            cl.push_back( fg.Delta(i) );
+        constructCVM( fg, cl );
     } else if( props.clusters == Properties::ClustersType::LOOP ) {
         cl = fg.Cliques();
         set<VarSet> scl;
@@ -173,11 +176,36 @@ HAK::HAK(const FactorGraph & fg, const PropertySet &opts) : DAIAlgRG(), _Qa(), _
             for( vector<VarSet>::const_iterator cli = cl.begin(); cli != cl.end(); cli++ )
                 cerr << *cli << endl;
         }
+        constructCVM( fg, cl );
+    } else if( props.clusters == Properties::ClustersType::BETHE ) {
+        // build outer regions (the cliques)
+        cl = fg.Cliques();
+        size_t nrEdges = 0;
+        for( size_t c = 0; c < cl.size(); c++ )
+            nrEdges += cl[c].size();
+
+        // build inner regions (single variables)
+        vector<Region> irs;
+        irs.reserve( fg.nrVars() );
+        for( size_t i = 0; i < fg.nrVars(); i++ )
+            irs.push_back( Region( fg.var(i), 1.0 ) );
+
+        // build edges (an outer and inner region are connected if the outer region contains the inner one)
+        // and calculate counting number for inner regions
+        vector<std::pair<size_t, size_t> > edges;
+        edges.reserve( nrEdges );
+        for( size_t c = 0; c < cl.size(); c++ )
+            for( size_t i = 0; i < irs.size(); i++ )
+                if( cl[c] >> irs[i] ) {
+                    edges.push_back( make_pair( c, i ) );
+                    irs[i].c() -= 1.0;
+                }
+
+        // build region graph
+        RegionGraph::construct( fg, cl, irs, edges );
     } else
         DAI_THROW(UNKNOWN_ENUM_VALUE);
 
-    RegionGraph rg(fg,cl);
-    RegionGraph::operator=(rg);
     construct();
 
     if( props.verbose >= 3 )
index 5b1ef7e..6df320e 100644 (file)
@@ -23,14 +23,22 @@ namespace dai {
 using namespace std;
 
 
-RegionGraph::RegionGraph( const FactorGraph &fg, const std::vector<Region> &ors, const std::vector<Region> &irs, const std::vector<std::pair<size_t,size_t> > &edges) : FactorGraph(fg), G(), ORs(), IRs(irs), fac2OR() {
-    // Copy outer regions (giving them counting number 1.0)
+void RegionGraph::construct( const FactorGraph &fg, const std::vector<VarSet> &ors, const std::vector<Region> &irs, const std::vector<std::pair<size_t,size_t> > &edges ) {
+    // Copy factor graph structure
+    FactorGraph::operator=( fg );
+
+    // Copy inner regions
+    IRs = irs;
+
+    // Construct outer regions (giving them counting number 1.0)
+    ORs.clear();
     ORs.reserve( ors.size() );
-    for( vector<Region>::const_iterator alpha = ors.begin(); alpha != ors.end(); alpha++ )
-        ORs.push_back( FRegion(Factor(*alpha, 1.0), 1.0) );
+    foreach( const VarSet &alpha, ors )
+        ORs.push_back( FRegion(Factor(alpha, 1.0), 1.0) );
 
     // For each factor, find an outer region that subsumes that factor.
     // Then, multiply the outer region with that factor.
+    fac2OR.clear();
     fac2OR.reserve( nrFactors() );
     for( size_t I = 0; I < nrFactors(); I++ ) {
         size_t alpha;
@@ -45,39 +53,14 @@ RegionGraph::RegionGraph( const FactorGraph &fg, const std::vector<Region> &ors,
 
     // Create bipartite graph
     G.construct( nrORs(), nrIRs(), edges.begin(), edges.end() );
-
-    // Check counting numbers
-#ifdef DAI_DEBUG
-    checkCountingNumbers();
-#endif
 }
 
 
-// CVM style
-RegionGraph::RegionGraph( const FactorGraph &fg, const std::vector<VarSet> &cl ) : FactorGraph(fg), G(), ORs(), IRs(), fac2OR() {
+void RegionGraph::constructCVM( const FactorGraph &fg, const std::vector<VarSet> &cl ) {
     // Retain only maximal clusters
     ClusterGraph cg( cl );
     cg.eraseNonMaximal();
 
-    // Create outer regions, giving them counting number 1.0
-    ORs.reserve( cg.size() );
-    foreach( const VarSet &ns, cg.clusters )
-        ORs.push_back( FRegion(Factor(ns, 1.0), 1.0) );
-
-    // For each factor, find an outer regions that subsumes that factor.
-    // Then, multiply the outer region with that factor.
-    fac2OR.reserve( nrFactors() );
-    for( size_t I = 0; I < nrFactors(); I++ ) {
-        size_t alpha;
-        for( alpha = 0; alpha < nrORs(); alpha++ )
-            if( OR(alpha).vars() >> factor(I).vars() ) {
-                fac2OR.push_back( alpha );
-                break;
-            }
-        DAI_ASSERT( alpha != nrORs() );
-    }
-    RecomputeORs();
-
     // Create inner regions - first pass
     set<VarSet> betas;
     for( size_t alpha = 0; alpha < cg.clusters.size(); alpha++ )
@@ -100,25 +83,35 @@ RegionGraph::RegionGraph( const FactorGraph &fg, const std::vector<VarSet> &cl )
         betas.insert(new_betas.begin(), new_betas.end());
     } while( new_betas.size() );
 
-    // Create inner regions - store them in the bipartite graph
-    IRs.reserve( betas.size() );
+    // Create inner regions - final phase
+    vector<Region> irs;
+    irs.reserve( betas.size() );
     for( set<VarSet>::const_iterator beta = betas.begin(); beta != betas.end(); beta++ )
-        IRs.push_back( Region(*beta,0.0) );
+        irs.push_back( Region(*beta,0.0) );
 
     // Create edges
     vector<pair<size_t,size_t> > edges;
-    for( size_t beta = 0; beta < nrIRs(); beta++ ) {
-        for( size_t alpha = 0; alpha < nrORs(); alpha++ ) {
-            if( OR(alpha).vars() >> IR(beta) )
+    for( size_t beta = 0; beta < irs.size(); beta++ )
+        for( size_t alpha = 0; alpha < cg.clusters.size(); alpha++ )
+            if( cg.clusters[alpha] >> irs[beta] )
                 edges.push_back( pair<size_t,size_t>(alpha,beta) );
-        }
-    }
 
-    // Create bipartite graph
-    G.construct( nrORs(), nrIRs(), edges.begin(), edges.end() );
+    // Construct region graph
+    construct( fg, cg.clusters, irs, edges );
 
     // Calculate counting numbers
     calcCountingNumbers();
+}
+
+
+RegionGraph::RegionGraph( const FactorGraph &fg, const std::vector<Region> &ors, const std::vector<Region> &irs, const std::vector<std::pair<size_t,size_t> > &edges ) {
+    vector<VarSet> ors_alt;
+    ors_alt.reserve( ors.size() );
+    for( size_t alpha = 0; alpha < ors.size(); alpha++ ) {
+        ors_alt.push_back( ors[alpha] );
+        DAI_ASSERT( ors[alpha].c() == 1.0 );
+    }
+    construct( fg, ors_alt, irs, edges );
 
     // Check counting numbers
 #ifdef DAI_DEBUG
index 1a0ccfb..6f199c7 100644 (file)
@@ -53,7 +53,6 @@ RootedTree::RootedTree( const Graph &T, size_t Root ) {
                 } else
                     e++;
             }
-
     }
 }
 
index 058250d..84e1ffe 100644 (file)
@@ -36,6 +36,9 @@
 %ignore dai::TProb::operator[];
 %ignore dai::TFactor::operator[];
 
+%ignore dai::Var::label() const;
+%ignore dai::Var::states() const;
+
 %include "../include/dai/util.h"
 %include "../include/dai/var.h"
 %include "../include/dai/smallset.h"
@@ -57,8 +60,8 @@
 %extend dai::TFactor<dai::Real> {
         inline dai::Real __getitem__(int i) const {return (*self)[i];} /* for python */
         inline void __setitem__(int i,dai::Real d) {(*self)[i] = d;}   /* for python */
-        inline dai::Real __paren(int i) const {return (*self)[i];}     /* for octave */
-        inline void __paren_asgn(int i,dai::Real d) {(*self)[i] = d;}  /* for octave */
+        inline dai::Real __paren__(int i) const {return (*self)[i];}     /* for octave */
+        inline void __paren_asgn__(int i,dai::Real d) {(*self)[i] = d;}  /* for octave */
 };
 
 %template(Factor) dai::TFactor<dai::Real>;
index 3ee5681..ff7c8b1 100644 (file)
@@ -55,6 +55,7 @@ MR_EXACT_LINEAR:                MR[updates=LINEAR,inits=EXACT,verbose=0,tol=1e-9
 # --- HAK ---------------------
 
 GBP_MIN:                        HAK[doubleloop=0,clusters=MIN,init=UNIFORM,tol=1e-9,maxiter=10000,verbose=0]
+GBP_BETHE:                      HAK[doubleloop=0,clusters=BETHE,init=UNIFORM,tol=1e-9,maxiter=10000,verbose=0]
 GBP_DELTA:                      HAK[doubleloop=0,clusters=DELTA,init=UNIFORM,tol=1e-9,maxiter=10000,verbose=0]
 GBP_LOOP3:                      HAK[doubleloop=0,clusters=LOOP,init=UNIFORM,loopdepth=3,tol=1e-9,maxiter=10000,verbose=0]
 GBP_LOOP4:                      HAK[doubleloop=0,clusters=LOOP,init=UNIFORM,loopdepth=4,tol=1e-9,maxiter=10000,verbose=0]
@@ -64,6 +65,7 @@ GBP_LOOP7:                      HAK[doubleloop=0,clusters=LOOP,init=UNIFORM,loop
 GBP_LOOP8:                      HAK[doubleloop=0,clusters=LOOP,init=UNIFORM,loopdepth=8,tol=1e-9,maxiter=10000,verbose=0]
 
 HAK_MIN:                        HAK[doubleloop=1,clusters=MIN,init=UNIFORM,tol=1e-9,maxiter=10000,verbose=0]
+HAK_BETHE:                      HAK[doubleloop=1,clusters=BETHE,init=UNIFORM,tol=1e-9,maxiter=10000,verbose=0]
 HAK_DELTA:                      HAK[doubleloop=1,clusters=DELTA,init=UNIFORM,tol=1e-9,maxiter=10000,verbose=0]
 HAK_LOOP3:                      HAK[doubleloop=1,clusters=LOOP,init=UNIFORM,loopdepth=3,tol=1e-9,maxiter=10000,verbose=0]
 HAK_LOOP4:                      HAK[doubleloop=1,clusters=LOOP,init=UNIFORM,loopdepth=4,tol=1e-9,maxiter=10000,verbose=0]
index 2324a94..5aac2d2 100755 (executable)
@@ -1,2 +1,2 @@
 #!/bin/bash
-./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
+./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_BETHE GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_BETHE 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 efc79de..a7ce8b8 100755 (executable)
@@ -1 +1 @@
-@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
+@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_BETHE GBP_DELTA GBP_LOOP3 GBP_LOOP4 GBP_LOOP5 GBP_LOOP6 GBP_LOOP7 HAK_MIN HAK_BETHE 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 30c081f..46a5013 100644 (file)
@@ -255,6 +255,23 @@ GBP_MIN                                    9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
+GBP_BETHE                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+# ({x0}, (4.233e-01, 5.767e-01))
+# ({x1}, (5.422e-01, 4.578e-01))
+# ({x2}, (4.662e-01, 5.338e-01))
+# ({x3}, (5.424e-01, 4.576e-01))
+# ({x4}, (6.042e-01, 3.958e-01))
+# ({x5}, (1.845e-01, 8.155e-01))
+# ({x6}, (8.203e-01, 1.797e-01))
+# ({x7}, (2.292e-01, 7.708e-01))
+# ({x8}, (3.119e-01, 6.881e-01))
+# ({x9}, (2.975e-01, 7.025e-01))
+# ({x10}, (7.268e-01, 2.732e-01))
+# ({x11}, (1.485e-01, 8.515e-01))
+# ({x12}, (4.512e-01, 5.488e-01))
+# ({x13}, (5.266e-01, 4.734e-01))
+# ({x14}, (6.033e-01, 3.967e-01))
+# ({x15}, (1.558e-01, 8.442e-01))
 GBP_DELTA                                      6.291e-01       3.350e-01       -3.303e-01      1.000e-09       
 # ({x0}, (0.000e+00, 1.000e+00))
 # ({x1}, (1.000e+00, 0.000e+00))
@@ -374,6 +391,23 @@ HAK_MIN                                    9.483e-02       3.078e-02       +1.737e-02      1.000e-09
 # ({x13}, (5.266e-01, 4.734e-01))
 # ({x14}, (6.033e-01, 3.967e-01))
 # ({x15}, (1.558e-01, 8.442e-01))
+HAK_BETHE                                      9.483e-02       3.078e-02       +1.737e-02      1.000e-09       
+# ({x0}, (4.233e-01, 5.767e-01))
+# ({x1}, (5.422e-01, 4.578e-01))
+# ({x2}, (4.662e-01, 5.338e-01))
+# ({x3}, (5.424e-01, 4.576e-01))
+# ({x4}, (6.042e-01, 3.958e-01))
+# ({x5}, (1.845e-01, 8.155e-01))
+# ({x6}, (8.203e-01, 1.797e-01))
+# ({x7}, (2.292e-01, 7.708e-01))
+# ({x8}, (3.119e-01, 6.881e-01))
+# ({x9}, (2.975e-01, 7.025e-01))
+# ({x10}, (7.268e-01, 2.732e-01))
+# ({x11}, (1.485e-01, 8.515e-01))
+# ({x12}, (4.512e-01, 5.488e-01))
+# ({x13}, (5.266e-01, 4.734e-01))
+# ({x14}, (6.033e-01, 3.967e-01))
+# ({x15}, (1.558e-01, 8.442e-01))
 HAK_DELTA                                      3.684e-01       1.892e-01       +9.675e-01      1.000e-09       
 # ({x0}, (4.902e-01, 5.098e-01))
 # ({x1}, (5.098e-01, 4.902e-01))