Cbc  2.10.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | Macros | Functions
CglTwomir.hpp File Reference
#include <string>
#include "CglCutGenerator.hpp"
#include "CoinFactorization.hpp"
+ Include dependency graph for CglTwomir.hpp:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  DGG_constraint_t
 
struct  DGG_list_t
 
struct  cutParams
 
struct  DGG_data_t
 
class  CglTwomir
 Twostep MIR Cut Generator Class. More...
 

Macros

#define DGG_isBasic(data, idx)   ((data->info[idx])&1)
 
#define DGG_isInteger(data, idx)   ((data->info[idx] >> 1)&1)
 
#define DGG_isStructural(data, idx)   ((data->info[idx] >> 2)&1)
 
#define DGG_isEqualityConstraint(data, idx)   ((data->info[idx] >> 3)&1)
 
#define DGG_isNonBasicAtUB(data, idx)   ((data->info[idx] >> 4)&1)
 
#define DGG_isNonBasicAtLB(data, idx)   ((data->info[idx] >> 5)&1)
 
#define DGG_isConstraintBoundedAbove(data, idx)   ((data->info[idx] >> 6)&1)
 
#define DGG_isConstraintBoundedBelow(data, idx)   ((data->info[idx] >> 7)&1)
 
#define DGG_setIsBasic(data, idx)   ((data->info[idx]) |= 1)
 
#define DGG_setIsInteger(data, idx)   ((data->info[idx]) |= (1<<1))
 
#define DGG_setIsStructural(data, idx)   ((data->info[idx]) |= (1<<2))
 
#define DGG_setEqualityConstraint(data, idx)   ((data->info[idx]) |= (1<<3))
 
#define DGG_setIsNonBasicAtUB(data, idx)   ((data->info[idx]) |= (1<<4))
 
#define DGG_setIsNonBasicAtLB(data, idx)   ((data->info[idx]) |= (1<<5))
 
#define DGG_setIsConstraintBoundedAbove(data, idx)   ((data->info[idx]) |= (1<<6))
 
#define DGG_setIsConstraintBoundedBelow(data, idx)   ((data->info[idx]) |= (1<<7))
 
#define DGG_DEBUG_DGG   1
 
#define DGG_TRACE_ERRORS   0
 
#define DGG_DISPLAY   0
 
#define DGG_AUTO_CHECK_CUT_OFF_OPTIMAL   1
 
#define DGG_DEFAULT_METHOD   2
 
#define DGG_DEFAULT_TMIN   1
 
#define DGG_DEFAULT_TMAX   1
 
#define DGG_DEFAULT_TAUMIN   2
 
#define DGG_DEFAULT_TAUMAX   6
 
#define DGG_DEFAULT_MAX_CUTS   500
 
#define DGG_DEFAULT_IMPROVEMENT_THRESH   0.001
 
#define DGG_DEFAULT_NBELOW_THRESH   INT_MAX
 
#define DGG_DEFAULT_NROOT_ROUNDS   2
 
#define DGG_DEFAULT_NEGATIVE_SCALED_TWOSTEPS   0
 
#define DGG_DEFAULT_ALPHA_RULE   0
 
#define DGG_DEFAULT_CUT_INC   250
 
#define DGG_DEFAULT_CUT_FORM   0
 
#define DGG_DEFAULT_NICEFY   0
 
#define DGG_DEFAULT_ONLY_DELAYED   0
 
#define DGG_DEFAULT_DELAYED_FREQ   9999999
 
#define DGG_DEFAULT_LPROWS_FREQ   9999999
 
#define DGG_DEFAULT_WHICH_FORMULATION_CUTS   2
 
#define DGG_OSI   0
 
#define DGG_CPX   1
 
#define DGG_QSO   2
 
#define DGG_SOLVER   DGG_OSI
 
#define DGG_DEBUG_SOLVER   0
 
#define DGG_SOLVER_SCREEN_FLAG   0
 
#define DGG_TMIR_CUT   1
 
#define DGG_2STEP_CUT   2
 
#define DGG_ALPHA_MIN_SUM   0
 
#define DGG_ALPHA_RANDOM_01   1
 
#define DGG_ALPHA_RANDOM_COEFF   2
 
#define DGG_ALPHA_ALL   3
 
#define DGG_ALPHA_MAX_STEEP   5
 
