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;
313 SCIPinfoMessage(scip, NULL,
"constraint %s is violated, all sub-constraints in this disjunction are violated by this given solution\n",
SCIPconsGetName(cons));
334 assert(scip != NULL);
335 assert(cons != NULL);
336 assert(ndelconss != NULL);
339 assert(consdata != NULL);
341 conss = consdata->conss;
342 assert(conss != NULL);
344 nconss = consdata->nconss;
347 for( c = 0; c < nconss; ++c )
401 assert(conshdlrdata != NULL);
427 assert(scip != NULL);
428 assert(conshdlr != NULL);
445 assert(scip != NULL);
446 assert(conshdlr != NULL);
451 assert(conshdlrdata != NULL);
479 assert(sourcedata != NULL);
502 for( c = 0; c < nconss; ++c )
505 assert(consdata != NULL);
556 for( c = 0; c < nconss && (*result ==
SCIP_FEASIBLE || completely); ++c )
561 SCIP_CALL(
checkCons(scip, conss[c], sol, checkintegrality, checklprows, printreason, &tmpres) );
584 for( c = 0; c < nconss; ++c )
609 assert(result != NULL);
612 oldndelconss = *ndelconss;
615 for( c = 0; c < nconss; ++c )
618 assert(consdata != NULL);
648 if( *ndelconss > oldndelconss )
663 assert(consdata != NULL);
666 for( c = 0; c < consdata->nconss; ++c )
682 assert(scip != NULL);
683 assert(conshdlr != NULL);
684 assert(cons != NULL);
687 assert(consdata != NULL);
691 for( i = 0; i < consdata->nconss; ++i )
699 if( consdata->relaxcons != NULL )
720 char* nexttokenstart;
723 assert(scip != NULL);
724 assert(conshdlr != NULL);
725 assert(cons != NULL);
726 assert(success != NULL);
728 assert(name != NULL);
741 saveptr = strpbrk(copystr,
"(");
743 if( saveptr == NULL )
745 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
753 nexttokenstart = saveptr;
756 saveptr = strpbrk(saveptr,
"(,");
761 if( saveptr != NULL )
765 int bracketcounter = 0;
767 if( *saveptr ==
'(' )
775 while( bracketcounter > 0 )
777 saveptr = strpbrk(saveptr,
"()");
779 if( saveptr != NULL )
781 if( *saveptr ==
'(' )
790 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
796 saveptr = strpbrk(saveptr,
"(,");
798 while( saveptr != NULL && *saveptr ==
'(' );
802 if( saveptr != NULL )
804 assert(*saveptr ==
',');
807 if( nconss == sconss )
810 assert(nconss < sconss);
815 assert(saveptr > nexttokenstart);
819 token[saveptr - nexttokenstart] =
'\0';
821 SCIPdebugMsg(scip,
"disjunctive parsing token(constraint): %s\n", token);
824 SCIP_CALL(
SCIPparseCons(scip, &(conss[nconss]), token, initial, separate, enforce,
FALSE, propagate,
TRUE, modifiable, dynamic, removable, stickingatnode, success) );
832 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
838 nexttokenstart = saveptr;
843 if( *nexttokenstart ==
',' )
846 nexttokenstart = saveptr+1;
852 saveptr = strpbrk(saveptr,
"(,");
855 while( saveptr != NULL );
859 saveptr = strrchr(nexttokenstart,
')');
861 if( saveptr == NULL )
863 SCIPdebugMsg(scip,
"error parsing disjunctive constraint: \"%s\"\n", str);
871 if( nconss == sconss )
877 assert(saveptr > nexttokenstart);
881 token[saveptr - nexttokenstart] =
'\0';
883 SCIPdebugMsg(scip,
"disjunctive parsing token(constraint): %s\n", token);
886 SCIP_CALL(
SCIPparseCons(scip, &(conss[nconss]), token, initial, separate, enforce,
FALSE, propagate,
TRUE, modifiable, dynamic, removable, stickingatnode, success) );
893 assert(nconss > 0 || !(*success));
900 initial, enforce, check, local, modifiable, dynamic) );
904 for( --nconss; nconss >= 0; --nconss )
931 assert(sourcedata != NULL);
933 nconss = sourcedata->nconss;
936 sourceconss = sourcedata->conss;
939 for( c = 0; c < nconss && (*valid); ++c )
948 assert(!(*valid) || conss[c] != NULL);
956 sourcerelaxcons = sourcedata->relaxcons;
957 targetrelaxcons = NULL;
959 if( sourcerelaxcons != NULL )
976 initial, enforce, check, local, modifiable, dynamic) );
981 initial, enforce, check, local, modifiable, dynamic) );
984 if( targetrelaxcons != NULL )
992 for( c = (*valid ? c - 1 : c - 2); c >= 0; --c )
994 assert(conss[c] != NULL);
1022 consEnfolpDisjunction, consEnfopsDisjunction, consCheckDisjunction, consLockDisjunction,
1025 assert(conshdlr != NULL);
1043 "alawys perform branching if one of the constraints is violated, otherwise only if all integers are fixed",
1081 if( conshdlr == NULL )
1091 SCIP_CALL(
SCIPcreateCons(scip, cons, name, conshdlr, consdata, initial,
FALSE, enforce, check,
FALSE,
1114 assert(scip != NULL);
1132 assert(cons != NULL);
1133 assert(addcons != NULL);
1142 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)
void SCIPdeactivateSolViolationUpdates(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)
static SCIP_RETCODE branch(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_RESULT *result)
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)
void SCIPactivateSolViolationUpdates(SCIP *scip)
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 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)
void SCIPupdateSolConsViolation(SCIP *scip, SCIP_SOL *sol, SCIP_Real absviol, SCIP_Real relviol)
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)