31 #define SEPA_NAME "impliedbounds" 32 #define SEPA_DESC "implied bounds separator" 33 #define SEPA_PRIORITY -50 35 #define SEPA_MAXBOUNDDIST 1.0 36 #define SEPA_USESSUBSCIP FALSE 37 #define SEPA_DELAY FALSE 39 #define RELCUTCOEFMAXRANGE 1.0 40 #define DEFAULT_USETWOSIZECLIQUES TRUE 70 assert(ncuts != NULL);
71 assert(cutoff != NULL);
75 activity = val1 * solval1 + val2 * solval2;
96 SCIPdebugMsg(scip,
" -> found cut (activity = %g): ", activity);
129 assert(solvals != NULL);
130 assert(fracvars != NULL || nfracs == 0);
131 assert(fracvals != NULL || nfracs == 0);
132 assert(cutoff != NULL);
133 assert(ncuts != NULL);
138 assert(sepadata != NULL);
140 SCIPdebugMsg(scip,
"searching for implied bound cuts\n");
143 for( i = 0; i < nfracs; i++ )
151 assert(fracvars != NULL);
152 assert(fracvals != NULL);
171 for( j = 0; j < nimpl; j++ )
175 assert(implvars != NULL);
176 assert(impltypes != NULL);
177 assert(implbounds != NULL);
195 SCIP_CALL(
addCut(scip, sepa, 1.0, implvars[j], solval, (ub - implbounds[j]), fracvars[i], fracvals[i],
196 ub, cutoff, ncuts) );
213 SCIP_CALL(
addCut(scip, sepa, -1.0, implvars[j], solval, (implbounds[j] - lb), fracvars[i], fracvals[i],
214 -lb, cutoff, ncuts) );
234 for( j = 0; j < nimpl; j++ )
254 SCIP_CALL(
addCut(scip, sepa, 1.0, implvars[j], solval, (implbounds[j] - ub), fracvars[i], fracvals[i],
255 implbounds[j], cutoff, ncuts) );
272 SCIP_CALL(
addCut(scip, sepa, -1.0, implvars[j], solval, (lb - implbounds[j]), fracvars[i], fracvals[i],
273 -implbounds[j], cutoff, ncuts) );
282 if( ! sepadata->usetwosizecliques )
295 for( i = 0; i < ncliques; ++i )
312 assert(clqvars[0] != clqvars[1]);
332 clqvals[0] ? 1.0 : -1.0, clqvars[0],
SCIPgetSolVal(scip, sol, clqvars[0]),
333 clqvals[1] ? 1.0 : -1.0, clqvars[1],
SCIPgetSolVal(scip, sol, clqvars[1]),
334 rhs, cutoff, ncuts) );
353 assert(
scip != NULL);
354 assert(sepa != NULL);
369 assert(
scip != NULL);
370 assert(sepa != NULL);
375 assert(sepadata != NULL);
399 assert(sepa != NULL);
400 assert(
scip != NULL);
425 else if ( ncuts > 0 )
452 assert(sepa != NULL);
453 assert(
scip != NULL);
470 for( i = 0; i < nbinvars; ++i )
474 fracvars[nfracs] = vars[i];
475 fracvals[nfracs] = solvals[i];
492 else if ( ncuts > 0 )
520 assert(sepadata != NULL);
525 sepaExeclpImpliedbounds, sepaExecsolImpliedbounds,
527 assert(sepa != NULL);
535 "should violated inequalities for cliques with 2 variables be separated?",
SCIP_RETCODE SCIPgetLPBranchCands(SCIP *scip, SCIP_VAR ***lpcands, SCIP_Real **lpcandssol, SCIP_Real **lpcandsfrac, int *nlpcands, int *npriolpcands, int *nfracimplvars)
enum SCIP_BoundType SCIP_BOUNDTYPE
static SCIP_DECL_SEPAEXECLP(sepaExeclpImpliedbounds)
SCIP_Real SCIPfeastol(SCIP *scip)
SCIP_VAR ** SCIPcliqueGetVars(SCIP_CLIQUE *clique)
SCIP_RETCODE SCIPcacheRowExtensions(SCIP *scip, SCIP_ROW *row)
SCIP_RETCODE SCIPflushRowExtensions(SCIP *scip, SCIP_ROW *row)
static SCIP_DECL_SEPAFREE(sepaFreeImpliedbounds)
#define SEPA_MAXBOUNDDIST
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPgetVarsData(SCIP *scip, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars, int *nimplvars, int *ncontvars)
SCIP_Real SCIPinfinity(SCIP *scip)
int SCIPsnprintf(char *t, int len, const char *s,...)
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
enum SCIP_Retcode SCIP_RETCODE
SCIP_Bool SCIPcliqueIsEquation(SCIP_CLIQUE *clique)
int SCIPvarGetProbindex(SCIP_VAR *var)
#define SCIPfreeBlockMemory(scip, ptr)
static SCIP_RETCODE addCut(SCIP *scip, SCIP_SEPA *sepa, SCIP_Real val1, SCIP_VAR *var1, SCIP_Real solval1, SCIP_Real val2, SCIP_VAR *var2, SCIP_Real solval2, SCIP_Real rhs, SCIP_Bool *cutoff, int *ncuts)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_RETCODE SCIPsetSepaCopy(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPACOPY((*sepacopy)))
#define DEFAULT_USETWOSIZECLIQUES
SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPgetSolVals(SCIP *scip, SCIP_SOL *sol, int nvars, SCIP_VAR **vars, SCIP_Real *vals)
SCIP_RETCODE SCIPincludeSepaImpliedbounds(SCIP *scip)
SCIP_Bool SCIPisEfficacious(SCIP *scip, SCIP_Real efficacy)
void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
#define RELCUTCOEFMAXRANGE
static SCIP_DECL_SEPAEXECSOL(sepaExecsolImpliedbounds)
SCIP_RETCODE SCIPincludeSepaBasic(SCIP *scip, SCIP_SEPA **sepa, const char *name, const char *desc, int priority, int freq, SCIP_Real maxbounddist, SCIP_Bool usessubscip, SCIP_Bool delay, SCIP_DECL_SEPAEXECLP((*sepaexeclp)), SCIP_DECL_SEPAEXECSOL((*sepaexecsol)), SCIP_SEPADATA *sepadata)
#define SCIPallocBufferArray(scip, ptr, num)
public data structures and miscellaneous methods
SCIP_BOUNDTYPE * SCIPvarGetImplTypes(SCIP_VAR *var, SCIP_Bool varfixing)
int SCIPvarGetNImpls(SCIP_VAR *var, SCIP_Bool varfixing)
SCIP_RETCODE SCIPaddPoolCut(SCIP *scip, SCIP_ROW *row)
SCIP_Bool * SCIPcliqueGetValues(SCIP_CLIQUE *clique)
SCIP_RETCODE SCIPcreateEmptyRowSepa(SCIP *scip, SCIP_ROW **row, SCIP_SEPA *sepa, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
SCIP_Real * SCIPvarGetImplBounds(SCIP_VAR *var, SCIP_Bool varfixing)
SCIP_VAR ** SCIPvarGetImplVars(SCIP_VAR *var, SCIP_Bool varfixing)
SCIP_CLIQUE ** SCIPgetCliques(SCIP *scip)
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa, SCIP_DECL_SEPAFREE((*sepafree)))
SCIP_RETCODE SCIPgetVarSols(SCIP *scip, int nvars, SCIP_VAR **vars, SCIP_Real *vals)
void SCIProwChgRank(SCIP_ROW *row, int rank)
static SCIP_DECL_SEPACOPY(sepaCopyImpliedbounds)
int SCIPgetNCliques(SCIP *scip)
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
int SCIPcliqueGetNVars(SCIP_CLIQUE *clique)
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
SCIP_RETCODE SCIPcleanupCliques(SCIP *scip, SCIP_Bool *infeasible)
SCIP_Longint SCIPgetNLPs(SCIP *scip)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
struct SCIP_SepaData SCIP_SEPADATA
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
static SCIP_RETCODE separateCuts(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_Real *solvals, SCIP_VAR **fracvars, SCIP_Real *fracvals, int nfracs, SCIP_Bool *cutoff, int *ncuts)