69#define _USE_MATH_DEFINES
93#define BRANCHRULE_NAME "distribution"
94#define BRANCHRULE_DESC "branching rule based on variable influence on cumulative normal distribution of row activities"
95#define BRANCHRULE_PRIORITY 0
96#define BRANCHRULE_MAXDEPTH -1
97#define BRANCHRULE_MAXBOUNDDIST 1.0
99#define SCOREPARAM_VALUES "dhlvw"
100#define DEFAULT_SCOREPARAM 'v'
101#define DEFAULT_PRIORITY 2.0
102#define DEFAULT_ONLYACTIVEROWS FALSE
103#define DEFAULT_USEWEIGHTEDSCORE FALSE
106#define EVENTHDLR_NAME "eventhdlr_distribution"
107#define EVENT_DISTRIBUTION SCIP_EVENTTYPE_BOUNDCHANGED
114struct SCIP_BranchruleData
122 int* rowinfinitiesdown;
124 int* rowinfinitiesup;
136struct SCIP_EventhdlrData
158 if( maxindex < branchruledata->memsize )
163 assert(newsize > branchruledata->memsize);
164 assert(branchruledata->memsize >= 0);
167 if( branchruledata->memsize == 0 )
192 branchruledata->varpossmemsize =
nvars;
193 branchruledata->nupdatedvars = 0;
196 for( v = 0; v <
nvars; ++v )
203 assert(branchruledata->varfilterposs[v] >= 0);
205 branchruledata->varposs[v] = -1;
206 branchruledata->updatedvars[v] =
NULL;
220 for(
r = branchruledata->memsize;
r < newsize; ++
r )
224 branchruledata->rowinfinitiesdown[
r] = 0;
225 branchruledata->rowinfinitiesup[
r] = 0;
229 branchruledata->memsize = newsize;
249 assert(0 <= varindex && varindex < branchruledata->varpossmemsize);
255 branchruledata->currentlbs[varindex] = lblocal;
256 branchruledata->currentubs[varindex] = ublocal;
291 *variance =
SQR(varub - varlb);
293 *variance =
SQR(varub - varlb + 1.0) - 1.0;
295 *mean = (varub + varlb) * .5;
322 std = sqrt(variance);
337 SCIPdebugMsg(
scip,
" Normalized value %g = ( %g - %g ) / (%g * 1.4142136)\n", normvalue, value, mean,
std);
344 else if( normvalue > 0 )
348 erfresult =
SCIPerf(normvalue);
349 return erfresult / 2.0 + 0.5;
355 erfresult =
SCIPerf(-normvalue);
357 return 0.5 - erfresult / 2.0;
376 int rowinfinitiesdown,
412 minprobability =
MIN(rhsprob, lhsprob);
413 maxprobability =
MAX(lhsprob, rhsprob);
414 rowprobability = minprobability / maxprobability;
417 rowprobability =
MIN(rhsprob, lhsprob);
420 SCIPdebugMsg(
scip,
" Row %s, mean %g, sigma2 %g, LHS %g, RHS %g has probability %g to be satisfied\n",
425 return rowprobability;
444 int* rowinfinitiesdown,
469 *rowinfinitiesdown = 0;
470 *rowinfinitiesup = 0;
473 for(
c = 0;
c < nrowvals; ++
c )
498 if( branchruledata->currentlbs[varindex] ==
SCIP_INVALID )
516 ++(*rowinfinitiesdown);
518 ++(*rowinfinitiesup);
527 ++(*rowinfinitiesdown);
529 ++(*rowinfinitiesup);
533 &varmean, &varvariance);
536 *mu += colval * varmean;
539 squarecoeff =
SQR(colval);
540 *sigma2 += squarecoeff * varvariance;
575 *upscore = 1.0 - newprobup;
577 *downscore = 1.0 - newprobdown;
583 *upscore = currentprob - newprobup;
584 if(
SCIPisGT(
scip, currentprob - newprobdown, *downscore) )
585 *downscore = currentprob - newprobdown;
591 *upscore = newprobup;
593 *downscore = newprobdown;
613 SCIPerrorMessage(
" ERROR! No branching scheme selected! Exiting method.\n");
673 squaredbounddiff = 0.0;
680 squaredbounddiffup = 0.0;
685 squaredbounddiffdown = 0.0;
693 onlyactiverows = branchruledata->onlyactiverows;
696 for(
i = 0;
i < ncolrows; ++
i )
708 int rowinfinitiesdown;
729 rowCalculateGauss(
scip, branchruledata, row, &branchruledata->rowmeans[rowpos], &branchruledata->rowvariances[rowpos],
730 &branchruledata->rowinfinitiesdown[rowpos], &branchruledata->rowinfinitiesup[rowpos]);
734 rowmean = branchruledata->rowmeans[rowpos];
735 rowvariance = branchruledata->rowvariances[rowpos];
736 rowinfinitiesdown = branchruledata->rowinfinitiesdown[rowpos];
737 rowinfinitiesup = branchruledata->rowinfinitiesdown[rowpos];
741 rowinfinitiesdown, rowinfinitiesup);
744 squaredcoeff =
SQR(rowval);
751 int rowinftiesdownafterbranch;
752 int rowinftiesupafterbranch;
755 changedrowmean = rowmean + rowval * (meanup - currentmean);
756 changedrowvariance = rowvariance + squaredcoeff * (squaredbounddiffup - squaredbounddiff);
757 changedrowvariance =
MAX(0.0, changedrowvariance);
759 rowinftiesdownafterbranch = rowinfinitiesdown;
760 rowinftiesupafterbranch = rowinfinitiesup;
764 rowinftiesupafterbranch--;
766 rowinftiesdownafterbranch--;
768 assert(rowinftiesupafterbranch >= 0);
769 assert(rowinftiesdownafterbranch >= 0);
771 rowinftiesupafterbranch);
774 newrowprobup = currentrowprob;
779 int rowinftiesdownafterbranch;
780 int rowinftiesupafterbranch;
782 changedrowmean = rowmean + rowval * (meandown - currentmean);
783 changedrowvariance = rowvariance + squaredcoeff * (squaredbounddiffdown - squaredbounddiff);
784 changedrowvariance =
MAX(0.0, changedrowvariance);
786 rowinftiesdownafterbranch = rowinfinitiesdown;
787 rowinftiesupafterbranch = rowinfinitiesup;
791 rowinftiesupafterbranch -= 1;
793 rowinftiesdownafterbranch -= 1;
795 assert(rowinftiesdownafterbranch >= 0);
796 assert(rowinftiesupafterbranch >= 0);
798 rowinftiesupafterbranch);
801 newrowprobdown = currentrowprob;
806 SCIPdebugMsg(
scip,
" Variable %s changes probability of row %s from %g to %g (branch up) or %g;\n",
808 SCIPdebugMsg(
scip,
" --> new variable score: %g (for branching up), %g (for branching down)\n",
809 *upscore, *downscore);
822 assert(branchruledata->memsize == 0 || branchruledata->rowmeans !=
NULL);
823 assert(branchruledata->memsize >= 0);
825 if( branchruledata->memsize > 0 )
838 branchruledata->memsize = 0;
857 assert(-1 <= varindex && varindex < branchruledata->varpossmemsize);
862 varpos = branchruledata->varposs[varindex];
863 assert(varpos < branchruledata->nupdatedvars);
868 assert(branchruledata->updatedvars[varpos] ==
var);
875 if( branchruledata->currentlbs[varindex] ==
SCIP_INVALID )
879 assert(branchruledata->varpossmemsize > branchruledata->nupdatedvars);
880 varpos = branchruledata->nupdatedvars;
881 branchruledata->updatedvars[varpos] =
var;
882 branchruledata->varposs[varindex] = varpos;
883 ++branchruledata->nupdatedvars;
896 assert(branchruledata->nupdatedvars >= 0);
899 if( branchruledata->nupdatedvars == 0 )
902 varpos = branchruledata->nupdatedvars - 1;
903 var = branchruledata->updatedvars[varpos];
906 assert(0 <= varindex && varindex < branchruledata->varpossmemsize);
907 assert(varpos == branchruledata->varposs[varindex]);
909 branchruledata->varposs[varindex] = -1;
910 branchruledata->nupdatedvars--;
954 oldlb = branchruledata->currentlbs[varindex];
955 oldub = branchruledata->currentubs[varindex];
980 for(
r = 0;
r < ncolrows; ++
r )
1000 coeffsquared =
SQR(coeff);
1003 branchruledata->rowmeans[rowpos] += coeff * (newmean - oldmean);
1004 branchruledata->rowvariances[rowpos] += coeffsquared * (newvariance - oldvariance);
1005 branchruledata->rowvariances[rowpos] =
MAX(0.0, branchruledata->rowvariances[rowpos]);
1012 ++branchruledata->rowinfinitiesup[rowpos];
1014 --branchruledata->rowinfinitiesup[rowpos];
1017 ++branchruledata->rowinfinitiesdown[rowpos];
1019 --branchruledata->rowinfinitiesdown[rowpos];
1021 else if( coeff < 0.0 )
1024 ++branchruledata->rowinfinitiesdown[rowpos];
1026 --branchruledata->rowinfinitiesdown[rowpos];
1029 ++branchruledata->rowinfinitiesup[rowpos];
1031 --branchruledata->rowinfinitiesup[rowpos];
1033 assert(branchruledata->rowinfinitiesdown[rowpos] >= 0);
1034 assert(branchruledata->rowinfinitiesup[rowpos] >= 0);
1087 if( branchruledata->varfilterposs !=
NULL)
1097 for( v = 0; v <
nvars; ++v )
1165 if( branchruledata->memsize == 0 )
1182 while( branchruledata->nupdatedvars > 0 )
1216 assert(0 <= varindex && varindex < branchruledata->varpossmemsize);
1226 if( branchruledata->currentlbs[varindex] ==
SCIP_INVALID )
1236 &upscore, &downscore, branchruledata->scoreparam) );
1239 if( branchruledata->usescipscore )
1246 if( score > bestscore )
1251 if( upscore > downscore )
1260 if( upscore > bestscore && upscore > downscore )
1262 bestscore = upscore;
1266 else if( downscore > bestscore )
1268 bestscore = downscore;
1319 branchruledata = eventhdlrdata->branchruledata;
1343 branchruledata =
NULL;
1346 branchruledata->memsize = 0;
1347 branchruledata->rowmeans =
NULL;
1348 branchruledata->rowvariances =
NULL;
1349 branchruledata->rowinfinitiesdown =
NULL;
1350 branchruledata->rowinfinitiesup =
NULL;
1351 branchruledata->varfilterposs =
NULL;
1352 branchruledata->currentlbs =
NULL;
1353 branchruledata->currentubs =
NULL;
1356 eventhdlrdata =
NULL;
1358 eventhdlrdata->branchruledata = branchruledata;
1360 branchruledata->eventhdlr =
NULL;
1362 "event handler for dynamic acitivity distribution updating",
1363 eventExecDistribution, eventhdlrdata) );
1379 "the score;largest 'd'ifference, 'l'owest cumulative probability,'h'ighest c.p., 'v'otes lowest c.p., votes highest c.p.('w') ",
1383 "should only rows which are active at the current node be considered?",
1387 "should the branching score weigh up- and down-scores of a variable",
#define BRANCHRULE_PRIORITY
#define BRANCHRULE_MAXDEPTH
#define BRANCHRULE_MAXBOUNDDIST
#define DEFAULT_SCOREPARAM
#define EVENT_DISTRIBUTION
static SCIP_RETCODE calcBranchScore(SCIP *scip, SCIP_BRANCHRULEDATA *branchruledata, SCIP_VAR *var, SCIP_Real lpsolval, SCIP_Real *upscore, SCIP_Real *downscore, char scoreparam)
#define SCOREPARAM_VALUES
static void rowCalculateGauss(SCIP *scip, SCIP_BRANCHRULEDATA *branchruledata, SCIP_ROW *row, SCIP_Real *mu, SCIP_Real *sigma2, int *rowinfinitiesdown, int *rowinfinitiesup)
static SCIP_VAR * branchruledataPopBoundChangeVar(SCIP_BRANCHRULEDATA *branchruledata)
static SCIP_RETCODE branchruledataEnsureArraySize(SCIP *scip, SCIP_BRANCHRULEDATA *branchruledata, int maxindex)
static void branchruledataFreeArrays(SCIP *scip, SCIP_BRANCHRULEDATA *branchruledata)
static SCIP_RETCODE varProcessBoundChanges(SCIP *scip, SCIP_BRANCHRULEDATA *branchruledata, SCIP_VAR *var)
static void branchruledataUpdateCurrentBounds(SCIP *scip, SCIP_BRANCHRULEDATA *branchruledata, SCIP_VAR *var)
#define DEFAULT_ONLYACTIVEROWS
static void branchruledataAddBoundChangeVar(SCIP_BRANCHRULEDATA *branchruledata, SCIP_VAR *var)
#define DEFAULT_USEWEIGHTEDSCORE
probability based branching rule based on an article by J. Pryor and J.W. Chinneck
SCIP_RETCODE SCIPupdateDistributionScore(SCIP *scip, SCIP_Real currentprob, SCIP_Real newprobup, SCIP_Real newprobdown, SCIP_Real *upscore, SCIP_Real *downscore, char scoreparam)
SCIP_Real SCIProwCalcProbability(SCIP *scip, SCIP_ROW *row, SCIP_Real mu, SCIP_Real sigma2, int rowinfinitiesdown, int rowinfinitiesup)
void SCIPvarCalcDistributionParameters(SCIP *scip, SCIP_Real varlb, SCIP_Real varub, SCIP_VARTYPE vartype, SCIP_IMPLINTTYPE impltype, SCIP_Real *mean, SCIP_Real *variance)
SCIP_Real SCIPcalcCumulativeDistribution(SCIP *scip, SCIP_Real mean, SCIP_Real variance, SCIP_Real value)
SCIP_RETCODE SCIPincludeBranchruleDistribution(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
SCIP_RETCODE SCIPchgChildPrio(SCIP *scip, SCIP_NODE *child, SCIP_Real priority)
SCIP_RETCODE SCIPaddCharParam(SCIP *scip, const char *name, const char *desc, char *valueptr, SCIP_Bool isadvanced, char defaultvalue, const char *allowedvalues, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPincludeBranchruleBasic(SCIP *scip, SCIP_BRANCHRULE **branchruleptr, const char *name, const char *desc, int priority, int maxdepth, SCIP_Real maxbounddist, SCIP_BRANCHRULEDATA *branchruledata)
const char * SCIPbranchruleGetName(SCIP_BRANCHRULE *branchrule)
SCIP_BRANCHRULEDATA * SCIPbranchruleGetData(SCIP_BRANCHRULE *branchrule)
SCIP_RETCODE SCIPsetBranchruleCopy(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
SCIP_RETCODE SCIPsetBranchruleExecLp(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
SCIP_RETCODE SCIPsetBranchruleExitsol(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
void SCIPbranchruleSetData(SCIP_BRANCHRULE *branchrule, SCIP_BRANCHRULEDATA *branchruledata)
SCIP_RETCODE SCIPsetBranchruleFree(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
SCIP_RETCODE SCIPgetLPBranchCands(SCIP *scip, SCIP_VAR ***lpcands, SCIP_Real **lpcandssol, SCIP_Real **lpcandsfrac, int *nlpcands, int *npriolpcands, int *nfracimplvars)
SCIP_RETCODE SCIPbranchVar(SCIP *scip, SCIP_VAR *var, SCIP_NODE **downchild, SCIP_NODE **eqchild, SCIP_NODE **upchild)
SCIP_Real SCIPgetBranchScore(SCIP *scip, SCIP_VAR *var, SCIP_Real downgain, SCIP_Real upgain)
SCIP_VAR * SCIPcolGetVar(SCIP_COL *col)
int SCIPcolGetNNonz(SCIP_COL *col)
SCIP_Real * SCIPcolGetVals(SCIP_COL *col)
SCIP_ROW ** SCIPcolGetRows(SCIP_COL *col)
SCIP_RETCODE SCIPsetEventhdlrFree(SCIP *scip, SCIP_EVENTHDLR *eventhdlr,)
SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr)
void SCIPeventhdlrSetData(SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTHDLRDATA *eventhdlrdata)
SCIP_RETCODE SCIPcatchVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
SCIP_RETCODE SCIPdropVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
int SCIPgetNLPRows(SCIP *scip)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
int SCIPgetNActivePricers(SCIP *scip)
SCIP_Bool SCIPinProbing(SCIP *scip)
SCIP_Real SCIProwGetLhs(SCIP_ROW *row)
int SCIProwGetNNonz(SCIP_ROW *row)
SCIP_COL ** SCIProwGetCols(SCIP_ROW *row)
SCIP_Real SCIProwGetRhs(SCIP_ROW *row)
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
const char * SCIProwGetName(SCIP_ROW *row)
int SCIProwGetIndex(SCIP_ROW *row)
SCIP_Real SCIPgetRowLPFeasibility(SCIP *scip, SCIP_ROW *row)
SCIP_Real SCIProwGetConstant(SCIP_ROW *row)
SCIP_Real * SCIProwGetVals(SCIP_ROW *row)
SCIP_Bool SCIPisSumPositive(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfeasCeil(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPfeasFloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_COL * SCIPvarGetCol(SCIP_VAR *var)
SCIP_Real SCIPvarGetSol(SCIP_VAR *var, SCIP_Bool getlpval)
SCIP_Bool SCIPvarIsActive(SCIP_VAR *var)
SCIP_VARSTATUS SCIPvarGetStatus(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
int SCIPvarGetProbindex(SCIP_VAR *var)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_Real SCIPvarGetLPSol(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_IMPLINTTYPE SCIPvarGetImplType(SCIP_VAR *var)
SCIP_Real SCIPerf(SCIP_Real x)
assert(minobj< SCIPgetCutoffbound(scip))
public methods for branching rules
public methods for managing events
public methods for LP management
public methods for message output
public data structures and miscellaneous methods
public methods for problem variables
public methods for branching rule plugins and branching
public methods for event handler plugins and event handlers
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for variable pricer plugins
public methods for global and local (sub)problems
public methods for the probing mode
#define SCIP_DECL_BRANCHEXECLP(x)
#define SCIP_DECL_BRANCHCOPY(x)
#define SCIP_DECL_BRANCHFREE(x)
struct SCIP_Branchrule SCIP_BRANCHRULE
struct SCIP_BranchruleData SCIP_BRANCHRULEDATA
#define SCIP_DECL_BRANCHEXITSOL(x)
struct SCIP_Eventhdlr SCIP_EVENTHDLR
struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA
#define SCIP_DECL_EVENTEXEC(x)
#define SCIP_DECL_EVENTFREE(x)
@ SCIP_BRANCHDIR_DOWNWARDS
enum SCIP_BranchDir SCIP_BRANCHDIR
enum SCIP_Retcode SCIP_RETCODE
struct SCIP_Node SCIP_NODE
enum SCIP_ImplintType SCIP_IMPLINTTYPE
@ SCIP_VARTYPE_CONTINUOUS
enum SCIP_Vartype SCIP_VARTYPE