50 #define PRESOL_NAME "symbreak" 51 #define PRESOL_DESC "presolver for adding symmetry breaking constraints" 52 #define PRESOL_PRIORITY -10000000 53 #define PRESOL_MAXROUNDS -1 54 #define PRESOL_TIMING SCIP_PRESOLTIMING_EXHAUSTIVE 57 #define DEFAULT_CONSSADDLP TRUE 58 #define DEFAULT_ADDSYMRESACKS TRUE 59 #define DEFAULT_COMPUTEORBITS FALSE 60 #define DEFAULT_DETECTORBITOPES TRUE 67 struct SCIP_PresolData
90 int* npermsincomponent;
112 int npermsincomponent;
124 assert( scip != NULL );
125 assert( presoldata != NULL );
127 nperms = presoldata->nperms;
129 presoldata->ncomponents = -1;
135 npermvars = presoldata->npermvars;
136 perms = presoldata->perms;
139 if ( presoldata->norbits == 1 )
145 ncomponents = nperms;
148 for (i = 0; i < nperms && ncomponents > 1; ++i)
150 for (j = i + 1; j < nperms && ncomponents > 1; ++j)
159 if ( componentI == componentJ )
166 for (k = 0; k < npermvars; ++k)
169 if ( permI[k] != k && permJ[k] != k )
175 if ( componentI < componentJ )
186 assert( ncomponents > 0 );
190 presoldata->ncomponents = ncomponents;
196 if ( ncomponents == 1 )
198 presoldata->npermsincomponent[0] = nperms;
201 for (i = 0; i < nperms; ++i)
202 presoldata->components[0][i] = i;
210 while ( startchanged )
212 startchanged =
FALSE;
213 npermsincomponent = 0;
214 assert( componentstoperm != NULL );
218 for (i = start; i < nperms; ++i)
231 presoldata->npermsincomponent[componentcnt] = npermsincomponent;
236 for (i = start; i < nperms; ++i)
239 presoldata->components[componentcnt][j++] = i;
247 if ( presoldata->norbits != 1 )
251 for (i = 0; i < ncomponents; ++i)
252 presoldata->componentblocked[i] =
FALSE;
255 printf(
"\n\n\nTESTS\n\n");
256 printf(
"Number of components:\t\t%d\n", presoldata->ncomponents);
257 for (i = 0; i < presoldata->ncomponents; ++i)
259 printf(
"Component %d: Number of perms: %d\n", i, presoldata->npermsincomponent[i]);
260 for (j = 0; j < presoldata->npermsincomponent[i]; ++j)
262 printf(
"%d ", presoldata->components[i][j]);
267 printf(
"GENERATORS:");
268 for (i = 0; i < presoldata->nperms; ++i)
270 printf(
"generator %d:\n", i);
271 for (j = 0; j < presoldata->npermvars; ++j)
273 if ( presoldata->perms[i][j] != j )
274 printf(
"%d ", presoldata->perms[i][j]);
298 assert( perm != NULL );
299 assert( iscompoftwocycles != NULL );
300 assert( ntwocyclesperm != NULL );
301 assert( allvarsbinary != NULL );
303 *iscompoftwocycles =
FALSE;
305 *allvarsbinary =
TRUE;
306 for (i = 0; i < nvars; ++i)
312 if ( perm[perm[i]] == i )
319 *allvarsbinary =
FALSE;
331 *iscompoftwocycles =
TRUE;
332 *ntwocyclesperm = ntwocycles;
358 int nintersections = 0;
363 assert( suborbitope != NULL );
364 assert( nfilledcols > 0 );
365 assert( perm != NULL );
366 assert( nusedelems != NULL );
367 assert( success != NULL );
368 assert( infeasible != NULL );
375 if ( nfilledcols == 2 )
378 for (row = 0; row < nrows; ++row)
380 idx1 = suborbitope[row][0];
381 idx2 = suborbitope[row][1];
384 if ( idx1 != perm[idx1] )
387 if ( ! leftextension )
389 suborbitope[row][0] = idx2;
390 suborbitope[row][1] = idx1;
392 suborbitope[row][2] = perm[idx1];
395 (*nusedelems)[idx1] += 1;
396 (*nusedelems)[perm[idx1]] += 1;
399 if ( (*nusedelems)[idx1] > 2 || (*nusedelems)[perm[idx1]] > 2 )
405 else if ( idx2 != perm[idx2] )
410 suborbitope[row][0] = idx2;
411 suborbitope[row][1] = idx1;
413 suborbitope[row][2] = perm[idx2];
416 (*nusedelems)[idx2] += 1;
417 (*nusedelems)[perm[idx2]] += 1;
420 if ( (*nusedelems)[idx2] > 2 || (*nusedelems)[perm[idx2]] > 2 )
431 for (row = 0; row < nrows; ++row)
433 idx1 = suborbitope[row][coltoextend];
436 if ( idx1 != perm[idx1] )
438 suborbitope[row][nfilledcols] = perm[idx1];
441 (*nusedelems)[idx1] += 1;
442 (*nusedelems)[perm[idx1]] += 1;
445 if ( (*nusedelems)[idx1] > 2 || (*nusedelems)[perm[idx1]] > 2 )
456 if ( nintersections > 0 && nintersections < nrows )
458 else if ( nintersections == nrows )
473 int** orbitopevaridx,
483 assert( vars != NULL );
486 assert( permvars != NULL );
487 assert( npermvars > 0 );
488 assert( orbitopevaridx != NULL );
489 assert( columnorder != NULL );
490 assert( nusedelems != NULL );
491 assert( infeasible != NULL );
493 curcolumn = ncols - 1;
496 while ( curcolumn >= 0 && columnorder[curcolumn] >= 0 )
498 for (i = 0; i < nrows; ++i)
500 assert( orbitopevaridx[i][curcolumn] < npermvars );
504 if ( nusedelems[orbitopevaridx[i][curcolumn]] > 1 )
510 (*vars)[i][nfilledcols] = permvars[orbitopevaridx[i][curcolumn]];
522 assert( curcolumn > 1 || (curcolumn < 0 && nfilledcols == ncols) );
527 for (i = 0; i < nrows; ++i)
529 assert( orbitopevaridx[i][1] < npermvars );
532 (*vars)[i][nfilledcols] = permvars[orbitopevaridx[i][1]];
537 for (i = 0; i < nrows; ++i)
539 assert( orbitopevaridx[i][0] < npermvars );
542 (*vars)[i][nfilledcols] = permvars[orbitopevaridx[i][0]];
547 if ( nfilledcols < ncols )
552 while ( nfilledcols < ncols )
554 assert( columnorder[curcolumn] < 0 );
556 for (i = 0; i < nrows; ++i)
558 assert( orbitopevaridx[i][curcolumn] < npermvars );
562 if ( nfilledcols == ncols - 1 && nusedelems[orbitopevaridx[i][curcolumn]] > 1 )
568 (*vars)[i][nfilledcols] = permvars[orbitopevaridx[i][curcolumn]];
590 int* npermsincomponent;
595 assert( scip != NULL );
596 assert( presoldata != NULL );
599 if ( presoldata->nperms == 0 )
603 if ( presoldata->ncomponents == -1 )
607 assert( presoldata->nperms > 0 );
608 assert( presoldata->perms != NULL );
609 assert( presoldata->npermvars > 0 );
610 assert( presoldata->permvars != NULL );
611 assert( presoldata->ncomponents > 0 );
612 assert( presoldata->components != NULL );
613 assert( presoldata->npermsincomponent != NULL );
615 perms = presoldata->perms;
616 npermvars = presoldata->npermvars;
617 permvars = presoldata->permvars;
618 ncomponents = presoldata->ncomponents;
619 npermsincomponent = presoldata->npermsincomponent;
620 components = presoldata->components;
623 for (i = 0; i < ncomponents; ++i)
629 int** orbitopevaridx;
631 int ntwocyclescomp = -1;
641 assert( npermsincomponent[i] > 0 );
642 for (j = 0; j < npermsincomponent[i]; ++j)
646 int ntwocyclesperm = 0;
648 SCIP_CALL(
getPermProperties(perms[components[i][j]], permvars, npermvars, &iscompoftwocycles, &ntwocyclesperm, &allvarsbinary) );
651 if ( ntwocyclescomp == - 1 )
652 ntwocyclescomp = ntwocyclesperm;
655 if ( ntwocyclescomp == 0 || ntwocyclescomp != ntwocyclesperm || ! allvarsbinary )
665 assert( ntwocyclescomp > 0 );
672 for (j = 0; j < npermsincomponent[i]; ++j)
678 for (j = 0; j < ntwocyclescomp; ++j)
685 for (j = 0; j < npermsincomponent[i] + 1; ++j)
686 columnorder[j] = npermsincomponent[i] + 2;
690 for (j = 0; j < npermvars; ++j)
695 for (j = 0; j < npermvars; ++j)
697 int permidx = components[i][0];
700 if ( perms[permidx][j] > j )
702 orbitopevaridx[row][0] = j;
703 orbitopevaridx[row++][1] = perms[permidx][j];
705 nusedelems[perms[permidx][j]] += 1;
708 if ( row == ntwocyclescomp )
711 assert( row == ntwocyclescomp );
723 for (j = 0; j < npermsincomponent[i]; ++j)
728 if ( nusedperms == npermsincomponent[i] )
735 perms[components[i][j]],
TRUE, &nusedelems, &success, &infeasible) );
746 coltoextend = nfilledcols;
747 columnorder[nfilledcols++] = -1;
753 goto FREEDATASTRUCTURES;
756 for (j = 0; j < npermsincomponent[i]; ++j)
761 if ( nusedperms == npermsincomponent[i] )
768 perms[components[i][j]],
FALSE, &nusedelems, &success, &infeasible) );
779 coltoextend = nfilledcols;
780 columnorder[nfilledcols] = 1;
786 if ( nusedperms < npermsincomponent[i] )
790 goto FREEDATASTRUCTURES;
794 for (j = 0; j < ntwocyclescomp; ++j)
800 infeasibleorbitope =
FALSE;
802 orbitopevaridx, columnorder, nusedelems, &infeasibleorbitope) );
804 if ( ! infeasibleorbitope )
812 presoldata->genconss[presoldata->ngenconss] = cons;
813 ++presoldata->ngenconss;
814 ++presoldata->norbitopes;
815 presoldata->componentblocked[i] =
TRUE;
819 for (j = 0; j < ntwocyclescomp; ++j)
826 for (j = 0; j < ntwocyclescomp; ++j)
848 int nsymresackcons = 0;
854 assert( scip != NULL );
855 assert( presol != NULL );
858 assert( presoldata != NULL );
860 perms = presoldata->perms;
861 nperms = presoldata->nperms;
862 permvars = presoldata->permvars;
863 npermvars = presoldata->npermvars;
864 conssaddlp = presoldata->conssaddlp;
865 ncomponents = presoldata->ncomponents;
867 assert( nperms <= 0 || perms != NULL );
868 assert( permvars != NULL );
869 assert( npermvars > 0 );
872 if ( ncomponents > 0 )
875 for (i = 0; i < ncomponents; ++i)
878 if ( presoldata->componentblocked[i] )
882 for (p = 0; p < presoldata->npermsincomponent[i]; ++p)
885 int permidx = presoldata->components[i][p];
895 presoldata->genconss[presoldata->ngenconss] = cons;
896 ++presoldata->ngenconss;
897 ++presoldata->nsymresacks;
899 SCIPdebugMsg(scip,
"Added symresack constraint: %d.\n", nsymresackcons);
906 for (p = 0; p < nperms; ++p)
918 presoldata->genconss[presoldata->ngenconss] = cons;
919 ++presoldata->ngenconss;
920 ++presoldata->nsymresacks;
922 SCIPdebugMsg(scip,
"Added symresack constraint: %d.\n", nsymresackcons);
939 assert( scip != NULL );
940 assert( presol != NULL );
943 assert( presoldata != NULL );
946 if ( presoldata->nperms < 1 )
949 if ( presoldata->addsymresacks )
969 assert(
scip != NULL );
970 assert( presol != NULL );
973 assert( presoldata != NULL );
988 assert(
scip != NULL );
989 assert( presol != NULL );
994 assert( presoldata != NULL );
999 presoldata->enabled =
TRUE;
1002 presoldata->enabled =
FALSE;
1005 if ( presoldata->enabled )
1024 assert(
scip != NULL );
1025 assert( presol != NULL );
1030 assert( presoldata != NULL );
1032 ngenconss = presoldata->ngenconss;
1035 genconss = presoldata->genconss;
1036 for (i = 0; i < ngenconss; ++i)
1038 assert( genconss[i] != NULL );
1047 presoldata->genconss = NULL;
1048 presoldata->ngenconss = 0;
1051 if ( presoldata->norbits >= 0 )
1057 presoldata->orbitbegins = NULL;
1058 presoldata->orbits = NULL;
1059 presoldata->norbits = -1;
1062 if ( presoldata->ncomponents > 0 )
1065 for (i = 0; i < presoldata->ncomponents; ++i)
1071 presoldata->componentblocked = NULL;
1072 presoldata->components = NULL;
1073 presoldata->npermsincomponent = NULL;
1074 presoldata->ncomponents = -1;
1077 presoldata->addedconss =
FALSE;
1078 presoldata->computedsymmetry =
FALSE;
1079 presoldata->enabled =
TRUE;
1080 presoldata->early =
FALSE;
1081 presoldata->nperms = -1;
1082 presoldata->log10groupsize = -1.0;
1083 presoldata->norbitopes = 0;
1084 presoldata->nsymresacks = 0;
1097 assert(
scip != NULL );
1098 assert( presol != NULL );
1101 assert( presoldata != NULL );
1105 presoldata->early = ! presoldata->early;
1110 presoldata->enabled =
TRUE;
1114 presoldata->enabled =
FALSE;
1117 if ( presoldata->enabled )
1123 if ( presoldata->early && presoldata->enabled )
1139 int noldfixedvars = *nfixedvars;
1140 int noldaggrvars = *naggrvars;
1141 int noldbdchgs = *nchgbds;
1142 int noldaddconss = *naddconss;
1145 assert(
scip != NULL );
1146 assert( presol != NULL );
1147 assert( result != NULL );
1153 assert( presoldata != NULL );
1156 if ( ! presoldata->enabled )
1167 SCIPdebugMsg(
scip,
"Presolving method of symmetry breaking presolver ...\n");
1170 if ( ! presoldata->computedsymmetry )
1172 SCIPdebugMsg(
scip,
"Symmetry breaking presolver: computing symmetry ...\n");
1173 assert( presoldata->nperms < 0 );
1177 &(presoldata->nperms), &(presoldata->perms), &(presoldata->log10groupsize)) );
1179 presoldata->computedsymmetry =
TRUE;
1181 if ( presoldata->nperms <= 0 )
1183 SCIPdebugMsg(
scip,
"Symmetry breaking presolver: no symmetry has been found, turning presolver off.\n");
1184 presoldata->enabled =
FALSE;
1189 assert( presoldata->nperms > 0 );
1193 if ( presoldata->computeorbits )
1199 presoldata->orbits, presoldata->orbitbegins, &presoldata->norbits) );
1202 if ( presoldata->detectorbitopes )
1208 else if ( presoldata->nperms <= 0 )
1212 assert( presoldata->nperms > 0 );
1223 if ( ! presoldata->addedconss )
1226 int noldngenconns = presoldata->ngenconss;
1230 presoldata->addedconss =
TRUE;
1231 *naddconss += presoldata->ngenconss - noldngenconns;
1232 SCIPdebugMsg(
scip,
"Added symmetry breaking constraints: %d.\n", presoldata->ngenconss - noldngenconns);
1235 for (i = 0; i < presoldata->ngenconss; ++i)
1238 nnewchgbds, nnewholes, nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides, nfixedvars, naggrvars,
1239 nchgvartypes, nchgbds, naddholes, ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
1248 SCIPdebugMsg(
scip,
"Presolved %d constraints generated by symbreak.\n", presoldata->ngenconss);
1252 if ( *naddconss + *nchgbds + *naggrvars + *nfixedvars > noldaddconss + noldbdchgs + noldaggrvars + noldfixedvars )
1275 presoldata->addedconss =
FALSE;
1276 presoldata->computedsymmetry =
FALSE;
1277 presoldata->enabled =
TRUE;
1278 presoldata->early =
FALSE;
1279 presoldata->nsymresacks = 0;
1280 presoldata->norbitopes = 0;
1281 presoldata->ngenconss = 0;
1282 presoldata->genconss = NULL;
1283 presoldata->nperms = -1;
1284 presoldata->log10groupsize = -1.0;
1285 presoldata->norbits = -1;
1286 presoldata->orbits = NULL;
1287 presoldata->orbitbegins = NULL;
1288 presoldata->ncomponents = -1;
1289 presoldata->npermsincomponent = NULL;
1290 presoldata->components = NULL;
1291 presoldata->componentblocked = NULL;
1295 presolExecSymbreak, presoldata) );
1306 "Should the symmetry breaking constraints be added to the LP?",
1311 "Add inequalities for symresacks for each generator?",
1316 "Should the orbits of the symmetry group be computed?",
1321 "Should we check whether the components of the symmetry group can be handled by orbitopes?",
1352 int beginneworbit = 0;
1354 assert( scip != NULL );
1355 assert( permvars != NULL );
1356 assert( perms != NULL );
1357 assert( nperms > 0 );
1358 assert( npermvars > 0 );
1359 assert( orbits != NULL );
1360 assert( norbits != NULL );
1367 for (i = 0; i < npermvars; ++i)
1368 varadded[i] =
FALSE;
1372 for (i = 0; i < npermvars; ++i)
1375 if ( ! varadded[i] )
1388 for (j = 0; j < curorbitsize; ++j)
1390 curelem = curorbit[j];
1392 for (p = 0; p < nperms; ++p)
1394 if ( activeperms == NULL || activeperms[p] )
1396 image = perms[p][curelem];
1399 if ( ! varadded[image] )
1401 curorbit[curorbitsize++] = image;
1402 varadded[image] =
TRUE;
1408 if ( curorbitsize > 1 )
1410 orbitbegins[*norbits] = beginneworbit;
1411 for (j = 0; j < curorbitsize; ++j)
1412 orbits[beginneworbit++] = curorbit[j];
1420 assert( *norbits < npermvars );
1421 orbitbegins[*norbits] = beginneworbit;
1424 printf(
"Orbits (total number: %d):\n", *norbits);
1425 for (i = 0; i < *norbits; ++i)
1430 for (j = orbitbegins[i]; j < orbitbegins[i+1]; ++j)
1431 printf(
"%d ", orbits[j]);
SCIP_RETCODE SCIPcreateConsOrbitope(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_VAR ***vars, SCIP_ORBITOPETYPE orbitopetype, int nspcons, int nblocks, SCIP_Bool resolveprop, 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)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
SCIP_RETCODE SCIPincludePresolBasic(SCIP *scip, SCIP_PRESOL **presolptr, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
struct SCIP_PresolData SCIP_PRESOLDATA
#define SCIPallocBlockMemoryArray(scip, ptr, num)
SCIP_RETCODE SCIPsetPresolFree(SCIP *scip, SCIP_PRESOL *presol, SCIP_DECL_PRESOLFREE((*presolfree)))
SCIP_STAGE SCIPgetStage(SCIP *scip)
void SCIPdisjointsetUnion(SCIP_DISJOINTSET *djset, int p, int q, SCIP_Bool forcerepofp)
SCIP_RETCODE SCIPcreateSymbreakCons(SCIP *scip, SCIP_CONS **cons, const char *name, int *perm, SCIP_VAR **vars, int nvars, 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_RETCODE SCIPsetPresolExit(SCIP *scip, SCIP_PRESOL *presol, SCIP_DECL_PRESOLEXIT((*presolexit)))
static SCIP_DECL_PRESOLEXIT(presolExitSymbreak)
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
static SCIP_DECL_PRESOLINIT(presolInitSymbreak)
int SCIPsnprintf(char *t, int len, const char *s,...)
enum SCIP_Retcode SCIP_RETCODE
static SCIP_RETCODE getPermProperties(int *perm, SCIP_VAR **vars, int nvars, SCIP_Bool *iscompoftwocycles, int *ntwocyclesperm, SCIP_Bool *allvarsbinary)
#define SYM_HANDLETYPE_SYMBREAK
SCIP_PRESOLDATA * SCIPpresolGetData(SCIP_PRESOL *presol)
SCIP_RETCODE SCIPcomputeGroupOrbitsSymbreak(SCIP *scip, SCIP_VAR **permvars, int npermvars, int **perms, int nperms, SCIP_Shortbool *activeperms, int *orbits, int *orbitbegins, int *norbits)
presolver for adding symmetry breaking constraints
#define SCIPfreeBufferArray(scip, ptr)
Constraint handler for the set partitioning / packing / covering constraints .
static SCIP_RETCODE detectOrbitopes(SCIP *scip, SCIP_PRESOLDATA *presoldata)
constraint handler for (partitioning/packing/full) orbitope constraints w.r.t. the full symmetric gro...
constraint handler for symresack constraints
SCIP_Bool SCIPisPresolveFinished(SCIP *scip)
#define SCIPallocMemory(scip, ptr)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
void SCIPdisjointsetFree(SCIP_DISJOINTSET **djset, BMS_BLKMEM *blkmem)
SCIP_RETCODE SCIPpresolCons(SCIP *scip, SCIP_CONS *cons, int nrounds, SCIP_PRESOLTIMING presoltiming, int nnewfixedvars, int nnewaggrvars, int nnewchgvartypes, int nnewchgbds, int nnewholes, int nnewdelconss, int nnewaddconss, int nnewupgdconss, int nnewchgcoefs, int nnewchgsides, int *nfixedvars, int *naggrvars, int *nchgvartypes, int *nchgbds, int *naddholes, int *ndelconss, int *naddconss, int *nupgdconss, int *nchgcoefs, int *nchgsides, SCIP_RESULT *result)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
static SCIP_DECL_PRESOLEXEC(presolExecSymbreak)
SCIP_RETCODE SCIPgetTimingSymmetry(SCIP *scip, SCIP_Bool *afterpresolve)
const char * SCIPconsGetName(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetPresolInit(SCIP *scip, SCIP_PRESOL *presol, SCIP_DECL_PRESOLINIT((*presolinit)))
internal miscellaneous methods
static SCIP_RETCODE generateOrbitopeVarsMatrix(SCIP_VAR ****vars, int nrows, int ncols, SCIP_VAR **permvars, int npermvars, int **orbitopevaridx, int *columnorder, int *nusedelems, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPgetIntParam(SCIP *scip, const char *name, int *value)
int SCIPdisjointsetFind(SCIP_DISJOINTSET *djset, int element)
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
static SCIP_DECL_PRESOLFREE(presolFreeSymbreak)
SCIP_RETCODE SCIPsetPresolInitpre(SCIP *scip, SCIP_PRESOL *presol, SCIP_DECL_PRESOLINITPRE((*presolinitpre)))
SCIP_RETCODE SCIPregisterSymmetry(SCIP *scip, SYM_HANDLETYPE symtype, SYM_SPEC type, SYM_SPEC fixedtype)
#define DEFAULT_CONSSADDLP
#define SCIPallocBufferArray(scip, ptr, num)
static SCIP_DECL_PRESOLINITPRE(presolInitpreSymbreak)
static SCIP_RETCODE extendSubOrbitope(int **suborbitope, int nrows, int nfilledcols, int coltoextend, int *perm, SCIP_Bool leftextension, int **nusedelems, SCIP_Bool *success, SCIP_Bool *infeasible)
#define DEFAULT_ADDSYMRESACKS
SCIP_RETCODE SCIPsetIntParam(SCIP *scip, const char *name, int value)
static SCIP_RETCODE addSymmetryBreakingConstraints(SCIP *scip, SCIP_PRESOL *presol)
const char * SCIPpresolGetName(SCIP_PRESOL *presol)
static SCIP_RETCODE computeComponents(SCIP *scip, SCIP_PRESOLDATA *presoldata)
static SCIP_RETCODE addSymresackConss(SCIP *scip, SCIP_PRESOL *presol)
#define SCIP_PRESOLTIMING_ALWAYS
Constraint handler for linear constraints in their most general form, .
#define SCIPfreeMemory(scip, ptr)
type definitions for symmetry computations
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
presolver for storing symmetry information about current problem
SCIP_Bool SCIPisStopped(SCIP *scip)
#define DEFAULT_DETECTORBITOPES
SCIP_RETCODE SCIPdisjointsetCreate(SCIP_DISJOINTSET **djset, BMS_BLKMEM *blkmem, int ncomponents)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
#define DEFAULT_COMPUTEORBITS
SCIP_RETCODE SCIPincludePresolSymbreak(SCIP *scip)
SCIP_RETCODE SCIPgetGeneratorsSymmetry(SCIP *scip, int *npermvars, SCIP_VAR ***permvars, int *nperms, int ***perms, SCIP_Real *log10groupsize)
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)