CPXXaddusercuts and CPXaddusercuts

The routine CPXXaddusercuts/CPXaddusercuts adds constraints to the list of constraints that CPLEX can add to the LP subproblem of a MIP optimization if they are violated by the LP relaxation solution.

int CPXXaddusercuts( CPXCENVptr env, CPXLPptr lp, CPXDIM rcnt, CPXNNZ nzcnt, double const * rhs, char const * sense, CPXNNZ const * rmatbeg, CPXDIM const * rmatind, double const * rmatval, char const *const * rowname )

int CPXaddusercuts( CPXCENVptr env, CPXLPptr lp, int rcnt, int nzcnt, double const * rhs, char const * sense, int const * rmatbeg, int const * rmatind, double const * rmatval, char ** rowname )

Description

Warning:

This is an advanced routine. Advanced routines typically demand a thorough understanding of the algorithms used by CPLEX. Thus they incur a higher risk of incorrect behavior in your application, behavior that can be difficult to debug. Therefore, the team encourages you to consider carefully whether you can accomplish the same task by means of other Callable Library routines instead.

The routine CPXXaddusercuts/CPXaddusercuts adds constraints to the list of constraints that CPLEX can add to the LP subproblem of a MIP optimization if they are violated by the LP relaxation solution. The constraints are added to those specified in prior calls to CPXXaddusercuts/CPXaddusercuts.

The constraints must be cuts that are implied by the constraint matrix.

If the value of the CPLEX linear reduction switch (CPXPARAM_Preprocessing_Linear) is CPX_ON (that is, 1 (one), its default value), then presolve can discard certain user-specified cuts during preprocessing. To make sure that all your user-specified cuts are taken into account and that none of them are discarded during preprocessing, you must set the value of CPXPARAM_Preprocessing_Linear to CPX_OFF, that is, 0 (zero).

Use CPXXfreeusercuts/CPXfreeusercuts to clear the list of cuts.

The arguments of CPXXaddusercuts/CPXaddusercuts are similar to those of CPXXaddrows/CPXaddrows, with the exception that new columns may not be specified, so there are no rcnt and rowname arguments. Furthermore, unlike CPXXaddrows/CPXaddrows, CPXXaddusercuts/CPXaddusercuts does not accept a NULL pointer for the array of righthand side values or senses. Nor does it accept ranged rows as user cuts. Acceptable values of the array sense appear in the table.

Arguments

env
A pointer to the CPLEX environment as returned by CPXXopenCPLEX/CPXopenCPLEX.
lp
A pointer to a CPLEX problem object as returned by CPXXcreateprob/CPXcreateprob.
rcnt
An integer that specifies the number of new rows to be added to the constraint matrix.
nzcnt
An integer that specifies the number of nonzero constraint coefficients to be added to the constraint matrix. This specifies the length of the arrays rmatind and rmatval.
rhs
An array of length rcnt containing the righthand side term for each constraint to be added to the CPLEX problem object.
sense
An array of length rcnt containing the sense of each constraint to be added to the CPLEX problem object. Possible values of this argument appear in the table.
rmatbeg
An array used with rmatind and rmatval to define the rows to be added.
rmatind
An array used with rmatbeg and rmatval to define the rows to be added.
rmatval
An array used with rmatbeg and rmatind to define the rows to be added. The format is similar to the format used to describe the constraint matrix in the routine CPXXcopylp/CPXcopylp (see description of matbeg, matcnt, matind, and matval in that routine), but the nonzero coefficients are grouped by row instead of column in the array rmatval. The nonzero elements of every row must be stored in sequential locations in this array from position rmatbeg[i] to rmatbeg[i+1]-1 (or from rmatbeg[i] to nzcnt-1 if i=rcnt-1). Each entry, rmatind[i], specifies the column index of the corresponding coefficient, rmatval[i]. UnlikeCPXcopylp, all rows must be contiguous, and rmatbeg[0] must be 0 (zero).
rowname
An array containing pointers to character strings that represent the names of the user cuts. Can be NULL, in which case the new user cuts are assigned default names if the user cuts already resident in the CPLEX problem object have names; otherwise, no names are associated with the user cuts. If row names are passed to CPXXaddusercuts/CPXaddusercuts but existing user cuts have no names assigned, default names are created for them.

Return

The routine returns 0 (zero) if successful and nonzero if an error occurs.

Example

 status = CPXaddusercuts (env, lp, cutcnt, cutnzcnt, cutrhs,
                          cutsense, cutbeg, cutind, cutval, NULL);
 

See also admipex4.c in the standard distribution.

Table 1. Values of sense
sense[i] 'L' <= constraint
sense[i] 'E' = constraint
sense[i] 'G' >= constraint