31 #define SEPA_NAME "impliedbounds" 32 #define SEPA_DESC "implied bounds separator" 33 #define SEPA_PRIORITY -50 35 #define SEPA_MAXBOUNDDIST 0.0 36 #define SEPA_USESSUBSCIP FALSE 37 #define SEPA_DELAY FALSE 39 #define RELCUTCOEFMAXRANGE 1.0 40 #define DEFAULT_USETWOSIZECLIQUES TRUE 71 assert(ncuts !=
NULL);
72 assert(cutoff !=
NULL);
76 activity = val1 * solval1 + val2 * solval2;
97 SCIPdebugMsg(scip,
" -> found cut (activity = %g): ", activity);
135 assert(solvals !=
NULL);
136 assert(fracvars !=
NULL || nfracs == 0);
137 assert(fracvals !=
NULL || nfracs == 0);
138 assert(cutoff !=
NULL);
139 assert(ncuts !=
NULL);
144 assert(sepadata !=
NULL);
146 SCIPdebugMsg(scip,
"searching for implied bound cuts\n");
149 for( i = 0; i < nfracs; i++ )
157 assert(fracvars !=
NULL);
158 assert(fracvals !=
NULL);
177 for( j = 0; j < nimpl; j++ )
181 assert(implvars !=
NULL);
182 assert(impltypes !=
NULL);
183 assert(implbounds !=
NULL);
201 SCIP_CALL(
addCut(scip, sepa, sol, 1.0, implvars[j], solval, (ub - implbounds[j]), fracvars[i], fracvals[i],
202 ub, cutoff, ncuts) );
219 SCIP_CALL(
addCut(scip, sepa, sol, -1.0, implvars[j], solval, (implbounds[j] - lb), fracvars[i], fracvals[i],
220 -lb, cutoff, ncuts) );
240 for( j = 0; j < nimpl; j++ )
260 SCIP_CALL(
addCut(scip, sepa, sol, 1.0, implvars[j], solval, (implbounds[j] - ub), fracvars[i], fracvals[i],
261 implbounds[j], cutoff, ncuts) );
278 SCIP_CALL(
addCut(scip, sepa, sol, -1.0, implvars[j], solval, (lb - implbounds[j]), fracvars[i], fracvals[i],
279 -implbounds[j], cutoff, ncuts) );
288 if( ! sepadata->usetwosizecliques )
301 for( i = 0; i < ncliques; ++i )
318 assert(clqvars[0] != clqvars[1]);
338 clqvals[0] ? 1.0 : -1.0, clqvars[0],
SCIPgetSolVal(scip, sol, clqvars[0]),
339 clqvals[1] ? 1.0 : -1.0, clqvars[1],
SCIPgetSolVal(scip, sol, clqvars[1]),
340 rhs, cutoff, ncuts) );
360 assert(sepa !=
NULL);
376 assert(sepa !=
NULL);
381 assert(sepadata !=
NULL);
405 assert(sepa !=
NULL);
431 else if ( ncuts > 0 )
458 assert(sepa !=
NULL);
476 for( i = 0; i < nbinvars; ++i )
480 fracvars[nfracs] = vars[i];
481 fracvals[nfracs] = solvals[i];
498 else if ( ncuts > 0 )
526 assert(sepadata !=
NULL);
531 sepaExeclpImpliedbounds, sepaExecsolImpliedbounds,
533 assert(sepa !=
NULL);
541 "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)
#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)
static SCIP_RETCODE addCut(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, 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)
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
SCIP_RETCODE SCIPaddCut(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut, SCIP_Bool forcecut, SCIP_Bool *infeasible)
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)