63 #define SEPA_NAME "zerohalf"
64 #define SEPA_DESC "{0,1/2}-cuts separator"
65 #define SEPA_PRIORITY -6000
67 #define SEPA_MAXBOUNDDIST 0.0
68 #define SEPA_USESSUBSCIP TRUE
69 #define SEPA_DELAY FALSE
71 #define DEFAULT_MAXROUNDS 5
72 #define DEFAULT_MAXROUNDSROOT 10
73 #define DEFAULT_MAXSEPACUTS 50
74 #define DEFAULT_MAXSEPACUTSROOT 500
75 #define DEFAULT_DYNAMICCUTS TRUE
76 #define DEFAULT_DECOMPOSEPROBLEM FALSE
77 #define DEFAULT_MAXDEPTH -1
78 #define DEFAULT_MINVIOLATION 0.30
79 #define DEFAULT_FORCECUTSTOLP FALSE
80 #define DEFAULT_FORCECUTSTOSEPASTORE FALSE
82 #define DEFAULT_MAXCUTS 100
84 #define DEFAULT_MAXCUTSROOT 1000
86 #define DEFAULT_SUBSCIPOBJECTIVE 'v'
87 #define DEFAULT_RELAXCONTVARS FALSE
88 #define DEFAULT_SCALEFRACCOEFFS TRUE
89 #define DEFAULT_SUBSCIPSETTINGS "-"
90 #define DEFAULT_SUBSCIPSOLLIMIT -1
91 #define DEFAULT_SUBSCIPUSEALLSOLS TRUE
93 #define DEFAULT_PPDELTA 0.500
94 #define DEFAULT_SUBSCIPOBJPEN 0.001
96 #define DEFAULT_PPMETHODS "CXGXIM"
97 #define DEFAULT_SEPAMETHODS "2g"
98 #define DEFAULT_MAXNCALLS -1LL
99 #define DEFAULT_IGNOREPREVIOUSZHCUTS FALSE
100 #define DEFAULT_ONLYORIGROWS FALSE
101 #define DEFAULT_USEZHCUTPOOL TRUE
102 #define DEFAULT_DELAYEDCUTS TRUE
103 #define DEFAULT_MAXTESTDELTA 10
104 #define DEFAULT_TRYNEGSCALING TRUE
107 #define ORTHOFUNC 'e'
111 #define NNONZOFFSET 500
112 #define BOUNDSWITCH 0.50
114 #define ALLOWLOCAL TRUE
115 #define FIXINTEGRALRHS TRUE
116 #define BOUNDSFORTRANS NULL
117 #define BOUNDTYPESFORTRANS NULL
118 #define MAXWEIGHTRANGE 10000.00
124 #define MAXSCALE 1000.0
127 #define USEVARBOUNDS TRUE
182 #define ISEVEN(scip, value) (SCIPisEQ((scip) , SCIPfloor(scip , (value) / 2) , (value) / 2))
183 #define ISODD(scip, value) (!(ISEVEN((scip), (value))))
184 #define XOR(bool1, bool2) ((bool1) ^ (bool2))
185 #define DIV(value1, powerof2value) (((unsigned int)(value1)) / ((unsigned int)(powerof2value)))
186 #define MOD(value1, powerof2value) (((unsigned int)(value1)) % ((unsigned int)(powerof2value)))
188 #ifndef BMSmoveMemoryArray
190 #define BMSmoveMemoryArray(ptr, source, num) \
192 size_t size__ = (num) * sizeof(*(ptr)); \
195 assert((void*)(ptr) != NULL); \
196 assert((void*)(source) != NULL); \
197 memmove((void*)(ptr), (void*)(source), size__); \
202 #ifdef ZEROHALF__PRINT_STATISTICS
204 #define ZEROHALFstatistics(x) x
205 #define ZEROHALFstatisticsMessage printf("#### ") ; printf
206 #define ZEROHALFcreateNewTimer(timervar) SCIP_CALL(SCIPcreateClock(scip, &timervar))
207 #define ZEROHALFcreateTimer(timervar) SCIP_CALL(SCIPcreateClock(scip, &timervar))
208 #define ZEROHALFfreeTimer(timervar) SCIP_CALL(SCIPfreeClock(scip, &timervar))
209 #define ZEROHALFresetTimer(timervar) SCIP_CALL(SCIPresetClock(scip, timervar))
210 #define ZEROHALFstartTimer(timervar) SCIP_CALL(SCIPstartClock(scip, timervar))
211 #define ZEROHALFstopTimer(timervar) SCIP_CALL(SCIPstopClock(scip, timervar))
212 #define ZEROHALFevalTimer(timervar) (SCIPgetClockTime(scip, timervar))
217 #define ZEROHALFstatistics(x)
218 #define ZEROHALFstatisticsMessage while( FALSE ) printf
219 #define ZEROHALFcreateNewTimer(timervar)
220 #define ZEROHALFcreateTimer(timervar)
221 #define ZEROHALFfreeTimer(timervar)
222 #define ZEROHALFresetTimer(timervar)
223 #define ZEROHALFstartTimer(timervar)
224 #define ZEROHALFstopTimer(timervar)
225 #define ZEROHALFevalTimer(timervar) (0.0)
236 #define IRRELEVANT -1
239 #define ZERO_ROW -100
240 #define IDENT_TO_ROW_WITH_SMALLER_SLACK -101
241 #define SLACK_GREATER_THAN_MAXSLACK -102
242 #define DEFINES_VIOLATED_ZEROHALF_CUT -103
244 #define ROW_IN_SUBPROB_WITHOUT_ODD_RHS -104
246 #define NONEXISTENT_ROW -105
247 #define NO_RELEVANT_COLUMNS -106
248 #define SLACK_GREATER_THAN_MSL_MINUS_SODD -107
250 #define LARGE_COL_EXISTS -108
255 #define ZERO_COLUMN -200
256 #define IDENT_TO_ANOTHER_COLUMN -201
257 #define ZERO_LP_SOL -202
258 #define LP_SOL_EQUALS_EVEN_LB -203
259 #define LP_SOL_EQUALS_ODD_LB -204
260 #define LP_SOL_EQUALS_EVEN_UB -205
261 #define LP_SOL_EQUALS_ODD_UB -206
262 #define SINGLETON_COLUMN -207
263 #define CONTINUOUS_VARIABLE -208
264 #define SMALL_FRACSOL_HEUR -209
265 #define ALL_MATRIX_ROWS_DELETED -210
267 #define COLUMN_IN_SUBPROB_WITHOUT_ODD_RHS -211
276 #define BITARRAYBASETYPE unsigned int
277 #define BITARRAYBITMASKTYPE BITARRAYBASETYPE
286 #define BITARRAY BITARRAYBASETYPE*
289 #define BITMASK(pos) ((unsigned int)(1 << (pos)))
292 #define BITSET(var, pos) (var) |= BITMASK(pos)
295 #define BITISSET(var, pos) (var & BITMASK(pos))
298 #define BITARRAYBITSET(barray, pos) BITSET(barray[DIV((pos),Zerohalf_bitarraybasetypesize_nbits)], \
299 MOD(pos,Zerohalf_bitarraybasetypesize_nbits))
302 #define BITARRAYBITISSET(barray, pos) BITISSET(barray[DIV(pos,Zerohalf_bitarraybasetypesize_nbits)], \
303 MOD(pos,Zerohalf_bitarraybasetypesize_nbits))
306 #define BITARRAYCLEAR(barray, barraysize) BMSclearMemoryArray(barray,barraysize)
309 #define GETREQUIREDBITARRAYSIZE(nvalstostore) \
310 ((((unsigned int)(nvalstostore)) % (Zerohalf_bitarraybasetypesize_nbits) == 0) \
311 ? (((unsigned int)(nvalstostore)) / (Zerohalf_bitarraybasetypesize_nbits)) \
312 : ((((unsigned int)(nvalstostore)) / (Zerohalf_bitarraybasetypesize_nbits)) + 1))
315 #define GETBITARRAYINDEX(pos) DIV((pos),Zerohalf_bitarraybasetypesize_nbits)
318 #define GETBITARRAYMASK(pos) BITMASK(MOD((pos),Zerohalf_bitarraybasetypesize_nbits))
321 #define BITARRAYSFOREACH(barray1, barray2, size, op) \
324 for( idx__ = 0 ; idx__ < (size) ; ++idx__) \
326 barray2[idx__] op barray1[idx__]; \
331 #define BITARRAYSXOR(barray1, barray2, size) BITARRAYSFOREACH(barray1,barray2,size,^=)
334 #define BITARRAYSAREEQUAL(barray1, barray2, size) \
335 (memcmp((void*)(barray1), (void*)(barray2), (size_t)((size) * (Zerohalf_bitarraybasetypesize))) == 0)
339 #define BITCLEAR(var, pos) (var) &= ~BITMASK(pos)
342 #define BITFLIP(var, pos) (var) ^= BITMASK(pos)
345 #define BITARRAYBITCLEAR(barray, pos) BITCLEAR(barray[DIV((pos),Zerohalf_bitarraybasetypesize_nbits)], \
346 MOD(pos,Zerohalf_bitarraybasetypesize_nbits))
349 #define BITARRAYBITFLIP(barray, pos) BITFLIP(barray[DIV((pos),Zerohalf_bitarraybasetypesize_nbits)], \
350 MOD(pos,Zerohalf_bitarraybasetypesize_nbits))
353 #define BITARRAYSAND(barray1, barray2, size) BITARRAYSFOREACH(barray1,barray2,size,&=)
356 #define BITARRAYSOR(barray1, barray2, size) BITARRAYSFOREACH(barray1,barray2,size,|=)
359 #define BITARRAYSNOT(barray1, barray2, size) BITARRAYSFOREACH(barray1,barray2,size,= ~)
397 char* subscipsettings;
398 char subscipobjective;
423 int* nzerohalfcutsalgo;
428 struct Zerohalf_SubLPData
443 struct Zerohalf_LPData
460 int* subproblemsindexofrow;
462 int* rrowsindexofleftrow;
463 int* rrowsindexofrightrow;
466 int* subproblemsindexofcol;
468 int* rcolsindexofcol;
505 struct Zerohalf_AuxIPData
529 struct Zerohalf_Mod2Data
541 int rowsbitarraysize;
542 int rowaggregationsbitarraysize;
559 struct Zerohalf_CutData
590 struct Zerohalf_AuxGraph_Node;
593 struct Zerohalf_AuxGraph_Node
605 struct Zerohalf_AuxGraph
626 assert(scip !=
NULL);
627 assert(subproblem !=
NULL);
630 (*subproblem)->rrows =
NULL;
631 (*subproblem)->rrowsrhs =
NULL;
632 (*subproblem)->rrowsslack =
NULL;
633 (*subproblem)->nrrows = 0;
635 (*subproblem)->rcols =
NULL;
636 (*subproblem)->rcolslbslack =
NULL;
637 (*subproblem)->rcolsubslack =
NULL;
638 (*subproblem)->nrcols = 0;
651 assert(scip !=
NULL);
652 assert(subproblem !=
NULL);
653 assert(*subproblem !=
NULL);
655 if( (*subproblem)->rrows !=
NULL )
659 if( (*subproblem)->rrowsrhs !=
NULL )
663 if( (*subproblem)->rrowsslack !=
NULL )
667 if( (*subproblem)->rcols !=
NULL )
671 if( (*subproblem)->rcolslbslack !=
NULL )
675 if( (*subproblem)->rcolsubslack !=
NULL )
680 (*subproblem) =
NULL;
691 assert(scip !=
NULL);
692 assert(lpdata !=
NULL);
695 (*lpdata)->vars =
NULL;
696 (*lpdata)->rows =
NULL;
697 (*lpdata)->cols =
NULL;
699 (*lpdata)->subproblems =
NULL;
700 (*lpdata)->nsubproblems = 0;
702 (*lpdata)->intscalarsleftrow =
NULL;
703 (*lpdata)->intscalarsrightrow =
NULL;
705 (*lpdata)->subproblemsindexofrow =
NULL;
706 (*lpdata)->rrowsindexofleftrow =
NULL;
707 (*lpdata)->rrowsindexofrightrow =
NULL;
709 (*lpdata)->subproblemsindexofcol =
NULL;
710 (*lpdata)->rcolsindexofcol =
NULL;
712 (*lpdata)->bestlbidxofcol =
NULL;
713 (*lpdata)->bestubidxofcol =
NULL;
728 assert(scip !=
NULL);
729 assert(lpdata !=
NULL);
730 assert(*lpdata !=
NULL);
733 assert(((*lpdata)->nsubproblems == 0 && (*lpdata)->subproblems ==
NULL)
734 || ((*lpdata)->nsubproblems > 0 && (*lpdata)->subproblems !=
NULL));
736 if( (*lpdata)->subproblems !=
NULL )
738 for( sp = 0 ; sp < (*lpdata)->nsubproblems ; ++sp )
739 if( (*lpdata)->subproblems[sp] !=
NULL )
744 if( (*lpdata)->intscalarsleftrow !=
NULL )
748 if( (*lpdata)->intscalarsrightrow !=
NULL )
752 if( (*lpdata)->subproblemsindexofrow !=
NULL )
756 if( (*lpdata)->rrowsindexofleftrow !=
NULL )
760 if( (*lpdata)->rrowsindexofrightrow !=
NULL )
764 if( (*lpdata)->subproblemsindexofcol !=
NULL )
768 if( (*lpdata)->rcolsindexofcol !=
NULL )
772 if( (*lpdata)->bestlbidxofcol !=
NULL )
776 if( (*lpdata)->bestubidxofcol !=
NULL )
794 assert(scip !=
NULL);
795 assert(mod2data !=
NULL);
799 (*mod2data)->relatedsubproblem =
NULL;
801 (*mod2data)->rows =
NULL;
802 (*mod2data)->rowaggregations =
NULL;
803 (*mod2data)->rhs =
NULL;
805 (*mod2data)->slacks =
NULL;
806 (*mod2data)->fracsol =
NULL;
808 (*mod2data)->rowstatistics =
NULL;
809 (*mod2data)->colstatistics =
NULL;
811 (*mod2data)->rowsind =
NULL;
812 (*mod2data)->colsind =
NULL;
827 assert(scip !=
NULL);
828 assert(mod2data !=
NULL);
829 assert(*mod2data !=
NULL);
831 if( (*mod2data)->rows !=
NULL )
833 for( i = 0 ; i < (*mod2data)->nrows ; ++i)
834 if( (*mod2data)->rows[i] !=
NULL )
841 if( (*mod2data)->rowaggregations !=
NULL )
843 for( i = 0 ; i < (*mod2data)->nrows ; ++i)
844 if( (*mod2data)->rowaggregations[i] !=
NULL )
851 if( (*mod2data)->rhs !=
NULL )
855 if( (*mod2data)->slacks !=
NULL )
859 if( (*mod2data)->fracsol !=
NULL )
863 if( (*mod2data)->rowstatistics !=
NULL )
867 if( (*mod2data)->colstatistics !=
NULL )
871 if( (*mod2data)->rowsind !=
NULL )
875 if( (*mod2data)->colsind !=
NULL )
893 assert(scip !=
NULL);
894 assert(auxipdata !=
NULL);
898 (*auxipdata)->subscip =
NULL;
900 (*auxipdata)->v =
NULL;
901 (*auxipdata)->y =
NULL;
902 (*auxipdata)->r =
NULL;
903 (*auxipdata)->q =
NULL;
905 (*auxipdata)->feasipcons =
NULL;
906 (*auxipdata)->oddrhscons =
NULL;
907 (*auxipdata)->columnsumcons =
NULL;
920 assert(scip !=
NULL);
921 assert(auxipdata !=
NULL);
922 assert(*auxipdata !=
NULL);
924 if( (*auxipdata)->subscip !=
NULL )
929 if( (*auxipdata)->v !=
NULL )
933 if( (*auxipdata)->y !=
NULL )
937 if( (*auxipdata)->r !=
NULL )
941 if( (*auxipdata)->columnsumcons !=
NULL )
964 assert(scip !=
NULL);
965 assert(cutdata !=
NULL);
966 assert(nrrowsincut >= 0);
967 assert(nrowsincut >= 0);
971 (*cutdata)->relatedsubproblem = relatedsubproblem;
972 (*cutdata)->relatedmod2data = relatedmod2data;
974 (*cutdata)->cut =
NULL;
976 (*cutdata)->success =
FALSE;
977 (*cutdata)->isfeasviolated =
FALSE;
978 (*cutdata)->islocal =
TRUE;
980 (*cutdata)->activity = 0.0;
981 (*cutdata)->rhs = 0.0;
982 (*cutdata)->norm = 0.0;
983 (*cutdata)->efficacy = 0.0;
984 (*cutdata)->violation = 0.0;
985 (*cutdata)->cutrank = 0;
986 (*cutdata)->nnonz = 0;
988 (*cutdata)->nrrowsincut = nrrowsincut;
989 (*cutdata)->nrowsincut = nrowsincut;
990 (*cutdata)->separatedby = separatedby;
991 (*cutdata)->addedtolp =
FALSE;
1004 assert(scip !=
NULL);
1005 assert(cutdata !=
NULL);
1006 assert(*cutdata !=
NULL);
1008 if( (*cutdata)->cut !=
NULL )
1026 assert(scip !=
NULL);
1027 assert(node !=
NULL);
1031 (*node)->neighbors =
NULL;
1032 (*node)->edgeweights =
NULL;
1033 (*node)->relatedrows =
NULL;
1034 (*node)->nneighbors = 0;
1036 (*node)->distance = -1.0;
1037 (*node)->previous =
NULL;
1050 assert(scip !=
NULL);
1051 assert(node !=
NULL);
1053 if( (*node)->neighbors !=
NULL )
1057 if( (*node)->edgeweights !=
NULL )
1061 if( (*node)->relatedrows !=
NULL )
1079 assert(scip !=
NULL);
1080 assert(auxgraph !=
NULL);
1084 (*auxgraph)->nodes =
NULL;
1085 (*auxgraph)->nodecopies =
NULL;
1087 (*auxgraph)->nnodes = 0;
1102 assert(scip !=
NULL);
1103 assert(auxgraph !=
NULL);
1105 if( (*auxgraph)->nodes !=
NULL )
1107 assert((*auxgraph)->nnodes > 0);
1108 for( n = 0; n < (*auxgraph)->nnodes ; ++n )
1109 if( (*auxgraph)->nodes[n] !=
NULL )
1116 if( (*auxgraph)->nodecopies !=
NULL )
1118 assert((*auxgraph)->nnodes > 0);
1119 for( n = 0; n < (*auxgraph)->nnodes ; ++n )
1120 if( (*auxgraph)->nodecopies[n] !=
NULL )
1141 char* getconstantname(
1158 #ifdef WITHDECOMPOSE
1159 case ROW_IN_SUBPROB_WITHOUT_ODD_RHS:
1192 #ifdef WITHDECOMPOSE
1193 case COLUMN_IN_SUBPROB_WITHOUT_ODD_RHS:
1206 #ifdef ZEROHALF__PRINT_STATISTICS
1217 int nirrelevantrows;
1220 int nirrelevantcols;
1223 int nnonexistingrows;
1225 assert(lpdata !=
NULL);
1228 nirrelevantrows = 0;
1229 nnonexistingrows = 0;
1231 nirrelevantcols = 0;
1234 for( i = 0 ; i < lpdata->nrows ; ++i)
1236 if( lpdata->rrowsindexofleftrow[i] >= 0 )
1239 if( lpdata->rrowsindexofleftrow[i] < -199 )
1246 if( lpdata->rrowsindexofrightrow[i] >= 0 )
1249 if( lpdata->rrowsindexofrightrow[i] < -199 )
1258 for( i = 0 ; i < lpdata->ncols ; ++i)
1260 if( lpdata->rcolsindexofcol[i] >= 0 )
1263 if( lpdata->rcolsindexofcol[i] == -1 )
1266 if( lpdata->rcolsindexofcol[i] > -200 || lpdata->rcolsindexofcol[i] < -299 )
1272 nrows = nrelevantrows + nirrelevantrows - nnonexistingrows;
1273 ncols = nrelevantcols + nirrelevantcols;
1275 ZEROHALFstatisticsMessage(
"\n");
1276 ZEROHALFstatisticsMessage(
" | ----- lp data ----- | --- (reductions) -- | --- problem data -- | -lpdata- | -(red.)- | -probd.- | --------\n");
1277 ZEROHALFstatisticsMessage(
" | nrows | ncols | ndelrows | ndelcols | nrrows | nrcols | nvarbnds | ndlvbnds | nvarbnds | \n");
1278 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8d | %8d | %8d | %8d | %8d |\n",
1279 "READING LPDATA", nrows, ncols, nirrelevantrows - nnonexistingrows, nirrelevantcols, nrelevantrows, nrelevantcols,
1280 lpdata->nvarbounds, lpdata->ndelvarbounds, lpdata->nvarbounds - lpdata->ndelvarbounds);
1290 void debugPrintSubLpData(
1299 assert(scip !=
NULL);
1300 assert(lpdata !=
NULL);
1301 assert(sublpdata !=
NULL);
1307 for( i = 0 ; i < sublpdata->nrrows ; ++i)
1310 i, sublpdata->rrows[i], sublpdata->rrowsrhs[i], sublpdata->rrowsslack[i],
1314 for( j = 0 ; j < sublpdata->nrcols ; ++j)
1317 i, sublpdata->rcols[i], sublpdata->rcolslbslack[i], sublpdata->rcolsubslack[i]);
1326 void debugPrintMod2Data(
1337 assert(scip !=
NULL);
1338 assert(lpdata !=
NULL);
1339 assert(mod2data !=
NULL);
1344 SCIPdebugMessage(
" nrows = %d, nvarbounds = %d, nrcols = %d, nrowsind = %d, ncolsind = %d\n",
1345 mod2data->nrows, mod2data->nvarbounds, mod2data->relatedsubproblem->nrcols,
1346 mod2data->nrowsind, mod2data->ncolsind);
1347 SCIPdebugMessage(
" rowsbitarraysize = %d, rowaggregationsbitarraysize = %d\n",
1348 mod2data->rowsbitarraysize, mod2data->rowaggregationsbitarraysize);
1352 for( j = 0 ; j < mod2data->relatedsubproblem->nrcols ; ++j )
1354 for( k = 0 ; k < mod2data->ncolsind ; ++k )
1355 if( mod2data->colsind[k] == j )
1357 SCIPdebugMessage(
" rcols[%6d]: fracsol: %6g colsind: %6d name: %s\n", j, mod2data->fracsol[j],
1358 k < mod2data->ncolsind ? k : -1,
1362 SCIPdebugMessage(
"\n (A mod 2, b mod 2, [#nonz] (slacks), R, name(rrows), left(-)/right(+):\n");
1363 if( mod2data->nrowsind == 0 )
1367 for( i = 0 ; i < mod2data->nrowsind ; ++i )
1371 for( j = 0 ; j < mod2data->ncolsind; ++j )
1372 if(
BITARRAYBITISSET(mod2data->rows[mod2data->rowsind[i]], mod2data->colsind[j]) )
1381 if( mod2data->rhs[mod2data->rowsind[i]] )
1392 if( printaggregations )
1394 for( j = 0 ; j < mod2data->relatedsubproblem->nrrows; ++j )
1405 if( mod2data->rowsind[i] < mod2data->nrows - mod2data->nvarbounds )
1408 if( lpdata->rrowsindexofleftrow[mod2data->relatedsubproblem->rrows[mod2data->rowsind[i]]] == mod2data->rowsind[i] )
1439 assert(scip !=
NULL);
1440 assert(lpdata !=
NULL);
1443 for( i = 0 ; i < lpdata->nrows ; ++i)
1446 (lpdata->subproblemsindexofrow[i] ==
IRRELEVANT)
1447 || (lpdata->rrowsindexofleftrow[i] < 0) ?
"IRRELEVANT" :
"RELEVANT",
1448 lpdata->subproblemsindexofrow[i], lpdata->rrowsindexofleftrow[i],
1449 lpdata->rrowsindexofleftrow[i] < 0 ? getconstantname(temp, lpdata->rrowsindexofleftrow[i]) :
"");
1451 (lpdata->subproblemsindexofrow[i] ==
IRRELEVANT)
1452 || (lpdata->rrowsindexofrightrow[i] < 0) ?
"IRRELEVANT" :
"RELEVANT",
1453 lpdata->subproblemsindexofrow[i], lpdata->rrowsindexofrightrow[i],
1454 lpdata->rrowsindexofrightrow[i] < 0 ? getconstantname(temp, lpdata->rrowsindexofrightrow[i]) :
"");
1459 for( j = 0 ; j < lpdata->ncols ; ++j)
1462 (lpdata->subproblemsindexofcol[j] ==
IRRELEVANT)
1463 || (lpdata->rcolsindexofcol[j] < 0) ?
"IRRELEVANT" :
"RELEVANT",
1464 lpdata->subproblemsindexofcol[j], lpdata->rcolsindexofcol[j],
1465 lpdata->rcolsindexofcol[j] < 0 ? getconstantname(temp, lpdata->rcolsindexofcol[j]) :
"");
1489 if( scores[ind1] < scores[ind2] )
1491 else if( scores[ind1] > scores[ind2] )
1506 if( scores[ind1] < scores[ind2] )
1508 else if( scores[ind1] > scores[ind2] )
1536 #ifdef ZEROHALF__PRINT_STATISTICS
1541 assert(scip !=
NULL);
1542 assert(lpdata !=
NULL);
1543 assert(lpdata->cols !=
NULL);
1544 assert(lpdata->ncols > 0);
1545 assert(lpdata->nrows > 0);
1546 assert(lpdata->subproblems ==
NULL);
1547 assert(lpdata->nsubproblems == 0);
1548 assert(lpdata->subproblemsindexofrow ==
NULL);
1549 assert(lpdata->rrowsindexofleftrow ==
NULL);
1550 assert(lpdata->rrowsindexofrightrow ==
NULL);
1551 assert(lpdata->subproblemsindexofcol ==
NULL);
1552 assert(lpdata->rcolsindexofcol ==
NULL);
1553 assert(lpdata->bestlbidxofcol ==
NULL);
1554 assert(lpdata->bestubidxofcol ==
NULL);
1574 lpdata->nsubproblems = 1;
1575 lpdata->subproblems[0] = problem;
1576 lpdata->nvarbounds = 0;
1577 lpdata->ndelvarbounds = 0;
1580 for( j = 0 ; j < lpdata->ncols ; ++j)
1583 lpdata->bestlbidxofcol[j] = -2;
1584 lpdata->bestubidxofcol[j] = -2;
1586 col = lpdata->cols[j];
1600 lbslack = primsol - lb;
1601 ubslack = ub - primsol;
1610 #ifdef ZEROHALF__PRINT_STATISTICS
1616 lpdata->nvarbounds += tempnvarbnds;
1630 lpdata->subproblemsindexofcol[j] =
IRRELEVANT;
1637 #ifdef ZEROHALF__PRINT_STATISTICS
1638 lpdata->ndelvarbounds += tempnvarbnds;
1640 lpdata->subproblemsindexofcol[j] =
IRRELEVANT;
1641 if(
ISODD(scip, lb) )
1650 #ifdef ZEROHALF__PRINT_STATISTICS
1651 lpdata->ndelvarbounds += tempnvarbnds;
1653 lpdata->subproblemsindexofcol[j] =
IRRELEVANT;
1654 if(
ISODD(scip, ub) )
1662 problem->rcols[problem->nrcols] = j;
1663 problem->rcolslbslack[problem->nrcols] = lbslack;
1664 problem->rcolsubslack[problem->nrcols] = ubslack;
1665 lpdata->subproblemsindexofcol[j] = 0;
1666 lpdata->rcolsindexofcol[j] = problem->nrcols;
1673 #ifdef ZEROHALF__PRINT_STATISTICS
1674 lpdata->ndelvarbounds += tempnvarbnds;
1676 lpdata->subproblemsindexofcol[j] =
IRRELEVANT;
1683 lpdata->subproblemsindexofcol[j] =
IRRELEVANT;
1716 assert(lpdata !=
NULL);
1717 assert(bestlbsol !=
NULL);
1718 assert(bestlbtype !=
NULL);
1719 assert(bestzvlb !=
NULL);
1720 assert(bestbvlb !=
NULL);
1721 assert(bestdvlb !=
NULL);
1727 *bestlbtype = lpdata->bestlbidxofcol[collppos];
1732 if( *bestlbtype == -1 )
1742 assert(zvlb !=
NULL || nvlb == 0);
1743 assert(bvlb !=
NULL || nvlb == 0);
1744 assert(dvlb !=
NULL || nvlb == 0);
1747 if( *bestlbtype == -2 )
1753 for( j = 0; j < nvlb; j++ )
1755 assert(zvlb !=
NULL);
1756 assert(bvlb !=
NULL);
1757 assert(dvlb !=
NULL);
1767 if( vlbsol > *bestlbsol )
1769 *bestlbsol = vlbsol;
1777 if( *bestlbtype == -2 )
1781 lpdata->bestlbidxofcol[collppos] = *bestlbtype;
1783 assert(lpdata->bestlbidxofcol[collppos] > -2);
1785 if( *bestlbtype >= 0 )
1788 assert(*bestlbtype < nvlb);
1789 assert(zvlb !=
NULL);
1790 assert(bvlb !=
NULL);
1791 assert(dvlb !=
NULL);
1792 *bestzvlb = zvlb[*bestlbtype];
1793 *bestbvlb = bvlb[*bestlbtype];
1794 *bestdvlb = dvlb[*bestlbtype];
1823 assert(lpdata !=
NULL);
1824 assert(bestubsol !=
NULL);
1825 assert(bestubtype !=
NULL);
1826 assert(bestzvub !=
NULL);
1827 assert(bestbvub !=
NULL);
1828 assert(bestdvub !=
NULL);
1833 *bestubtype = lpdata->bestubidxofcol[collppos];
1838 if( *bestubtype == -1 )
1848 assert(zvub !=
NULL || nvub == 0);
1849 assert(bvub !=
NULL || nvub == 0);
1850 assert(dvub !=
NULL || nvub == 0);
1853 if( *bestubtype == -2 )
1858 for( j = 0; j < nvub; j++ )
1860 assert(zvub !=
NULL);
1861 assert(bvub !=
NULL);
1862 assert(dvub !=
NULL);
1872 if( vubsol < *bestubsol )
1874 *bestubsol = vubsol;
1881 if( *bestubtype == -2 )
1885 lpdata->bestubidxofcol[collppos] = *bestubtype;
1887 assert(lpdata->bestubidxofcol[collppos] > -2);
1889 if( *bestubtype >= 0 )
1892 assert(*bestubtype < nvub);
1893 assert(zvub !=
NULL);
1894 assert(bvub !=
NULL);
1895 assert(dvub !=
NULL);
1896 *bestzvub = zvub[*bestubtype];
1897 *bestbvub = bvub[*bestubtype];
1898 *bestdvub = dvub[*bestubtype];
1933 int nnonzcurrentrow;
1949 assert(scip !=
NULL);
1950 assert(sepadata !=
NULL);
1951 assert(lpdata !=
NULL);
1952 assert(lpdata->rows !=
NULL);
1953 assert(lpdata->nrows > 0);
1954 assert(lpdata->subproblemsindexofcol !=
NULL);
1955 assert(lpdata->rcolsindexofcol !=
NULL);
1956 assert(lpdata->subproblems !=
NULL);
1957 assert(lpdata->nsubproblems > 0);
1959 assert(lpdata->subproblemsindexofrow ==
NULL);
1960 assert(lpdata->rrowsindexofleftrow ==
NULL);
1961 assert(lpdata->rrowsindexofrightrow ==
NULL);
1964 problem = lpdata->subproblems[k];
1967 assert(k <= lpdata->nsubproblems);
1968 assert(problem !=
NULL);
1969 assert(problem->rcols !=
NULL);
1970 assert(problem->nrcols > 0);
1971 assert(problem->rcolslbslack !=
NULL);
1972 assert(problem->rcolsubslack !=
NULL);
1974 assert(problem->rrows ==
NULL);
1975 assert(problem->rrowsrhs ==
NULL);
1976 assert(problem->rrowsslack ==
NULL);
1997 maxslack = sepadata->maxslack;
1998 problem->nrrows = 0;
1999 for( r = 0 ; r < lpdata->nrows ; ++r)
2001 row = lpdata->rows[r];
2003 if( sepadata->ignoreprevzhcuts )
2008 if( strlen(rowname) > 8 )
2009 if(rowname[0] ==
'z'
2010 && rowname[1] ==
'e'
2011 && rowname[2] ==
'r'
2012 && rowname[3] ==
'o'
2013 && rowname[4] ==
'h'
2014 && rowname[5] ==
'a'
2015 && rowname[6] ==
'l'
2016 && rowname[7] ==
'f' )
2018 lpdata->subproblemsindexofrow[r] =
IRRELEVANT;
2026 if( sepadata->onlyorigrows )
2033 assert(sepadata->origrows !=
NULL);
2034 assert(sepadata->norigrows > 0);
2038 right = sepadata->norigrows - 1;
2040 while( left <= right && center > -1 )
2042 center = left + ((right - left) / 2);
2043 if( sepadata->origrows[center] == rowindex )
2045 if( sepadata->origrows[center] > rowindex )
2052 lpdata->subproblemsindexofrow[r] =
IRRELEVANT;
2069 for( c = 0; c < nnonzcurrentrow; ++c)
2072 assert(0 <= collppos && collppos < lpdata->ncols);
2095 &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2096 assert( bestbndtype > -2 && lpdata->bestlbidxofcol[collppos] == bestbndtype);
2098 if( bestbndtype > -1 )
2103 assert(0 <= zlppos && zlppos < lpdata->ncols);
2105 if( valscurrentrow[c] > 0 )
2106 densecoeffscurrentrightrow[zlppos] += valscurrentrow[c] * bestbvbnd;
2108 densecoeffscurrentleftrow[zlppos] -= valscurrentrow[c] * bestbvbnd;
2112 &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2113 assert(bestbndtype > -2 && lpdata->bestubidxofcol[collppos] == bestbndtype);
2115 if( bestbndtype > -1 )
2120 assert(0 <= zlppos && zlppos < lpdata->ncols);
2122 if( valscurrentrow[c] > 0 )
2123 densecoeffscurrentleftrow[zlppos] -= valscurrentrow[c] * bestbvbnd;
2125 densecoeffscurrentrightrow[zlppos] += valscurrentrow[c] * bestbvbnd;
2130 densecoeffscurrentleftrow[collppos] -= valscurrentrow[c];
2131 densecoeffscurrentrightrow[collppos] += valscurrentrow[c];
2138 intscalarleftrow = 1.0;
2139 intscalarrightrow = 1.0;
2161 lpdata->subproblemsindexofrow[r] =
IRRELEVANT;
2166 lpdata->intscalarsleftrow[r] = intscalarleftrow;
2167 lpdata->intscalarsrightrow[r] = intscalarrightrow;
2181 lhs = (lhs - cst) * intscalarleftrow;
2182 rhs = (rhs - cst) * intscalarrightrow;
2187 lhsslack = lhsslack * intscalarleftrow;
2188 rhsslack = rhsslack * intscalarrightrow;
2191 if( (!lhsisinfinity &&
SCIPisLE(scip, lhsslack, maxslack))
2192 || (!rhsisinfinity &&
SCIPisLE(scip, rhsslack, maxslack)) )
2198 lhsiseven =
ISEVEN(scip, lhs);
2199 rhsiseven =
ISEVEN(scip, rhs);
2201 rowisrelevant =
FALSE;
2202 for( c = 0 ; c < nnonzcurrentrow ; ++c )
2212 lhsiseven = !lhsiseven;
2213 rhsiseven = !rhsiseven;
2219 if( !rhsisinfinity )
2221 if( valscurrentrow[c] * intscalarrightrow > 0 )
2223 findClosestLb(scip, lpdata, colscurrentrow[c], &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2224 assert(bestbndtype > -2 && lpdata->bestlbidxofcol[collppos] == bestbndtype);
2228 assert(valscurrentrow[c] * intscalarrightrow < 0);
2229 findClosestUb(scip, lpdata, colscurrentrow[c], &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2230 assert(bestbndtype > -2 && lpdata->bestubidxofcol[collppos] == bestbndtype);
2232 assert(bestbndtype == -1 || bestzvbnd !=
NULL);
2235 rhsisinfinity =
TRUE;
2239 if ( bestbndtype == -1 )
2240 rhs -= intscalarrightrow *
REALABS(valscurrentrow[c]) * bestbndsol;
2242 rhs -= intscalarrightrow *
REALABS(valscurrentrow[c]) * bestdvbnd;
2243 rhsslack += intscalarrightrow *
REALABS(valscurrentrow[c])
2245 assert(
SCIPisGE(scip, rhsslack, 0.0));
2250 if( !lhsisinfinity )
2252 if( valscurrentrow[c] * intscalarleftrow < 0 )
2254 findClosestLb(scip, lpdata, colscurrentrow[c], &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2255 assert(bestbndtype > -2 && lpdata->bestlbidxofcol[collppos] == bestbndtype);
2259 assert(valscurrentrow[c] * intscalarleftrow > 0);
2260 findClosestUb(scip, lpdata, colscurrentrow[c], &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2261 assert(bestbndtype > -2 && lpdata->bestubidxofcol[collppos] == bestbndtype);
2263 assert(bestbndtype == -1 || bestzvbnd !=
NULL);
2266 lhsisinfinity =
TRUE;
2270 if( bestbndtype == -1 )
2271 lhs -= intscalarleftrow *
REALABS(valscurrentrow[c]) * bestbndsol;
2273 lhs -= intscalarleftrow *
REALABS(valscurrentrow[c]) * bestdvbnd;
2274 lhsslack += intscalarleftrow *
REALABS(valscurrentrow[c])
2276 assert(
SCIPisGE(scip, lhsslack, 0.0));
2282 if( lhsisinfinity && rhsisinfinity )
2284 rowisrelevant =
FALSE;
2288 rowisrelevant =
TRUE;
2292 if( lpdata->subproblemsindexofcol[collppos] == k )
2293 rowisrelevant =
TRUE;
2296 if( c == nnonzcurrentrow - 1 && (!lhsiseven || !rhsiseven) )
2297 rowisrelevant =
TRUE;
2300 assert(
SCIPisGE(scip, lhsslack, 0.0));
2301 assert(
SCIPisGE(scip, rhsslack, 0.0));
2308 problem->rrows[problem->nrrows] = r;
2310 lhsslackislessequalmaxslack =
SCIPisLE(scip, lhsslack, maxslack);
2311 rhsslackislessequalmaxslack =
SCIPisLE(scip, rhsslack, maxslack);
2317 if( !lhsisinfinity && lhsslackislessequalmaxslack )
2320 lpdata->subproblemsindexofrow[r] = k;
2321 lpdata->rrowsindexofleftrow[r] = problem->nrrows;
2323 problem->rrows[problem->nrrows] = r;
2327 problem->rrowsrhs[problem->nrrows] = lhs;
2328 problem->rrowsslack[problem->nrrows] = lhsslack;
2338 if( !rhsisinfinity && rhsslackislessequalmaxslack )
2341 lpdata->subproblemsindexofrow[r] = k;
2342 lpdata->rrowsindexofrightrow[r] = problem->nrrows;
2344 problem->rrows[problem->nrrows] = r;
2345 problem->rrowsrhs[problem->nrrows] = rhs;
2346 problem->rrowsslack[problem->nrrows] = rhsslack;
2354 if( lpdata->rrowsindexofleftrow[r] > -1 || lpdata->rrowsindexofrightrow[r] > -1 )
2360 lpdata->subproblemsindexofrow[r] =
IRRELEVANT;
2367 lpdata->subproblemsindexofrow[r] =
IRRELEVANT;
2392 assert(mod2data !=
NULL);
2394 if( mod2data->nrowsind == 0 )
2397 if( mod2data->ncolsind <= 2 )
2400 for( r = 0; r < mod2data->nrowsind ; ++r )
2403 for( c = 0; c < mod2data->ncolsind ; ++c )
2405 if(
BITARRAYBITISSET(mod2data->rows[mod2data->rowsind[r]], mod2data->colsind[c]) )
2419 #ifdef ZEROHALF__PRINT_STATISTICS
2422 SCIP_Bool hasMatrixMax2EntriesPerColumn(
2430 assert(mod2data !=
NULL);
2432 if( mod2data->ncolsind == 0 )
2435 if( mod2data->nrowsind <= 2 )
2438 for( c = 0; c < mod2data->ncolsind ; ++c )
2441 for( r = 0; r < mod2data->nrowsind ; ++r )
2443 if(
BITARRAYBITISSET(mod2data->rows[mod2data->rowsind[r]], mod2data->colsind[c]) )
2464 int subproblemindex,
2475 int* varboundstoadd;
2476 int nnonzcurrentrow;
2481 #ifdef ZEROHALF__PRINT_STATISTICS
2482 int nirrelevantvarbounds;
2490 assert(scip !=
NULL);
2491 assert(sepadata !=
NULL);
2492 assert(lpdata !=
NULL);
2493 assert(lpdata->rows !=
NULL);
2494 assert(lpdata->nrows > 0);
2495 assert(lpdata->cols !=
NULL);
2496 assert(lpdata->ncols > 0);
2497 assert(lpdata->subproblems !=
NULL);
2498 assert(lpdata->nsubproblems > 0);
2499 assert(lpdata->subproblemsindexofrow !=
NULL);
2500 assert(lpdata->rrowsindexofleftrow !=
NULL);
2501 assert(lpdata->rrowsindexofrightrow !=
NULL);
2502 assert(lpdata->subproblemsindexofcol !=
NULL);
2503 assert(lpdata->rcolsindexofcol !=
NULL);
2504 assert(0 <= subproblemindex);
2505 assert(subproblemindex <= lpdata->nsubproblems);
2506 problem = lpdata->subproblems[subproblemindex];
2507 assert(problem !=
NULL);
2508 assert(problem->rrows !=
NULL);
2509 assert(problem->nrrows > 0);
2510 assert(problem->rrowsrhs !=
NULL);
2511 assert(problem->rrowsslack !=
NULL);
2512 assert(problem->rcols !=
NULL);
2513 assert(problem->nrcols > 0);
2514 assert(problem->rcolslbslack !=
NULL);
2515 assert(problem->rcolsubslack !=
NULL);
2516 assert(mod2data !=
NULL);
2521 maxslack = sepadata->maxslack;
2523 #ifdef ZEROHALF__PRINT_STATISTICS
2524 nirrelevantvarbounds = 0;
2526 mod2data->nvarbounds = 0;
2527 for( c = 0 ; c < problem->nrcols ; c++ )
2532 lbslackisok =
SCIPisLE(scip, problem->rcolslbslack[c], maxslack);
2533 ubslackisok =
SCIPisLE(scip, problem->rcolsubslack[c], maxslack);
2535 if( lbslackisok && ubslackisok )
2545 varboundstoadd[mod2data->nvarbounds] = (-1) * (c + 1);
2546 mod2data->nvarbounds++;
2547 varboundstoadd[mod2data->nvarbounds] = c + 1;
2548 mod2data->nvarbounds++;
2552 if(
SCIPisLE(scip, problem->rcolslbslack[c], problem->rcolsubslack[c]) )
2553 varboundstoadd[mod2data->nvarbounds] = (-1) * (c + 1);
2555 varboundstoadd[mod2data->nvarbounds] = c + 1;
2556 mod2data->nvarbounds++;
2557 #ifdef ZEROHALF__PRINT_STATISTICS
2558 nirrelevantvarbounds++;
2566 varboundstoadd[mod2data->nvarbounds] = (-1) * (c + 1);
2567 mod2data->nvarbounds++;
2569 #ifdef ZEROHALF__PRINT_STATISTICS
2571 nirrelevantvarbounds++;
2575 varboundstoadd[mod2data->nvarbounds] = c + 1;
2576 mod2data->nvarbounds++;
2578 #ifdef ZEROHALF__PRINT_STATISTICS
2580 nirrelevantvarbounds++;
2584 mod2data->nrows = problem->nrrows + mod2data->nvarbounds;
2599 mod2data->relatedsubproblem = problem;
2603 for( c = 0 ; c < problem->nrcols ; ++c)
2605 for( c = 0 ; c < problem->nrcols ; c++)
2606 mod2data->colsind[c] = c;
2607 mod2data->nrowsind = 0;
2608 mod2data->ncolsind = problem->nrcols;
2611 tempcurrentrow =
NULL;
2614 for( i = 0 ; i < problem->nrrows ; ++i )
2616 row = lpdata->rows[problem->rrows[i]];
2620 assert(nnonzcurrentrow > 0);
2621 tempcurrentrow =
NULL;
2626 if( lpdata->rrowsindexofleftrow[problem->rrows[i]] == i )
2630 assert(lpdata->rrowsindexofrightrow[problem->rrows[i]] == i);
2633 intscalar = isrhsrow ? lpdata->intscalarsrightrow[problem->rrows[i]]
2634 : lpdata->intscalarsleftrow[problem->rrows[i]];
2640 for( j = 0 ; j < nnonzcurrentrow; ++j )
2652 if( nonzvalscurrentrow[j] * intscalar > 0.0 )
2653 ispositivecoeff =
TRUE;
2655 ispositivecoeff =
FALSE;
2658 if( isrhsrow == ispositivecoeff )
2659 findClosestLb(scip, lpdata, colscurrentrow[j], &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2661 findClosestUb(scip, lpdata, colscurrentrow[j], &bestbndsol, &bestbndtype, &bestzvbnd, &bestbvbnd, &bestdvbnd );
2664 assert(bestbndtype > -2);
2666 assert(bestbndtype == -1);
2669 if( bestbndtype == -1 )
2678 densecoeffscurrentrow[
SCIPcolGetLPPos(colscurrentrow[j])] += (nonzvalscurrentrow[j] * intscalar);
2682 for( j = 0 ; j < lpdata->ncols; ++j )
2686 if(
SCIPisZero(scip, densecoeffscurrentrow[j]) )
2689 if( intscalar == 1.0 && !
SCIPisIntegral(scip, densecoeffscurrentrow[j]) )
2695 assert(sepadata->scalefraccoeffs);
2700 densecoeffscurrentrow[j] =
SCIPfloor(scip, densecoeffscurrentrow[j]);
2702 densecoeffscurrentrow[j] =
SCIPceil(scip, densecoeffscurrentrow[j]);
2704 if(
ISODD(scip, densecoeffscurrentrow[j]) )
2706 rcolsindex = lpdata->rcolsindexofcol[j];
2707 fliplhsrhs =
XOR((
int) fliplhsrhs,
2709 if( rcolsindex >= 0 )
2711 if( tempcurrentrow ==
NULL )
2716 assert(rcolsindex < problem->nrcols);
2726 if( tempcurrentrow !=
NULL )
2729 tempcurrentrow =
NULL;
2735 if(
XOR((
int)
ISODD(scip, problem->rrowsrhs[i]), (
int) fliplhsrhs) )
2738 tempmod2rhs =
FALSE;
2740 if( tempcurrentrow ==
NULL && tempmod2rhs )
2745 assert(tempcurrentrow !=
NULL || !tempmod2rhs);
2748 if( tempcurrentrow !=
NULL )
2750 mod2data->rows[i] = tempcurrentrow;
2751 mod2data->rhs[i] = tempmod2rhs;
2753 assert(mod2data->rowaggregationsbitarraysize > 0);
2755 mod2data->rowaggregationsbitarraysize) );
2756 BITARRAYCLEAR(mod2data->rowaggregations[i], mod2data->rowaggregationsbitarraysize);
2759 mod2data->rowsind[mod2data->nrowsind] = i;
2760 mod2data->nrowsind++;
2762 tempcurrentrow =
NULL;
2767 lpdata->subproblemsindexofrow[problem->rrows[i]] =
IRRELEVANT;
2768 if( lpdata->rrowsindexofleftrow[problem->rrows[i]] >= 0 )
2769 lpdata->rrowsindexofleftrow[problem->rrows[i]] =
ZERO_ROW;
2770 if( lpdata->rrowsindexofrightrow[problem->rrows[i]] >= 0 )
2771 lpdata->rrowsindexofrightrow[problem->rrows[i]] =
ZERO_ROW;
2777 i = problem->nrrows;
2778 for( j = 0 ; j < mod2data->nvarbounds ; ++j)
2782 if( varboundstoadd[j] < 0 )
2783 c = (-1) * varboundstoadd[j] - 1;
2785 c = varboundstoadd[j] - 1;
2787 assert(mod2data->rowsbitarraysize > 0);
2789 BITARRAYCLEAR(mod2data->rows[i], mod2data->rowsbitarraysize);
2794 mod2data->rowaggregationsbitarraysize));
2795 BITARRAYCLEAR(mod2data->rowaggregations[i], mod2data->rowaggregationsbitarraysize);
2797 if( varboundstoadd[j] < 0 )
2800 mod2data->rhs[i] =
ISODD(scip, bound);
2801 mod2data->slacks[i] = problem->rcolslbslack[c];
2806 mod2data->rhs[i] =
ISODD(scip, bound);
2807 mod2data->slacks[i] = problem->rcolsubslack[c];
2810 mod2data->slacks[i] = 0.0;
2812 mod2data->rowsind[mod2data->nrowsind] = i;
2813 mod2data->nrowsind++;
2821 #ifdef ZEROHALF__PRINT_STATISTICS
2822 ZEROHALFstatisticsMessage(
"\n");
2823 ZEROHALFstatisticsMessage(
" | ------------------------------- subproblem ------------------------------- | ------------------------------\n");
2824 ZEROHALFstatisticsMessage(
" | nrrows | nrcols | nvarbnds | ndlvbnds | max2/row | max2/col | A^T ept | \n");
2825 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8s | %8s | %8s |\n",
2826 "SUBPROBLEMDATA", problem->nrrows, problem->nrcols, mod2data->nvarbounds, nirrelevantvarbounds,
2864 assert(nvars == 0 || cutcoefs !=
NULL);
2865 assert(nvars == 0 || varsolvals !=
NULL);
2866 assert(cutvars !=
NULL);
2867 assert(cutvals !=
NULL);
2868 assert(cutlen !=
NULL);
2869 assert(cutact !=
NULL);
2870 assert(cutnorm !=
NULL);
2879 for( v = 0; v < nvars; ++v)
2884 act += val * varsolvals[v];
2885 cutsqrnorm += SQR(val);
2886 cutvars[len] = vars[v];
2891 norm = SQRT(cutsqrnorm);
2894 for( v = 0; v < nvars; ++v)
2899 act += val * varsolvals[v];
2901 norm =
MAX(norm, absval);
2902 cutvars[len] = vars[v];
2909 for( v = 0; v < nvars; ++v)
2914 act += val * varsolvals[v];
2916 cutvars[len] = vars[v];
2923 for( v = 0; v < nvars; ++v)
2928 act += val * varsolvals[v];
2930 cutvars[len] = vars[v];
2960 assert(scip !=
NULL);
2961 assert(sepadata !=
NULL);
2962 assert(cutdata !=
NULL);
2963 assert(result !=
NULL);
2966 if( !cutdata->isfeasviolated || !cutdata->success )
2977 if( !sepadata->forcecutstolp && !sepadata->forcecutstosepastore
2984 if( !sepadata->usezhcutpool )
2993 if( !cutdata->islocal )
2999 cutdata->addedtolp =
TRUE;
3024 assert(mod2data !=
NULL);
3025 assert(mod2data->relatedsubproblem !=
NULL);
3026 assert(mod2data->nrowsind > 0);
3028 assert(r < mod2data->nrowsind);
3030 mod2data->rowstatistics[mod2data->rowsind[r]] = flag;
3047 assert(mod2data !=
NULL);
3048 assert(mod2data->relatedsubproblem !=
NULL);
3049 assert(mod2data->ncolsind > 0);
3051 assert(c < mod2data->ncolsind);
3055 mod2data->colstatistics[mod2data->colsind[c]] = flag;
3060 for( i = 0 ; i < mod2data->nrowsind ; ++i)
3061 mod2data->rows[mod2data->rowsind[i]][rowsbind] &= rowsbmask;
3088 assert(scip !=
NULL);
3089 assert(lpdata !=
NULL);
3090 assert(lpdata->nrows > 0);
3091 assert(mod2data !=
NULL);
3092 assert(mod2data->relatedsubproblem !=
NULL);
3093 assert(mod2data->nrowsind > 0);
3094 assert(rrowsincut !=
NULL);
3095 assert(weights !=
NULL);
3096 assert(*weights ==
NULL);
3097 assert(nrowsincut !=
NULL);
3105 problem = mod2data->relatedsubproblem;
3110 for( i = 0 ; i < problem->nrrows ; ++i)
3112 lppos = problem->rrows[i];
3113 assert(0 <= lppos && lppos <= lpdata->nrows);
3116 assert(lpdata->rrowsindexofleftrow[lppos] == i || lpdata->rrowsindexofrightrow[lppos] == i);
3119 lpdata->rrowsindexofleftrow[lppos] == i ?
"-" :
"+",
3120 lpdata->intscalarsleftrow[lppos], lpdata->intscalarsrightrow[lppos],
3123 if( lpdata->rrowsindexofleftrow[lppos] == i )
3124 (*weights)[lppos] = lpdata->intscalarsleftrow[lppos] * (-0.5);
3126 (*weights)[lppos] = lpdata->intscalarsrightrow[lppos] * 0.5;
3134 if( nnonz >= 5 * sepadata->maxnnonz )
3164 assert(scip !=
NULL);
3165 assert(lpdata !=
NULL);
3166 assert(lpdata->nvars > 0);
3167 assert(weights !=
NULL);
3168 assert(varsolvals !=
NULL);
3169 assert(cutdata !=
NULL);
3170 assert(cutdata->relatedsubproblem !=
NULL);
3171 assert(cutoff !=
NULL);
3182 cutdata->success =
FALSE;
3183 if( sepadata->maxtestdelta == 0 )
3188 weights,
NULL, 1.0,
NULL,
NULL, cutcoefs, &(cutdata->rhs), &(cutdata->activity),
3189 &(cutdata->success), &(cutdata->islocal), &(cutdata->cutrank)) );
3191 if( sepadata->trynegscaling )
3195 weights,
NULL, -1.0,
NULL,
NULL, cutcoefs, &(cutdata->rhs), &(cutdata->activity),
3196 &(cutdata->success), &(cutdata->islocal), &(cutdata->cutrank)) );
3207 if( *varsolvals ==
NULL )
3220 for(i = lpdata->nvars - 1; i >= 0; --i )
3225 assert(*varsolvals !=
NULL);
3230 sepadata->trynegscaling,
TRUE,
"zerohalf", cutoff, &ncuts, &bestdelta, &bestdeltavalid) );
3234 if( !(*cutoff) && bestdeltavalid )
3238 weights,
NULL, bestdelta,
NULL,
NULL, cutcoefs, &(cutdata->rhs), &(cutdata->activity),
3239 &(cutdata->success), &(cutdata->islocal), &(cutdata->cutrank)) );
3244 cutdata->violation = cutdata->activity - cutdata->rhs;
3247 if( !(*cutoff) && cutdata->success )
3249 cutdata->isfeasviolated =
SCIPisFeasGT(scip, cutdata->activity, cutdata->rhs);
3251 cutdata->isfeasviolated ?
"" :
"not ", cutdata->activity, cutdata->rhs, cutdata->violation);
3253 if( cutdata->isfeasviolated )
3255 if( *varsolvals ==
NULL )
3261 assert(*varsolvals !=
NULL);
3269 cutcoefs, *varsolvals, normtype, cutvars, cutvals,
3270 &(cutdata->nnonz), &(cutdata->activity), &(cutdata->norm)));
3275 cutdata->efficacy = (cutdata->activity - cutdata->rhs) / cutdata->norm;
3277 if( sepadata->forcecutstolp || sepadata->forcecutstosepastore
3278 || (
SCIPisEfficacious(scip, cutdata->efficacy) && cutdata->nnonz < sepadata->maxnnonz) )
3283 cutdata->islocal,
FALSE, sepadata->dynamiccuts));
3289 cutdata->success =
FALSE;
3292 cutdata->success =
FALSE;
3299 cutdata->success =
FALSE;
3340 assert(scip !=
NULL);
3341 assert(lpdata !=
NULL);
3342 assert(mod2data !=
NULL);
3343 assert(mod2data->relatedsubproblem !=
NULL);
3344 assert(firstrowsind >= 0);
3345 assert(lastrowsind <= mod2data->nrowsind);
3346 assert(nsepacuts !=
NULL);
3347 assert(nzerohalfcuts !=
NULL);
3348 assert(zerohalfcuts !=
NULL);
3349 assert(*nsepacuts <= *nzerohalfcuts);
3350 assert(varsolvals !=
NULL);
3351 assert(result !=
NULL);
3355 if( mod2data->nrowsind == 0 || lastrowsind - firstrowsind <= 0 )
3366 maxslack = sepadata->maxslack;
3371 for( r = 0 ; r < lastrowsind - firstrowsind && *nsepacuts < maxsepacuts && *nzerohalfcuts < maxcuts; ++r )
3373 if( mod2data->rhs[mod2data->rowsind[firstrowsind + r]] ==
TRUE )
3375 if(
SCIPisLE(scip, mod2data->slacks[mod2data->rowsind[firstrowsind + r]], maxslack ))
3378 zerorow, mod2data->rowsbitarraysize) )
3383 mod2data->rowaggregations[mod2data->rowsind[firstrowsind + r]], &weights, &nrowsincut));
3384 if( weights ==
NULL )
3388 assert(nrowsincut > 0);
3392 mod2data->relatedsubproblem, mod2data, 1, nrowsincut, cutseparatedby));
3394 lpdata, weights, normtype, *nzerohalfcuts, varsolvals, zerohalfcuts[*nzerohalfcuts], &cutoff));
3411 removerow[r] =
TRUE;
3419 if( ! cutoff && nrowsremoved > 0 )
3422 for( r = firstrowsind ; r < mod2data->nrowsind && r2 < mod2data->nrowsind; ++r)
3424 if( r < lastrowsind - firstrowsind )
3425 while( removerow[r2] && r2 < mod2data->nrowsind )
3427 if( r < r2 && r2 < mod2data->nrowsind )
3428 mod2data->rowsind[r] = mod2data->rowsind[r2];
3431 mod2data->nrowsind -= nrowsremoved;
3461 int nzerorowsremoved;
3462 int nlargeslackrowsremoved;
3463 int nidenticalrowsremoved;
3467 assert(scip !=
NULL);
3468 assert(lpdata !=
NULL);
3469 assert(mod2data !=
NULL);
3470 assert(mod2data->relatedsubproblem !=
NULL);
3471 assert(firstrowsind >= 0);
3472 assert(lastrowsind <= mod2data->nrowsind);
3476 if( mod2data->nrowsind == 0 || lastrowsind - firstrowsind <= 0 )
3483 if( removezerorows )
3490 if( removezerorows )
3494 maxslack = sepadata->maxslack;
3495 nzerorowsremoved = 0;
3496 nlargeslackrowsremoved = 0;
3497 nidenticalrowsremoved = 0;
3500 for( r1 = 0 ; r1 < lastrowsind - firstrowsind ; ++r1)
3501 if( !rowisprocessed[r1] )
3503 rowisprocessed[r1] =
TRUE;
3505 if( removezerorows && !removerow[r1] )
3506 if( mod2data->rhs[mod2data->rowsind[firstrowsind + r1]] ==
FALSE )
3508 assert(zerorow !=
NULL);
3510 zerorow, mod2data->rowsbitarraysize) )
3513 removerow[r1] =
TRUE;
3517 if( removelargeslackrows && !removerow[r1] )
3518 if(
SCIPisGT(scip, mod2data->slacks[mod2data->rowsind[firstrowsind + r1]], maxslack) )
3521 removerow[r1] =
TRUE;
3522 nlargeslackrowsremoved++;
3525 if( removeidenticalrows && !removerow[r1] )
3526 for( r2 = r1 + 1 ; r2 < lastrowsind - firstrowsind ; ++r2)
3527 if( !rowisprocessed[r2] )
3528 if( mod2data->rhs[mod2data->rowsind[firstrowsind + r1]]
3529 == mod2data->rhs[mod2data->rowsind[firstrowsind + r2]] )
3531 mod2data->rows[mod2data->rowsind[firstrowsind + r2]], mod2data->rowsbitarraysize) )
3533 if(
SCIPisLT(scip, mod2data->slacks[mod2data->rowsind[firstrowsind + r1]],
3534 mod2data->slacks[mod2data->rowsind[firstrowsind + r2]]) )
3537 removerow[r2] =
TRUE;
3538 nidenticalrowsremoved++;
3539 rowisprocessed[r2] =
TRUE;
3544 removerow[r1] =
TRUE;
3545 nidenticalrowsremoved++;
3552 if( nzerorowsremoved + nlargeslackrowsremoved + nidenticalrowsremoved > 0 )
3555 for( r1 = firstrowsind ; r1 < mod2data->nrowsind && r2 < mod2data->nrowsind; ++r1)
3557 if( r1 < lastrowsind - firstrowsind )
3558 while( removerow[r2] && r2 < mod2data->nrowsind )
3560 if( r1 < r2 && r2 < mod2data->nrowsind )
3561 mod2data->rowsind[r1] = mod2data->rowsind[r2];
3564 mod2data->nrowsind -= (nzerorowsremoved + nlargeslackrowsremoved + nidenticalrowsremoved);
3569 if( removezerorows && zerorow !=
NULL )
3595 int maxnnonzentries;
3596 int nzerocolsremoved;
3597 int ncolsingletonsremoved;
3598 int nunprocessedcols;
3599 int nconsideredcols;
3603 int rowofcolsingleton;
3610 assert(scip !=
NULL);
3611 assert(sepadata !=
NULL);
3612 assert(lpdata !=
NULL);
3613 assert(mod2data !=
NULL);
3614 assert(mod2data->relatedsubproblem !=
NULL);
3615 assert(firstcolsind >= 0);
3616 assert(lastcolsind <= mod2data->ncolsind);
3617 assert(removezerocols || removecolsingletons);
3620 nconsideredcols = lastcolsind - firstcolsind;
3623 if( mod2data->ncolsind == 0 || mod2data->nrowsind == 0 || nconsideredcols <= 0 )
3634 maxslack = sepadata->maxslack;
3635 nunprocessedcols = nconsideredcols;
3636 nzerocolsremoved = 0;
3637 ncolsingletonsremoved = 0;
3639 rowofcolsingleton = -1;
3640 if( removecolsingletons )
3641 maxnnonzentries = 1;
3643 maxnnonzentries = 0;
3646 while(nunprocessedcols > 0)
3648 for( c = 0 ; c < nconsideredcols ; ++c )
3649 if( colisprocessed[c] ==
FALSE )
3651 assert(firstcolsind + c < mod2data->ncolsind);
3657 for( r = 0 ; r < mod2data->nrowsind ; ++r)
3658 if( mod2data->rows[mod2data->rowsind[r]][rowsbind] & rowsbmask )
3661 if( nnonzentries > maxnnonzentries )
3663 rowofcolsingleton = r;
3667 if( removezerocols )
3668 if( nnonzentries == 0 )
3671 removecol[c] =
TRUE;
3677 if( removecolsingletons && !removecol[c] )
3678 if( nnonzentries == 1 )
3680 r = rowofcolsingleton;
3681 removecol[c] =
TRUE;
3684 mod2data->slacks[mod2data->rowsind[r]] += mod2data->fracsol[mod2data->colsind[firstcolsind + c]];
3688 if( checkresultingrows &&
SCIPisGT(scip, mod2data->slacks[mod2data->rowsind[r]], maxslack) )
3691 for( j = 0 ; j < nconsideredcols ; ++j)
3692 if( !removecol[j] && colisprocessed[j] )
3694 mod2data->colsind[firstcolsind + j]) )
3696 colisprocessed[j] =
FALSE;
3701 mod2data->nrowsind - r - 1);
3703 mod2data->nrowsind--;
3707 ncolsingletonsremoved++;
3711 colisprocessed[c] =
TRUE;
3714 if( nzerocolsremoved + ncolsingletonsremoved == nconsideredcols || mod2data->nrowsind == 0 )
3719 if( mod2data->nrowsind == 0 )
3721 for( c = firstcolsind ; c < mod2data->ncolsind; ++c)
3724 removecol[c] =
TRUE;
3727 nzerocolsremoved = nconsideredcols - ncolsingletonsremoved;
3728 assert(nzerocolsremoved + ncolsingletonsremoved == nconsideredcols);
3732 if( mod2data->nrowsind == 0 )
3733 mod2data->ncolsind = 0;
3735 if( nzerocolsremoved + ncolsingletonsremoved > 0 )
3738 for( c = firstcolsind ; c < mod2data->ncolsind && j < mod2data->ncolsind; ++c)
3740 if( c < nconsideredcols )
3741 while( removecol[j] && j < mod2data->ncolsind )
3743 if( c < j && j < mod2data->ncolsind )
3744 mod2data->colsind[c] = mod2data->colsind[j];
3747 mod2data->ncolsind -= (nzerocolsremoved + ncolsingletonsremoved);
3771 int identsubmatrixsize;
3777 assert(scip !=
NULL);
3778 assert(sepadata !=
NULL);
3779 assert(lpdata !=
NULL);
3780 assert(mod2data !=
NULL);
3781 assert(mod2data->relatedsubproblem !=
NULL);
3784 if( mod2data->ncolsind == 0 || mod2data->nrowsind == 0 )
3789 while( nslackzerorows < mod2data->nrowsind
3790 &&
SCIPisZero(scip, mod2data->slacks[mod2data->rowsind[nslackzerorows]]) )
3793 if( nslackzerorows == 0 )
3798 if( mod2data->ncolsind > 1 )
3800 SCIPsortInd( mod2data->colsind , compRealNonIncreasing , (
void*) mod2data->fracsol , mod2data->ncolsind );
3804 if( mod2data->nrowsind > 1 )
3806 SCIPsortInd( mod2data->rowsind , compRealNonDecreasing , (
void*) mod2data->slacks , mod2data->nrowsind );
3810 identsubmatrixsize = 0;
3814 for( pivotcol = 0 ; pivotcol < mod2data->ncolsind ; ++pivotcol)
3816 if( identsubmatrixsize == mod2data->nrowsind )
3822 for( pivotrow = identsubmatrixsize ; pivotrow < nslackzerorows ; ++pivotrow)
3823 if( mod2data->rows[mod2data->rowsind[pivotrow]][rowsbind] & rowsbmask )
3825 if( pivotrow == nslackzerorows )
3829 for( r = 0 ; r < nslackzerorows ; ++r)
3833 if( mod2data->rows[mod2data->rowsind[r]][rowsbind] & rowsbmask )
3836 BITARRAYSXOR(mod2data->rows[mod2data->rowsind[pivotrow]],
3837 mod2data->rows[mod2data->rowsind[r]],mod2data->rowsbitarraysize);
3838 BITARRAYSXOR(mod2data->rowaggregations[mod2data->rowsind[pivotrow]],
3839 mod2data->rowaggregations[mod2data->rowsind[r]],mod2data->rowaggregationsbitarraysize);
3840 mod2data->rhs[mod2data->rowsind[r]] =
3841 XOR(mod2data->rhs[mod2data->rowsind[pivotrow]],mod2data->rhs[mod2data->rowsind[r]]);
3848 temp = mod2data->rowsind[pivotrow];
3849 mod2data->rowsind[pivotrow] = mod2data->rowsind[identsubmatrixsize];
3850 mod2data->rowsind[identsubmatrixsize] = temp;
3851 temp = mod2data->colsind[pivotcol];
3852 mod2data->colsind[pivotcol] = mod2data->colsind[identsubmatrixsize];
3853 mod2data->colsind[identsubmatrixsize] = temp;
3855 identsubmatrixsize++;
3858 if( identsubmatrixsize > 0 )
3862 for( pivot = 0 ; pivot < identsubmatrixsize ; ++pivot)
3866 for( r = nslackzerorows ; r < mod2data->nrowsind ; ++r)
3867 if( mod2data->rows[mod2data->rowsind[r]][rowsbind] & rowsbmask )
3871 mod2data->rows[mod2data->rowsind[r]],mod2data->rowsbitarraysize);
3872 BITARRAYSXOR(mod2data->rowaggregations[mod2data->rowsind[pivot]],
3873 mod2data->rowaggregations[mod2data->rowsind[r]],mod2data->rowaggregationsbitarraysize);
3874 mod2data->rhs[mod2data->rowsind[r]] =
3875 XOR(mod2data->rhs[mod2data->rowsind[pivot]],mod2data->rhs[mod2data->rowsind[r]]);
3903 #ifdef WITHDECOMPOSE
3924 int processedrowsbitarraysize;
3925 int unprocessedrowidx;
3929 int processedcolsbitarraysize;
3959 int* rrowsinsubprob;
3960 int* rcolsinsubprob;
3962 int nrrowsinsubprob;
3963 int nrcolsinsubprob;
3977 assert(scip !=
NULL);
3978 assert(sepadata !=
NULL);
3979 assert(lpdata !=
NULL);
3980 assert(lpdata->subproblems !=
NULL);
3981 assert(lpdata->nsubproblems > 0);
3985 assert(problemindex >= 0);
3986 assert(problemindex <= lpdata->nsubproblems);
3988 problem = lpdata->subproblems[problemindex];
3990 assert(problem !=
NULL);
3991 assert(problem->rcols !=
NULL);
3992 assert(problem->nrcols > 0);
3993 assert(problem->rcolslbslack !=
NULL);
3994 assert(problem->rcolsubslack !=
NULL);
3995 assert(problem->rrows !=
NULL);
3996 assert(problem->nrrows > 0);
3997 assert(problem->rrowsrhs !=
NULL);
3998 assert(problem->rrowsslack !=
NULL);
4000 if( sepadata->dtimer ==
NULL )
4002 ZEROHALFcreateTimer((sepadata->dtimer));
4004 ZEROHALFstartTimer(sepadata->dtimer);
4023 lpdata->nsubproblems = 0;
4024 maxslack = sepadata->maxslack;
4026 nrrowsinitial = problem->nrrows;
4027 nrcolsinitial = problem->nrcols;
4034 unprocessedrowidx = 0;
4036 while( nprocessedrows < problem->nrrows )
4039 nrrowsinsubprob = 0;
4040 nrcolsinsubprob = 0;
4042 for( i = unprocessedrowidx ; i < problem->nrrows ; ++i)
4045 unprocessedrowidx++;
4055 while( queuelast > queuefirst )
4057 assert(queuelast <= problem->nrrows);
4059 i = queue[queuefirst];
4062 rrowsinsubprob[nrrowsinsubprob] = i;
4071 for( cidx = 0 ; cidx < ncolvals ; ++cidx)
4076 rcolsidx = lpdata->rcolsindexofcol[lppos];
4078 if( lpdata->subproblemsindexofcol[lppos] != problemindex || rcolsidx < 0 )
4080 if(
ISODD(scip, colvals[cidx]) )
4081 fliplhsrhs =
XOR(fliplhsrhs,
4089 if( nprocessedcols == problem->nrcols )
4095 if(
ISEVEN(scip, colvals[cidx]) )
4098 rcolsinsubprob[nrcolsinsubprob] = rcolsidx;
4105 for( ridx = 0 ; ridx < nrowvals ; ++ridx)
4110 rrowsidx = lpdata->rrowsindexofleftrow[lppos];
4111 if( lpdata->subproblemsindexofrow[lppos] == problemindex
4115 if(
ISODD(scip, rowvals[ridx]) )
4117 queue[queuelast] = rrowsidx;
4122 rrowsidx = lpdata->rrowsindexofrightrow[lppos];
4123 if( lpdata->subproblemsindexofrow[lppos] == problemindex
4127 if(
ISODD(scip, rowvals[ridx]) )
4129 queue[queuelast] = rrowsidx;
4137 rrowsinsubproboddrhs[nrrowsinsubprob-1] =
XOR(
ISODD(scip, problem->rrowsrhs[i]),fliplhsrhs);
4143 for( i = 0 ; i < nrrowsinsubprob ; ++i)
4144 if( rrowsinsubproboddrhs[i] )
4146 for( j = 0 ; j < nrcolsinsubprob ; ++j)
4147 if( (
SCIPisLE(scip, problem->rcolsubslack[rcolsinsubprob[j]], maxslack)
4149 || (
SCIPisLE(scip, problem->rcolslbslack[rcolsinsubprob[j]], maxslack)
4150 &&
ISODD(scip,
SCIPcolGetLb(lpdata->cols[problem->rcols[rcolsinsubprob[j]]]))) )
4152 if( i == nrrowsinsubprob && j == nrcolsinsubprob )
4155 for( i = 0 ; i < nrrowsinsubprob ; ++i)
4157 lppos =
SCIProwGetLPPos(lpdata->rows[problem->rrows[rrowsinsubprob[i]]]);
4158 lpdata->subproblemsindexofrow[lppos] =
IRRELEVANT;
4159 if( lpdata->rrowsindexofleftrow[lppos] == rrowsinsubprob[i] )
4160 lpdata->rrowsindexofleftrow[lppos] = ROW_IN_SUBPROB_WITHOUT_ODD_RHS;
4161 if( lpdata->rrowsindexofrightrow[lppos] == rrowsinsubprob[i] )
4162 lpdata->rrowsindexofrightrow[lppos] = ROW_IN_SUBPROB_WITHOUT_ODD_RHS;
4164 for( j = 0 ; j < nrcolsinsubprob ; ++j)
4166 lppos =
SCIPcolGetLPPos(lpdata->cols[problem->rcols[rcolsinsubprob[j]]]);
4167 lpdata->subproblemsindexofcol[lppos] =
IRRELEVANT;
4168 lpdata->rcolsindexofcol[lppos] = COLUMN_IN_SUBPROB_WITHOUT_ODD_RHS;
4171 if( !
SCIPisInfinity(scip, problem->rcolslbslack[rcolsinsubprob[j]]) )
4173 if( !
SCIPisInfinity(scip, problem->rcolsubslack[rcolsinsubprob[j]]) )
4180 if( lpdata->nsubproblems == 0 && nprocessedrows == problem->nrrows )
4188 subproblem->nrrows = nrrowsinsubprob;
4192 subproblem->nrcols = nrcolsinsubprob;
4194 for( i = 0 ; i < nrrowsinsubprob ; ++i)
4196 rowindex = problem->rrows[rrowsinsubprob[i]];
4198 subproblem->rrows[i] = rowindex;
4199 subproblem->rrowsrhs[i] = problem->rrowsrhs[rrowsinsubprob[i]];
4200 subproblem->rrowsslack[i] = problem->rrowsslack[rrowsinsubprob[i]];
4202 if( lpdata->subproblemsindexofrow[rowindex] !=
IRRELEVANT )
4204 assert(lpdata->rrowsindexofleftrow[rowindex] >= 0
4205 || lpdata->rrowsindexofrightrow[rowindex] >= 0);
4206 lpdata->subproblemsindexofrow[rowindex] = lpdata->nsubproblems;
4207 if( lpdata->rrowsindexofleftrow[rowindex] >= 0 )
4208 lpdata->rrowsindexofleftrow[rowindex] = i;
4209 if( lpdata->rrowsindexofrightrow[rowindex] >= 0 )
4210 lpdata->rrowsindexofrightrow[rowindex] = i;
4214 for( i = 0 ; i < nrcolsinsubprob ; ++i)
4216 colindex = problem->rcols[rcolsinsubprob[i]];
4218 subproblem->rcols[i] = colindex;
4219 subproblem->rcolslbslack[i] = problem->rcolslbslack[rcolsinsubprob[i]];
4220 subproblem->rcolsubslack[i] = problem->rcolsubslack[rcolsinsubprob[i]];
4222 if( lpdata->subproblemsindexofcol[colindex] !=
IRRELEVANT )
4224 assert(lpdata->rcolsindexofcol[colindex] >= 0);
4225 lpdata->subproblemsindexofcol[colindex] = lpdata->nsubproblems;
4226 lpdata->rcolsindexofcol[colindex] = i;
4230 lpdata->subproblems[lpdata->nsubproblems] = subproblem;
4231 lpdata->nsubproblems++;
4233 totalnrrows += subproblem->nrrows;
4234 totalnrcols += subproblem->nrcols;
4236 SCIPdebugMessage(
"subproblem %d: %d rrows, %d rcols\n", k, subproblem->nrrows, subproblem->nrcols);
4238 if( lpdata->nsubproblems == 0 )
4241 lpdata->subproblems[0] = problem;
4242 lpdata->nsubproblems = 1;
4243 totalnrrows = problem->nrrows;
4244 totalnrcols = problem->nrcols;
4261 ZEROHALFstopTimer(sepadata->dtimer);
4262 ZEROHALFstatisticsMessage(
"\n");
4263 ZEROHALFstatisticsMessage(
" | --------------------------------- problem \
4264 -------------------------------- | ----- callback ---- | --total-\n");
4265 ZEROHALFstatisticsMessage(
" | nrrows | nrcols | ndlrrows | ndlrcols \
4266 | nsubprob | ndelsubp | ndlvbnds | nsepcuts | ncutsfnd | time\n");
4267 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8d | %8d | %8d | %8d | %8d | %8.4f\n",
4268 "DECOMPOSITION", totalnrrows, totalnrcols, nrrowsinitial - totalnrrows, nrcolsinitial - totalnrcols,
4269 lpdata->nsubproblems, k - lpdata->nsubproblems,
4271 0, 0, ZEROHALFevalTimer(sepadata->dtimer));
4274 assert(scip !=
NULL);
4275 assert(sepadata !=
NULL);
4276 assert(lpdata !=
NULL);
4298 assert(scip !=
NULL);
4299 assert(sepadata !=
NULL);
4300 assert(mod2data !=
NULL);
4301 assert(delta >= 0.0);
4302 assert(delta <= 1.0);
4306 if( mod2data->ncolsind == 0 || mod2data->nrowsind == 0 )
4316 maxsumfracsols = sepadata->maxslack * delta;
4319 if( mod2data->ncolsind > 1 )
4321 SCIPsortInd( mod2data->colsind , compRealNonIncreasing , (
void*) mod2data->fracsol , mod2data->ncolsind );
4324 for( c = mod2data->ncolsind - 1 ; c >= 0 ; --c)
4326 if(
SCIPisGT(scip, sumfracsols + mod2data->fracsol[mod2data->colsind[c]], maxsumfracsols) )
4329 sumfracsols += mod2data->fracsol[mod2data->colsind[c]];
4334 if( ncolsremoved > 0 )
4336 mod2data->ncolsind -= ncolsremoved;
4337 sepadata->maxslack -= sumfracsols;
4361 int nlslrowsremoved;
4362 int nlcolrowsremoved;
4373 assert(scip !=
NULL);
4374 assert(sepadata !=
NULL);
4375 assert(lpdata !=
NULL);
4376 assert(mod2data !=
NULL);
4377 assert(removelargeslackrows || removelargecolrows);
4381 if( mod2data->nrows == 0 || mod2data->nrowsind == 0 )
4387 last = mod2data->nrowsind - 1;
4390 if( !mod2data->rhs[mod2data->rowsind[first]] )
4392 temp = mod2data->rowsind[first];
4393 mod2data->rowsind[first] = mod2data->rowsind[last];
4394 mod2data->rowsind[last] = temp;
4400 noddrhsrows = first + (mod2data->rhs[mod2data->rowsind[first]] ? 1 : 0);
4404 if( noddrhsrows == 0 )
4408 assert(noddrhsrows >= 0);
4409 SCIPsortInd( mod2data->rowsind , compRealNonDecreasing , (
void*) mod2data->slacks , noddrhsrows );
4410 if( noddrhsrows < mod2data->nrowsind )
4412 SCIPsortInd( mod2data->rowsind + noddrhsrows , compRealNonDecreasing , (
void*) mod2data->slacks ,
4413 mod2data->nrowsind - noddrhsrows );
4416 minslackoddrhsrows = mod2data->slacks[mod2data->rowsind[0]];
4417 nlslrowsremoved = 0;
4418 nlcolrowsremoved = 0;
4424 if(
SCIPisGT(scip, minslackoddrhsrows, sepadata->maxslack) )
4426 if( removelargeslackrows )
4428 for( i = 0 ; i < mod2data->nrowsind ; ++i )
4430 for( i = 0 ; i < mod2data->ncolsind ; ++i )
4432 mod2data->nrowsind = 0;
4433 mod2data->ncolsind = 0;
4442 if( removelargeslackrows )
4444 for( i = noddrhsrows ; i < mod2data->nrowsind ; ++i)
4445 if(
SCIPisGT(scip, minslackoddrhsrows + mod2data->slacks[mod2data->rowsind[i]], sepadata->maxslack) )
4447 nlslrowsremoved += mod2data->nrowsind - i;
4448 while(i < mod2data->nrowsind)
4451 r = mod2data->rowsind[i];
4453 assert(!mod2data->rhs[r]);
4454 assert(
SCIPisGT(scip, minslackoddrhsrows + mod2data->slacks[r], sepadata->maxslack));
4456 removerow[i] =
TRUE;
4462 if( removelargecolrows )
4464 if( mod2data->ncolsind > 0 )
4467 if( mod2data->ncolsind > 1 )
4469 SCIPsortInd( mod2data->colsind , compRealNonIncreasing , (
void*) mod2data->fracsol , mod2data->ncolsind );
4473 while( j < mod2data->ncolsind &&
SCIPisGT(scip, mod2data->fracsol[mod2data->colsind[j]] + minslackoddrhsrows, sepadata->maxslack) )
4475 c = mod2data->colsind[j];
4476 minslackrowwithnonz = 1.0;
4479 for( i = 0 ; i < mod2data->nrowsind ; ++i)
4481 if( mod2data->rows[mod2data->rowsind[i]][rowsbind] & rowsbmask )
4482 if(
SCIPisLT(scip, mod2data->slacks[mod2data->rowsind[i]], minslackrowwithnonz) )
4483 minslackrowwithnonz = mod2data->slacks[mod2data->rowsind[i]];
4485 if( minslackrowwithnonz < 1.0 )
4487 for( i = 0 ; i < mod2data->nrowsind ; ++i)
4489 if( mod2data->rows[mod2data->rowsind[i]][rowsbind] & rowsbmask )
4490 if(
SCIPisGT(scip, minslackrowwithnonz + mod2data->slacks[mod2data->rowsind[i]], sepadata->maxslack) )
4493 removerow[i] =
TRUE;
4503 if( nlslrowsremoved + nlcolrowsremoved > 0 )
4506 for( i = 0 ; i < mod2data->nrowsind && j < mod2data->nrowsind; ++i)
4508 if( i < mod2data->nrowsind )
4509 while( removerow[j] && j < mod2data->nrowsind )
4511 if( i < j && j < mod2data->nrowsind )
4512 mod2data->rowsind[i] = mod2data->rowsind[j];
4515 mod2data->nrowsind -= (nlslrowsremoved + nlcolrowsremoved);
4543 assert(scip !=
NULL);
4544 assert(mod2data !=
NULL);
4547 if( mod2data->nrows == 0 || mod2data->nrowsind == 0 || mod2data->ncolsind == 0 )
4558 for( c1 = 0 ; c1 < mod2data->ncolsind - 1 ; ++c1)
4562 for( c2 = c1 + 1 ; c2 < mod2data->ncolsind ; ++c2)
4566 for( r = 0 ; r < mod2data->nrowsind ; ++r)
4567 if( (mod2data->rows[mod2data->rowsind[r]][rowsbind1] & rowsbmask1)
4568 != (mod2data->rows[mod2data->rowsind[r]][rowsbind2] & rowsbmask2) )
4570 if( r == mod2data->nrowsind )
4574 mod2data->fracsol[mod2data->colsind[c2]] += mod2data->fracsol[mod2data->colsind[c1]];
4575 removecol[c1] =
TRUE;
4583 if( ncolsremoved > 0 )
4586 for( c2 = 0 ; c2 < mod2data->ncolsind && c1 < mod2data->ncolsind; ++c2)
4588 if( c2 < mod2data->ncolsind )
4589 while( removecol[c1] && c1 < mod2data->ncolsind )
4591 if( c2 < c1 && c1 < mod2data->ncolsind )
4592 mod2data->colsind[c2] = mod2data->colsind[c1];
4595 mod2data->ncolsind -= ncolsremoved;
4624 #ifdef ZEROHALF__PRINT_STATISTICS
4629 int nsepacutsbeforeppm;
4630 int nsepacutsinitial;
4631 int nzerohalfcutsbeforeppm;
4632 int nzerohalfcutsinitial;
4638 assert(scip !=
NULL);
4639 assert(sepadata !=
NULL);
4640 assert(lpdata !=
NULL);
4641 assert(mod2data !=
NULL);
4642 assert(maxsepacuts >= 0);
4643 assert(maxcuts >= 0);
4644 assert(result !=
NULL);
4645 assert(nsepacuts !=
NULL);
4646 assert(nzerohalfcuts !=
NULL);
4647 assert(zerohalfcuts !=
NULL);
4648 assert(*nsepacuts <= *nzerohalfcuts);
4650 assert(mod2data->relatedsubproblem !=
NULL);
4651 assert(mod2data->rows !=
NULL);
4652 assert(mod2data->rowaggregations !=
NULL);
4653 assert(mod2data->rhs !=
NULL);
4654 assert(mod2data->slacks !=
NULL);
4655 assert(mod2data->fracsol !=
NULL);
4656 assert(mod2data->nrows > 0);
4657 assert(mod2data->rowsind !=
NULL);
4658 assert(mod2data->colsind !=
NULL);
4660 if( sepadata->nppmethods == -1 )
4662 sepadata->nppmethods = (int) strlen(sepadata->ppmethods);
4663 if( sepadata->nppmethods > 0 && sepadata->ppmethods[0] ==
'-' )
4664 sepadata->nppmethods = 0;
4667 if( sepadata->nppmethods == 0 )
4671 #ifdef ZEROHALF__PRINT_STATISTICS
4672 if( sepadata->pptimers ==
NULL )
4675 for( i = 0 ; i < sepadata->nppmethods + 1 ; ++i)
4677 ZEROHALFcreateTimer((sepadata->pptimers[i]));
4680 ZEROHALFstartTimer(sepadata->pptimers[sepadata->nppmethods]);
4683 if( mod2data->nrowsind == 0 || mod2data->ncolsind == 0 )
4686 #ifdef ZEROHALF__PRINT_STATISTICS
4687 ncolsinitial = mod2data->ncolsind;
4688 nrowsinitial = mod2data->nrowsind;
4689 nsepacutsinitial = *nsepacuts;
4690 nzerohalfcutsinitial = *nzerohalfcuts;
4693 #ifdef ZEROHALF__PRINT_STATISTICS
4694 ZEROHALFstatisticsMessage(
"\n");
4695 ZEROHALFstatisticsMessage(
" | ------------------------------- subproblem\
4696 ------------------------------- | ----- callback ---- | --total-\n");
4697 ZEROHALFstatisticsMessage(
" | nrowsind | ncolsind | ndelrows | ndelcols \
4698 | nsepcuts | ncutsfnd | time | nsepcuts | ncutsfnd | time\n");
4699 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8d | %8d | %8.4f | %8d | %8d | %8.4f\n",
4700 "START PREPROCSS", mod2data->nrowsind, mod2data->ncolsind, 0, 0, 0, 0, 0.0,
4701 *nsepacuts, *nzerohalfcuts, ZEROHALFevalTimer(sepadata->pptimers[sepadata->nppmethods]));
4702 ZEROHALFcreateNewTimer(timer);
4703 ZEROHALFstartTimer(timer);
4705 ZEROHALFcreateNewTimer(pptimer);
4708 for( i = 0 ; i < sepadata->nppmethods ; ++i)
4711 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
4713 #ifndef ZEROHALF__PRINT_STATISTICS
4715 if( mod2data->nrowsind == 0 && mod2data->ncolsind == 0 )
4719 #ifdef ZEROHALF__PRINT_STATISTICS
4721 ZEROHALFstartTimer(pptimer);
4722 ZEROHALFstartTimer(sepadata->pptimers[i]);
4723 ncolsbeforeppm = mod2data->ncolsind;
4724 nrowsbeforeppm = mod2data->nrowsind;
4725 nsepacutsbeforeppm = *nsepacuts;
4726 nzerohalfcutsbeforeppm = *nzerohalfcuts;
4730 switch(sepadata->ppmethods[i])
4753 0, mod2data->nrowsind, normtype, maxsepacuts, maxcuts, nsepacuts,
4754 nzerohalfcuts, zerohalfcuts, varsolvals,
PPZEROONEROW, result));
4783 sepadata->ppdelta));
4791 SCIPerrorMessage(
"invalid preprocessing method '%c'\n", sepadata->ppmethods[i]);
4795 #ifdef ZEROHALF__PRINT_STATISTICS
4797 ZEROHALFstopTimer(sepadata->pptimers[i]);
4798 ZEROHALFstopTimer(pptimer);
4799 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8d | %8d | %8.4f | %8d | %8d | %8.4f\n",
4800 ppname, mod2data->nrowsind, mod2data->ncolsind,
4801 nrowsbeforeppm - mod2data->nrowsind, ncolsbeforeppm - mod2data->ncolsind,
4802 *nsepacuts - nsepacutsbeforeppm, *nzerohalfcuts - nzerohalfcutsbeforeppm,
4803 ZEROHALFevalTimer(pptimer), *nsepacuts, *nzerohalfcuts,
4804 ZEROHALFevalTimer(sepadata->pptimers[i]));
4805 ZEROHALFresetTimer(pptimer);
4809 #ifdef ZEROHALF__PRINT_STATISTICS
4811 ZEROHALFstopTimer(timer);
4812 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8d | %8d | %8.4f | %8d | %8d | %8.4f\n",
4813 "PREPROCESSED", mod2data->nrowsind, mod2data->ncolsind,
4814 nrowsinitial - mod2data->nrowsind, ncolsinitial - mod2data->ncolsind,
4815 *nsepacuts - nsepacutsinitial, *nzerohalfcuts - nzerohalfcutsinitial,
4816 ZEROHALFevalTimer(timer), *nsepacuts, *nzerohalfcuts,
4817 ZEROHALFevalTimer(sepadata->pptimers[sepadata->nppmethods]));
4818 ZEROHALFstatisticsMessage(
"\n");
4819 ZEROHALFfreeTimer(timer);
4820 ZEROHALFfreeTimer(pptimer);
4821 ZEROHALFstopTimer(sepadata->pptimers[sepadata->nppmethods]);
4823 ZEROHALFstatisticsMessage(
" | ------------------------------- subproblem ------------------------------- | ------------------------------\n");
4824 ZEROHALFstatisticsMessage(
" | | max2/row | max2/col | A^T ept | \n");
4825 ZEROHALFstatisticsMessage(
"%15s | | %8s | %8s | %8s |\n",
4828 ZEROHALFstatisticsMessage(
"\n");
4848 int naggregatedrrows;
4850 assert(rowaggregation !=
NULL);
4853 naggregatedrrows = 0;
4854 for( i = 0 ; i < nrrows ; ++i)
4872 #define BRANCHPRIORITY__AVOID_BRANCHING 0
4873 #define BRANCHPRIORITY__PREFER_BRANCHING 0
4907 assert(scip !=
NULL);
4908 assert(sepadata !=
NULL);
4909 assert(lpdata !=
NULL);
4910 assert(mod2data !=
NULL);
4911 assert(auxipdata !=
NULL);
4913 assert(mod2data->relatedsubproblem !=
NULL);
4914 assert(mod2data->rows !=
NULL);
4915 assert(mod2data->rowaggregations !=
NULL);
4916 assert(mod2data->rhs !=
NULL);
4917 assert(mod2data->slacks !=
NULL);
4918 assert(mod2data->fracsol !=
NULL);
4919 assert(mod2data->rowsind !=
NULL);
4920 assert(mod2data->colsind !=
NULL);
4922 assert(auxipdata->subscip ==
NULL);
4923 assert(auxipdata->v ==
NULL);
4924 assert(auxipdata->y ==
NULL);
4925 assert(auxipdata->r ==
NULL);
4926 assert(auxipdata->q ==
NULL);
4927 assert(auxipdata->feasipcons ==
NULL);
4928 assert(auxipdata->oddrhscons ==
NULL);
4929 assert(auxipdata->columnsumcons ==
NULL);
4932 auxipdata->m = mod2data->nrowsind;
4933 auxipdata->n = mod2data->ncolsind;
4947 maxslack = sepadata->maxslack;
4948 nrrows = mod2data->relatedsubproblem->nrrows;
4963 if( setnodelimit ==
TRUE )
4964 auxipdata->nodelimit = 3000;
4966 auxipdata->nodelimit = -1;
4969 auxipdata->objectivelimit =
MIN(1.0, maxslack + feastol);
4976 if( auxipdata->timelimit <= 0.0 )
4980 maxnconsvars = auxipdata->m + auxipdata->n + 2;
4990 TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
FALSE,
TRUE, &success) );
4993 TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
TRUE,
FALSE,
FALSE,
TRUE, &success) );
4995 SCIPdebugMessage(
"Copying the plugins was %s successful.\n", success ?
"" :
"not");
5000 settingsfileexists =
TRUE;
5001 if( strlen(sepadata->subscipsettings) == 0 )
5002 settingsfileexists =
FALSE;
5003 if( strlen(sepadata->subscipsettings) == 1 && sepadata->subscipsettings[0] ==
'-' )
5004 settingsfileexists =
FALSE;
5006 if( settingsfileexists )
5073 isfeasip = (sepadata->subscipobjective ==
'v' ?
FALSE :
TRUE);
5074 isweighted = (sepadata->subscipobjective ==
'w' ?
TRUE :
FALSE);
5075 ispenalized = (sepadata->subscipobjective ==
'p' ?
TRUE :
FALSE);
5096 for( j = 0 ; j < auxipdata->n ; ++j)
5105 for( i = 0 ; i < auxipdata->m ; ++i)
5108 assert(mod2data->rows[mod2data->rowsind[i]] !=
NULL);
5115 objcoef =
calcObjWeight(mod2data->rowaggregations[mod2data->rowsind[i]], nrrows);
5117 else if( ispenalized )
5119 objcoef = mod2data->slacks[mod2data->rowsind[i]]
5120 + (sepadata->subscipobjpen
5121 *
calcObjWeight(mod2data->rowaggregations[mod2data->rowsind[i]], nrrows));
5127 objcoef = mod2data->slacks[mod2data->rowsind[i]];
5135 for( j = 0 ; j < auxipdata->n ; ++j)
5142 objcoef = mod2data->fracsol[mod2data->colsind[j]];
5153 for( i = 0 ; i < auxipdata->m ; ++i)
5155 consvals[nconsvars] = mod2data->slacks[mod2data->rowsind[i]];
5156 consvars[nconsvars] = auxipdata->v[i];
5159 for( j = 0 ; j < auxipdata->n ; ++j)
5161 consvals[nconsvars] = mod2data->fracsol[mod2data->colsind[j]];
5162 consvars[nconsvars] = auxipdata->y[j];
5166 nconsvars, consvars, consvals, 0.0, auxipdata->objectivelimit,
5172 for( i = 0 ; i < auxipdata->m ; ++i)
5173 if( mod2data->rhs[mod2data->rowsind[i]] ==
TRUE )
5175 consvals[nconsvars] = 1.0;
5176 consvars[nconsvars] = auxipdata->v[i];
5179 consvals[nconsvars] = -2.0;
5180 consvars[nconsvars] = auxipdata->q;
5183 nconsvars, consvars, consvals, 1.0, 1.0,
5187 for( j = 0 ; j < auxipdata->n ; ++j)
5193 for( i = 0 ; i < auxipdata->m ; ++i) {
5194 if( mod2data->rows[mod2data->rowsind[i]][rowsbind] & rowsbmask )
5196 consvals[nconsvars] = 1.0;
5197 consvars[nconsvars] = auxipdata->v[i];
5201 consvals[nconsvars] = -1.0;
5202 consvars[nconsvars] = auxipdata->y[j];
5204 consvals[nconsvars] = -2.0;
5205 consvars[nconsvars] = auxipdata->r[j];
5241 assert(sepadata !=
NULL);
5242 assert(mod2data !=
NULL);
5243 assert(auxipdata !=
NULL);
5244 assert(auxipdata->subscip !=
NULL);
5245 assert(sols !=
NULL);
5246 assert(*sols ==
NULL);
5247 assert(*nsols == 0);
5250 retcode =
SCIPsolve(auxipdata->subscip);
5259 SCIPwarningMessage(scip,
"Error while solving subproblem in zerohalf separator; sub-SCIP terminated with code <%d>\n", retcode);
5267 maxslack = sepadata->maxslack;
5279 if( !sepadata->subscipuseallsols )
5284 if( sepadata->subscipobjective ==
'v' )
5286 for( i = 0 ; i < *nsols ; ++i)
5306 for( i = 0 ; i < *nsols ; ++i)
5309 for( j = 0 ; j < auxipdata->m ; ++j)
5310 z += mod2data->slacks[mod2data->rowsind[j]]
5311 *
SCIPgetSolVal(auxipdata->subscip, (*sols)[i], auxipdata->v[j]);
5312 for( j = 0 ; j < auxipdata->n ; ++j)
5313 z += mod2data->fracsol[mod2data->colsind[j]]
5314 *
SCIPgetSolVal(auxipdata->subscip, (*sols)[i], auxipdata->y[j]);
5319 propersols[npropersols] = (*sols)[i];
5320 viols[npropersols] = z;
5327 for( i = 1 ; i < npropersols && swapped; ++i)
5330 for( j = 0 ; j < npropersols - i ; ++j)
5332 if( viols[j] > viols[j+1] )
5334 tempviol = viols[j+1];
5335 viols[j+1] = viols[j];
5336 viols[j] = tempviol;
5337 tempsol = propersols[j+1];
5338 propersols[j+1] = propersols[j];
5339 propersols[j] = tempsol;
5346 *nsols = npropersols;
5369 assert(scip !=
NULL);
5370 assert(lpdata !=
NULL);
5371 assert(lpdata->nrows > 0);
5372 assert(0 <= rowsindex);
5373 assert(rowsindex < lpdata->nrows);
5374 assert(lpdata->rrowsindexofleftrow[rowsindex] == rrowsindex
5375 || lpdata->rrowsindexofrightrow[rowsindex] == rrowsindex);
5376 assert(weights !=
NULL);
5377 assert(*weights ==
NULL);
5387 if( lpdata->rrowsindexofleftrow[rowsindex] == rrowsindex )
5388 (*weights)[rowsindex] = lpdata->intscalarsleftrow[rowsindex] * (-0.5);
5390 (*weights)[rowsindex] = lpdata->intscalarsrightrow[rowsindex] * 0.5;
5415 assert(scip !=
NULL);
5416 assert(mod2data !=
NULL);
5417 assert(mod2data->nrowsind > 0);
5418 assert(auxipdata !=
NULL);
5419 assert(auxipdata->subscip !=
NULL);
5420 assert(auxipdata->v !=
NULL);
5421 assert(solution !=
NULL);
5422 assert(rrowsincut !=
NULL);
5423 assert(*rrowsincut ==
NULL);
5424 assert(nrrowsincut !=
NULL);
5429 BITARRAYCLEAR(*rrowsincut, mod2data->rowaggregationsbitarraysize);
5434 for( i = 0 ; i < mod2data->nrowsind ; ++i)
5435 if( auxipdata->v[i] !=
NULL )
5438 BITARRAYSXOR(mod2data->rowaggregations[mod2data->rowsind[i]], (*rrowsincut) ,
5439 mod2data->rowaggregationsbitarraysize);
5476 assert(scip !=
NULL);
5477 assert(sepadata !=
NULL);
5478 assert(lpdata !=
NULL);
5479 assert(mod2data !=
NULL);
5480 assert(maxsepacuts >= 0);
5481 assert(maxcuts >= 0);
5482 assert(nsepacuts !=
NULL);
5483 assert(nzerohalfcuts !=
NULL);
5484 assert(zerohalfcuts !=
NULL);
5485 assert(*nsepacuts <= *nzerohalfcuts);
5486 assert(varsolvals !=
NULL);
5487 assert(result !=
NULL);
5489 assert(mod2data->relatedsubproblem !=
NULL);
5490 assert(mod2data->rows !=
NULL);
5491 assert(mod2data->rowaggregations !=
NULL);
5492 assert(mod2data->rhs !=
NULL);
5493 assert(mod2data->slacks !=
NULL);
5494 assert(mod2data->fracsol !=
NULL);
5495 assert(mod2data->rowsind !=
NULL);
5496 assert(mod2data->colsind !=
NULL);
5500 if( mod2data->nrows == 0 || mod2data->nrowsind == 0 )
5504 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
5514 if( auxipdata->subscip ==
NULL )
5527 for( s = 0; s < nsols ; ++s)
5530 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
5536 &rrowsincut, &nrrowsincut));
5537 assert(nrrowsincut > 0);
5542 mod2data, rrowsincut, &weights, &nrowsincut));
5543 if ( weights ==
NULL )
5548 assert(nrowsincut > 0);
5552 SCIP_CALL( debugPrintLPRowsAndCols(scip, lpdata) );
5554 debugPrintSubLpData(scip, lpdata, mod2data->relatedsubproblem);
5555 debugPrintMod2Data(scip, lpdata, mod2data,
TRUE);
5564 mod2data->relatedsubproblem, mod2data, nrrowsincut, nrowsincut,
AUXIP));
5566 lpdata, weights, normtype, *nzerohalfcuts, varsolvals, zerohalfcuts[*nzerohalfcuts], &cutoff));
5586 if( sepadata->subscipobjective !=
'v' )
5609 assert(scip !=
NULL);
5610 assert(mod2data !=
NULL);
5611 assert(row !=
NULL);
5612 assert(maxinnerproduct >= 0);
5613 assert(innerproduct !=
NULL);
5616 *innerproduct = 0.0;
5619 if( mod2data->nrows == 0 || mod2data->nrowsind == 0
5620 || mod2data->ncolsind == 0 )
5624 for( c = 0 ; c < mod2data->ncolsind ; ++c)
5626 rcolindex = mod2data->colsind[c];
5628 *innerproduct += mod2data->fracsol[rcolindex];
5629 if(
SCIPisGT(scip, *innerproduct, maxinnerproduct) )
5653 int maxncombinedrows
5675 assert(scip !=
NULL);
5676 assert(sepadata !=
NULL);
5677 assert(lpdata !=
NULL);
5678 assert(mod2data !=
NULL);
5679 assert(maxsepacuts >= 0);
5680 assert(maxcuts >= 0);
5681 assert(nsepacuts !=
NULL);
5682 assert(nzerohalfcuts !=
NULL);
5683 assert(zerohalfcuts !=
NULL);
5684 assert(*nsepacuts <= *nzerohalfcuts);
5685 assert(varsolvals !=
NULL);
5686 assert(result !=
NULL);
5687 assert(maxncombinedrows >= 1);
5689 assert(mod2data->relatedsubproblem !=
NULL);
5690 assert(mod2data->rows !=
NULL);
5691 assert(mod2data->rowaggregations !=
NULL);
5692 assert(mod2data->rhs !=
NULL);
5693 assert(mod2data->slacks !=
NULL);
5694 assert(mod2data->fracsol !=
NULL);
5695 assert(mod2data->rowsind !=
NULL);
5696 assert(mod2data->colsind !=
NULL);
5700 if( mod2data->nrows == 0 || mod2data->nrowsind == 0 )
5704 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
5710 last = mod2data->nrowsind - 1;
5713 if( !mod2data->rhs[mod2data->rowsind[first]] )
5715 temp = mod2data->rowsind[first];
5716 mod2data->rowsind[first] = mod2data->rowsind[last];
5717 mod2data->rowsind[last] = temp;
5723 noddrhsrows = first + (mod2data->rhs[mod2data->rowsind[first]] ? 1 : 0);
5726 if( noddrhsrows == 0 )
5732 if( maxncombinedrows > 1 )
5736 BITARRAYCLEAR(rrowsincut, mod2data->rowaggregationsbitarraysize);
5740 assert(noddrhsrows >= 0);
5741 SCIPsortInd( mod2data->rowsind , compRealNonDecreasing , (
void*) mod2data->slacks , noddrhsrows );
5743 if( noddrhsrows < mod2data->nrowsind )
5745 SCIPsortInd( mod2data->rowsind + noddrhsrows , compRealNonDecreasing , (
void*) mod2data->slacks , mod2data->nrowsind - noddrhsrows );
5748 minslackoddrhsrows = mod2data->slacks[mod2data->rowsind[0]];
5750 if(
SCIPisLE(scip, minslackoddrhsrows, sepadata->maxslack) )
5752 for( ncombinedrows = 1 ; ncombinedrows <= maxncombinedrows ; ++ncombinedrows )
5754 switch( ncombinedrows )
5758 for( i = 0 ; i < noddrhsrows ; ++i)
5760 r1 = mod2data->rowsind[i];
5761 assert(mod2data->rhs[r1]);
5762 if( *nzerohalfcuts == maxcuts || *nsepacuts == maxsepacuts )
5764 slack1 = mod2data->slacks[r1];
5765 if(
SCIPisGT(scip, slack1, sepadata->maxslack) )
5768 sepadata->maxslack, &roundingdownweakening));
5769 if(
SCIPisLE(scip, roundingdownweakening + slack1, sepadata->maxslack) )
5776 mod2data, mod2data->rowaggregations[r1], &weights, &nrowsincut));
5777 if( weights ==
NULL )
5781 assert(nrowsincut > 0);
5785 mod2data->relatedsubproblem, mod2data, 2, nrowsincut,
HEURISTICSENUM));
5787 lpdata, weights, normtype, *nzerohalfcuts, varsolvals, zerohalfcuts[*nzerohalfcuts], &cutoff));
5804 assert(combinedrow !=
NULL);
5805 assert(rrowsincut !=
NULL);
5806 if( noddrhsrows == mod2data->nrowsind )
5808 if( mod2data->nrowsind < 2 )
5812 for( i = 0 ; i < noddrhsrows ; ++i)
5814 r1 = mod2data->rowsind[i];
5815 assert(mod2data->rhs[r1]);
5816 if( *nzerohalfcuts == maxcuts || *nsepacuts == maxsepacuts )
5818 slack1 = mod2data->slacks[r1];
5819 if(
SCIPisGT(scip, slack1, sepadata->maxslack) )
5822 for( j = noddrhsrows ; j < mod2data->ncolsind ; ++j)
5824 r2 = mod2data->rowsind[j];
5825 assert(!mod2data->rhs[r2]);
5826 if( *nzerohalfcuts == maxcuts || *nsepacuts == maxsepacuts )
5828 slack2 = mod2data->slacks[r2];
5829 if(
SCIPisGT(scip, slack1 + slack2, sepadata->maxslack) )
5832 BITARRAYSXOR(mod2data->rows[r2], combinedrow, mod2data->rowsbitarraysize);
5834 sepadata->maxslack, &roundingdownweakening));
5835 if(
SCIPisLE(scip, roundingdownweakening + slack1 + slack2, sepadata->maxslack) )
5841 mod2data->rowaggregationsbitarraysize);
5842 BITARRAYSXOR(mod2data->rowaggregations[r2], rrowsincut,
5843 mod2data->rowaggregationsbitarraysize);
5848 mod2data, rrowsincut, &weights, &nrowsincut));
5849 if ( weights ==
NULL )
5853 assert(nrowsincut > 0);
5857 mod2data->relatedsubproblem, mod2data, 2, nrowsincut,
HEURISTICSENUM));
5859 lpdata, weights, normtype, *nzerohalfcuts, varsolvals, zerohalfcuts[*nzerohalfcuts], &cutoff));
5887 if( rrowsincut !=
NULL )
5891 if( combinedrow !=
NULL )
5902 void debugPrintAuxGraphNode(
5908 assert(node !=
NULL);
5911 for( i = 0 ; i < node->nneighbors ; ++i)
5914 i, node->neighbors[i], node->edgeweights[i], node->relatedrows[i]);
5917 node->nneighbors, node->distance, node->previous);
5941 int maxnumberofneighbors;
5943 assert(scip !=
NULL);
5944 assert(graph !=
NULL);
5945 assert(node1index >= 0);
5946 assert(node1index < graph->nnodes);
5947 assert(node2index >= 0);
5948 assert(node2index < graph->nnodes);
5951 maxnumberofneighbors = 2 * graph->nnodes - 2;
5955 node1 = graph->nodes[node1index];
5956 node2 = graph->nodecopies[node2index];
5957 node1copy = graph->nodecopies[node1index];
5958 node2copy = graph->nodes[node2index];
5962 node1 = graph->nodes[node1index];
5963 node2 = graph->nodes[node2index];
5964 node1copy = graph->nodecopies[node1index];
5965 node2copy = graph->nodecopies[node2index];
5968 if( node1->nneighbors == 0 )
5970 assert(maxnumberofneighbors > 0);
5980 if( node2->nneighbors == 0 )
5982 assert(maxnumberofneighbors > 0);
5992 n2 = node2->nneighbors;
5993 for( n1 = 0 ; n1 < node1->nneighbors ; ++n1)
5994 if( node1->neighbors[n1] == node2 )
5996 if( n1 < node1->nneighbors)
5997 for( n2 = 0 ; n2 < node2->nneighbors ; ++n2)
5998 if( node2->neighbors[n2] == node1 )
6000 if( n1 < node1->nneighbors )
6003 assert(node1->neighbors[n1] == node2);
6004 assert(n2 < node2->nneighbors);
6005 assert(node2->neighbors[n2] == node1);
6006 assert(node1->edgeweights[n1] == node2->edgeweights[n2]);
6009 if( n1 == node1->nneighbors ||
SCIPisLT(scip, weight, node1->edgeweights[n1]) )
6011 node1->neighbors[n1] = node2;
6012 node1->edgeweights[n1] = weight;
6013 node1->relatedrows[n1] = relatedrow;
6014 node1->nneighbors++;
6016 node2->neighbors[n2] = node1;
6017 node2->edgeweights[n2] = weight;
6018 node2->relatedrows[n2] = relatedrow;
6019 node2->nneighbors++;
6021 node1copy->neighbors[n1] = node2copy;
6022 node1copy->edgeweights[n1] = weight;
6023 node1copy->relatedrows[n1] = relatedrow;
6024 node1copy->nneighbors++;
6026 node2copy->neighbors[n2] = node1copy;
6027 node2copy->edgeweights[n2] = weight;
6028 node2copy->relatedrows[n2] = relatedrow;
6029 node2copy->nneighbors++;
6050 int nunprocessednodes;
6059 assert(scip !=
NULL);
6060 assert(graph !=
NULL);
6061 assert(graph->nnodes > 0);
6062 assert(sourcenode !=
NULL);
6063 assert(targetnode !=
NULL);
6064 assert(maxdistance > 0.0);
6065 assert(maxdistance <= 1.0);
6071 nunprocessednodes = 0;
6073 for( v = 0; v < graph->nnodes ; ++v)
6075 graph->nodes[v]->distance = 1.0;
6076 graph->nodes[v]->previous =
NULL;
6078 graph->nodecopies[v]->distance = 1.0;
6079 graph->nodecopies[v]->previous =
NULL;
6081 unprocessednodes[nunprocessednodes] = graph->nodes[v];
6082 ++nunprocessednodes;
6083 unprocessednodes[nunprocessednodes] = graph->nodecopies[v];
6084 ++nunprocessednodes;
6086 sourcenode->distance = 0.0;
6087 sourcenode->previous =
NULL;
6089 assert(nunprocessednodes == 2 * graph->nnodes);
6090 assert(nunprocessednodes > 0);
6093 while( nunprocessednodes > 0 )
6097 mindistance = unprocessednodes[0]->distance;
6098 for( v = 1 ; v < nunprocessednodes ; ++v)
6099 if( unprocessednodes[v]->distance < mindistance )
6102 mindistance = unprocessednodes[v]->distance;
6105 if(
SCIPisGT(scip, mindistance, maxdistance) )
6108 currentnode = unprocessednodes[u];
6109 unprocessednodes[u] = unprocessednodes[nunprocessednodes-1];
6110 nunprocessednodes--;
6113 for( n = 0 ; n < currentnode->nneighbors ; ++n)
6115 newdistance = currentnode->distance + currentnode->edgeweights[n];
6117 if(
SCIPisLT(scip, newdistance , currentnode->neighbors[n]->distance) )
6119 currentnode->neighbors[n]->distance = newdistance;
6120 currentnode->neighbors[n]->previous = currentnode;
6122 if( currentnode->neighbors[n] == targetnode )
6170 assert(scip !=
NULL);
6171 assert(sepadata !=
NULL);
6172 assert(lpdata !=
NULL);
6173 assert(mod2data !=
NULL);
6174 assert(maxsepacuts >= 0);
6175 assert(maxcuts >= 0);
6176 assert(nsepacuts !=
NULL);
6177 assert(nzerohalfcuts !=
NULL);
6178 assert(zerohalfcuts !=
NULL);
6179 assert(*nsepacuts <= *nzerohalfcuts);
6180 assert(varsolvals !=
NULL);
6181 assert(result !=
NULL);
6182 assert(wrongstructure !=
NULL);
6184 *wrongstructure =
FALSE;
6187 if( mod2data->nrows == 0 || mod2data->nrowsind == 0 )
6191 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
6197 *wrongstructure =
TRUE;
6202 if( mod2data->nrowsind == 1 )
6205 normtype, maxsepacuts, maxcuts, nsepacuts, nzerohalfcuts, zerohalfcuts,
6206 varsolvals, result, 1));
6215 auxgraph->nnodes = mod2data->ncolsind + 1;
6218 q = auxgraph->nnodes - 1;
6220 for( j = 0 ; j < auxgraph->nnodes ; ++j)
6226 for( i = 0 ; i < mod2data->nrowsind ; ++i)
6228 rowsindex = mod2data->rowsind[i];
6229 for( j = 0 ; j < mod2data->ncolsind; ++j)
6232 for( k = j+1 ; k < mod2data->ncolsind; ++k)
6237 if( j >= mod2data->ncolsind )
6239 if( mod2data->rhs[rowsindex] )
6241 if(
SCIPisLE(scip, mod2data->slacks[rowsindex], sepadata->maxslack) )
6248 mod2data->rowaggregations[rowsindex], &weights, &nrowsincut));
6249 if( weights ==
NULL )
6253 assert(nrowsincut > 0);
6257 mod2data->relatedsubproblem, mod2data, nrrowsincut, nrowsincut,
AUXGRAPH));
6259 lpdata, weights, normtype, *nzerohalfcuts, varsolvals, zerohalfcuts[*nzerohalfcuts], &cutoff));
6271 assert( weights !=
NULL );
6284 if( k >= mod2data->ncolsind )
6288 mod2data->rhs[rowsindex], mod2data->slacks[rowsindex], rowsindex));
6295 mod2data->rhs[rowsindex], mod2data->slacks[rowsindex], rowsindex));
6302 for( n = 0 ; n < auxgraph->nnodes && n != q ; ++n)
6305 FALSE, mod2data->fracsol[mod2data->colsind[n]], -1));
6308 if( cutoff || auxgraph->nnodes == 0 )
6318 for( n = 0 ; n < auxgraph->nnodes && n != q ; ++n)
6321 auxgraph->nodes[n], auxgraph->nodecopies[n], sepadata->maxslack));
6323 if(
SCIPisLE(scip, auxgraph->nodecopies[n]->distance, sepadata->maxslack) )
6329 BITARRAYCLEAR(rrowsincut, mod2data->rowaggregationsbitarraysize);
6333 node = auxgraph->nodecopies[n];
6334 while( node->previous !=
NULL )
6336 for( i = 0 ; i < node->nneighbors ; ++i)
6337 if( node->neighbors[i] == node->previous )
6339 assert(i < node->nneighbors);
6340 rowsindex = node->relatedrows[i];
6341 BITARRAYSXOR(mod2data->rowaggregations[rowsindex], rrowsincut ,
6342 mod2data->rowaggregationsbitarraysize);
6343 node = node->previous;
6348 assert(weights ==
NULL);
6350 mod2data, rrowsincut, &weights, &nrowsincut));
6351 if( weights ==
NULL )
6356 assert(nrowsincut > 0);
6360 mod2data->relatedsubproblem, mod2data, nrrowsincut, nrowsincut,
AUXGRAPH));
6362 lpdata, weights, normtype, *nzerohalfcuts, varsolvals, zerohalfcuts[*nzerohalfcuts], &cutoff));
6374 assert( weights !=
NULL );
6378 if( rrowsincut !=
NULL )
6416 int identsubmatrixsize;
6422 assert(scip !=
NULL);
6423 assert(sepadata !=
NULL);
6424 assert(lpdata !=
NULL);
6425 assert(mod2data !=
NULL);
6426 assert(maxsepacuts >= 0);
6427 assert(maxcuts >= 0);
6428 assert(nsepacuts !=
NULL);
6429 assert(nzerohalfcuts !=
NULL);
6430 assert(zerohalfcuts !=
NULL);
6431 assert(*nsepacuts <= *nzerohalfcuts);
6432 assert(varsolvals !=
NULL);
6433 assert(result !=
NULL);
6437 if( mod2data->nrows == 0 || mod2data->nrowsind == 0 )
6441 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
6444 if( mod2data->nrowsind == 1 )
6447 normtype, maxsepacuts, maxcuts, nsepacuts, nzerohalfcuts, zerohalfcuts,
6448 varsolvals, result, 1));
6452 identsubmatrixsize = 0;
6457 for( pivotcol = 0; pivotcol < mod2data->ncolsind; ++pivotcol )
6459 if( identsubmatrixsize == mod2data->nrowsind )
6463 SCIPsortInd(mod2data->rowsind + identsubmatrixsize , compRealNonDecreasing ,
6464 (
void*) mod2data->slacks , mod2data->nrowsind - identsubmatrixsize);
6467 if(
SCIPisGT(scip, mod2data->slacks[mod2data->rowsind[identsubmatrixsize]], sepadata->maxslack) )
6473 for( pivotrow = identsubmatrixsize ; pivotrow < mod2data->nrowsind ; ++pivotrow)
6474 if( mod2data->rows[mod2data->rowsind[pivotrow]][rowsbind] & rowsbmask )
6476 if( pivotrow == mod2data->nrowsind )
6480 for( r = 0 ; r < mod2data->nrowsind
6481 &&
SCIPisLE(scip, mod2data->slacks[mod2data->rowsind[r]], sepadata->maxslack) ; ++r)
6485 if( mod2data->rows[mod2data->rowsind[r]][rowsbind] & rowsbmask )
6488 mod2data->slacks[mod2data->rowsind[r]] += mod2data->slacks[mod2data->rowsind[pivotrow]];
6492 if(
SCIPisLE(scip, mod2data->slacks[mod2data->rowsind[r]], sepadata->maxslack) )
6495 BITARRAYSXOR(mod2data->rows[mod2data->rowsind[pivotrow]],
6496 mod2data->rows[mod2data->rowsind[r]],mod2data->rowsbitarraysize);
6497 BITARRAYSXOR(mod2data->rowaggregations[mod2data->rowsind[pivotrow]],
6498 mod2data->rowaggregations[mod2data->rowsind[r]],mod2data->rowaggregationsbitarraysize);
6499 mod2data->rhs[mod2data->rowsind[r]] =
6500 XOR(mod2data->rhs[mod2data->rowsind[pivotrow]],mod2data->rhs[mod2data->rowsind[r]]);
6506 temp = mod2data->rowsind[pivotrow];
6507 mod2data->rowsind[pivotrow] = mod2data->rowsind[identsubmatrixsize];
6508 mod2data->rowsind[identsubmatrixsize] = temp;
6509 temp = mod2data->colsind[pivotcol];
6510 mod2data->colsind[pivotcol] = mod2data->colsind[identsubmatrixsize];
6511 mod2data->colsind[identsubmatrixsize] = temp;
6513 identsubmatrixsize++;
6526 0, mod2data->nrowsind, normtype, maxsepacuts, maxcuts, nsepacuts,
6556 #ifdef ZEROHALF__PRINT_STATISTICS
6557 int nsepacutsbefore;
6558 int nsepacutsinitial;
6559 int nzerohalfcutsbefore;
6560 int nzerohalfcutsinitial;
6565 int ncutsfoundbefore;
6568 assert(scip !=
NULL);
6569 assert(sepadata !=
NULL);
6570 assert(lpdata !=
NULL);
6571 assert(mod2data !=
NULL);
6572 assert(maxsepacuts >= 0);
6573 assert(maxcuts >= 0);
6574 assert(result !=
NULL);
6575 assert(nsepacuts !=
NULL);
6576 assert(nzerohalfcuts !=
NULL);
6577 assert(zerohalfcuts !=
NULL);
6578 assert(*nsepacuts <= *nzerohalfcuts);
6580 assert(mod2data->relatedsubproblem !=
NULL);
6581 assert(mod2data->rows !=
NULL);
6582 assert(mod2data->rowaggregations !=
NULL);
6583 assert(mod2data->rhs !=
NULL);
6584 assert(mod2data->slacks !=
NULL);
6585 assert(mod2data->fracsol !=
NULL);
6586 assert(mod2data->nrows > 0);
6587 assert(mod2data->rowsind !=
NULL);
6588 assert(mod2data->colsind !=
NULL);
6590 sepadata->nsepamethods = (int) strlen(sepadata->sepamethods);
6591 if( sepadata->nsepamethods > 0 && sepadata->sepamethods[0] ==
'-' )
6592 sepadata->nsepamethods = 0;
6594 if( sepadata->nsepamethods == 0 )
6599 #ifdef ZEROHALF__PRINT_STATISTICS
6600 if( sepadata->sepatimers ==
NULL )
6603 for( i = 0 ; i < sepadata->nsepamethods + 1 ; ++i)
6605 ZEROHALFcreateTimer((sepadata->sepatimers[i]));
6613 nsepacutsinitial = *nsepacuts;
6614 nzerohalfcutsinitial = *nzerohalfcuts;
6616 ZEROHALFstatisticsMessage(
"\n");
6617 ZEROHALFstatisticsMessage(
" | -------------------------- subproblem ----\
6618 ---------- | - callback (algo) - | ----- callback ---- | --total-\n");
6619 ZEROHALFstatisticsMessage(
" | nrowsind | ncolsind | nsepcuts | ncutsfnd \
6620 | time | nsepcuts | ncutsfnd | nsepcuts | ncutsfnd | time\n");
6621 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8.4f | %8s | %8s | %8d | %8d | %8.4f\n",
6622 "START PROCESSG", mod2data->nrowsind, mod2data->ncolsind,
6623 0, 0, 0.0,
" ",
" ", *nsepacuts, *nzerohalfcuts, ZEROHALFevalTimer(sepadata->sepatimers[sepadata->nsepamethods]));
6626 if( mod2data->nrowsind == 0 || mod2data->ncolsind == 0 )
6629 #ifdef ZEROHALF__PRINT_STATISTICS
6630 ZEROHALFcreateNewTimer(timer);
6631 ZEROHALFcreateNewTimer(sepatimer);
6632 ZEROHALFstartTimer(sepadata->sepatimers[sepadata->nsepamethods]);
6633 ZEROHALFstartTimer(timer);
6637 for( i = 0 ; i < sepadata->nsepamethods && !stop; ++i)
6640 #ifdef ZEROHALF__PRINT_STATISTICS
6641 ZEROHALFstartTimer(sepatimer);
6642 ZEROHALFstartTimer(sepadata->sepatimers[i]);
6643 nsepacutsbefore = *nsepacuts;
6644 nzerohalfcutsbefore = *nzerohalfcuts;
6647 if( *nsepacuts >= maxsepacuts || *nzerohalfcuts >= maxcuts )
6650 if( mod2data->nrowsind == 0 || mod2data->ncolsind == 0 )
6655 sepamethod = sepadata->sepamethods[i];
6660 if( *nsepacuts > 0 )
6668 ncutsfoundbefore = *nzerohalfcuts;
6671 nsepacuts, nzerohalfcuts, zerohalfcuts, varsolvals, result));
6673 if( *nzerohalfcuts == ncutsfoundbefore )
6681 maxcuts, nsepacuts, nzerohalfcuts, zerohalfcuts, varsolvals, result, 1));
6686 maxcuts, nsepacuts, nzerohalfcuts, zerohalfcuts, varsolvals, result, 2));
6691 nsepacuts, nzerohalfcuts, zerohalfcuts, varsolvals, result));
6695 ncutsfoundbefore = *nzerohalfcuts;
6697 nsepacuts, nzerohalfcuts, zerohalfcuts, varsolvals, result, &wrongstructure));
6699 if( ! wrongstructure )
6701 if( *nzerohalfcuts == ncutsfoundbefore )
6713 #ifdef ZEROHALF__PRINT_STATISTICS
6715 ZEROHALFstopTimer(sepadata->sepatimers[i]);
6716 ZEROHALFstopTimer(sepatimer);
6717 sepadata->nsepacutsalgo[i] += *nsepacuts - nsepacutsbefore;
6718 sepadata->nzerohalfcutsalgo[i] += *nzerohalfcuts - nzerohalfcutsbefore;
6719 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8.4f | %8d | %8d | %8d | %8d | %8.4f\n",
6720 sepaname, mod2data->nrowsind, mod2data->ncolsind,
6721 *nsepacuts - nsepacutsbefore, *nzerohalfcuts - nzerohalfcutsbefore,
6722 ZEROHALFevalTimer(sepatimer),
6723 sepadata->nsepacutsalgo[i], sepadata->nzerohalfcutsalgo[i],
6724 *nsepacuts, *nzerohalfcuts, ZEROHALFevalTimer(sepadata->sepatimers[i]));
6725 ZEROHALFresetTimer(sepatimer);
6729 #ifdef ZEROHALF__PRINT_STATISTICS
6731 ZEROHALFstopTimer(timer);
6732 ZEROHALFstatisticsMessage(
"%15s | %8d | %8d | %8d | %8d | %8.4f | %8s | %8s | %8d | %8d | %8.4f\n",
6733 "PROCESSED", mod2data->nrowsind, mod2data->ncolsind,
6734 *nsepacuts - nsepacutsinitial , *nzerohalfcuts - nzerohalfcutsinitial,
6735 ZEROHALFevalTimer(timer),
" ",
" ", *nsepacuts, *nzerohalfcuts,
6736 ZEROHALFevalTimer(sepadata->sepatimers[sepadata->nsepamethods]));
6737 ZEROHALFfreeTimer(timer);
6738 ZEROHALFfreeTimer(sepatimer);
6739 ZEROHALFstopTimer(sepadata->sepatimers[sepadata->nsepamethods]);
6746 #ifdef ZEROHALF__PRINT_STATISTICS
6749 void printZerohalfCutsStatistics(
6753 int* zerohalfcutsindices,
6763 assert(scip !=
NULL);
6764 assert(zerohalfcuts !=
NULL);
6765 assert(nzerohalfcuts >= 0);
6767 ZEROHALFstatisticsMessage(
"\n");
6768 ZEROHALFstatisticsMessage(
" NZEROHALFCUTS: %6d\n", nzerohalfcuts);
6769 ZEROHALFstatisticsMessage(
" NSEPACUTS: %6d\n", nsepacuts);
6771 if( nzerohalfcuts == 0 )
6774 ZEROHALFstatisticsMessage(
"%15s | index | A | viol | efficacy | ef? \
6775 | minortho | #nonz | norm | #origrows | #preprows | by | priority\n",
" ");
6776 for( i = 0 ; i < nzerohalfcuts ; ++i)
6778 if( zerohalfcutsindices ==
NULL )
6781 si = zerohalfcutsindices[i];
6783 assert(i < nzerohalfcuts);
6784 cut = zerohalfcuts[si];
6785 ZEROHALFstatisticsMessage(
"%15s | %6d | %1s | %8f | %8f | %3s | %8f | %8d | %8.2f | %9d | %9d | %2s | %8.6f\n",
6787 cut->addedtolp ?
"A" :
"-",
6788 cut->violation, cut->efficacy,
6790 zerohalfcutsminortho !=
NULL ? zerohalfcutsminortho[i] : 0.0,
6791 cut->nnonz, cut->norm, cut->nrowsincut, cut->nrrowsincut,
6792 (cut->separatedby ==
AUXIP ?
"IP" :
6797 (cut->separatedby ==
AUXGRAPH ?
"2R" :
6800 zerohalfcutsprios !=
NULL ? zerohalfcutsprios[i] : 0.0
6817 assert(scip !=
NULL);
6818 assert(sepa !=
NULL);
6837 assert(sepadata !=
NULL);
6839 if( sepadata->pptimers !=
NULL )
6841 #ifdef ZEROHALF__PRINT_STATISTICS
6844 for( i = 0 ; i < sepadata->nppmethods + 1 ; ++i)
6846 ZEROHALFfreeTimer((sepadata->pptimers[i]));
6852 if( sepadata->sepatimers !=
NULL )
6854 #ifdef ZEROHALF__PRINT_STATISTICS
6857 for( i = 0 ; i < sepadata->nsepamethods + 1 ; ++i)
6859 ZEROHALFfreeTimer((sepadata->sepatimers[i]));
6865 #ifdef ZEROHALF__PRINT_STATISTICS
6866 if( sepadata->dtimer !=
NULL )
6868 ZEROHALFfreeTimer((sepadata->dtimer));
6872 if( sepadata->nsepacutsalgo !=
NULL )
6876 if( sepadata->nzerohalfcutsalgo !=
NULL )
6880 if( sepadata->origrows !=
NULL )
6901 int* sortedsubproblems;
6908 int subproblemindex;
6916 assert(sepa !=
NULL);
6918 assert(scip !=
NULL);
6919 assert(result !=
NULL);
6923 assert(sepadata !=
NULL);
6933 if( sepadata->maxncalls > -1 && totalncalls > sepadata->maxncalls - 1 )
6937 if( (depth == 0 && sepadata->maxroundsroot >= 0 && ncalls >= sepadata->maxroundsroot)
6938 || (depth > 0 && sepadata->maxrounds >= 0 && ncalls >= sepadata->maxrounds) )
6942 if( sepadata->maxdepth > -1 && depth > sepadata->maxdepth )
6962 if( lpdata->ncols == 0 || lpdata->nrows == 0 )
6969 if( sepadata->onlyorigrows && sepadata->origrows ==
NULL )
6975 for( i = 0 ; i < lpdata->nrows ; ++i )
6977 sepadata->norigrows = lpdata->nrows;
6983 for( i = 0 ; i < sepadata->norigrows - 1 ; ++i )
6985 if( sepadata->origrows[i] > sepadata->origrows[i+1] )
6987 temp = sepadata->origrows[i];
6988 sepadata->origrows[i] = sepadata->origrows[i+1];
6989 sepadata->origrows[i+1] = temp;
7000 maxcuts = sepadata->maxcutsroot;
7001 maxsepacuts =
MIN(maxcuts, sepadata->maxsepacutsroot);
7005 maxcuts = sepadata->maxcuts;
7006 maxsepacuts =
MIN(maxcuts, sepadata->maxsepacuts);
7010 if( maxsepacuts == 0 )
7017 #ifdef ZEROHALF__PRINT_STATISTICS
7018 ZEROHALFstatisticsMessage(
"= SEPA_ZEROHALF ================================================================\
7019 s=============================================\n");
7031 sepadata->maxslack = 1.0 - 2.0 * sepadata->minviolation;
7037 #ifdef ZEROHALF__PRINT_STATISTICS
7038 if( sepadata->nsepamethods > 0 )
7040 assert(sepadata->nsepacutsalgo !=
NULL);
7041 assert(sepadata->nzerohalfcutsalgo !=
NULL);
7048 sepadata->maxnnonz = 0;
7049 for( i = 0 ; i < lpdata->nrows ; i++ )
7053 sepadata->maxnnonz = (int) floor( 10.0 * sepadata->maxnnonz / (
double) lpdata->nrows);
7054 sepadata->maxnnonz = (int) floor(
MIN(0.1 * lpdata->ncols, sepadata->maxnnonz)) +
NNONZOFFSET;
7058 if( lpdata->subproblems[0]->nrcols == 0 )
7066 if( lpdata->subproblems[0]->nrrows == 0 )
7072 #ifdef ZEROHALF__PRINT_STATISTICS
7073 SCIP_CALL( printPreprocessingStatistics(scip, lpdata) );
7077 if( sepadata->decomposeproblem )
7085 nrcolsfactor = 1.0 / (2.0 * lpdata->ncols);
7086 for( i = 0 ; i < lpdata->nsubproblems; ++i)
7088 sortedsubproblems[i] = i;
7089 subproblempriorities[i] = ((
SCIP_Real) lpdata->subproblems[i]->nrrows)
7090 + nrcolsfactor * ((
SCIP_Real) lpdata->subproblems[i]->nrcols);
7092 SCIPsortRealInt(subproblempriorities, sortedsubproblems, lpdata->nsubproblems);
7098 for( i = 0; i < lpdata->nsubproblems; ++i )
7101 if( nsepacuts >= maxsepacuts || nzerohalfcuts >= maxcuts )
7104 subproblemindex = sortedsubproblems[i];
7105 sepadata->maxslack = 1.0 - 2.0 * sepadata->minviolation;
7110 if( lpdata->subproblems[subproblemindex]->nrrows == 1 && lpdata->subproblems[subproblemindex]->nrcols == 0 )
7115 SCIP_CALL( debugPrintLPRowsAndCols(scip, lpdata) );
7117 debugPrintSubLpData(scip, lpdata, lpdata->subproblems[subproblemindex]);
7124 if( weights ==
NULL )
7131 lpdata, weights, normtype, nzerohalfcuts, &varsolvals, zerohalfcuts[nzerohalfcuts], &cutoff) );
7148 if( lpdata->rrowsindexofleftrow[lpdata->subproblems[subproblemindex]->rrows[0]] >= 0 )
7149 lpdata->rrowsindexofleftrow[lpdata->subproblems[subproblemindex]->rrows[0]] =
7152 if( lpdata->rrowsindexofrightrow[lpdata->subproblems[subproblemindex]->rrows[0]] >= 0 )
7153 lpdata->rrowsindexofrightrow[lpdata->subproblems[subproblemindex]->rrows[0]] =
7161 if( nsepacuts >= maxsepacuts || nzerohalfcuts >= maxcuts )
7171 SCIP_CALL(
preprocess(scip, sepa, sepadata, lpdata, mod2data, normtype, maxsepacuts, maxcuts,
7172 &nsepacuts, &nzerohalfcuts, zerohalfcuts, &varsolvals, result) );
7174 if( nsepacuts < maxsepacuts || nzerohalfcuts < maxcuts )
7177 SCIP_CALL(
process(scip, sepa, sepadata, lpdata, mod2data, normtype, maxsepacuts, maxcuts,
7178 &nsepacuts, &nzerohalfcuts, zerohalfcuts, &varsolvals, result) );
7185 for( j = 0 ; j < nzerohalfcuts ; ++j)
7186 zerohalfcuts[j]->relatedmod2data =
NULL;
7189 #ifdef ZEROHALF__PRINT_STATISTICS
7190 if( !sepadata->usezhcutpool )
7191 printZerohalfCutsStatistics(scip, zerohalfcuts, nzerohalfcuts,
NULL,
NULL,
NULL, nsepacuts);
7194 if( ! cutoff && sepadata->usezhcutpool )
7200 int* sortedzerohalfcuts;
7213 violationbucketsize = 10.0;
7218 for( i = 0 ; i < nzerohalfcuts; ++i)
7220 sortedzerohalfcuts[i] = i;
7221 zerohalfcutpriorities[i] =
SCIPfloor(scip, violationbucketsize * (zerohalfcuts[i])->violation)
7227 for( si = 0; si < nzerohalfcuts; ++si )
7229 cutdatai = zerohalfcuts[sortedzerohalfcuts[si]];
7230 if( cutdatai->cut ==
NULL || !cutdatai->addedtolp )
7232 hasminorthogonality =
TRUE;
7233 for( sj = 0; hasminorthogonality && sj < si; ++sj )
7235 cutdataj = zerohalfcuts[sortedzerohalfcuts[sj]];
7236 if( cutdataj->cut !=
NULL && cutdataj->addedtolp )
7239 hasminorthogonality =
FALSE;
7243 if( hasminorthogonality && cutdatai->addedtolp )
7246 if( sepadata->delayedcuts && !cutdatai->islocal )
7258 if( !cutdatai->islocal )
7262 cutdatai->addedtolp =
TRUE;
7267 cutdatai->addedtolp =
FALSE;
7271 nsepacuts -= nignoredcuts;
7273 #ifdef ZEROHALF__PRINT_STATISTICS
7274 printZerohalfCutsStatistics(scip, zerohalfcuts, nzerohalfcuts, sortedzerohalfcuts,
7275 zerohalfcutpriorities,
NULL, nsepacuts);
7285 for( i = 0 ; i < nzerohalfcuts; ++i )
7287 cutdatai = zerohalfcuts[i];
7289 if( cutdatai->cut ==
NULL || !cutdatai->addedtolp )
7292 sortedzerohalfcuts[ncutpool] = i;
7293 zerohalfcutminortho[ncutpool] = 1.0;
7294 zerohalfcutpriorities[ncutpool] =
SCIPfloor(scip, violationbucketsize * cutdatai->efficacy)
7296 +
SCIPfloor(scip, violationbucketsize * zerohalfcutminortho[ncutpool]);
7300 ncutpoolold = ncutpool;
7303 while( ncutpool > 0 )
7312 assert(cutdatai->addedtolp);
7318 for( i = 0; i < ncutpool; i++ )
7321 if( zerohalfcutpriorities[i] > bestscore )
7323 bestscore = zerohalfcutpriorities[i];
7328 cutdatai = zerohalfcuts[sortedzerohalfcuts[bestpos]];
7337 if( !cutdatai->islocal )
7342 priotmp = zerohalfcutpriorities[bestpos];
7343 minorthotmp = zerohalfcutminortho[bestpos];
7344 sortidxtmp = sortedzerohalfcuts[bestpos];
7347 zerohalfcutpriorities[bestpos] = zerohalfcutpriorities[ncutpool-1];
7348 zerohalfcutminortho[bestpos] = zerohalfcutminortho[ncutpool-1];
7349 sortedzerohalfcuts[bestpos] = sortedzerohalfcuts[ncutpool-1];
7353 zerohalfcutpriorities[ncutpool] = priotmp;
7354 zerohalfcutminortho[ncutpool] = minorthotmp;
7355 sortedzerohalfcuts[ncutpool] = sortidxtmp;
7359 while( j < ncutpool )
7363 cutdataj = zerohalfcuts[sortedzerohalfcuts[j]];
7368 priotmp = zerohalfcutpriorities[j];
7369 minorthotmp = zerohalfcutminortho[j];
7370 sortidxtmp = sortedzerohalfcuts[j];
7373 zerohalfcutpriorities[j] = zerohalfcutpriorities[ncutpool-1];
7374 zerohalfcutminortho[j] = zerohalfcutminortho[ncutpool-1];
7375 sortedzerohalfcuts[j] = sortedzerohalfcuts[ncutpool-1];
7376 cutdataj->addedtolp =
FALSE;
7381 zerohalfcutpriorities[ncutpool] = priotmp;
7382 zerohalfcutminortho[ncutpool] = minorthotmp;
7383 sortedzerohalfcuts[ncutpool] = sortidxtmp;
7388 if( thisortho < zerohalfcutminortho[j] )
7390 zerohalfcutminortho[j] = thisortho;
7391 zerohalfcutpriorities[j] =
SCIPfloor(scip, violationbucketsize * cutdataj->efficacy)
7393 +
SCIPfloor(scip, violationbucketsize * zerohalfcutminortho[j]);
7399 nsepacuts -= nignoredcuts;
7401 #ifdef ZEROHALF__PRINT_STATISTICS
7402 printZerohalfCutsStatistics(scip, zerohalfcuts, ncutpoolold, sortedzerohalfcuts,
7403 zerohalfcutpriorities, zerohalfcutminortho, nsepacuts);
7414 sepadata->totalncutsfound += nzerohalfcuts;
7415 sepadata->totalnsepacuts += nsepacuts;
7418 if( varsolvals !=
NULL )
7423 for( i = 0 ; i < nzerohalfcuts ; ++i)
7456 ncharsprinted =
SCIPmemccpy(preprocessingmethodsdescription,
7457 "preprocessing methods and ordering:\n"
7458 " # 'd' columns with small LP solution,\n"
7459 " # 'G' modified Gaussian elimination,\n"
7460 " # 'i' identical columns,\n"
7461 " # 'I' identical rows,\n"
7462 " # 'L' large slack rows,\n"
7463 " # 'M' large slack rows (minslack),\n"
7468 ncharsprinted +=
SCIPmemccpy(&(preprocessingmethodsdescription[ncharsprinted - 1]),
7469 " # 'X' add trivial zerohalf cuts,\n"
7470 " # 'z' zero columns,\n"
7471 " # 'Z' zero rows,\n"
7472 " # 'C' fast {'z','s'},\n"
7473 " # 'R' fast {'Z','L','I'}\n"
7475 " # '-' no preprocessing\n"
7476 " #",
'\0', (
unsigned int) (
SCIP_MAXSTRLEN - ncharsprinted - 1));
7480 ncharsprinted =
SCIPmemccpy(sepamethodsdescription,
7481 "separating methods and ordering:\n"
7482 " # '!' stop further processing if a cut was found,\n"
7483 " # '2' exact polynomial time algorithm (only if matrix has max 2 odd entries per row),\n"
7484 " # 'e' enumeration heuristics (k=1: try all preprocessed rows),\n"
7485 " # 'E' enumeration heuristics (k=2: try all combinations of up to two preprocessed rows),\n"
7486 " # 'g' Extended Gaussian elimination heuristics,\n",
'\0',
SCIP_MAXSTRLEN - 1);
7490 ncharsprinted +=
SCIPmemccpy(&(sepamethodsdescription[ncharsprinted - 1]),
7491 " # 's' auxiliary IP heuristics (i.e. number of solved nodes is limited)\n"
7492 " # 'S' auxiliary IP exact (i.e. unlimited number of nodes)\n"
7494 " # '-' no processing\n"
7495 " #",
'\0', (
unsigned int) (
SCIP_MAXSTRLEN - ncharsprinted - 1));
7499 ncharsprinted =
SCIPmemccpy(subscipobjectivedescription,
7500 "auxiliary IP objective:\n"
7501 " # 'v' maximize cut violation,\n"
7502 " # 'u' minimize number of aggregated rows in cut,\n"
7503 " # 'w' minimize number of aggregated rows in cut\n"
7504 " # weighted by the number of rows in the aggregation,\n",
'\0',
SCIP_MAXSTRLEN - 1);
7508 ncharsprinted +=
SCIPmemccpy(&(subscipobjectivedescription[ncharsprinted - 1]),
7509 " # 'p' maximize cut violation and penalize a high number\n"
7510 " # of aggregated rows in the cut weighted by the number\n"
7511 " # of rows in the aggregation and the penalty factor p\n"
7512 " #",
'\0', (
unsigned int) (
SCIP_MAXSTRLEN - ncharsprinted - 1));
7520 sepadata->totalncutsfound = 0;
7521 sepadata->totalnsepacuts = 0;
7522 sepadata->pptimers =
NULL;
7523 sepadata->dtimer =
NULL;
7524 sepadata->sepatimers =
NULL;
7525 sepadata->nsepacutsalgo =
NULL;
7526 sepadata->nzerohalfcutsalgo =
NULL;
7528 sepadata->ppmethods =
NULL;
7529 sepadata->sepamethods =
NULL;
7530 sepadata->nppmethods = -1;
7531 sepadata->nsepamethods = -1;
7532 sepadata->subscipsettings =
NULL;
7534 sepadata->norigrows = 0;
7535 sepadata->origrows =
NULL;
7540 sepaExeclpZerohalf,
NULL,
7543 assert(sepa !=
NULL);
7551 "separating/zerohalf/maxrounds",
7552 "maximal number of zerohalf separation rounds per node (-1: unlimited)",
7555 "separating/zerohalf/maxroundsroot",
7556 "maximal number of zerohalf separation rounds in the root node (-1: unlimited)",
7559 "separating/zerohalf/maxsepacuts",
7560 "maximal number of {0,1/2}-cuts separated per separation round",
7563 "separating/zerohalf/maxsepacutsroot",
7564 "maximal number of {0,1/2}-cuts separated per separation round in the root node",
7567 "separating/zerohalf/dynamiccuts",
7568 "should generated cuts be removed from the LP if they are no longer tight?",
7573 "separating/zerohalf/maxcutsfound",
7574 "maximal number of {0,1/2}-cuts determined per separation round\n\
7575 # (this includes separated but inefficacious cuts)",
7578 "separating/zerohalf/maxcutsfoundroot",
7579 "maximal number of {0,1/2}-cuts determined per separation round in the root node\n\
7580 # (this includes separated but inefficacious cuts)",
7585 "separating/zerohalf/maxdepth",
7586 "separating cuts only if depth <= maxdepth (-1: unlimited)",
7589 "separating/zerohalf/maxncalls",
7590 "maximal number of calls (-1: unlimited)",
7593 "separating/zerohalf/relaxcontvars",
7594 "should continuous variables be relaxed by adding variable bounds?",
7597 "separating/zerohalf/scalefraccoeffs",
7598 "should rows be scaled to make fractional coefficients integer?",
7601 "separating/zerohalf/ignoreprevzhcuts",
7602 "should zerohalf cuts found in previous callbacks ignored?",
7605 "separating/zerohalf/onlyorigrows",
7606 "should only original LP rows be considered (i.e. ignore previously added LP rows)?",
7610 "separating/zerohalf/usezhcutpool",
7611 "should zerohalf cuts be filtered using a cutpool?",
7614 "separating/zerohalf/delayedcuts",
7615 "should cuts be added to the delayed cut pool?",
7618 "separating/zerohalf/maxtestdelta",
7619 "maximal number of different deltas to try for cmir (-1: unlimited, 0: delta=1)",
7622 "separating/zerohalf/trynegscaling",
7623 "should negative values also be tested in scaling for cmir?",
7628 "separating/zerohalf/preprocessing/decomposeproblem",
7629 "should problem be decomposed into subproblems (if possible) before applying preprocessing?",
7632 "separating/zerohalf/preprocessing/delta",
7633 "value of delta parameter used in preprocessing method 'd'",
7636 "separating/zerohalf/preprocessing/ppmethods",
7637 preprocessingmethodsdescription,
7643 "separating/zerohalf/separating/forcecutstolp",
7644 "should the cuts be forced to enter the LP?",
7647 "separating/zerohalf/separating/forcecutstosepastore",
7648 "should the cuts be forced to enter SCIP's sepastore?",
7651 "separating/zerohalf/separating/minviolation",
7652 "minimal violation of a {0,1/2}-cut to be separated",
7655 "separating/zerohalf/separating/sepamethods",
7656 sepamethodsdescription,
7662 "separating/zerohalf/separating/auxip/settingsfile",
7663 "optional settings file of the auxiliary IP (-: none)",
7666 "separating/zerohalf/separating/auxip/sollimit",
7667 "limits/solutions setting of the auxiliary IP",
7670 "separating/zerohalf/separating/auxip/penaltyfactor",
7671 "penalty factor used with objective function 'p' of auxiliary IP",
7674 "separating/zerohalf/separating/auxip/useallsols",
7675 "should all (proper) solutions of the auxiliary IP be used to generate cuts instead of using only the best?",
7678 "separating/zerohalf/separating/auxip/objective",
7679 subscipobjectivedescription,