65#define PRESOL_NAME "implint"
66#define PRESOL_DESC "detects implicit integer variables"
74#define PRESOL_PRIORITY -900000
75#define PRESOL_MAXROUNDS 0
76#define PRESOL_TIMING SCIP_PRESOLTIMING_EXHAUSTIVE
78#define DEFAULT_CONVERTINTEGERS FALSE
79#define DEFAULT_COLUMNROWRATIO 50.0
80#define DEFAULT_NUMERICSLIMIT 1e8
224 assert(row < matrix->nrows);
238 assert(row < matrix->nrows);
252 assert(row < matrix->nrows);
265 return matrix->
nrows;
276 return matrix->
ncols;
372 assert(row < matrix->nrows);
374 return matrix->
lhs[row];
386 assert(row < matrix->nrows);
388 return matrix->
rhs[row];
413 if( requiredsize > *
nvars )
446 rowidx = matrix->
nrows;
448 matrix->
lhs[rowidx] = lhs;
449 matrix->
rhs[rowidx] = rhs;
452 for( j = 0; j <
nvars; ++j )
461 assert(0 <= probindex && probindex < matrix->ncols);
467 matrix->
rowcons[rowidx] = cons;
507 activeconstant = 0.0;
519 for( v = 0; v < nactivevars; ++v )
528 lhs -= activeconstant;
530 rhs -= activeconstant;
535 if( nactivevars >= 1 )
585 for(
i = 0;
i < noperands; ++
i )
587 vars[1] = operands[
i];
595 lhs = 1.0 - noperands;
604 for(
i = 0;
i < noperands; ++
i )
606 vars[
i + 1] = operands[
i];
643 for( j = 0; j < noperands; ++j )
645 vars[j] = operands[j];
648 vars[noperands] = intvar;
649 vals[noperands] = -2.0;
655 else if( noperands == 3 )
668 SCIP_Real scale = rhs == 0.0 ? 1.0 : -1.0;
670 for(
i = 0;
i < noperands; ++
i )
672 for( j = 0; j < noperands; ++j )
673 vals[j] = (
i == j) ? scale : -scale;
678 for( j = 0; j < noperands; ++j )
683 else if( noperands < 3 )
685 for( j = 0; j < noperands; ++j )
686 vals[j] = (j <= rhs) ? 1.0 : -1.0;
705 for( j = 0; j < noperands; ++j )
708 aggrvars[j] = operands[j];
711 naggrvars = noperands;
714 for( k = 0; k < naggrvars; ++k )
721 assert(col < matrix->ncols);
764 for(
i = 0;
i < matrix->
nrows; ++
i )
768 for( ; rowpnt < rowend; ++rowpnt )
776 for(
i = 0;
i < matrix->
ncols - 1; ++
i )
779 for(
i = 0;
i < matrix->
nrows; ++
i )
785 for( ; rowpnt != rowend; ++rowpnt, ++valpnt )
788 assert(colidx < matrix->ncols);
815 const char* conshdlrname;
839 for(
i = 0;
i < nconshdlrs; ++
i )
843 if( nconshdlrconss > 0 )
848 if( strcmp(conshdlrname,
"linear") == 0 || strcmp(conshdlrname,
"knapsack") == 0
849 || strcmp(conshdlrname,
"setppc") == 0 || strcmp(conshdlrname,
"logicor") == 0
850 || strcmp(conshdlrname,
"varbound") == 0 )
851 nmatrixrows += nconshdlrconss;
852 else if( strcmp(conshdlrname,
"and") == 0 )
856 for( j = 0; j < nconshdlrconss; ++j )
859 nmatrixrows += nandvars + 1;
861 nnonzstmp += nandvars - 1;
864 else if( strcmp(conshdlrname,
"or") == 0 )
868 for( j = 0; j < nconshdlrconss; ++j )
871 nmatrixrows += norvars + 1;
873 nnonzstmp += norvars - 1;
876 else if( strcmp(conshdlrname,
"xor") == 0 )
884 for( j = 0; j < nconshdlrconss; ++j )
889 else if( nxorvars == 3 )
904 if( nmatrixrows == 0 )
943 for(
i = 0;
i < matrix->
ncols; ++
i )
961 for(
i = 0;
i < nconshdlrs; ++
i )
971 if( strcmp(conshdlrname,
"linear") == 0 )
973 for(
c = 0;
c < nconshdlrconss; ++
c )
988 else if( strcmp(conshdlrname,
"knapsack") == 0 )
990 if( nconshdlrconss > 0 )
997 for(
c = 0;
c < nconshdlrconss; ++
c )
1011 for( v = 0; v < nrowvars; ++v )
1022 else if( strcmp(conshdlrname,
"setppc") == 0 )
1024 for(
c = 0;
c < nconshdlrconss; ++
c )
1062 else if( strcmp(conshdlrname,
"logicor") == 0 )
1064 for(
c = 0;
c < nconshdlrconss; ++
c )
1079 else if( strcmp(conshdlrname,
"varbound") == 0 )
1081 if( nconshdlrconss > 0 )
1089 for(
c = 0;
c < nconshdlrconss; ++
c )
1112 else if( strcmp(conshdlrname,
"and") == 0 )
1114 for(
c = 0;
c < nconshdlrconss; ++
c )
1129 else if( strcmp(conshdlrname,
"or") == 0 )
1131 for(
c = 0;
c < nconshdlrconss; ++
c )
1146 else if( strcmp(conshdlrname,
"xor") == 0 )
1148 for(
c = 0;
c < nconshdlrconss; ++
c )
1207 if( matrix !=
NULL )
1270 for(
i = 0;
i < nrows; ++
i )
1275 for(
i = 0;
i < ncols; ++
i )
1325 while( (next = disjointset[current]) >= 0 )
1333 while( (next = disjointset[current]) >= 0 )
1335 disjointset[current] = root;
1353 assert(disjointset[first] <= -1);
1354 assert(disjointset[second] <= -1);
1361 int firstRank = disjointset[first];
1362 int secondRank = disjointset[second];
1363 if( firstRank > secondRank )
1368 disjointset[second] = first;
1369 if( firstRank == secondRank )
1371 --disjointset[first];
1387 int* representativecomponent;
1388 int* componentnextrowindex;
1389 int* componentnextcolindex;
1397 disjointset[
i] = -1;
1408 for(
i = 0;
i < colnnonzs; ++
i )
1410 int colrow = colrows[
i];
1414 if( colrep != rowrep )
1422 representativecomponent[
i] = -1;
1432 int component = representativecomponent[colroot];
1439 representativecomponent[colroot] = component;
1452 int component = representativecomponent[rowroot];
1476 componentnextcolindex[0] = 0;
1477 componentnextrowindex[0] = 0;
1495 comp->
componentcols[componentnextcolindex[component]] = col;
1496 ++componentnextcolindex[component];
1509 comp->
componentrows[componentnextrowindex[component]] = row;
1510 ++componentnextrowindex[component];
1560 for(
i = 0;
i < nrows; ++
i )
1574 int ncontinuous = 0;
1575 int ncontinuouspmone = 0;
1576 for( j = 0; j < nnonz; ++j )
1593 if(
ABS(value) > numericslimit )
1605 for(
i = 0;
i < ncols; ++
i )
1688 for( component = 0; component < comp->
ncomponents; ++component )
1690 int startrow = (component == 0) ? 0 : comp->
componentrowend[component - 1];
1694 for(
i = startrow;
i < startrow + nrows; ++
i )
1700 componentokay =
FALSE;
1705 if( !componentokay )
1707 compNetworkValid[component] =
FALSE;
1708 compTransNetworkValid[component] =
FALSE;
1712 int startcol = (component == 0) ? 0 : comp->
componentcolend[component - 1];
1715 for(
i = startcol;
i < startcol + ncols; ++
i )
1721 componentokay =
FALSE;
1726 if( !componentokay )
1728 compNetworkValid[component] =
FALSE;
1729 compTransNetworkValid[component] =
FALSE;
1740 if( nrows * presoldata->columnrowratio < ncols )
1742 for(
i = startrow;
i < startrow + nrows && componentnetwork; ++
i )
1750 for( j = 0; j < rownnonzs; ++j )
1752 int rowcol = rowcols[j];
1756 tempIdxArray[contnnonzs] = rowcol;
1757 tempValArray[contnnonzs] = rowvals[j];
1768 for(
i = startcol;
i < startcol + ncols && componentnetwork; ++
i )
1779 if( !componentnetwork )
1782 compNetworkValid[component] = componentnetwork;
1787 if( componentnetwork && !runintdetection )
1789 compTransNetworkValid[component] =
FALSE;
1796 if( nrows <= ncols * presoldata->columnrowratio )
1798 for(
i = startrow;
i < startrow + nrows && componenttransnetwork; ++
i )
1806 for( j = 0; j < rownnonzs; ++j )
1808 int rowcol = rowcols[j];
1812 tempIdxArray[contnnonzs] = rowcol;
1813 tempValArray[contnnonzs] = rowvals[j];
1824 for(
i = startcol;
i < startcol + ncols && componenttransnetwork; ++
i )
1835 if( !componenttransnetwork )
1838 compTransNetworkValid[component] = componenttransnetwork;
1842 for( component = 0; component < comp->
ncomponents; ++component )
1844 if( !compNetworkValid[component] && !compTransNetworkValid[component] )
1847 int startcol = (component == 0) ? 0 : comp->
componentcolend[component - 1];
1850 for(
i = startcol;
i < endcol; ++
i )
1867 if( runintdetection )
1881 for( component = 0; component < implintcomp->
ncomponents; ++component )
1886 int startrow = (component == 0) ? 0 : implintcomp->
componentrowend[component - 1];
1889 for(
i = startrow;
i < endrow; ++
i )
1895 if( contcomponent != -1 )
1897 componentnetwork = componentnetwork && compNetworkValid[contcomponent];
1898 componenttransnetwork = componenttransnetwork && compTransNetworkValid[contcomponent];
1902 componentnetwork =
FALSE;
1903 componenttransnetwork =
FALSE;
1908 if( !componentnetwork && !componenttransnetwork )
1910 implCompNetworkValid[component] =
FALSE;
1911 implCompTransNetworkValid[component] =
FALSE;
1915 int startcol = (component == 0) ? 0 : implintcomp->
componentcolend[component - 1];
1918 for(
i = startcol;
i < endcol; ++
i )
1924 if( contcomponent != -1 )
1926 componentnetwork = componentnetwork && compNetworkValid[contcomponent];
1927 componenttransnetwork = componenttransnetwork && compTransNetworkValid[contcomponent];
1937 for( j = 0; j < colnnonz && implpmone; ++j )
1945 componentnetwork =
FALSE;
1946 componenttransnetwork =
FALSE;
1952 if( !componentnetwork && !componenttransnetwork )
1954 implCompNetworkValid[component] =
FALSE;
1955 implCompTransNetworkValid[component] =
FALSE;
1960 for(
i = startcol;
i < endcol; ++
i )
1965 if( contcomponent != -1 )
1980 if( componentnetwork )
1986 if( componenttransnetwork )
1992 if( !componentnetwork && !componenttransnetwork )
1996 implCompNetworkValid[component] = componentnetwork;
1997 implCompTransNetworkValid[component] = componenttransnetwork;
2001 int numCandidates = 0;
2023 for(
i = 0;
i < colnnonz; ++
i )
2025 int colrow = colrows[
i];
2036 if( rowcomponent != -1 )
2038 SCIP_Bool networkValid = implCompNetworkValid[rowcomponent];
2039 SCIP_Bool transNetworkValid = implCompTransNetworkValid[rowcomponent];
2041 if( networkValid && transNetworkValid )
2043 else if( networkValid )
2045 else if( transNetworkValid )
2066 for(
i = 0;
i < numCandidates; ++
i )
2074 candidateScores[
i] = 10.0;
2078 candidateScores[
i] = 100.0;
2082 candidateScores[
i] -= 0.001 * nnonzs;
2088 int integerNetwork = 0;
2089 int integerTransNetwork = 0;
2093 for(
i = 0;
i < numCandidates; ++
i )
2098 for(
i = 0;
i < numCandidates; ++
i )
2127 ++integerTransNetwork;
2132 if( integerNetwork >= integerTransNetwork )
2134 for(
i = 0;
i < numCandidates; ++
i )
2136 col = candidates[indArray[
i]].
column;
2153 for(
i = 0;
i < numCandidates; ++
i )
2155 col = candidates[indArray[
i]].
column;
2213 targetpresoldata->computedimplints = sourcepresoldata->computedimplints;
2257 if( presoldata->computedimplints )
2260 presoldata->computedimplints =
TRUE;
2277 if( matrix ==
NULL )
2280 " (%.1fs) implied integrality detection stopped because problem contains unsuitable constraints\n",
2287 int beforechanged = *nchgvartypes;
2296 afterchanged = *nchgvartypes;
2299 if( afterchanged == beforechanged )
2302 " (%.1fs) no implied integral variables detected (time: %.2fs)\n",
2303 endtime, endtime - starttime);
2308 " (%.1fs) %d implied integral variables detected (time: %.2fs)\n",
2309 endtime, afterchanged - beforechanged, endtime - starttime);
2346 presoldata->computedimplints =
FALSE;
2349 "presolving/implint/convertintegers",
2350 "should implied integrality also be detected for enforced integral variables?",
2354 "presolving/implint/columnrowratio",
2355 "use the network row addition algorithm when the column to row ratio becomes larger than this threshold",
2359 "presolving/implint/numericslimit",
2360 "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, .
#define SCIP_STRINGEQ(name, reference, retcode)
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