/** includes event handler for best solution found */ SCIP_RETCODE SCIPincludeEventHdlrSofttimelimit( SCIP* scip /**< SCIP data structure */ ) { SCIP_EVENTHDLRDATA* eventhdlrdata; SCIP_EVENTHDLR* eventhdlr; SCIP_CALL( SCIPallocMemory(scip, &eventhdlrdata) ); eventhdlrdata->filterpos = -1; eventhdlr = NULL; /* create event handler for events on watched variables */ SCIP_CALL( SCIPincludeEventhdlrBasic(scip, &eventhdlr, EVENTHDLR_NAME, EVENTHDLR_DESC, eventExecSofttimelimit, eventhdlrdata) ); assert(eventhdlr != NULL); SCIP_CALL( SCIPsetEventhdlrCopy(scip, eventhdlr, eventCopySofttimelimit) ); SCIP_CALL( SCIPsetEventhdlrFree(scip, eventhdlr, eventFreeSofttimelimit) ); SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitSofttimelimit) ); SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitSofttimelimit) ); SCIP_CALL( SCIPaddRealParam(scip, "limits/softtime", "soft time limit which should be applied after first solution was found", &eventhdlrdata->softtimelimit, FALSE, -1.0, -1.0, SCIP_REAL_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** includes event handler for best solution found */ SCIP_RETCODE SCIPincludeEventHdlrBestsol( SCIP* scip /**< SCIP data structure */ ) { SCIP_EVENTHDLRDATA* eventhdlrdata; SCIP_EVENTHDLR* eventhdlr; eventhdlrdata = NULL; eventhdlr = NULL; /* create event handler for events on watched variables */ SCIP_CALL( SCIPincludeEventhdlrBasic(scip, &eventhdlr, EVENTHDLR_NAME, EVENTHDLR_DESC, eventExecBestsol, eventhdlrdata) ); assert(eventhdlr != NULL); SCIP_CALL( SCIPsetEventhdlrCopy(scip, eventhdlr, eventCopyBestsol) ); SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitBestsol) ); SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitBestsol) ); return SCIP_OKAY; }
/** 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; SCIP_SEPA* sepa; SCIP_EVENTHDLR* eventhdlr; /* create intobj separator data */ SCIP_CALL( sepadataCreate(scip, &sepadata) ); /* include separator */ SCIP_CALL( SCIPincludeSepaBasic(scip, &sepa, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaExeclpIntobj, sepaExecsolIntobj, sepadata) ); assert(sepa != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetSepaCopy(scip, sepa, sepaCopyIntobj) ); SCIP_CALL( SCIPsetSepaFree(scip, sepa, sepaFreeIntobj) ); SCIP_CALL( SCIPsetSepaExit(scip, sepa, sepaExitIntobj) ); SCIP_CALL( SCIPsetSepaExitsol(scip, sepa, sepaExitsolIntobj) ); /* include event handler for objective change events */ eventhdlr = NULL; eventhdlrdata = (SCIP_EVENTHDLRDATA*)sepadata; SCIP_CALL( SCIPincludeEventhdlrBasic(scip, &eventhdlr, EVENTHDLR_NAME, EVENTHDLR_DESC, eventExecIntobj, eventhdlrdata) ); assert(eventhdlr != NULL); SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitIntobj) ); SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitIntobj) ); return SCIP_OKAY; }
/** includes event handler for writing primal- and dualbound for all open nodes */ SCIP_RETCODE SCIPincludeEventHdlrBoundwriting( SCIP* scip /**< SCIP data structure */ ) { SCIP_EVENTHDLRDATA* eventhdlrdata; SCIP_EVENTHDLR* eventhdlr; /* create bounds reader data */ SCIP_CALL( SCIPallocMemory(scip, &eventhdlrdata) ); initEventhdlrdata(eventhdlrdata); eventhdlr = NULL; /* create event handler for events on watched variables */ SCIP_CALL( SCIPincludeEventhdlrBasic(scip, &eventhdlr, EVENTHDLR_NAME, EVENTHDLR_DESC, eventExecBoundwriting, eventhdlrdata) ); assert(eventhdlr != NULL); SCIP_CALL( SCIPsetEventhdlrCopy(scip, eventhdlr, eventCopyBoundwriting) ); SCIP_CALL( SCIPsetEventhdlrFree(scip, eventhdlr, eventFreeBoundwriting) ); SCIP_CALL( SCIPsetEventhdlrInit(scip, eventhdlr, eventInitBoundwriting) ); SCIP_CALL( SCIPsetEventhdlrExit(scip, eventhdlr, eventExitBoundwriting) ); /* add boundwriting parameters */ SCIP_CALL( SCIPaddLongintParam(scip, "eventhdlr/"EVENTHDLR_NAME"/freq", "in which frequency should all bounds be written(0: never)", &eventhdlrdata->freq, FALSE, DEFAULT_FREQ, 0LL, SCIP_LONGINT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddStringParam(scip, "eventhdlr/"EVENTHDLR_NAME"/filename", "filename to write all bounds to", &eventhdlrdata->filename, FALSE, DEFAULT_FILENAME, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "eventhdlr/"EVENTHDLR_NAME"/writesubmipdualbound", "should the dualbound of the submip-root which was created out of an open node be printed", &eventhdlrdata->writesubmipdualbound, FALSE, DEFAULT_WRITESUBMIPDUALBOUND, NULL, NULL) ); return SCIP_OKAY; }