#define DGG_MIN_STEEPNESS   1.0e-4
 
#define DGG_MAX_L2NORM   1.0e7
 
#define DGG_NORM_CRITERIA   1
 
#define DGG_GOMORY_THRESH   0.005
 
#define DGG_RHS_THRESH   0.005
 
#define DGG_BOUND_THRESH   1.0e-6
 
#define DGG_EQUALITY_THRESH   1.0e-5
 
#define DGG_SHIFT_THRESH   1.0e-6
 
#define DGG_INTEGRALITY_THRESH   1.0e-10
 
#define CBC_CHECK_CUT
 
#define DGG_MIN_TABLEAU_COEFFICIENT   1.0e-12
 
#define DGG_MIN_RHO   1.0e-7
 
#define DGG_MIN_ALPHA   1.0e-7
 
#define DGG_NULL_SLACK   1.0e-5
 
#define DGG_NICEFY_MIN_ABSVALUE   1.0e-13
 
#define DGG_NICEFY_MIN_FIX   1.0e-7
 
#define DGG_NICEFY_MAX_PADDING   1.0e-6
 
#define DGG_NICEFY_MAX_RATIO   1.0e9
 
#define DGG_IF_EXIT(A, B, REST)   {if(A) {fprintf(stdout, REST);exit(B);}}
 
#define DGG_THROW(A, B)   return(A)
 
#define DGG_CHECKRVAL(A, B)   { if(A) return(B); }
 
#define DGG_CHECKRVAL1(A, B)   { if(A) { rval = B; goto CLEANUP; } }
 
#define DGG_TEST(A, B, REST)   { if(A) return(B);}
 
#define DGG_TEST2(A, B, REST, C)   { DGG_TEST(A,B,REST) }
 
#define DGG_TEST3(A, B, REST, C, D)   { DGG_TEST(A,B,REST) }
 
#define DGG_MIN(a, b)   ( (a<b)?a:b )
 
#define DGG_MAX(a, b)   ( (a>b)?a:b )
 
#define KREM(vht, alpha, tau)   (DGG_MIN( ceil(vht / alpha), tau ) - 1)
 
#define LMIN(vht, d, bht)   (DGG_MIN( floor(d*bht/bht), d))
 
#define ABOV(v)   (v - floor(v))
 
#define QINT(vht, bht, tau)   ( (int)floor( (vht*(tau-1))/bht ) )
 
#define V2I(bht, tau, i)   ( ((i+1)*bht / tau) )
 

Functions

int DGG_is_even (double vht, double bht, int tau, int q)
 
double frac_part (double value)
 
int DGG_is_a_multiple_of_b (double a, double b)
 
int DGG_freeData (DGG_data_t *data)
 
DGG_constraint_tDGG_newConstraint (int max_arrays)
 
void DGG_freeConstraint (DGG_constraint_t *c)
 
DGG_constraint_tDGG_copyConstraint (DGG_constraint_t *c)
 
void DGG_scaleConstraint (DGG_constraint_t *c, int t)
 
void DGG_list_init (DGG_list_t *l)
 
int DGG_list_addcut (DGG_list_t *l, DGG_constraint_t *cut, int ctype, double alpha)
 
void DGG_list_delcut (DGG_list_t *l, int i)
 
void DGG_list_free (DGG_list_t *l)
 
DGG_data_tDGG_getData (const void *solver_ptr)
 
int DGG_transformConstraint (DGG_data_t *data, double **x_out, double **rc_out, char **isint_out, DGG_constraint_t *constraint)
 
int DGG_unTransformConstraint (DGG_data_t *data, DGG_constraint_t *constraint)
 
int DGG_substituteSlacks (const void *solver_ptr, DGG_data_t *data, DGG_constraint_t *cut)
 
int DGG_nicefyConstraint (const void *solver_ptr, DGG_data_t *data, DGG_constraint_t *cut)
 
int DGG_getFormulaConstraint (int row_idx, const void *solver_ptr, DGG_data_t *data, DGG_constraint_t *row)
 
int DGG_getTableauConstraint (int index, const void *solver_ptr, DGG_data_t *data, DGG_constraint_t *tabrow, const int *colIsBasic, const int *rowIsBasic, CoinFactorization &factorization, int mode)
 
