98#define SEPA_NAME "mixing"
99#define SEPA_DESC "mixing inequality separator"
100#define DEFAULT_MAXROUNDS -1
101#define DEFAULT_MAXROUNDSROOT -1
102#define SEPA_PRIORITY -50
104#define SEPA_MAXBOUNDDIST 1.0
105#define SEPA_USESSUBSCIP FALSE
106#define SEPA_DELAY FALSE
108#define DEFAULT_USELOCALBOUNDS FALSE
109#define DEFAULT_ISCUTSONINTS FALSE
110#define DEFAULT_MAXNUNSUCCESSFUL 10
120 int maxnunsuccessful;
168 for( v = 0; v < cutnnz; ++v )
275 if( firstvar ==
nvars )
327 if( nvlb == 0 && nvub == 0 )
356 for( j = 0; j < nvlb; j++ )
362 tmplb = (vlbcoefs[j] > 0) ? vlbconsts[j] : (vlbconsts[j] + vlbcoefs[j]);
371 for( j = 0; j < nvlb; j++ )
379 maxactivity = (vlbcoefs[j] > 0) ? (vlbconsts[j] + vlbcoefs[j]) : vlbconsts[j];
385 if( vlbcoefs[j] > 0 )
387 coef = maxactivity - lb;
388 vlbmixsigns[vlbmixsize] = 0;
392 coef = lb - maxactivity;
393 vlbmixsigns[vlbmixsize] = 1;
397 vlbmixcoefs[vlbmixsize] =
REALABS(coef);
402 if( maxabscoef < vlbmixcoefs[vlbmixsize] )
404 maxabscoef = vlbmixcoefs[vlbmixsize];
405 maxabsind = vlbmixinds[vlbmixsize];
406 maxabssign = vlbmixsigns[vlbmixsize];
412 if( vlbmixsize >= nmaxvars )
416 assert( vlbmixsize <= nmaxvars );
419 if( vlbmixsize == 0 )
430 cutcoefs[cutnnz] = -1;
435 activity = -(varsolval - lb);
439 for( j = 0; j < vlbmixsize; j++ )
443 solval = vlbmixsols[j];
446 if( activity + solval * (maxabscoef - lastcoef) < 0.0 ||
SCIPisFeasZero(
scip, solval) )
455 activity += (vlbmixcoefs[j] - lastcoef) * solval;
458 cutcoefs[cutnnz] = lastcoef - vlbmixcoefs[j];
459 cutrhs -= vlbmixcoefs[j] - lastcoef;
462 cutcoefs[cutnnz] = vlbmixcoefs[j] - lastcoef;
463 cutinds[cutnnz++] = vlbmixinds[j];
464 lastcoef = vlbmixcoefs[j];
475 cutcoefs[cutnnz] = lastcoef - maxabscoef;
476 cutrhs -= maxabscoef - lastcoef;
479 cutcoefs[cutnnz] = maxabscoef - lastcoef;
480 cutinds[cutnnz++] = maxabsind;
482 assert( cutnnz <= nmaxvars + 1 );
516 for( j = 0; j < nvub; j++ )
522 tmpub = (vubcoefs[j] < 0) ? vubconsts[j] : (vubconsts[j] + vubcoefs[j]);
531 for( j = 0; j < nvub; j++ )
539 minactivity = (vubcoefs[j] < 0) ? (vubconsts[j] + vubcoefs[j]) : vubconsts[j];
545 if( vubcoefs[j] > 0 )
547 coef = ub - minactivity;
548 vubmixsigns[vubmixsize] = 1;
552 coef = minactivity - ub;
553 vubmixsigns[vubmixsize] = 0;
556 vubmixcoefs[vubmixsize] =
REALABS(coef);
561 if( maxabscoef < vubmixcoefs[vubmixsize] )
563 maxabscoef = vubmixcoefs[vubmixsize];
564 maxabsind = vubmixinds[vubmixsize];
565 maxabssign = vubmixsigns[vubmixsize];
571 if( vubmixsize >= nmaxvars )
575 assert( vubmixsize <= nmaxvars );
578 if( vubmixsize == 0 )
590 cutcoefs[cutnnz] = 1;
595 activity = varsolval - ub;
598 for( j = 0; j < vubmixsize; j++ )
602 solval = vubmixsols[j];
605 if( activity + solval * (maxabscoef - lastcoef) < 0.0 ||
SCIPisFeasZero(
scip, solval) )
614 activity += (vubmixcoefs[j] - lastcoef) * solval;
617 cutcoefs[cutnnz] = lastcoef - vubmixcoefs[j];
618 cutrhs -= vubmixcoefs[j] - lastcoef;
621 cutcoefs[cutnnz] = vubmixcoefs[j] - lastcoef;
622 cutinds[cutnnz++] = vubmixinds[j];
623 lastcoef = vubmixcoefs[j];
634 cutcoefs[cutnnz] = lastcoef - maxabscoef;
635 cutrhs -= maxabscoef - lastcoef;
638 cutcoefs[cutnnz] = maxabscoef - lastcoef;
639 cutinds[cutnnz++] = maxabsind;
641 assert( cutnnz <= nmaxvars + 1 );
652 if( vlbmixsize == 0 || vubmixsize == 0 )
658 cutislocal = islocallb || islocalub;
659 for( j = 0; j < vlbmixsize; j++ )
663 solval = vlbmixsols[j];
669 for( k = 0; k < vubmixsize; k++ )
676 tmp = lb + vlbmixcoefs[j] + vubmixcoefs[k] - ub;
683 cutcoefs[0] = vlbmixsigns[j] ? -1.0 : 1.0;
684 cutcoefs[1] = vubmixsigns[k] ? -1.0 : 1.0;
685 cutinds[0] = vlbmixinds[j];
686 cutinds[1] = vubmixinds[k];
687 cutrhs = vlbmixsigns[j] ? (cutrhs - 1.0) : cutrhs;
688 cutrhs = vubmixsigns[k] ? (cutrhs - 1.0) : cutrhs;
785 if(
nvars == nbinvars )
839 if(
nvars == nbinvars )
887 sepaExeclpMixing, sepaExecSolMixing,
897 "Should local bounds be used?",
901 "Should general integer variables be used to generate cuts?",
905 "maximal number of mixing separation rounds per node (-1: unlimited)",
909 "maximal number of mixing separation rounds in the root node (-1: unlimited)",
913 "maximal number of consecutive unsuccessful iterations",
#define DEFAULT_MAXROUNDSROOT
#define DEFAULT_MAXROUNDS
#define SCIP_STRINGEQ(name, reference, retcode)
#define SCIP_LONGINT_FORMAT
int SCIPgetNIntVars(SCIP *scip)
int SCIPgetNBinImplVars(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 SCIPgetNIntImplVars(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_Bool SCIPvarIsImpliedIntegral(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
#define SEPA_MAXBOUNDDIST
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
static SCIP_RETCODE separateCuts(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_Bool *cutoff, int *ncuts)
#define DEFAULT_USELOCALBOUNDS
#define DEFAULT_ISCUTSONINTS
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)
struct SCIP_Sepa SCIP_SEPA
#define SCIP_DECL_SEPACOPY(x)