32 #define CONSHDLR_NAME "disjunction" 33 #define CONSHDLR_DESC "disjunction of constraints (or(cons1, cons2, ..., consn))" 34 #define CONSHDLR_ENFOPRIORITY -950000 35 #define CONSHDLR_CHECKPRIORITY -900000 36 #define CONSHDLR_PROPFREQ -1 37 #define CONSHDLR_EAGERFREQ 100 39 #define CONSHDLR_MAXPREROUNDS -1 41 #define CONSHDLR_DELAYPROP FALSE 42 #define CONSHDLR_NEEDSCONS TRUE 44 #define CONSHDLR_PRESOLTIMING SCIP_PRESOLTIMING_FAST 45 #define CONSHDLR_PROP_TIMING SCIP_PROPTIMING_BEFORELP 48 #define DEFAULT_ALWAYSBRANCH TRUE 66 struct SCIP_ConshdlrData
86 assert(consdata !=
NULL);
91 assert(conss !=
NULL);
95 (*consdata)->consssize = nconss;
96 (*consdata)->nconss = nconss;
97 (*consdata)->relaxcons = relaxcons;
106 if( (*consdata)->relaxcons !=
NULL )
115 for( c = 0; c < nconss; ++c )
117 assert(conss[c] !=
NULL);
121 if( (*consdata)->relaxcons !=
NULL )
129 (*consdata)->conss =
NULL;
130 (*consdata)->consssize = 0;
131 (*consdata)->nconss = 0;
132 (*consdata)->relaxcons =
NULL;
147 assert(scip !=
NULL);
148 assert(consdata !=
NULL);
149 assert(*consdata !=
NULL);
152 for( c = 0; c < (*consdata)->nconss; ++c )
158 if( (*consdata)->relaxcons !=
NULL )
178 assert(scip !=
NULL);
179 assert(consdata !=
NULL);
180 assert(cons !=
NULL);
184 assert(consdata->conss !=
NULL);
185 assert(consdata->nconss < consdata->consssize);
188 consdata->conss[consdata->nconss] = cons;
219 assert(result !=
NULL);
226 assert(consdata !=
NULL);
228 conss = consdata->conss;
229 assert(conss !=
NULL);
231 nconss = consdata->nconss;
237 for( i = 0; i < nconss; ++i )
282 assert(result !=
NULL);
285 assert(consdata !=
NULL);
287 conss = consdata->conss;
288 assert(conss !=
NULL);
290 nconss = consdata->nconss;
324 assert(scip !=
NULL);
325 assert(cons !=
NULL);
326 assert(ndelconss !=
NULL);
329 assert(consdata !=
NULL);
331 conss = consdata->conss;
332 assert(conss !=
NULL);
334 nconss = consdata->nconss;
337 for( c = 0; c < nconss; ++c )
391 assert(conshdlrdata !=
NULL);
418 assert(conshdlr !=
NULL);
435 assert(scip !=
NULL);
436 assert(conshdlr !=
NULL);
441 assert(conshdlrdata !=
NULL);
469 assert(sourcedata !=
NULL);
492 for( c = 0; c < nconss; ++c )
495 assert(consdata !=
NULL);
546 for( c = 0; c < nconss && (*result ==
SCIP_FEASIBLE || completely); ++c )
551 SCIP_CALL(
checkCons(scip, conss[c], sol, checkintegrality, checklprows, printreason, &tmpres) );
574 for( c = 0; c < nconss; ++c )
599 assert(result !=
NULL);
602 oldndelconss = *ndelconss;
605 for( c = 0; c < nconss; ++c )
608 assert(consdata !=
NULL);
638 if( *ndelconss > oldndelconss )
653 assert(consdata !=
NULL);
656 for( c = 0; c < consdata->nconss; ++c )
672 assert(scip !=
NULL);
673 assert(conshdlr !=
NULL);
674 assert(cons !=
NULL);
677 assert(consdata !=
NULL);
681 for( i = 0; i < consdata->nconss; ++i )
689 if( consdata->relaxcons !=
NULL )
710 char* nexttokenstart;
713 assert(scip !=
NULL);
714 assert(conshdlr !=
NULL);
715 assert(cons !=
NULL);
716 assert(success !=
NULL);
718 assert(name !=
NULL);
731 saveptr = strpbrk(copystr,
"(");
733 if( saveptr ==
NULL )
735 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
743 nexttokenstart = saveptr;
746 saveptr = strpbrk(saveptr,
"(,");
751 if( saveptr !=
NULL )
755 int bracketcounter = 0;
757 if( *saveptr ==
'(' )
765 while( bracketcounter > 0 )
767 saveptr = strpbrk(saveptr,
"()");
769 if( saveptr !=
NULL )
771 if( *saveptr ==
'(' )
780 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
786 saveptr = strpbrk(saveptr,
"(,");
788 while( saveptr !=
NULL && *saveptr ==
'(' );
792 if( saveptr !=
NULL )
794 assert(*saveptr ==
',');
797 if( nconss == sconss )
800 assert(nconss < sconss);
805 assert(saveptr > nexttokenstart);
809 token[saveptr - nexttokenstart] =
'\0';
811 SCIPdebugMsg(scip,
"disjunctive parsing token(constraint): %s\n", token);
814 SCIP_CALL(
SCIPparseCons(scip, &(conss[nconss]), token, initial, separate, enforce,
FALSE, propagate,
TRUE, modifiable, dynamic, removable, stickingatnode, success) );
822 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
828 nexttokenstart = saveptr;
833 if( *nexttokenstart ==
',' )
836 nexttokenstart = saveptr+1;
842 saveptr = strpbrk(saveptr,
"(,");
845 while( saveptr !=
NULL );
849 saveptr = strrchr(nexttokenstart,
')');
851 if( saveptr ==
NULL )
853 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
861 if( nconss == sconss )
867 assert(saveptr > nexttokenstart);
871 token[saveptr - nexttokenstart] =
'\0';
873 SCIPdebugMsg(scip,
"disjunctive parsing token(constraint): %s\n", token);
876 SCIP_CALL(
SCIPparseCons(scip, &(conss[nconss]), token, initial, separate, enforce,
FALSE, propagate,
TRUE, modifiable, dynamic, removable, stickingatnode, success) );
883 assert(nconss > 0 || !(*success));
890 initial, enforce, check, local, modifiable, dynamic) );
894 for( --nconss; nconss >= 0; --nconss )
921 assert(sourcedata !=
NULL);
923 nconss = sourcedata->nconss;
926 sourceconss = sourcedata->conss;
929 for( c = 0; c < nconss && (*valid); ++c )
938 assert(!(*valid) || conss[c] !=
NULL);
946 sourcerelaxcons = sourcedata->relaxcons;
947 targetrelaxcons =
NULL;
949 if( sourcerelaxcons !=
NULL )
966 initial, enforce, check, local, modifiable, dynamic) );
971 initial, enforce, check, local, modifiable, dynamic) );
974 if( targetrelaxcons !=
NULL )
982 for( c = (*valid ? c - 1 : c - 2); c >= 0; --c )
984 assert(conss[c] !=
NULL);
1012 consEnfolpDisjunction, consEnfopsDisjunction, consCheckDisjunction, consLockDisjunction,
1015 assert(conshdlr !=
NULL);
1033 "alawys perform branching if one of the constraints is violated, otherwise only if all integers are fixed",
1071 if( conshdlr ==
NULL )
1081 SCIP_CALL(
SCIPcreateCons(scip, cons, name, conshdlr, consdata, initial,
FALSE, enforce, check,
FALSE,
1104 assert(scip !=
NULL);
1122 assert(cons !=
NULL);
1123 assert(addcons !=
NULL);
1132 assert(consdata !=
NULL);
enum SCIP_Result SCIP_RESULT
void SCIPconshdlrSetData(SCIP_CONSHDLR *conshdlr, SCIP_CONSHDLRDATA *conshdlrdata)
constraint handler for disjunction constraints
SCIP_RETCODE SCIPsetConshdlrDelete(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDELETE((*consdelete)))
SCIP_STAGE SCIPgetStage(SCIP *scip)
SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetConshdlrTrans(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSTRANS((*constrans)))
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
static SCIP_DECL_CONSCOPY(consCopyDisjunction)
SCIP_Real SCIPgetLocalTransEstimate(SCIP *scip)
SCIP_RETCODE SCIPsetConshdlrEnforelax(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSENFORELAX((*consenforelax)))
SCIP_RETCODE SCIPresetConsAge(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPdelCons(SCIP *scip, SCIP_CONS *cons)
int SCIPcalcMemGrowSize(SCIP *scip, int num)
static SCIP_DECL_CONSPROP(consPropDisjunction)
#define CONSHDLR_ENFOPRIORITY
int SCIPgetNPseudoBranchCands(SCIP *scip)
SCIP_RETCODE SCIPdelConsNode(SCIP *scip, SCIP_NODE *node, SCIP_CONS *cons)
#define CONSHDLR_PROPFREQ
SCIP_RETCODE SCIPtransformConss(SCIP *scip, int nconss, SCIP_CONS **conss, SCIP_CONS **transconss)
SCIP_RETCODE SCIPincludeConshdlrBasic(SCIP *scip, SCIP_CONSHDLR **conshdlrptr, const char *name, const char *desc, int enfopriority, int chckpriority, int eagerfreq, SCIP_Bool needscons, SCIP_DECL_CONSENFOLP((*consenfolp)), SCIP_DECL_CONSENFOPS((*consenfops)), SCIP_DECL_CONSCHECK((*conscheck)), SCIP_DECL_CONSLOCK((*conslock)), SCIP_CONSHDLRDATA *conshdlrdata)
SCIP_RETCODE SCIPparseCons(SCIP *scip, SCIP_CONS **cons, const char *str, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool *success)
enum SCIP_Retcode SCIP_RETCODE
SCIP_Bool SCIPconsIsStickingAtNode(SCIP_CONS *cons)
static SCIP_DECL_CONSCHECK(consCheckDisjunction)
static SCIP_DECL_CONSPARSE(consParseDisjunction)
#define SCIPfreeBlockMemory(scip, ptr)
#define CONSHDLR_EAGERFREQ
#define SCIPduplicateBufferArray(scip, ptr, source, num)
static SCIP_DECL_CONSENFORELAX(consEnforelaxDisjunction)
#define SCIPfreeBufferArray(scip, ptr)
static SCIP_DECL_CONSENFOLP(consEnfolpDisjunction)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_Bool SCIPisTransformed(SCIP *scip)
SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetConshdlrInitlp(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINITLP((*consinitlp)))
SCIP_RETCODE SCIPsetConshdlrParse(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPARSE((*consparse)))
SCIP_Bool SCIPconsIsActive(SCIP_CONS *cons)
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
static SCIP_RETCODE enforceConstraint(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_CONS **conss, int nconss, SCIP_RESULT *result)
SCIP_RETCODE SCIPcreateCons(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_CONSHDLR *conshdlr, SCIP_CONSDATA *consdata, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
static SCIP_DECL_CONSFREE(consFreeDisjunction)
#define CONSHDLR_PROP_TIMING
static SCIP_RETCODE consdataFree(SCIP *scip, SCIP_CONSDATA **consdata)
static SCIP_DECL_CONSPRINT(consPrintDisjunction)
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
#define CONSHDLR_PRESOLTIMING
SCIP_RETCODE SCIPsetConshdlrCopy(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), SCIP_DECL_CONSCOPY((*conscopy)))
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
static SCIP_RETCODE consdataAddCons(SCIP *scip, SCIP_CONSDATA *consdata, SCIP_CONS *cons)
SCIP_RETCODE SCIPaddConsLocal(SCIP *scip, SCIP_CONS *cons, SCIP_NODE *validnode)
SCIP_RETCODE SCIPdelConsLocal(SCIP *scip, SCIP_CONS *cons)
static SCIP_DECL_CONSLOCK(consLockDisjunction)
SCIP_RETCODE SCIPcheckCons(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool printreason, SCIP_RESULT *result)
SCIP_RETCODE SCIPsetConsChecked(SCIP *scip, SCIP_CONS *cons, SCIP_Bool check)
const char * SCIPconsGetName(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetConshdlrFree(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSFREE((*consfree)))
SCIP_CONSHDLRDATA * SCIPconshdlrGetData(SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPcreateConsBasicDisjunction(SCIP *scip, SCIP_CONS **cons, const char *name, int nconss, SCIP_CONS **conss, SCIP_CONS *relaxcons)
SCIP_RETCODE SCIPtransformCons(SCIP *scip, SCIP_CONS *cons, SCIP_CONS **transcons)
SCIP_RETCODE SCIPcreateChild(SCIP *scip, SCIP_NODE **node, SCIP_Real nodeselprio, SCIP_Real estimate)
static SCIP_DECL_CONSINITLP(consInitlpDisjunction)
#define SCIPensureBlockMemoryArray(scip, ptr, arraysizeptr, minsize)
static SCIP_DECL_CONSTRANS(consTransDisjunction)
SCIP_Bool SCIPconsIsLocal(SCIP_CONS *cons)
SCIP_RETCODE SCIPcaptureCons(SCIP *scip, SCIP_CONS *cons)
struct SCIP_ConsData SCIP_CONSDATA
SCIP_RETCODE SCIPgetConsCopy(SCIP *sourcescip, SCIP *targetscip, SCIP_CONS *sourcecons, SCIP_CONS **targetcons, SCIP_CONSHDLR *sourceconshdlr, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, const char *name, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool global, SCIP_Bool *valid)
static SCIP_DECL_CONSPRESOL(consPresolDisjunction)
SCIP_RETCODE SCIPaddConsNode(SCIP *scip, SCIP_NODE *node, SCIP_CONS *cons, SCIP_NODE *validnode)
#define SCIPallocBufferArray(scip, ptr, num)
SCIP_RETCODE SCIPaddConsElemDisjunction(SCIP *scip, SCIP_CONS *cons, SCIP_CONS *addcons)
SCIP_RETCODE SCIPprintCons(SCIP *scip, SCIP_CONS *cons, FILE *file)
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsDeleted(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
#define CONSHDLR_DELAYPROP
static SCIP_RETCODE branch(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_Bool allowaddcons, SCIP_RESULT *result)
static SCIP_RETCODE checkCons(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool printreason, SCIP_RESULT *result)
SCIP_RETCODE SCIPsetConshdlrPrint(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRINT((*consprint)))
static SCIP_DECL_CONSHDLRCOPY(conshdlrCopyDisjunction)
SCIP_RETCODE SCIPincludeConshdlrDisjunction(SCIP *scip)
SCIP_Bool SCIPinProbing(SCIP *scip)
SCIP_CONSDATA * SCIPconsGetData(SCIP_CONS *cons)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
SCIP_RETCODE SCIPsetConshdlrPresol(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRESOL((*conspresol)), int maxprerounds, SCIP_PRESOLTIMING presoltiming)
static SCIP_RETCODE branchCons(SCIP *scip, SCIP_CONS *cons, SCIP_RESULT *result)
#define CONSHDLR_MAXPREROUNDS
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
#define CONSHDLR_NEEDSCONS
SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
SCIP_RETCODE SCIPaddConsLocks(SCIP *scip, SCIP_CONS *cons, int nlockspos, int nlocksneg)
static SCIP_DECL_CONSDELETE(consDeleteDisjunction)
struct SCIP_ConshdlrData SCIP_CONSHDLRDATA
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
#define CONSHDLR_CHECKPRIORITY
static SCIP_RETCODE consdataCreate(SCIP *scip, SCIP_CONSDATA **consdata, SCIP_CONS **conss, int nconss, SCIP_CONS *relaxcons)
#define DEFAULT_ALWAYSBRANCH
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_RETCODE SCIPcreateConsDisjunction(SCIP *scip, SCIP_CONS **cons, const char *name, int nconss, SCIP_CONS **conss, SCIP_CONS *relaxcons, SCIP_Bool initial, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic)
static SCIP_DECL_CONSENFOPS(consEnfopsDisjunction)
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)
#define SCIPreallocBufferArray(scip, ptr, num)
static SCIP_RETCODE propagateCons(SCIP *scip, SCIP_CONS *cons, int *ndelconss)
SCIP_RETCODE SCIPsetConshdlrProp(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPROP((*consprop)), int propfreq, SCIP_Bool delayprop, SCIP_PROPTIMING proptiming)