DGG_constraint_tDGG_getSlackExpression (const void *solver_ptr, DGG_data_t *data, int row_index)
 
int DGG_generateTabRowCuts (DGG_list_t *list, DGG_data_t *data, const void *solver_ptr)
 
int DGG_generateFormulationCuts (DGG_list_t *list, DGG_data_t *data, const void *solver_ptr, int nrows, CoinThreadRandom &generator)
 
int DGG_generateFormulationCutsFromBase (DGG_constraint_t *base, double slack, DGG_list_t *list, DGG_data_t *data, const void *solver_ptr, CoinThreadRandom &generator)
 
int DGG_generateCutsFromBase (DGG_constraint_t *base, DGG_list_t *list, DGG_data_t *data, const void *solver_ptr)
 
int DGG_buildMir (char *isint, DGG_constraint_t *base, DGG_constraint_t **cut_out)
 
int DGG_build2step (double alpha, char *isint, DGG_constraint_t *base, DGG_constraint_t **cut_out)
 
int DGG_addMirToList (DGG_constraint_t *base, char *isint, double *x, DGG_list_t *list, DGG_data_t *data, DGG_constraint_t *orig_base)
 
int DGG_add2stepToList (DGG_constraint_t *base, char *isint, double *x, double *rc, DGG_list_t *list, DGG_data_t *data, DGG_constraint_t *orig_base)
 
double DGG_cutLHS (DGG_constraint_t *c, double *x)
 
int DGG_isCutDesirable (DGG_constraint_t *c, DGG_data_t *d)
 
int DGG_isConstraintViolated (DGG_data_t *d, DGG_constraint_t *c)
 
int DGG_isBaseTrivial (DGG_data_t *d, DGG_constraint_t *c)
 
int DGG_is2stepValid (double alpha, double bht)
 
int DGG_cutsOffPoint (double *x, DGG_constraint_t *cut)
 
void CglTwomirUnitTest (const OsiSolverInterface *siP, const std::string mpdDir)
 A function that tests the methods in the CglTwomir class. More...
 

Macro Definition Documentation

#define DGG_isBasic (   data,
  idx 
)    ((data->info[idx])&1)

Definition at line 71 of file CglTwomir.hpp.

#define DGG_isInteger (   data,
  idx 
)    ((data->info[idx] >> 1)&1)

Definition at line 72 of file CglTwomir.hpp.

#define DGG_isStructural (   data,
  idx 
)    ((data->info[idx] >> 2)&1)

Definition at line 73 of file CglTwomir.hpp.

#define DGG_isEqualityConstraint (   data,
  idx 
)    ((data->info[idx] >> 3)&1)

Definition at line 74 of file CglTwomir.hpp.

#define DGG_isNonBasicAtUB (   data,
  idx 
)    ((data->info[idx] >> 4)&1)

Definition at line 75 of file CglTwomir.hpp.

#define DGG_isNonBasicAtLB (   data,
  idx 
)    ((data->info[idx] >> 5)&1)

Definition at line 76 of file CglTwomir.hpp.

#define DGG_isConstraintBoundedAbove (   data,
  idx 
)    ((data->info[idx] >> 6)&1)

Definition at line 77 of file CglTwomir.hpp.

#define DGG_isConstraintBoundedBelow (   data,
  idx 
)    ((data->info[idx] >> 7)&1)

Definition at line 78 of file CglTwomir.hpp.

#define DGG_setIsBasic (   data,
  idx 
)    ((data->info[idx]) |= 1)

Definition at line 80 of file CglTwomir.hpp.

#define DGG_setIsInteger (   data,
  idx 
)    ((data->info[idx]) |= (1<<1))

Definition at line 81 of file CglTwomir.hpp.

#define DGG_setIsStructural (   data,
  idx 
)    ((data->info[idx]) |= (1<<2))

Definition at line 82 of file CglTwomir.hpp.

#define DGG_setEqualityConstraint (   data,
  idx 
)    ((data->info[idx]) |= (1<<3))

Definition at line 83 of file CglTwomir.hpp.

#define DGG_setIsNonBasicAtUB (   data,
  idx 
)    ((data->info[idx]) |= (1<<4))

Definition at line 84 of file CglTwomir.hpp.

#define DGG_setIsNonBasicAtLB (   data,
  idx 
)    ((data->info[idx]) |= (1<<5))

