/** applies an upper bound change */ static SCIP_RETCODE sepastoreApplyUb( SCIP_SEPASTORE* sepastore, /**< separation storage */ BMS_BLKMEM* blkmem, /**< block memory */ SCIP_SET* set, /**< global SCIP settings */ SCIP_STAT* stat, /**< problem statistics */ SCIP_TREE* tree, /**< branch and bound tree */ SCIP_LP* lp, /**< LP data */ SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */ SCIP_EVENTQUEUE* eventqueue, /**< event queue */ SCIP_VAR* var, /**< problem variable */ SCIP_Real bound, /**< new upper bound of variable */ SCIP_Bool* cutoff /**< pointer to store TRUE, if an infeasibility has been detected */ ) { assert(sepastore != NULL); assert(cutoff != NULL); if( SCIPsetIsLT(set, bound, SCIPvarGetUbLocal(var)) ) { SCIPdebugMessage(" -> applying bound change: <%s>: [%g,%g] -> [%g,%g]\n", SCIPvarGetName(var), SCIPvarGetLbLocal(var), SCIPvarGetUbLocal(var), SCIPvarGetLbLocal(var), bound); if( SCIPsetIsFeasGE(set, bound, SCIPvarGetLbLocal(var)) ) { SCIP_CALL( SCIPnodeAddBoundchg(SCIPtreeGetCurrentNode(tree), blkmem, set, stat, tree, lp, branchcand, eventqueue, var, bound, SCIP_BOUNDTYPE_UPPER, FALSE) ); } else *cutoff = TRUE; if( !sepastore->initiallp ) sepastore->ncutsapplied++; } return SCIP_OKAY; }
/** depending on the current memory usage, switches mode flag to standard or memory saving mode */ void SCIPstatUpdateMemsaveMode( SCIP_STAT* stat, /**< problem statistics data */ SCIP_SET* set, /**< global SCIP settings */ SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */ SCIP_MEM* mem /**< block memory pools */ ) { assert(stat != NULL); assert(set != NULL); if( SCIPsetIsLT(set, set->mem_savefac, 1.0) ) { SCIP_Longint memused; memused = SCIPmemGetUsed(mem); if( !stat->memsavemode && memused >= set->mem_savefac * set->limit_memory * 1024.0 * 1024.0 ) { /* switch to memory saving mode */ SCIPmessagePrintVerbInfo(messagehdlr, set->disp_verblevel, SCIP_VERBLEVEL_HIGH, "(node %"SCIP_LONGINT_FORMAT") switching to memory saving mode (mem: %.1fM/%.1fM)\n", stat->nnodes, (SCIP_Real)memused/(1024.0*1024.0), set->limit_memory); stat->memsavemode = TRUE; set->nodesel = NULL; } else if( stat->memsavemode && memused < 0.5 * set->mem_savefac * set->limit_memory * 1024.0 * 1024.0 ) { /* switch to standard mode */ SCIPmessagePrintVerbInfo(messagehdlr, set->disp_verblevel, SCIP_VERBLEVEL_HIGH, "(node %"SCIP_LONGINT_FORMAT") switching to standard mode (mem: %.1fM/%.1fM)\n", stat->nnodes, (SCIP_Real)memused/(1024.0*1024.0), set->limit_memory); stat->memsavemode = FALSE; set->nodesel = NULL; } } else stat->memsavemode = FALSE; }
/** checks whether given conflict is valid for the debugging solution */ SCIP_RETCODE SCIPdebugCheckConflict( BMS_BLKMEM* blkmem, /**< block memory */ SCIP_SET* set, /**< global SCIP settings */ SCIP_NODE* node, /**< node where the conflict clause is added */ SCIP_BDCHGINFO** bdchginfos, /**< bound change informations of the conflict set */ int nbdchginfos /**< number of bound changes in the conflict set */ ) { SCIP_Real solval; SCIP_Bool solcontained; int i; assert(set != NULL); assert(blkmem != NULL); assert(node != NULL); assert(nbdchginfos == 0 || bdchginfos != NULL); /* check if we are in the original problem and not in a sub MIP */ if( !isSolutionInMip(set) ) return SCIP_OKAY; /* check if the incumbent solution is at least as good as the debug solution, so we can stop to check the debug solution */ if( debugSolIsAchieved(set) ) return SCIP_OKAY; /* check whether the debugging solution is contained in the local subproblem */ SCIP_CALL( isSolutionInNode(blkmem, set, node, &solcontained) ); if( !solcontained ) return SCIP_OKAY; /* check, whether at least one literals is TRUE in the debugging solution */ for( i = 0; i < nbdchginfos; ++i ) { SCIP_VAR* var; SCIP_Real newbound; var = SCIPbdchginfoGetVar(bdchginfos[i]); newbound = SCIPbdchginfoGetNewbound(bdchginfos[i]); SCIP_CALL( getSolutionValue(set, var, &solval) ); if( solval == SCIP_UNKNOWN ) /*lint !e777*/ return SCIP_OKAY; if( SCIPbdchginfoGetBoundtype(bdchginfos[i]) == SCIP_BOUNDTYPE_LOWER ) { if( SCIPvarGetType(var) == SCIP_VARTYPE_CONTINUOUS ) { if( SCIPsetIsLE(set, solval, newbound) ) return SCIP_OKAY; } else { if( SCIPsetIsLT(set, solval, newbound) ) return SCIP_OKAY; } } else { if( SCIPvarGetType(var) == SCIP_VARTYPE_CONTINUOUS ) { if( SCIPsetIsGE(set, solval, newbound) ) return SCIP_OKAY; } else { if( SCIPsetIsGT(set, solval, newbound) ) return SCIP_OKAY; } } } SCIPerrorMessage("invalid conflict set:"); for( i = 0; i < nbdchginfos; ++i ) { SCIP_CALL( getSolutionValue(set, SCIPbdchginfoGetVar(bdchginfos[i]), &solval) ); printf(" <%s>[%.15g] %s %g", SCIPvarGetName(SCIPbdchginfoGetVar(bdchginfos[i])), solval, SCIPbdchginfoGetBoundtype(bdchginfos[i]) == SCIP_BOUNDTYPE_LOWER ? ">=" : "<=", SCIPbdchginfoGetNewbound(bdchginfos[i])); } printf("\n"); SCIPABORT(); return SCIP_OKAY; /*lint !e527*/ }