67#define PRESOL_NAME "implint"
68#define PRESOL_DESC "detects implicit integer variables"
76#define PRESOL_PRIORITY -900000
77#define PRESOL_MAXROUNDS 0
78#define PRESOL_TIMING SCIP_PRESOLTIMING_EXHAUSTIVE
80#define DEFAULT_CONVERTINTEGERS FALSE
81#define DEFAULT_COLUMNROWRATIO 50.0
82#define DEFAULT_NUMERICSLIMIT 1e8
226 assert(row < matrix->nrows);
240 assert(row < matrix->nrows);
254 assert(row < matrix->nrows);
267 return matrix->
nrows;
278 return matrix->
ncols;
374 assert(row < matrix->nrows);
376 return matrix->
lhs[row];
388 assert(row < matrix->nrows);
390 return matrix->
rhs[row];
415 if( requiredsize > *
nvars )
448 rowidx = matrix->
nrows;
450 matrix->
lhs[rowidx] = lhs;
451 matrix->
rhs[rowidx] = rhs;
454 for( j = 0; j <
nvars; ++j )
463 assert(0 <= probindex && probindex < matrix->ncols);
469 matrix->
rowcons[rowidx] = cons;
509 activeconstant = 0.0;
521 for( v = 0; v < nactivevars; ++v )
530 lhs -= activeconstant;
532 rhs -= activeconstant;
537 if( nactivevars >= 1 )
587 for(
i = 0;
i < noperands; ++
i )
589 vars[1] = operands[
i];
597 lhs = 1.0 - noperands;
606 for(
i = 0;
i < noperands; ++
i )
608 vars[
i + 1] = operands[
i];
645 for( j = 0; j < noperands; ++j )
647 vars[j] = operands[j];
650 vars[noperands] = intvar;
651 vals[noperands] = -2.0;
657 else if( noperands == 3 )
670 SCIP_Real scale = rhs == 0.0 ? 1.0 : -1.0;
672 for(
i = 0;
i < noperands; ++
i )
674 for( j = 0; j < noperands; ++j )
675 vals[j] = (
i == j) ? scale : -scale;
680 for( j = 0; j < noperands; ++j )
685 else if( noperands < 3 )
687 for( j = 0; j < noperands; ++j )
688 vals[j] = (j <= rhs) ? 1.0 : -1.0;
707 for( j = 0; j < noperands; ++j )
710 aggrvars[j] = operands[j];
713 naggrvars = noperands;
716 for( k = 0; k < naggrvars; ++k )
723 assert(col < matrix->ncols);
766 for(
i = 0;
i < matrix->
nrows; ++
i )
770 for( ; rowpnt < rowend; ++rowpnt )
778 for(
i = 0;
i < matrix->
ncols - 1; ++
i )
781 for(
i = 0;
i < matrix->
nrows; ++
i )
787 for( ; rowpnt != rowend; ++rowpnt, ++valpnt )
790 assert(colidx < matrix->ncols);
817 const char* conshdlrname;
841 for(
i = 0;
i < nconshdlrs; ++
i )
845 if( nconshdlrconss > 0 )
850 if( strcmp(conshdlrname,
"linear") == 0 || strcmp(conshdlrname,
"knapsack") == 0
851 || strcmp(conshdlrname,
"setppc") == 0 || strcmp(conshdlrname,
"logicor") == 0
852 || strcmp(conshdlrname,
"varbound") == 0 )
853 nmatrixrows += nconshdlrconss;
854 else if( strcmp(conshdlrname,
"and") == 0 )
858 for( j = 0; j < nconshdlrconss; ++j )
861 nmatrixrows += nandvars + 1;
863 nnonzstmp += nandvars - 1;
866 else if( strcmp(conshdlrname,
"or") == 0 )
870 for( j = 0; j < nconshdlrconss; ++j )
873 nmatrixrows += norvars + 1;
875 nnonzstmp += norvars - 1;
878 else if( strcmp(conshdlrname,
"xor") == 0 )
886 for( j = 0; j < nconshdlrconss; ++j )
891 else if( nxorvars == 3 )
906 if( nmatrixrows == 0 )
945 for(
i = 0;
i < matrix->
ncols; ++
i )
963 for(
i = 0;
i < nconshdlrs; ++
i )
973 if( strcmp(conshdlrname,
"linear") == 0 )
975 for(
c = 0;
c < nconshdlrconss; ++
c )
990 else if( strcmp(conshdlrname,
"knapsack") == 0 )
992 if( nconshdlrconss > 0 )
999 for(
c = 0;
c < nconshdlrconss; ++
c )
1013 for( v = 0; v < nrowvars; ++v )
1024 else if( strcmp(conshdlrname,
"setppc") == 0 )
1026 for(
c = 0;
c < nconshdlrconss; ++
c )
1064 else if( strcmp(conshdlrname,
"logicor") == 0 )
1066 for(
c = 0;
c < nconshdlrconss; ++
c )
1081 else if( strcmp(conshdlrname,
"varbound") == 0 )
1083 if( nconshdlrconss > 0 )
1091 for(
c = 0;
c < nconshdlrconss; ++
c )
1114 else if( strcmp(conshdlrname,
"and") == 0 )
1116 for(
c = 0;
c < nconshdlrconss; ++
c )
1131 else if( strcmp(conshdlrname,
"or") == 0 )
1133 for(
c = 0;
c < nconshdlrconss; ++
c )
1148 else if( strcmp(conshdlrname,
"xor") == 0 )
1150 for(
c = 0;
c < nconshdlrconss; ++
c )
1209 if( matrix !=
NULL )
1272 for(
i = 0;
i < nrows; ++
i )
1277 for(
i = 0;
i < ncols; ++
i )
1327 while( (next = disjointset[current]) >= 0 )
1335 while( (next = disjointset[current]) >= 0 )
1337 disjointset[current] = root;
1355 assert(disjointset[first] <= -1);
1356 assert(disjointset[second] <= -1);
1363 int firstRank = disjointset[first];
1364 int secondRank = disjointset[second];
1365 if( firstRank > secondRank )
1370 disjointset[second] = first;
1371 if( firstRank == secondRank )
1373 --disjointset[first];
1389 int* representativecomponent;
1390 int* componentnextrowindex;
1391 int* componentnextcolindex;
1399 disjointset[
i] = -1;
1410 for(
i = 0;
i < colnnonzs; ++
i )
1412 int colrow = colrows[
i];
1416 if( colrep != rowrep )
1424 representativecomponent[
i] = -1;
1434 int component = representativecomponent[colroot];
1441 representativecomponent[colroot] = component;
1454 int component = representativecomponent[rowroot];
1478 componentnextcolindex[0] = 0;
1479 componentnextrowindex[0] = 0;
1497 comp->
componentcols[componentnextcolindex[component]] = col;
1498 ++componentnextcolindex[component];
1511 comp->
componentrows[componentnextrowindex[component]] = row;
1512 ++componentnextrowindex[component];
1562 for(
i = 0;
i < nrows; ++
i )
1576 int ncontinuous = 0;
1577 int ncontinuouspmone = 0;
1578 for( j = 0; j < nnonz; ++j )
1595 if(
ABS(value) > numericslimit )
1607 for(
i = 0;
i < ncols; ++
i )
1690 for( component = 0; component < comp->
ncomponents; ++component )
1692 int startrow = (component == 0) ? 0 : comp->
componentrowend[component - 1];
1696 for(
i = startrow;
i < startrow + nrows; ++
i )
1702 componentokay =
FALSE;
1707 if( !componentokay )
1709 compNetworkValid[component] =
FALSE;
1710 compTransNetworkValid[component] =
FALSE;
1714 int startcol = (component == 0) ? 0 : comp->
componentcolend[component - 1];
1717 for(
i = startcol;
i < startcol + ncols; ++
i )
1723 componentokay =
FALSE;
1728 if( !componentokay )
1730 compNetworkValid[component] =
FALSE;
1731 compTransNetworkValid[component] =
FALSE;
1742 if( nrows * presoldata->columnrowratio < ncols )
1744 for(
i = startrow;
i < startrow + nrows && componentnetwork; ++
i )
1752 for( j = 0; j < rownnonzs; ++j )
1754 int rowcol = rowcols[j];
1758 tempIdxArray[contnnonzs] = rowcol;
1759 tempValArray[contnnonzs] = rowvals[j];
1770 for(
i = startcol;
i < startcol + ncols && componentnetwork; ++
i )
1781 if( !componentnetwork )
1784 compNetworkValid[component] = componentnetwork;
1789 if( componentnetwork && !runintdetection )
1791 compTransNetworkValid[component] =
FALSE;
1798 if( nrows <= ncols * presoldata->columnrowratio )
1800 for(
i = startrow;
i < startrow + nrows && componenttransnetwork; ++
i )
1808 for( j = 0; j < rownnonzs; ++j )
1810 int rowcol = rowcols[j];
1814 tempIdxArray[contnnonzs] = rowcol;
1815 tempValArray[contnnonzs] = rowvals[j];
1826 for(
i = startcol;
i < startcol + ncols && componenttransnetwork; ++
i )
1837 if( !componenttransnetwork )
1840 compTransNetworkValid[component] = componenttransnetwork;
1844 for( component = 0; component < comp->
ncomponents; ++component )
1846 if( !compNetworkValid[component] && !compTransNetworkValid[component] )
1849 int startcol = (component == 0) ? 0 : comp->
componentcolend[component - 1];
1852 for(
i = startcol;
i < endcol; ++
i )
1869 if( runintdetection )
1883 for( component = 0; component < implintcomp->
ncomponents; ++component )
1888 int startrow = (component == 0) ? 0 : implintcomp->
componentrowend[component - 1];
1891 for(
i = startrow;
i < endrow; ++
i )
1897 if( contcomponent != -1 )
1899 componentnetwork = componentnetwork && compNetworkValid[contcomponent];
1900 componenttransnetwork = componenttransnetwork && compTransNetworkValid[contcomponent];
1904 componentnetwork =
FALSE;
1905 componenttransnetwork =
FALSE;
1910 if( !componentnetwork && !componenttransnetwork )
1912 implCompNetworkValid[component] =
FALSE;
1913 implCompTransNetworkValid[component] =
FALSE;
1917 int startcol = (component == 0) ? 0 : implintcomp->
componentcolend[component - 1];
1920 for(
i = startcol;
i < endcol; ++
i )
1926 if( contcomponent != -1 )
1928 componentnetwork = componentnetwork && compNetworkValid[contcomponent];
1929 componenttransnetwork = componenttransnetwork && compTransNetworkValid[contcomponent];
1939 for( j = 0; j < colnnonz && implpmone; ++j )
1947 componentnetwork =
FALSE;
1948 componenttransnetwork =
FALSE;
1954 if( !componentnetwork && !componenttransnetwork )
1956 implCompNetworkValid[component] =
FALSE;
1957 implCompTransNetworkValid[component] =
FALSE;
1962 for(
i = startcol;
i < endcol; ++
i )
1967 if( contcomponent != -1 )
1982 if( componentnetwork )
1988 if( componenttransnetwork )
1994 if( !componentnetwork && !componenttransnetwork )
1998 implCompNetworkValid[component] = componentnetwork;
1999 implCompTransNetworkValid[component] = componenttransnetwork;
2003 int numCandidates = 0;
2025 for(
i = 0;
i < colnnonz; ++
i )
2027 int colrow = colrows[
i];
2038 if( rowcomponent != -1 )
2040 SCIP_Bool networkValid = implCompNetworkValid[rowcomponent];
2041 SCIP_Bool transNetworkValid = implCompTransNetworkValid[rowcomponent];
2043 if( networkValid && transNetworkValid )
2045 else if( networkValid )
2047 else if( transNetworkValid )
2068 for(
i = 0;
i < numCandidates; ++
i )
2076 candidateScores[
i] = 10.0;
2080 candidateScores[
i] = 100.0;
2084 candidateScores[
i] -= 0.001 * nnonzs;
2090 int integerNetwork = 0;
2091 int integerTransNetwork = 0;
2095 for(
i = 0;
i < numCandidates; ++
i )
2100 for(
i = 0;
i < numCandidates; ++
i )
2129 ++integerTransNetwork;
2134 if( integerNetwork >= integerTransNetwork )
2136 for(
i = 0;
i < numCandidates; ++
i )
2138 col = candidates[indArray[
i]].
column;
2155 for(
i = 0;
i < numCandidates; ++
i )
2157 col = candidates[indArray[
i]].
column;
2214 targetpresoldata->computedimplints = sourcepresoldata->computedimplints;
2258 if( presoldata->computedimplints )
2261 presoldata->computedimplints =
TRUE;
2278 if( matrix ==
NULL )
2281 " (%.1fs) implied integrality detection stopped because problem contains unsuitable constraints\n",
2288 int beforechanged = *nchgvartypes;
2297 afterchanged = *nchgvartypes;
2300 if( afterchanged == beforechanged )
2303 " (%.1fs) no implied integral variables detected (time: %.2fs)\n",
2304 endtime, endtime - starttime);
2309 " (%.1fs) %d implied integral variables detected (time: %.2fs)\n",
2310 endtime, afterchanged - beforechanged, endtime - starttime);
2347 presoldata->computedimplints =
FALSE;
2350 "presolving/implint/convertintegers",
2351 "should implied integrality also be detected for enforced integral variables?",
2355 "presolving/implint/columnrowratio",
2356 "use the network row addition algorithm when the column to row ratio becomes larger than this threshold",
2360 "presolving/implint/numericslimit",
2361 "a row that contains variables with coefficients that are greater in absolute value than this limit is not considered for implied integrality detection",
Constraint handler for AND constraints, .
Constraint handler for knapsack constraints of the form , x binary and .
Constraint handler for linear constraints in their most general form, .
Constraint handler for logicor constraints (equivalent to set covering, but algorithms are suited fo...
Constraint handler for "or" constraints, .
Constraint handler for the set partitioning / packing / covering constraints .
Constraint handler for variable bound constraints .
Constraint handler for XOR constraints, .
SCIP_VAR ** SCIPgetVarsOr(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetVbdcoefVarbound(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsLogicor(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetRhsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsLinear(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsOr(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsXor(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetLhsLinear(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR * SCIPgetResultantAnd(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsAnd(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR * SCIPgetIntVarXor(SCIP *scip, SCIP_CONS *cons)
SCIP_Real * SCIPgetValsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR * SCIPgetVbdvarVarbound(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR * SCIPgetResultantOr(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR * SCIPgetVarVarbound(SCIP *scip, SCIP_CONS *cons)
SCIP_Longint * SCIPgetWeightsKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Longint SCIPgetCapacityKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetLhsVarbound(SCIP *scip, SCIP_CONS *cons)
SCIP_SETPPCTYPE SCIPgetTypeSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsLogicor(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetRhsVarbound(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsAnd(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Bool SCIPgetRhsXor(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsXor(SCIP *scip, SCIP_CONS *cons)
@ SCIP_SETPPCTYPE_PARTITIONING
@ SCIP_SETPPCTYPE_COVERING
@ SCIP_SETPPCTYPE_PACKING
SCIP_Bool SCIPisPresolveFinished(SCIP *scip)
SCIP_Bool SCIPisStopped(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
int SCIPgetNIntVars(SCIP *scip)
int SCIPgetNContVars(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
int SCIPgetNConss(SCIP *scip)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
int SCIPgetNBinVars(SCIP *scip)
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
struct SCIP_Netmatdec SCIP_NETMATDEC
SCIP_Bool SCIPnetmatdecContainsRow(SCIP_NETMATDEC *dec, int row)
void SCIPnetmatdecRemoveComponent(SCIP_NETMATDEC *dec, int *componentrows, int nrows, int *componentcols, int ncols)
SCIP_Bool SCIPnetmatdecContainsColumn(SCIP_NETMATDEC *dec, int column)
SCIP_RETCODE SCIPnetmatdecTryAddRow(SCIP_NETMATDEC *dec, int row, int *nonzcols, double *nonzvals, int nnonzs, SCIP_Bool *success)
SCIP_RETCODE SCIPnetmatdecCreate(BMS_BLKMEM *blkmem, SCIP_NETMATDEC **pdec, int nrows, int ncols)
SCIP_RETCODE SCIPnetmatdecTryAddCol(SCIP_NETMATDEC *dec, int column, int *nonzrows, double *nonzvals, int nnonzs, SCIP_Bool *success)
void SCIPnetmatdecFree(SCIP_NETMATDEC **pdec)
SCIP_RETCODE SCIPaddRealParam(SCIP *scip, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
void SCIPswapInts(int *value1, int *value2)
SCIP_RETCODE SCIPincludePresolImplint(SCIP *scip)
int SCIPconshdlrGetNCheckConss(SCIP_CONSHDLR *conshdlr)
SCIP_CONS ** SCIPconshdlrGetCheckConss(SCIP_CONSHDLR *conshdlr)
int SCIPgetNConshdlrs(SCIP *scip)
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
SCIP_CONSHDLR ** SCIPgetConshdlrs(SCIP *scip)
SCIP_Bool SCIPconsIsTransformed(SCIP_CONS *cons)
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
#define SCIPfreeBuffer(scip, ptr)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPreallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPduplicateBufferArray(scip, ptr, source, num)
#define SCIPallocBuffer(scip, ptr)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPfreeBufferArrayNull(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_Bool SCIPisNLPEnabled(SCIP *scip)
SCIP_RETCODE SCIPsetPresolFree(SCIP *scip, SCIP_PRESOL *presol,)
void SCIPpresolSetData(SCIP_PRESOL *presol, SCIP_PRESOLDATA *presoldata)
SCIP_PRESOLDATA * SCIPpresolGetData(SCIP_PRESOL *presol)
SCIP_PRESOL * SCIPfindPresol(SCIP *scip, const char *name)
SCIP_RETCODE SCIPsetPresolCopy(SCIP *scip, SCIP_PRESOL *presol,)
SCIP_RETCODE SCIPincludePresolBasic(SCIP *scip, SCIP_PRESOL **presolptr, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
const char * SCIPpresolGetName(SCIP_PRESOL *presol)
int SCIPgetNActivePricers(SCIP *scip)
SCIP_Bool SCIPinProbing(SCIP *scip)
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisPositive(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
int SCIPvarGetNLocksUpType(SCIP_VAR *var, SCIP_LOCKTYPE locktype)
SCIP_Bool SCIPvarIsImpliedIntegral(SCIP_VAR *var)
SCIP_Bool SCIPvarIsNonimpliedIntegral(SCIP_VAR *var)
SCIP_RETCODE SCIPchgVarImplType(SCIP *scip, SCIP_VAR *var, SCIP_IMPLINTTYPE impltype, SCIP_Bool *infeasible)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
int SCIPvarGetProbindex(SCIP_VAR *var)
SCIP_RETCODE SCIPgetProbvarLinearSum(SCIP *scip, SCIP_VAR **vars, SCIP_Real *scalars, int *nvars, int varssize, SCIP_Real *constant, int *requiredsize)
SCIP_Bool SCIPvarIsIntegral(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
int SCIPvarGetNLocksDownType(SCIP_VAR *var, SCIP_LOCKTYPE locktype)
SCIP_Bool SCIPallowStrongDualReds(SCIP *scip)
void SCIPsortDownRealInt(SCIP_Real *realarray, int *intarray, int len)
assert(minobj< SCIPgetCutoffbound(scip))
static const SCIP_Real scalars[]
#define BMSclearMemoryArray(ptr, num)
static SCIP_Bool matrixColInNonlinearTerm(IMPLINT_MATRIX *matrix, int column)
static SCIP_RETCODE findImpliedIntegers(SCIP *scip, SCIP_PRESOLDATA *presoldata, IMPLINT_MATRIX *matrix, MATRIX_COMPONENTS *comp, MATRIX_STATISTICS *stats, int *nchgvartypes)
static SCIP_RETCODE addXorLinearization(SCIP *scip, IMPLINT_MATRIX *matrix, SCIP_CONS *cons, SCIP_VAR **operands, int noperands, SCIP_VAR *intvar, SCIP_Real rhs)
static SCIP_RETCODE addLinearConstraint(SCIP *scip, IMPLINT_MATRIX *matrix, SCIP_VAR **vars, SCIP_Real *vals, int nvars, SCIP_Real lhs, SCIP_Real rhs, SCIP_CONS *cons)
static SCIP_RETCODE createMatrixComponents(SCIP *scip, IMPLINT_MATRIX *matrix, MATRIX_COMPONENTS **pmatrixcomponents)
static SCIP_Real matrixGetRowLhs(IMPLINT_MATRIX *matrix, int row)
static int matrixGetColumnNNonzs(IMPLINT_MATRIX *matrix, int column)
static SCIP_RETCODE matrixSetColumnMajor(SCIP *scip, IMPLINT_MATRIX *matrix)
static SCIP_Real matrixGetColUb(IMPLINT_MATRIX *matrix, int column)
static int disjointSetMerge(int *disjointset, int first, int second)
static int matrixGetNCols(IMPLINT_MATRIX *matrix)
static SCIP_Real matrixGetRowRhs(IMPLINT_MATRIX *matrix, int row)
#define DEFAULT_CONVERTINTEGERS
static SCIP_RETCODE computeMatrixStatistics(SCIP *scip, IMPLINT_MATRIX *matrix, MATRIX_STATISTICS **pstats, SCIP_Real numericslimit)
static int matrixGetNRows(IMPLINT_MATRIX *matrix)
static SCIP_Bool matrixColIsImpliedIntegral(IMPLINT_MATRIX *matrix, int column)
static int * matrixGetRowInds(IMPLINT_MATRIX *matrix, int row)
static void freeMatrixComponents(SCIP *scip, MATRIX_COMPONENTS **pmatrixcomponents)
#define DEFAULT_NUMERICSLIMIT
struct IntegerCandidateData INTEGER_CANDIDATE_DATA
static SCIP_RETCODE computeContinuousComponents(SCIP *scip, IMPLINT_MATRIX *matrix, MATRIX_COMPONENTS *comp, SCIP_Bool includeimplints)
static SCIP_RETCODE matrixCreate(SCIP *scip, IMPLINT_MATRIX **pmatrix)
static void matrixFree(SCIP *scip, IMPLINT_MATRIX **pmatrix)
static SCIP_Bool matrixColIsIntegral(IMPLINT_MATRIX *matrix, int column)
#define DEFAULT_COLUMNROWRATIO
struct MatrixStatistics MATRIX_STATISTICS
static SCIP_Real * matrixGetRowVals(IMPLINT_MATRIX *matrix, int row)
struct ImplintMatrix IMPLINT_MATRIX
static int matrixGetRowNNonzs(IMPLINT_MATRIX *matrix, int row)
static SCIP_RETCODE getActiveVariables(SCIP *scip, SCIP_VAR ***vars, SCIP_Real **scalars, int *nvars, SCIP_Real *constant)
static SCIP_VAR * matrixGetVar(IMPLINT_MATRIX *matrix, int column)
static int * matrixGetColumnInds(IMPLINT_MATRIX *matrix, int column)
struct MatrixComponents MATRIX_COMPONENTS
static SCIP_Real matrixGetColLb(IMPLINT_MATRIX *matrix, int column)
static SCIP_RETCODE addAndOrLinearization(SCIP *scip, IMPLINT_MATRIX *matrix, SCIP_CONS *cons, SCIP_VAR **operands, int noperands, SCIP_VAR *resultant, SCIP_Bool isAndCons)
static SCIP_Real * matrixGetColumnVals(IMPLINT_MATRIX *matrix, int column)
static SCIP_RETCODE matrixAddRow(SCIP *scip, IMPLINT_MATRIX *matrix, SCIP_VAR **vars, SCIP_Real *vals, int nvars, SCIP_Real lhs, SCIP_Real rhs, SCIP_CONS *cons)
static int disjointSetFind(int *disjointset, int ind)
static void freeMatrixStatistics(SCIP *scip, MATRIX_STATISTICS **pstats)
Presolver that detects implicit integer variables.
public methods for managing constraints
public methods for message output
public data structures and miscellaneous methods
Methods for detecting network matrices.
public methods for presolvers
public methods for problem variables
public methods for constraint handler plugins and constraints
public methods for memory management
public methods for message handling
public methods for nonlinear relaxation
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for presolving plugins
public methods for variable pricer plugins
public methods for global and local (sub)problems
public methods for the probing mode
public methods for timing
public methods for SCIP variables
SCIP_Bool * colinnonlinterm
SCIP_Bool * colimplintegral
int numContNetworkEntries
int numContTransNetworkEntries
SCIP_Bool * rowbadnumerics
SCIP_Bool * colintegralbounds
int * rowncontinuouspmone
struct SCIP_Cons SCIP_CONS
struct SCIP_Conshdlr SCIP_CONSHDLR
#define SCIP_DECL_PRESOLCOPY(x)
struct SCIP_PresolData SCIP_PRESOLDATA
#define SCIP_DECL_PRESOLFREE(x)
struct SCIP_Presol SCIP_PRESOL
#define SCIP_DECL_PRESOLEXEC(x)
enum SCIP_Retcode SCIP_RETCODE