Definition at line 85 of file CglTwomir.hpp.

#define DGG_setIsConstraintBoundedAbove (   data,
  idx 
)    ((data->info[idx]) |= (1<<6))

Definition at line 86 of file CglTwomir.hpp.

#define DGG_setIsConstraintBoundedBelow (   data,
  idx 
)    ((data->info[idx]) |= (1<<7))

Definition at line 87 of file CglTwomir.hpp.

#define DGG_DEBUG_DGG   1

Definition at line 236 of file CglTwomir.hpp.

#define DGG_TRACE_ERRORS   0

Definition at line 237 of file CglTwomir.hpp.

#define DGG_DISPLAY   0

Definition at line 238 of file CglTwomir.hpp.

#define DGG_AUTO_CHECK_CUT_OFF_OPTIMAL   1

Definition at line 239 of file CglTwomir.hpp.

#define DGG_DEFAULT_METHOD   2

Definition at line 243 of file CglTwomir.hpp.

#define DGG_DEFAULT_TMIN   1

Definition at line 244 of file CglTwomir.hpp.

#define DGG_DEFAULT_TMAX   1

Definition at line 245 of file CglTwomir.hpp.

#define DGG_DEFAULT_TAUMIN   2

Definition at line 246 of file CglTwomir.hpp.

#define DGG_DEFAULT_TAUMAX   6

Definition at line 247 of file CglTwomir.hpp.

#define DGG_DEFAULT_MAX_CUTS   500

Definition at line 248 of file CglTwomir.hpp.

#define DGG_DEFAULT_IMPROVEMENT_THRESH   0.001

Definition at line 249 of file CglTwomir.hpp.

#define DGG_DEFAULT_NBELOW_THRESH   INT_MAX

Definition at line 250 of file CglTwomir.hpp.

#define DGG_DEFAULT_NROOT_ROUNDS   2

Definition at line 251 of file CglTwomir.hpp.

#define DGG_DEFAULT_NEGATIVE_SCALED_TWOSTEPS   0

Definition at line 252 of file CglTwomir.hpp.

#define DGG_DEFAULT_ALPHA_RULE   0

Definition at line 253 of file CglTwomir.hpp.

#define DGG_DEFAULT_CUT_INC   250

Definition at line 254 of file CglTwomir.hpp.

#define DGG_DEFAULT_CUT_FORM   0

Definition at line 255 of file CglTwomir.hpp.

#define DGG_DEFAULT_NICEFY   0

Definition at line 256 of file CglTwomir.hpp.

#define DGG_DEFAULT_ONLY_DELAYED   0

Definition at line 257 of file CglTwomir.hpp.

#define DGG_DEFAULT_DELAYED_FREQ   9999999

Definition at line 258 of file CglTwomir.hpp.

#define DGG_DEFAULT_LPROWS_FREQ   9999999

Definition at line 259 of file CglTwomir.hpp.

#define DGG_DEFAULT_WHICH_FORMULATION_CUTS   2

Definition at line 260 of file CglTwomir.hpp.

#define DGG_OSI   0

Definition at line 264 of file CglTwomir.hpp.

#define DGG_CPX   1

Definition at line 265 of file CglTwomir.hpp.

#define DGG_QSO   2

Definition at line 266 of file CglTwomir.hpp.

#define DGG_SOLVER   DGG_OSI

Definition at line 269 of file CglTwomir.hpp.

#define DGG_DEBUG_SOLVER   0

Definition at line 272 of file CglTwomir.hpp.

#define DGG_SOLVER_SCREEN_FLAG   0

Definition at line 275 of file CglTwomir.hpp.

#define DGG_TMIR_CUT   1

Definition at line 280 of file CglTwomir.hpp.

#define DGG_2STEP_CUT   2

Definition at line 281 of file CglTwomir.hpp.

#define DGG_ALPHA_MIN_SUM   0

Definition at line 284 of file CglTwomir.hpp.

#define DGG_ALPHA_RANDOM_01   1

Definition at line 285 of file CglTwomir.hpp.

#define DGG_ALPHA_RANDOM_COEFF   2

Definition at line 286 of file CglTwomir.hpp.

#define DGG_ALPHA_ALL   3

Definition at line 287 of file CglTwomir.hpp.

