/** execution method of event handler */ static SCIP_DECL_EVENTEXEC(eventExecAddedVar) { /*lint --e{715}*/ assert(eventhdlr != NULL); assert(strcmp(SCIPeventhdlrGetName(eventhdlr), EVENTHDLR_NAME) == 0); assert(event != NULL); assert(SCIPeventGetType(event) == SCIP_EVENTTYPE_VARADDED); SCIPdebugMessage("exec method of event handler for added variable to probdata\n"); /* add new variable to probdata */ SCIP_CALL( SCIPprobdataAddVar(scip, SCIPgetProbData(scip), SCIPeventGetVar(event)) ); return SCIP_OKAY; }
/** event execution method of distribution branching which handles bound change events of variables */ static SCIP_DECL_EVENTEXEC(eventExecDistribution) { SCIP_HEURDATA* heurdata; SCIP_EVENTHDLRDATA* eventhdlrdata; SCIP_VAR* var; assert(eventhdlr != NULL); eventhdlrdata = SCIPeventhdlrGetData(eventhdlr); assert(eventhdlrdata != NULL); heurdata = eventhdlrdata->heurdata; var = SCIPeventGetVar(event); /* add the variable to the queue of unprocessed variables; method itself ensures that every variable is added at most once */ heurdataAddBoundChangeVar(scip, heurdata, var); return SCIP_OKAY; }
/** execution method of objective change event handler */ static SCIP_DECL_EVENTEXEC(eventExecIntobj) { /*lint --e{715}*/ SCIP_EVENTHDLRDATA* eventhdlrdata; SCIP_SEPADATA* sepadata; SCIP_VAR* var; SCIP_Real objdelta; eventhdlrdata = SCIPeventhdlrGetData(eventhdlr); sepadata = (SCIP_SEPADATA*)eventhdlrdata; assert(sepadata != NULL); /* we don't have anything to do, if the objective value inequality doesn't yet exist */ if( sepadata->objrow == NULL ) return SCIP_OKAY; var = SCIPeventGetVar(event); switch( SCIPeventGetType(event) ) { case SCIP_EVENTTYPE_VARADDED: SCIPdebugMessage("variable <%s> with obj=%g was added to the problem\n", SCIPvarGetName(var), SCIPvarGetObj(var)); objdelta = SCIPvarGetObj(var); if( !SCIPisZero(scip, objdelta) ) { SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, var, SCIPvarGetObj(var)) ); } break; case SCIP_EVENTTYPE_OBJCHANGED: SCIPdebugMessage("variable <%s> changed objective value from %g to %g\n", SCIPvarGetName(var), SCIPeventGetOldobj(event), SCIPeventGetNewobj(event)); objdelta = SCIPeventGetNewobj(event) - SCIPeventGetOldobj(event); SCIP_CALL( SCIPaddVarToRow(scip, sepadata->objrow, var, objdelta) ); break; default: SCIPerrorMessage("invalid event type %x\n", SCIPeventGetType(event)); return SCIP_INVALIDDATA; } return SCIP_OKAY; }
/** execution method of event handler */ static SCIP_DECL_EVENTEXEC(eventExecProbdatavardeleted) { SCIP_VAR* var; SCIP_PROBDATA* probdata; int idx; assert(SCIPeventGetType(event) == SCIP_EVENTTYPE_VARDELETED); var = SCIPeventGetVar(event); probdata = (SCIP_PROBDATA*) eventdata; assert(probdata != NULL); assert(var != NULL); /* get index of variable in stablesets array */ idx = (int)(size_t) SCIPvarGetData(var); SCIPdebugMessage("remove variable %s [%d] from list of stable sets\n", SCIPvarGetName(var), idx); assert(probdata->stablesetvars[idx] == var); /* remove variable from stablesets array and release it */ SCIPfreeBlockMemoryArray(scip, &(probdata->stablesets[idx]), probdata->stablesetlengths[idx]); /*lint !e866*/ SCIP_CALL( SCIPreleaseVar(scip, &(probdata->stablesetvars[idx])) ); /* move all subsequent variables to the front */ for( ; idx < probdata->nstablesets - 1; idx++) { probdata->stablesets[idx] = probdata->stablesets[idx + 1]; probdata->stablesetlengths[idx] = probdata->stablesetlengths[idx + 1]; probdata->stablesetvars[idx] = probdata->stablesetvars[idx + 1]; SCIPvarSetData(probdata->stablesetvars[idx], (SCIP_VARDATA*) (size_t) idx); /*lint !e571*/ } probdata->nstablesets--; return SCIP_OKAY; }/*lint !e715*/