99#define SEPA_NAME "mixing"
100#define SEPA_DESC "mixing inequality separator"
101#define DEFAULT_MAXROUNDS -1
102#define DEFAULT_MAXROUNDSROOT -1
103#define SEPA_PRIORITY -50
105#define SEPA_MAXBOUNDDIST 1.0
106#define SEPA_USESSUBSCIP FALSE
107#define SEPA_DELAY FALSE
109#define DEFAULT_USELOCALBOUNDS FALSE
110#define DEFAULT_ISCUTSONINTS FALSE
111#define DEFAULT_MAXNUNSUCCESSFUL 10
116 SCIP_Bool uselocalbounds;
117 SCIP_Bool iscutsonints;
121 int maxnunsuccessful;
138 SCIP_Bool cutislocal,
169 for( v = 0; v < cutnnz; ++v )
232 SCIP_Real* vlbmixcoefs;
233 SCIP_Real* vlbmixsols;
234 SCIP_Real* vubmixcoefs;
235 SCIP_Real* vubmixsols;
276 if( firstvar ==
nvars )
297 SCIP_Real* vlbconsts;
300 SCIP_Real* vubconsts;
301 SCIP_Real maxabscoef;
307 SCIP_Bool islocallb =
FALSE;
308 SCIP_Bool islocalub =
FALSE;
309 SCIP_Bool cutislocal;
328 if( nvlb == 0 && nvub == 0 )
357 for( j = 0; j < nvlb; j++ )
363 tmplb = (vlbcoefs[j] > 0) ? vlbconsts[j] : (vlbconsts[j] + vlbcoefs[j]);
372 for( j = 0; j < nvlb; j++ )
377 SCIP_Real maxactivity;
380 maxactivity = (vlbcoefs[j] > 0) ? (vlbconsts[j] + vlbcoefs[j]) : vlbconsts[j];
386 if( vlbcoefs[j] > 0 )
388 coef = maxactivity - lb;
389 vlbmixsigns[vlbmixsize] = 0;
393 coef = lb - maxactivity;
394 vlbmixsigns[vlbmixsize] = 1;
398 vlbmixcoefs[vlbmixsize] =
REALABS(coef);
403 if( maxabscoef < vlbmixcoefs[vlbmixsize] )
405 maxabscoef = vlbmixcoefs[vlbmixsize];
406 maxabsind = vlbmixinds[vlbmixsize];
407 maxabssign = vlbmixsigns[vlbmixsize];
413 if( vlbmixsize >= nmaxvars )
417 assert( vlbmixsize <= nmaxvars );
420 if( vlbmixsize == 0 )
431 cutcoefs[cutnnz] = -1;
436 activity = -(varsolval - lb);
440 for( j = 0; j < vlbmixsize; j++ )
444 solval = vlbmixsols[j];
447 if( activity + solval * (maxabscoef - lastcoef) < 0.0 ||
SCIPisFeasZero(
scip, solval) )
456 activity += (vlbmixcoefs[j] - lastcoef) * solval;
459 cutcoefs[cutnnz] = lastcoef - vlbmixcoefs[j];
460 cutrhs -= vlbmixcoefs[j] - lastcoef;
463 cutcoefs[cutnnz] = vlbmixcoefs[j] - lastcoef;
464 cutinds[cutnnz++] = vlbmixinds[j];
465 lastcoef = vlbmixcoefs[j];
476 cutcoefs[cutnnz] = lastcoef - maxabscoef;
477 cutrhs -= maxabscoef - lastcoef;
480 cutcoefs[cutnnz] = maxabscoef - lastcoef;
481 cutinds[cutnnz++] = maxabsind;
483 assert( cutnnz <= nmaxvars + 1 );
517 for( j = 0; j < nvub; j++ )
523 tmpub = (vubcoefs[j] < 0) ? vubconsts[j] : (vubconsts[j] + vubcoefs[j]);
532 for( j = 0; j < nvub; j++ )
537 SCIP_Real minactivity;
540 minactivity = (vubcoefs[j] < 0) ? (vubconsts[j] + vubcoefs[j]) : vubconsts[j];
546 if( vubcoefs[j] > 0 )
548 coef = ub - minactivity;
549 vubmixsigns[vubmixsize] = 1;
553 coef = minactivity - ub;
554 vubmixsigns[vubmixsize] = 0;
557 vubmixcoefs[vubmixsize] =
REALABS(coef);
562 if( maxabscoef < vubmixcoefs[vubmixsize] )
564 maxabscoef = vubmixcoefs[vubmixsize];
565 maxabsind = vubmixinds[vubmixsize];
566 maxabssign = vubmixsigns[vubmixsize];
572 if( vubmixsize >= nmaxvars )
576 assert( vubmixsize <= nmaxvars );
579 if( vubmixsize == 0 )
591 cutcoefs[cutnnz] = 1;
596 activity = varsolval - ub;
599 for( j = 0; j < vubmixsize; j++ )
603 solval = vubmixsols[j];
606 if( activity + solval * (maxabscoef - lastcoef) < 0.0 ||
SCIPisFeasZero(
scip, solval) )
615 activity += (vubmixcoefs[j] - lastcoef) * solval;
618 cutcoefs[cutnnz] = lastcoef - vubmixcoefs[j];
619 cutrhs -= vubmixcoefs[j] - lastcoef;
622 cutcoefs[cutnnz] = vubmixcoefs[j] - lastcoef;
623 cutinds[cutnnz++] = vubmixinds[j];
624 lastcoef = vubmixcoefs[j];
635 cutcoefs[cutnnz] = lastcoef - maxabscoef;
636 cutrhs -= maxabscoef - lastcoef;
639 cutcoefs[cutnnz] = maxabscoef - lastcoef;
640 cutinds[cutnnz++] = maxabsind;
642 assert( cutnnz <= nmaxvars + 1 );
653 if( vlbmixsize == 0 || vubmixsize == 0 )
659 cutislocal = islocallb || islocalub;
660 for( j = 0; j < vlbmixsize; j++ )
664 solval = vlbmixsols[j];
670 for( k = 0; k < vubmixsize; k++ )
677 tmp = lb + vlbmixcoefs[j] + vubmixcoefs[k] - ub;
684 cutcoefs[0] = vlbmixsigns[j] ? -1.0 : 1.0;
685 cutcoefs[1] = vubmixsigns[k] ? -1.0 : 1.0;
686 cutinds[0] = vlbmixinds[j];
687 cutinds[1] = vubmixinds[k];
688 cutrhs = vlbmixsigns[j] ? (cutrhs - 1.0) : cutrhs;
689 cutrhs = vubmixsigns[k] ? (cutrhs - 1.0) : cutrhs;
886 sepaExeclpMixing, sepaExecSolMixing,
896 "Should local bounds be used?",
900 "Should general integer variables be used to generate cuts?",
904 "maximal number of mixing separation rounds per node (-1: unlimited)",
908 "maximal number of mixing separation rounds in the root node (-1: unlimited)",
912 "maximal number of consecutive unsuccessful iterations",
#define SCIP_LONGINT_FORMAT
int SCIPgetNIntVars(SCIP *scip)
int SCIPgetNImplVars(SCIP *scip)
SCIP_RETCODE SCIPgetVarsData(SCIP *scip, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars, int *nimplvars, int *ncontvars)
int SCIPgetNVars(SCIP *scip)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
int SCIPgetNBinVars(SCIP *scip)
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
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)
SCIP_RETCODE SCIPaddPoolCut(SCIP *scip, SCIP_ROW *row)
SCIP_Real SCIPgetCutEfficacy(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
SCIP_Bool SCIPisCutEfficacious(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
SCIP_Bool SCIPisEfficacious(SCIP *scip, SCIP_Real efficacy)
SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_RETCODE SCIPcacheRowExtensions(SCIP *scip, SCIP_ROW *row)
SCIP_RETCODE SCIPflushRowExtensions(SCIP *scip, SCIP_ROW *row)
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
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)
void SCIProwChgRank(SCIP_ROW *row, int rank)
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)
SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa,)
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
int SCIPsepaGetNCallsAtNode(SCIP_SEPA *sepa)
SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
SCIP_RETCODE SCIPsetSepaCopy(SCIP *scip, SCIP_SEPA *sepa,)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
SCIP_Longint SCIPgetNLPs(SCIP *scip)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
int SCIPvarGetNVlbs(SCIP_VAR *var)
SCIP_Real * SCIPvarGetVlbCoefs(SCIP_VAR *var)
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
int SCIPvarGetProbindex(SCIP_VAR *var)
SCIP_Real * SCIPvarGetVlbConstants(SCIP_VAR *var)
int SCIPvarGetNVubs(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_VAR ** SCIPvarGetVlbVars(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
SCIP_Real * SCIPvarGetVubConstants(SCIP_VAR *var)
SCIP_VAR ** SCIPvarGetVubVars(SCIP_VAR *var)
SCIP_Real * SCIPvarGetVubCoefs(SCIP_VAR *var)
SCIP_RETCODE SCIPincludeSepaMixing(SCIP *scip)
void SCIPsortDownRealRealIntInt(SCIP_Real *realarray1, SCIP_Real *realarray2, int *intarray1, int *intarray2, int len)
int SCIPsnprintf(char *t, int len, const char *s,...)
assert(minobj< SCIPgetCutoffbound(scip))
memory allocation routines
public methods for implications, variable bounds, and cliques
public methods for LP management
public methods for message output
public data structures and miscellaneous methods
public methods for separators
public methods for problem variables
public methods for branching rule plugins and branching
public methods for cuts and aggregation rows
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for separator plugins
public methods for solutions
public methods for querying solving statistics
public methods for the branch-and-bound tree
public methods for SCIP variables
static SCIP_RETCODE addCut(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_Real *cutcoefs, int *cutinds, int cutnnz, SCIP_Real cutrhs, SCIP_Bool cutislocal, SCIP_Bool *cutoff, int *ncuts)
#define DEFAULT_MAXNUNSUCCESSFUL
#define DEFAULT_MAXROUNDSROOT
static SCIP_RETCODE separateCuts(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_Bool *cutoff, int *ncuts)
#define DEFAULT_USELOCALBOUNDS
#define SEPA_MAXBOUNDDIST
#define DEFAULT_ISCUTSONINTS
#define DEFAULT_MAXROUNDS
enum SCIP_Retcode SCIP_RETCODE
struct SCIP_SepaData SCIP_SEPADATA
#define SCIP_DECL_SEPAEXECSOL(x)
#define SCIP_DECL_SEPAEXECLP(x)
#define SCIP_DECL_SEPAFREE(x)
#define SCIP_DECL_SEPACOPY(x)