#define DGG_ALPHA_MAX_STEEP   5

Definition at line 288 of file CglTwomir.hpp.

#define DGG_MIN_STEEPNESS   1.0e-4

Definition at line 293 of file CglTwomir.hpp.

#define DGG_MAX_L2NORM   1.0e7

Definition at line 294 of file CglTwomir.hpp.

#define DGG_NORM_CRITERIA   1

Definition at line 297 of file CglTwomir.hpp.

#define DGG_GOMORY_THRESH   0.005

Definition at line 302 of file CglTwomir.hpp.

#define DGG_RHS_THRESH   0.005

Definition at line 304 of file CglTwomir.hpp.

#define DGG_BOUND_THRESH   1.0e-6

Definition at line 310 of file CglTwomir.hpp.

#define DGG_EQUALITY_THRESH   1.0e-5

Definition at line 314 of file CglTwomir.hpp.

#define DGG_SHIFT_THRESH   1.0e-6

Definition at line 318 of file CglTwomir.hpp.

#define DGG_INTEGRALITY_THRESH   1.0e-10

Definition at line 323 of file CglTwomir.hpp.

#define CBC_CHECK_CUT

Definition at line 327 of file CglTwomir.hpp.

#define DGG_MIN_TABLEAU_COEFFICIENT   1.0e-12

Definition at line 331 of file CglTwomir.hpp.

#define DGG_MIN_RHO   1.0e-7

Definition at line 336 of file CglTwomir.hpp.

#define DGG_MIN_ALPHA   1.0e-7

Definition at line 337 of file CglTwomir.hpp.

#define DGG_NULL_SLACK   1.0e-5

Definition at line 340 of file CglTwomir.hpp.

#define DGG_NICEFY_MIN_ABSVALUE   1.0e-13

Definition at line 343 of file CglTwomir.hpp.

#define DGG_NICEFY_MIN_FIX   1.0e-7

Definition at line 344 of file CglTwomir.hpp.

#define DGG_NICEFY_MAX_PADDING   1.0e-6

Definition at line 345 of file CglTwomir.hpp.

#define DGG_NICEFY_MAX_RATIO   1.0e9

Definition at line 346 of file CglTwomir.hpp.

#define DGG_IF_EXIT (   A,
  B,
  REST 
)    {if(A) {fprintf(stdout, REST);exit(B);}}

Definition at line 389 of file CglTwomir.hpp.

#define DGG_THROW (   A,
 
)    return(A)

Definition at line 391 of file CglTwomir.hpp.

#define DGG_CHECKRVAL (   A,
 
)    { if(A) return(B); }

Definition at line 393 of file CglTwomir.hpp.

#define DGG_CHECKRVAL1 (   A,
 
)    { if(A) { rval = B; goto CLEANUP; } }

Definition at line 394 of file CglTwomir.hpp.

#define DGG_TEST (   A,
  B,
  REST 
)    { if(A) return(B);}

Definition at line 396 of file CglTwomir.hpp.

#define DGG_TEST2 (   A,
  B,
  REST,
 
)    { DGG_TEST(A,B,REST) }

Definition at line 397 of file CglTwomir.hpp.

#define DGG_TEST3 (   A,
  B,
  REST,
  C,
 
)    { DGG_TEST(A,B,REST) }

Definition at line 398 of file CglTwomir.hpp.

#define DGG_MIN (   a,
 
)    ( (a<b)?a:b )

Definition at line 404 of file CglTwomir.hpp.

#define DGG_MAX (   a,
 
)    ( (a>b)?a:b )

Definition at line 405 of file CglTwomir.hpp.

#define KREM (   vht,
  alpha,
  tau 
)    (DGG_MIN( ceil(vht / alpha), tau ) - 1)

Definition at line 406 of file CglTwomir.hpp.

#define LMIN (   vht,
  d,
  bht 
)    (DGG_MIN( floor(d*bht/bht), d))

Definition at line 407 of file CglTwomir.hpp.

#define ABOV (   v)    (v - floor(v))

Definition at line 408 of file CglTwomir.hpp.

#define QINT (   vht,
  bht,
  tau 
)    ( (int)floor( (vht*(tau-1))/bht ) )

Definition at line 409 of file CglTwomir.hpp.

#define V2I (   bht,
  tau,
 
)    ( ((i+1)*bht / tau) )

