/** depending on the LP's solution status, calls reduced cost or Farkas pricing method of variable pricer */ SCIP_RETCODE SCIPpricerExec( SCIP_PRICER* pricer, /**< variable pricer */ SCIP_SET* set, /**< global SCIP settings */ SCIP_PROB* prob, /**< transformed problem */ SCIP_LP* lp, /**< LP data */ SCIP_PRICESTORE* pricestore, /**< pricing storage */ SCIP_Real* lowerbound, /**< local lower bound computed by the pricer */ SCIP_RESULT* result /**< result of the pricing process */ ) { assert(pricer != NULL); assert(lowerbound != NULL); assert(result != NULL); /* set lowerbound and result pointer */ *lowerbound = - SCIPsetInfinity(set); *result = SCIP_SUCCESS; /* check if pricer should be delayed */ if( pricer->delay && SCIPpricestoreGetNVars(pricestore) > 0 ) return SCIP_OKAY; if( SCIPlpGetSolstat(lp) == SCIP_LPSOLSTAT_INFEASIBLE ) { SCIP_CALL( SCIPpricerFarkas(pricer, set, prob) ); } else { *result = SCIP_DIDNOTRUN; SCIP_CALL( SCIPpricerRedcost(pricer, set, prob, lowerbound, result) ); } return SCIP_OKAY; }
/** adds priced variables to the LP */ SCIP_RETCODE SCIPpricestoreApplyVars( SCIP_PRICESTORE* pricestore, /**< pricing storage */ BMS_BLKMEM* blkmem, /**< block memory buffers */ SCIP_SET* set, /**< global SCIP settings */ SCIP_STAT* stat, /**< dynamic problem statistics */ SCIP_EVENTQUEUE* eventqueue, /**< event queue */ SCIP_PROB* prob, /**< transformed problem after presolve */ SCIP_TREE* tree, /**< branch and bound tree */ SCIP_LP* lp /**< LP data */ ) { SCIP_VAR* var; SCIP_COL* col; int v; assert(pricestore != NULL); assert(pricestore->naddedbdviolvars <= pricestore->nbdviolvars); assert(set != NULL); assert(prob != NULL); assert(lp != NULL); assert(tree != NULL); assert(SCIPtreeIsFocusNodeLPConstructed(tree)); SCIPdebugMessage("adding %d variables (%d bound violated and %d priced vars) to %d LP columns\n", SCIPpricestoreGetNVars(pricestore), pricestore->nbdviolvars - pricestore->naddedbdviolvars, pricestore->nvars, SCIPlpGetNCols(lp)); /* add the variables with violated bounds to LP */ for( v = pricestore->naddedbdviolvars; v < pricestore->nbdviolvars; ++v ) { var = pricestore->bdviolvars[v]; assert(SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE || SCIPvarGetStatus(var) == SCIP_VARSTATUS_COLUMN); assert(SCIPvarGetProbindex(var) >= 0); assert(var->nuses >= 2); /* at least used in pricing storage and in problem */ if( SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE ) { /* transform loose variable into column variable */ SCIP_CALL( SCIPvarColumn(var, blkmem, set, stat, prob, lp) ); } assert(SCIPvarGetStatus(var) == SCIP_VARSTATUS_COLUMN); col = SCIPvarGetCol(var); assert(col != NULL); assert(col->lppos == -1); SCIPdebugMessage("adding bound violated variable <%s> (lb=%g, ub=%g)\n", SCIPvarGetName(var), pricestore->bdviolvarslb[v], pricestore->bdviolvarsub[v]); SCIP_CALL( SCIPlpAddCol(lp, set, col, SCIPtreeGetCurrentDepth(tree)) ); if( !pricestore->initiallp ) pricestore->nvarsapplied++; } pricestore->naddedbdviolvars = pricestore->nbdviolvars; /* add the selected pricing variables to LP */ for( v = 0; v < pricestore->nvars; ++v ) { var = pricestore->vars[v]; assert(SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE || SCIPvarGetStatus(var) == SCIP_VARSTATUS_COLUMN); assert(SCIPvarGetProbindex(var) >= 0); assert(var->nuses >= 2); /* at least used in pricing storage and in problem */ /* transform variable into column variable, if needed */ if( SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE ) { SCIP_CALL( SCIPvarColumn(var, blkmem, set, stat, prob, lp) ); } assert(SCIPvarGetStatus(var) == SCIP_VARSTATUS_COLUMN); col = SCIPvarGetCol(var); assert(col != NULL); assert(col->lppos == -1); SCIPdebugMessage("adding priced variable <%s> (score=%g)\n", SCIPvarGetName(var), pricestore->scores[v]); SCIP_CALL( SCIPlpAddCol(lp, set, col, SCIPtreeGetCurrentDepth(tree)) ); /* release the variable */ SCIP_CALL( SCIPvarRelease(&pricestore->vars[v], blkmem, set, eventqueue, lp) ); if( !pricestore->initiallp ) pricestore->nvarsapplied++; } /* clear the pricing storage */ pricestore->nvars = 0; return SCIP_OKAY; }