/** creates the integer objective value separator and includes it in SCIP */ SCIP_RETCODE SCIPincludeSepaIntobj( SCIP* scip /**< SCIP data structure */ ) { SCIP_SEPADATA* sepadata; SCIP_EVENTHDLRDATA* eventhdlrdata; /* create intobj separator data */ SCIP_CALL( sepadataCreate(scip, &sepadata) ); /* include separator */ SCIP_CALL( SCIPincludeSepa(scip, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaCopyIntobj, sepaFreeIntobj, sepaInitIntobj, sepaExitIntobj, sepaInitsolIntobj, sepaExitsolIntobj, sepaExeclpIntobj, sepaExecsolIntobj, sepadata) ); /* include event handler for objective change events */ eventhdlrdata = (SCIP_EVENTHDLRDATA*)sepadata; SCIP_CALL( SCIPincludeEventhdlr(scip, EVENTHDLR_NAME, EVENTHDLR_DESC, NULL, eventFreeIntobj, eventInitIntobj, eventExitIntobj, eventInitsolIntobj, eventExitsolIntobj, eventDeleteIntobj, eventExecIntobj, eventhdlrdata) ); return SCIP_OKAY; }
/** creates the xyz separator and includes it in SCIP */ SCIP_RETCODE SCIPincludeSepaXyz( SCIP* scip /**< SCIP data structure */ ) { SCIP_SEPADATA* sepadata; SCIP_SEPA* sepa; /* create xyz separator data */ sepadata = NULL; /* TODO: (optional) create separator specific data here */ sepa = NULL; /* include separator */ #if 0 /* use SCIPincludeSepa() if you want to set all callbacks explicitly and realize (by getting compiler errors) when * new callbacks are added in future SCIP versions */ SCIP_CALL( SCIPincludeSepa(scip, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaCopyXyz, sepaFreeXyz, sepaInitXyz, sepaExitXyz, sepaInitsolXyz, sepaExitsolXyz, sepaExeclpXyz, sepaExecsolXyz, sepadata) ); #else /* use SCIPincludeSepaBasic() plus setter functions if you want to set callbacks one-by-one and your code should * compile independent of new callbacks being added in future SCIP versions */ SCIP_CALL( SCIPincludeSepaBasic(scip, &sepa, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaExeclpXyz, sepaExecsolXyz, sepadata) ); assert(sepa != NULL); /* set non fundamental callbacks via setter functions */ SCIP_CALL( SCIPsetSepaCopy(scip, sepa, sepaCopyXyz) ); SCIP_CALL( SCIPsetSepaFree(scip, sepa, sepaFreeXyz) ); SCIP_CALL( SCIPsetSepaInit(scip, sepa, sepaInitXyz) ); SCIP_CALL( SCIPsetSepaExit(scip, sepa, sepaExitXyz) ); SCIP_CALL( SCIPsetSepaInitsol(scip, sepa, sepaInitsolXyz) ); SCIP_CALL( SCIPsetSepaExitsol(scip, sepa, sepaExitsolXyz) ); #endif /* add xyz separator parameters */ /* TODO: (optional) add separator specific parameters with SCIPaddTypeParam() here */ return SCIP_OKAY; }
/** creates the Strong CG cut separator and includes it in SCIP */ SCIP_RETCODE SCIPincludeSepaStrongcg( SCIP* scip /**< SCIP data structure */ ) { SCIP_SEPADATA* sepadata; /* create separator data */ SCIP_CALL( SCIPallocMemory(scip, &sepadata) ); sepadata->lastncutsfound = 0; /* include separator */ SCIP_CALL( SCIPincludeSepa(scip, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaCopyStrongcg, sepaFreeStrongcg, sepaInitStrongcg, sepaExitStrongcg, sepaInitsolStrongcg, sepaExitsolStrongcg, sepaExeclpStrongcg, sepaExecsolStrongcg, sepadata) ); /* add separator parameters */ SCIP_CALL( SCIPaddIntParam(scip, "separating/strongcg/maxrounds", "maximal number of strong CG separation rounds per node (-1: unlimited)", &sepadata->maxrounds, FALSE, DEFAULT_MAXROUNDS, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/strongcg/maxroundsroot", "maximal number of strong CG separation rounds in the root node (-1: unlimited)", &sepadata->maxroundsroot, FALSE, DEFAULT_MAXROUNDSROOT, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/strongcg/maxsepacuts", "maximal number of strong CG cuts separated per separation round", &sepadata->maxsepacuts, FALSE, DEFAULT_MAXSEPACUTS, 0, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/strongcg/maxsepacutsroot", "maximal number of strong CG cuts separated per separation round in the root node", &sepadata->maxsepacutsroot, FALSE, DEFAULT_MAXSEPACUTSROOT, 0, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "separating/strongcg/maxweightrange", "maximal valid range max(|weights|)/min(|weights|) of row weights", &sepadata->maxweightrange, TRUE, DEFAULT_MAXWEIGHTRANGE, 1.0, SCIP_REAL_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/strongcg/dynamiccuts", "should generated cuts be removed from the LP if they are no longer tight?", &sepadata->dynamiccuts, FALSE, DEFAULT_DYNAMICCUTS, NULL, NULL) ); return SCIP_OKAY; }
/** creates the closecuts separator and includes it in SCIP */ SCIP_RETCODE SCIPincludeSepaClosecuts( SCIP* scip /**< SCIP data structure */ ) { SCIP_SEPADATA* sepadata; /* create closecuts separator data */ SCIP_CALL( SCIPallocMemory(scip, &sepadata) ); sepadata->sepasol = NULL; sepadata->discardnode = -1; sepadata->nunsuccessful = 0; /* include separator */ SCIP_CALL( SCIPincludeSepa(scip, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaCopyClosecuts, sepaFreeClosecuts, sepaInitClosecuts, sepaExitClosecuts, sepaInitsolClosecuts, sepaExitsolClosecuts, sepaExeclpClosecuts, sepaExecsolClosecuts, sepadata) ); /* add closecuts separator parameters */ SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/separelint", "generate close cuts w.r.t. relative interior point (best solution otherwise)?", &sepadata->separelint, TRUE, SCIP_DEFAULT_SEPARELINT, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "separating/closecuts/sepacombvalue", "convex combination value for close cuts", &sepadata->sepacombvalue, TRUE, SCIP_DEFAULT_SEPACOMBVALUE, 0.0, 1.0, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/separootonly", "generate close cuts in the root only?", &sepadata->separootonly, TRUE, SCIP_DEFAULT_SEPAROOTONLY, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/closecuts/closethres", "threshold on number of generated cuts below which the ordinary separation is started", &sepadata->sepathreshold, TRUE, SCIP_DEFAULT_SEPATHRESHOLD, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/inclobjcutoff", "include an objective cutoff when computing the relative interior?", &sepadata->inclobjcutoff, TRUE, SCIP_DEFAULT_INCLOBJCUTOFF, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/recomputerelint", "recompute relative interior point in each separation call?", &sepadata->recomputerelint, TRUE, SCIP_DEFAULT_RECOMPUTERELINT, NULL, NULL) ); SCIP_CALL( SCIPaddCharParam(scip, "separating/closecuts/relintnormtype", "type of norm to use when computing relative interior: 'o'ne norm, 's'upremum norm", &sepadata->relintnormtype, TRUE, SCIP_DEFAULT_RELINTNORMTYPE, "os", NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/closecuts/maxunsuccessful", "turn off separation in current node after unsuccessful calls (-1 never turn off)", &sepadata->maxunsuccessful, TRUE, SCIP_DEFAULT_MAXUNSUCCESSFUL, -1, INT_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the rapidlearning separator and includes it in SCIP */ SCIP_RETCODE SCIPincludeSepaRapidlearning( SCIP* scip /**< SCIP data structure */ ) { SCIP_SEPADATA* sepadata; /* create rapidlearning separator data */ SCIP_CALL( SCIPallocMemory(scip, &sepadata) ); /* include separator */ SCIP_CALL( SCIPincludeSepa(scip, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaCopyRapidlearning, sepaFreeRapidlearning, sepaInitRapidlearning, sepaExitRapidlearning, sepaInitsolRapidlearning, sepaExitsolRapidlearning, sepaExeclpRapidlearning, sepaExecsolRapidlearning, sepadata) ); /* add rapidlearning separator parameters */ SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/applyconflicts", "should the found conflicts be applied in the original SCIP?", &sepadata->applyconflicts, TRUE, DEFAULT_APPLYCONFLICTS, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/applybdchgs", "should the found global bound deductions be applied in the original SCIP?", &sepadata->applybdchgs, TRUE, DEFAULT_APPLYBDCHGS, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/applyinfervals", "should the inference values be used as initialization in the original SCIP?", &sepadata->applyinfervals, TRUE, DEFAULT_APPLYINFERVALS, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/reducedinfer", "should the inference values only be used when "SEPA_NAME" found other reductions?", &sepadata->reducedinfer, TRUE, DEFAULT_REDUCEDINFER, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/applyprimalsol", "should the incumbent solution be copied to the original SCIP?", &sepadata->applyprimalsol, TRUE, DEFAULT_APPLYPRIMALSOL, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/applysolved", "should a solved status be copied to the original SCIP?", &sepadata->applysolved, TRUE, DEFAULT_APPLYSOLVED, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/contvars", "should rapid learning be applied when there are continuous variables?", &sepadata->contvars, TRUE, DEFAULT_CONTVARS, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "separating/"SEPA_NAME"/contvarsquot", "maximal portion of continuous variables to apply rapid learning", &sepadata->contvarsquot, TRUE, DEFAULT_CONTVARSQUOT, 0.0, 1.0, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "separating/"SEPA_NAME"/lpiterquot", "maximal fraction of LP iterations compared to node LP iterations", &sepadata->lpiterquot, TRUE, DEFAULT_LPITERQUOT, 0.0, SCIP_REAL_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/"SEPA_NAME"/maxnvars", "maximum problem size (variables) for which rapid learning will be called", &sepadata->maxnvars, TRUE, DEFAULT_MAXNVARS, 0, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/"SEPA_NAME"/maxnconss", "maximum problem size (constraints) for which rapid learning will be called", &sepadata->maxnconss, TRUE, DEFAULT_MAXNCONSS, 0, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/"SEPA_NAME"/maxnodes", "maximum number of nodes considered in rapid learning run", &sepadata->maxnodes, TRUE, DEFAULT_MAXNODES, 0, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/"SEPA_NAME"/minnodes", "minimum number of nodes considered in rapid learning run", &sepadata->minnodes, TRUE, DEFAULT_MINNODES, 0, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/"SEPA_NAME"/copycuts", "should all active cuts from cutpool be copied to constraints in subproblem?", &sepadata->copycuts, TRUE, DEFAULT_COPYCUTS, NULL, NULL) ); return SCIP_OKAY; }