Definition at line 410 of file CglTwomir.hpp.

Function Documentation

int DGG_is_even ( double  vht,
double  bht,
int  tau,
int  q 
)
double frac_part ( double  value)
int DGG_is_a_multiple_of_b ( double  a,
double  b 
)
int DGG_freeData ( DGG_data_t data)
DGG_constraint_t* DGG_newConstraint ( int  max_arrays)
void DGG_freeConstraint ( DGG_constraint_t c)
DGG_constraint_t* DGG_copyConstraint ( DGG_constraint_t c)
void DGG_scaleConstraint ( DGG_constraint_t c,
int  t 
)
void DGG_list_init ( DGG_list_t l)
int DGG_list_addcut ( DGG_list_t l,
DGG_constraint_t cut,
int  ctype,
double  alpha 
)
void DGG_list_delcut ( DGG_list_t l,
int  i 
)
void DGG_list_free ( DGG_list_t l)
DGG_data_t* DGG_getData ( const void *  solver_ptr)
int DGG_transformConstraint ( DGG_data_t data,
double **  x_out,
double **  rc_out,
char **  isint_out,
DGG_constraint_t constraint 
)
int DGG_unTransformConstraint ( DGG_data_t data,
DGG_constraint_t constraint 
)
int DGG_substituteSlacks ( const void *  solver_ptr,
DGG_data_t data,
DGG_constraint_t cut 
)
int DGG_nicefyConstraint ( const void *  solver_ptr,
DGG_data_t data,
DGG_constraint_t cut 
)
int DGG_getFormulaConstraint ( int  row_idx,
const void *  solver_ptr,
DGG_data_t data,
DGG_constraint_t row 
)
int DGG_getTableauConstraint ( int  index,
const void *  solver_ptr,
DGG_data_t data,
DGG_constraint_t tabrow,
const int *  colIsBasic,
const int *  rowIsBasic,
CoinFactorization factorization,
int  mode 
)
DGG_constraint_t* DGG_getSlackExpression ( const void *  solver_ptr,
DGG_data_t data,
int  row_index 
)
int DGG_generateTabRowCuts ( DGG_list_t list,
DGG_data_t data,
const void *  solver_ptr 
)
int DGG_generateFormulationCuts ( DGG_list_t list,
DGG_data_t data,
const void *  solver_ptr,
int  nrows,
CoinThreadRandom generator 
)
int DGG_generateFormulationCutsFromBase ( DGG_constraint_t base,
double  slack,
DGG_list_t list,
DGG_data_t data,
const void *  solver_ptr,
CoinThreadRandom generator 
)
int DGG_generateCutsFromBase ( DGG_constraint_t base,
DGG_list_t list,
DGG_data_t data,
const void *  solver_ptr 
)
int DGG_buildMir ( char *  isint,
DGG_constraint_t base,
DGG_constraint_t **  cut_out 
)
int DGG_build2step ( double  alpha,
char *  isint,
DGG_constraint_t base,
DGG_constraint_t **  cut_out 
)
int DGG_addMirToList ( DGG_constraint_t base,
char *  isint,
double *  x,
DGG_list_t list,
DGG_data_t data,
DGG_constraint_t orig_base 
)
int DGG_add2stepToList ( DGG_constraint_t base,
char *  isint,
double *  x,
double *  rc,
DGG_list_t list,
DGG_data_t data,
DGG_constraint_t orig_base 
)
double DGG_cutLHS ( DGG_constraint_t c,
double *  x 
)
int DGG_isCutDesirable ( DGG_constraint_t c,
DGG_data_t d 
)
int DGG_isConstraintViolated ( DGG_data_t d,
DGG_constraint_t c 
)
int DGG_isBaseTrivial ( DGG_data_t d,
DGG_constraint_t c 
)
int DGG_is2stepValid ( double  alpha,
double  bht 
)
int DGG_cutsOffPoint ( double *  x,
DGG_constraint_t cut 
)
void CglTwomirUnitTest ( const OsiSolverInterface siP,
const std::string  mpdDir 
)

A function that tests the methods in the CglTwomir class.

The only reason for it not to be a member method is that this way it doesn't have to be compiled into the library. And that's a gain, because the library should be compiled with optimization on, but this method should be compiled with debugging.