68#define BRANCHRULE_NAME "allfullstrong"
69#define BRANCHRULE_DESC "all variables full strong branching"
70#define BRANCHRULE_PRIORITY -1000
71#define BRANCHRULE_MAXDEPTH -1
72#define BRANCHRULE_MAXBOUNDDIST 1.0
76struct SCIP_BranchruleData
99 SCIP_Real provedbound;
100 SCIP_Bool exactsolve;
101 SCIP_Bool allcolsinlp;
102 SCIP_Bool bestdownvalid;
103 SCIP_Bool bestupvalid;
105 int npriopseudocands;
108 SCIP_Real cutoffbound;
129 if( branchruledata->skipdown ==
NULL )
143 assert(npriopseudocands > 0);
148 npriopseudocands, &bestpseudocand, &bestdown, &bestup, &bestscore, &bestdownvalid, &bestupvalid, &provedbound,
result) );
158 assert(0 <= bestpseudocand && bestpseudocand < npseudocands);
161 var = pseudocandscopy[bestpseudocand];
164 SCIPdebugMsg(
scip,
" -> %d candidates, selected candidate %d: variable <%s>[%g,%g] (solval=%g, down=%g, up=%g, score=%g)\n",
166 bestdown, bestup, bestscore);
170 if( allcolsinlp && !exactsolve )
172 if( downchild !=
NULL )
177 if( eqchild !=
NULL )
182 if( upchild !=
NULL )
242 branchruledata->lastcand = 0;
300 int npriopseudocands,
304 SCIP_Real* bestscore,
305 SCIP_Bool* bestdownvalid,
306 SCIP_Bool* bestupvalid,
307 SCIP_Real* provedbound,
312 SCIP_Bool allcolsinlp;
313 SCIP_Bool exactsolve;
315 SCIP_Real cutoffbound;
346 *bestdown = lpobjval;
348 *bestdownvalid =
TRUE;
351 *provedbound = lpobjval;
352 if( npseudocands > 1 )
369 SCIP_Bool downconflict;
370 SCIP_Bool upconflict;
389 for(
i = 0,
c = branchruledata->lastcand;
i < npseudocands; ++
i, ++
c )
391 c =
c % npseudocands;
401 SCIPdebugMsg(
scip,
"applying strong branching on %s variable <%s>[%g,%g] with solution %g\n",
411 skipdown[
c] ?
NULL : &down, skipup[
c] ?
NULL : &up, &downvalid, &upvalid, &downinf, &upinf, &downconflict, &upconflict, &
lperror) );
416 skipdown[
c] ?
NULL : &down, skipup[
c] ?
NULL : &up, &downvalid, &upvalid, &downinf, &upinf, &downconflict, &upconflict, &
lperror) );
430 "(node %" SCIP_LONGINT_FORMAT ") error in strong branching call for variable <%s> with solution %g\n",
436 down =
MAX(down, lpobjval);
437 up =
MAX(up, lpobjval);
438 downgain = down - lpobjval;
439 upgain = up - lpobjval;
440 assert(!allcolsinlp || exactsolve || !downvalid || downinf ==
SCIPisGE(
scip, down, cutoffbound));
441 assert(!allcolsinlp || exactsolve || !upvalid || upinf ==
SCIPisGE(
scip, up, cutoffbound));
442 assert(downinf || !downconflict);
443 assert(upinf || !upconflict);
446 if( downinf || upinf )
451 if( downinf && upinf )
455 SCIP_Bool infeasible;
463 SCIPdebugMsg(
scip,
" -> integral variable <%s> is infeasible in both directions\n",
471 SCIPdebugMsg(
scip,
" -> fractional variable <%s> is infeasible in both directions\n",
506 else if( allcolsinlp && !exactsolve && downvalid && upvalid )
511 minbound =
MIN(down, up);
512 *provedbound =
MAX(*provedbound, minbound);
516 if(
c < npriopseudocands )
543 if( score > *bestscore )
548 *bestdownvalid = downvalid;
549 *bestupvalid = upvalid;
570 SCIPdebugMsg(
scip,
" -> var <%s> (solval=%g, downgain=%g, upgain=%g, score=%g) -- best: <%s> (%g)\n",
576 branchruledata->lastcand =
c;
595 branchruledata->lastcand = 0;
596 branchruledata->skipsize = 0;
597 branchruledata->skipup =
NULL;
598 branchruledata->skipdown =
NULL;
static SCIP_RETCODE branch(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_RESULT *result)
SCIP_RETCODE SCIPselectVarPseudoStrongBranching(SCIP *scip, SCIP_VAR **pseudocands, SCIP_Bool *skipdown, SCIP_Bool *skipup, int npseudocands, int npriopseudocands, int *bestpseudocand, SCIP_Real *bestdown, SCIP_Real *bestup, SCIP_Real *bestscore, SCIP_Bool *bestdownvalid, SCIP_Bool *bestupvalid, SCIP_Real *provedbound, SCIP_RESULT *result)
#define BRANCHRULE_PRIORITY
SCIP_RETCODE SCIPincludeBranchruleAllfullstrong(SCIP *scip)
#define BRANCHRULE_MAXDEPTH
#define BRANCHRULE_MAXBOUNDDIST
all variables full strong LP branching rule
#define SCIP_LONGINT_FORMAT
SCIP_Bool SCIPisExactSolve(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_RETCODE SCIPupdateNodeLowerbound(SCIP *scip, SCIP_NODE *node, SCIP_Real newbound)
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
SCIP_RETCODE SCIPsetBranchruleInit(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
SCIP_BRANCHRULE * SCIPfindBranchrule(SCIP *scip, const char *name)
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,)
void SCIPbranchruleSetData(SCIP_BRANCHRULE *branchrule, SCIP_BRANCHRULEDATA *branchruledata)
SCIP_RETCODE SCIPsetBranchruleFree(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
SCIP_RETCODE SCIPsetBranchruleExecPs(SCIP *scip, SCIP_BRANCHRULE *branchrule,)
SCIP_RETCODE SCIPbranchVarVal(SCIP *scip, SCIP_VAR *var, SCIP_Real val, SCIP_NODE **downchild, SCIP_NODE **eqchild, SCIP_NODE **upchild)
SCIP_RETCODE SCIPgetPseudoBranchCands(SCIP *scip, SCIP_VAR ***pseudocands, int *npseudocands, int *npriopseudocands)
SCIP_Real SCIPgetBranchScoreMultiple(SCIP *scip, SCIP_VAR *var, int nchildren, SCIP_Real *gains)
SCIP_Real SCIPgetBranchScore(SCIP *scip, SCIP_VAR *var, SCIP_Real downgain, SCIP_Real upgain)
SCIP_Bool SCIPhasCurrentNodeLP(SCIP *scip)
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
SCIP_Bool SCIPallColsInLP(SCIP *scip)
SCIP_Real SCIPgetLPObjval(SCIP *scip)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPduplicateBufferArray(scip, ptr, source, num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_Real SCIPnodeGetLowerbound(SCIP_NODE *node)
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_Real SCIPgetCutoffbound(SCIP *scip)
SCIP_RETCODE SCIPprintDisplayLine(SCIP *scip, FILE *file, SCIP_VERBLEVEL verblevel, SCIP_Bool endline)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfeasCeil(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPfeasFloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
int SCIPgetDepth(SCIP *scip)
SCIP_RETCODE SCIPgetVarStrongbranchFrac(SCIP *scip, SCIP_VAR *var, int itlim, SCIP_Bool idempotent, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, SCIP_Bool *downinf, SCIP_Bool *upinf, SCIP_Bool *downconflict, SCIP_Bool *upconflict, SCIP_Bool *lperror)
SCIP_RETCODE SCIPgetVarStrongbranchInt(SCIP *scip, SCIP_VAR *var, int itlim, SCIP_Bool idempotent, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, SCIP_Bool *downinf, SCIP_Bool *upinf, SCIP_Bool *downconflict, SCIP_Bool *upconflict, SCIP_Bool *lperror)
SCIP_RETCODE SCIPendStrongbranch(SCIP *scip)
SCIP_RETCODE SCIPchgVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_RETCODE SCIPchgVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_Real SCIPvarGetLPSol(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_RETCODE SCIPupdateVarPseudocost(SCIP *scip, SCIP_VAR *var, SCIP_Real solvaldelta, SCIP_Real objdelta, SCIP_Real weight)
SCIP_RETCODE SCIPfixVar(SCIP *scip, SCIP_VAR *var, SCIP_Real fixedval, SCIP_Bool *infeasible, SCIP_Bool *fixed)
SCIP_RETCODE SCIPstartStrongbranch(SCIP *scip, SCIP_Bool enablepropagation)
SCIP_Bool SCIPvarIsInLP(SCIP_VAR *var)
assert(minobj< SCIPgetCutoffbound(scip))
memory allocation routines
#define BMSclearMemoryArray(ptr, num)
public methods for branching rules
public methods for message output
public methods for branch and bound tree
public methods for problem variables
public methods for branching rule plugins and branching
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 global and local (sub)problems
public methods for querying solving statistics
public methods for the branch-and-bound tree
public methods for SCIP variables
#define SCIP_DECL_BRANCHEXECPS(x)
#define SCIP_DECL_BRANCHEXECLP(x)
#define SCIP_DECL_BRANCHINIT(x)
#define SCIP_DECL_BRANCHCOPY(x)
#define SCIP_DECL_BRANCHFREE(x)
struct SCIP_BranchruleData SCIP_BRANCHRULEDATA
enum SCIP_Result SCIP_RESULT
enum SCIP_Retcode SCIP_RETCODE