/** creates the random branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleRandom( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create random branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); branchruledata->seed = 0; /* include allfullstrong branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non-fundamental callbacks via specific setter functions*/ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyRandom) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreeRandom) ); SCIP_CALL( SCIPsetBranchruleInit(scip, branchrule, branchInitRandom) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpRandom) ); SCIP_CALL( SCIPsetBranchruleExecExt(scip, branchrule, branchExecextRandom) ); SCIP_CALL( SCIPsetBranchruleExecPs(scip, branchrule, branchExecpsRandom) ); SCIP_CALL( SCIPaddIntParam(scip, "branching/" BRANCHRULE_NAME "/seed", "initial random seed value", &branchruledata->initseed, FALSE, DEFAULT_INITSEED, 0, INT_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the nodereopt branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleNodereopt( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULE* branchrule; SCIP_BRANCHRULEDATA* branchruledata; assert(scip != NULL ); /* no branching rule data */ branchruledata = NULL; /* include nodereopt branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata)); assert(branchrule != NULL ); /* set non fundamental callbacks via setter functions */ SCIP_CALL(SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpnodereopt)); SCIP_CALL(SCIPsetBranchruleExecExt(scip, branchrule, branchExecextnodereopt)); SCIP_CALL(SCIPsetBranchruleExecPs(scip, branchrule, branchExecpsnodereopt)); return SCIP_OKAY; }
/** creates the multi-aggregated branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleStp( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create stp branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); branchruledata->lastcand = 0; /* include branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non fundamental callbacks via setter functions */ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyStp) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreeStp) ); SCIP_CALL( SCIPsetBranchruleInit(scip, branchrule, branchInitStp) ); SCIP_CALL( SCIPsetBranchruleExit(scip, branchrule, branchExitStp) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpStp) ); return SCIP_OKAY; }
/** creates the all variables full strong LP branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleAllfullstrong( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create allfullstrong branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); branchruledata->lastcand = 0; branchruledata->skipup = NULL; branchruledata->skipdown = NULL; /* include allfullstrong branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non-fundamental callbacks via specific setter functions*/ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyAllfullstrong) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreeAllfullstrong) ); SCIP_CALL( SCIPsetBranchruleInit(scip, branchrule, branchInitAllfullstrong) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpAllfullstrong) ); SCIP_CALL( SCIPsetBranchruleExecPs(scip, branchrule, branchExecpsAllfullstrong) ); return SCIP_OKAY; }
/** creates the myfullstrong branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleMyfullstrong( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create myfullstrong branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); /* TODO: (optional) create branching rule specific data here */ /* include branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non fundamental callbacks via setter functions */ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreeMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleInit(scip, branchrule, branchInitMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleExit(scip, branchrule, branchExitMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleExecPs(scip, branchrule, branchExecpsMyfullstrong) ); #if 0 SCIP_CALL( SCIPsetBranchruleInitsol(scip, branchrule, branchInitsolMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleExitsol(scip, branchrule, branchExitsolMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleExecExt(scip, branchrule, branchExecextMyfullstrong) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpMyfullstrong) ); #endif return SCIP_OKAY; }
/** creates the pseudo cost branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchrulePscost( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create pscost branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); /* include allfullstrong branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non-fundamental callbacks via specific setter functions*/ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyPscost) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreePscost) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpPscost) ); SCIP_CALL( SCIPsetBranchruleExecExt(scip, branchrule, branchExecextPscost) ); SCIP_CALL( SCIPaddCharParam(scip, "branching/"BRANCHRULE_NAME"/strategy", "strategy for utilizing pseudo-costs of external branching candidates (multiply as in pseudo costs 'u'pdate rule, or by 'd'omain reduction, or by domain reduction of 's'ibling, or by 'v'ariable score)", &branchruledata->strategy, FALSE, BRANCHRULE_STRATEGY_DEFAULT, BRANCHRULE_STRATEGIES, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/minscoreweight", "weight for minimum of scores of a branching candidate when building weighted sum of min/max/sum of scores", &branchruledata->scoreminweight, TRUE, BRANCHRULE_SCOREMINWEIGHT_DEFAULT, -SCIPinfinity(scip), SCIPinfinity(scip), NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/maxscoreweight", "weight for maximum of scores of a branching candidate when building weighted sum of min/max/sum of scores", &branchruledata->scoremaxweight, TRUE, BRANCHRULE_SCOREMAXWEIGHT_DEFAULT, -SCIPinfinity(scip), SCIPinfinity(scip), NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/sumscoreweight", "weight for sum of scores of a branching candidate when building weighted sum of min/max/sum of scores", &branchruledata->scoresumweight, TRUE, BRANCHRULE_SCORESUMWEIGHT_DEFAULT, -SCIPinfinity(scip), SCIPinfinity(scip), NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "branching/"BRANCHRULE_NAME"/nchildren", "number of children to create in n-ary branching", &branchruledata->nchildren, FALSE, BRANCHRULE_NCHILDREN_DEFAULT, 2, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "branching/"BRANCHRULE_NAME"/narymaxdepth", "maximal depth where to do n-ary branching, -1 to turn off", &branchruledata->narymaxdepth, FALSE, BRANCHRULE_NARYMAXDEPTH_DEFAULT, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/naryminwidth", "minimal domain width in children when doing n-ary branching, relative to global bounds", &branchruledata->naryminwidth, FALSE, BRANCHRULE_NARYMINWIDTH_DEFAULT, 0.0, 1.0, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/narywidthfactor", "factor of domain width in n-ary branching when creating nodes with increasing distance from branching value", &branchruledata->narywidthfactor, FALSE, BRANCHRULE_NARYWIDTHFAC_DEFAULT, 1.0, SCIP_REAL_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the inference history branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleInference( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create inference branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); /* include branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non-fundamental callbacks via specific setter functions*/ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyInference) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreeInference) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpInference) ); SCIP_CALL( SCIPsetBranchruleExecExt(scip, branchrule, branchExecextInference) ); SCIP_CALL( SCIPsetBranchruleExecPs(scip, branchrule, branchExecpsInference) ); /* inference branching rule parameters */ SCIP_CALL( SCIPaddRealParam(scip, "branching/inference/conflictweight", "weight in score calculations for conflict score", &branchruledata->conflictweight, TRUE, DEFAULT_CONFLICTWEIGHT, 0.0, SCIP_REAL_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/inference/inferenceweight", "weight in score calculations for inference score", &branchruledata->inferenceweight, TRUE, DEFAULT_INFERENCEWEIGHT, SCIP_REAL_MIN, SCIP_REAL_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/inference/cutoffweight", "weight in score calculations for cutoff score", &branchruledata->cutoffweight, TRUE, DEFAULT_CUTOFFWEIGHT, 0.0, SCIP_REAL_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "branching/inference/fractionals", "should branching on LP solution be restricted to the fractional variables?", &branchruledata->fractionals, TRUE, DEFAULT_FRACTIONALS, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "branching/inference/useweightedsum", "should a weighted sum of inference, conflict and cutoff weights be used?", &branchruledata->useweightedsum, FALSE, DEFAULT_USEWEIGHTEDSUM, NULL, NULL) ); /* inference branching rule parameters */ SCIP_CALL( SCIPaddRealParam(scip, "branching/inference/reliablescore", "weight in score calculations for conflict score", &branchruledata->reliablescore, TRUE, DEFAULT_RELIABLESCORE, 0.0, SCIP_REAL_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the least infeasible LP branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchruleLeastinf( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULE* branchrule; /* include branching rule */ branchrule = NULL; SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, NULL) ); assert(branchrule != NULL); SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyLeastinf) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpLeastinf) ); SCIP_CALL( SCIPsetBranchruleExecExt(scip, branchrule, branchExecextLeastinf) ); return SCIP_OKAY; }