CPXXgetcallbackinfo and CPXgetcallbackinfo
The routine CPXXgetcallbackinfo/CPXgetcallbackinfo
accesses
information about the current optimization process from within a
user-written legacy callback function.
int CPXXgetcallbackinfo( CPXCENVptrenv, void *cbdata, intwherefrom, intwhichinfo, void *result_p )
int CPXgetcallbackinfo( CPXCENVptrenv, void *cbdata, intwherefrom, intwhichinfo, void *result_p )
Description
The routine CPXXgetcallbackinfo/CPXgetcallbackinfo
accesses
information about the current optimization process from within a
user-written legacy callback function.
This routine is part of legacy callbacks. Do not use this routine with a generic callback in your application. If your application uses a generic callback, consider CPXXcallbackgetinfodbl and CPXcallbackgetinfodbl, CPXXcallbackgetinfoint and CPXcallbackgetinfoint, or CPXXcallbackgetinfolong and CPXcallbackgetinfolong instead. For more about generic callbacks, see the topic Generic callbacks in the CPLEX User's Manual.
This routine is the only routine that can access optimization status information from within a nonadvanced, user-written, legacy callback function. It is also the only Callable Library routine that you can call from within a nonadvanced, user-written, legacy callback function. In fact, you can call it only from the legacy callback function.
Some of the values can be queried by two different whichinfo
arguments. For example, the iteration count can be queried by
CPX_CALLBACK_INFO_ITCOUNT
and
CPX_CALLBACK_INFO_ITCOUNT_LONG
.
Similarly, the node count can be queried by
CPX_CALLBACK_INFO_NODE_COUNT
and
CPX_CALLBACK_INFO_NODE_COUNT_LONG
.
When the query uses
CPX_CALLBACK_INFO_ITCOUNT_LONG
(or CPX_CALLBACK_INFO_NODE_COUNT_LONG
), then result_p
must point to a value of type CPXLONG
.
When the query uses
CPX_CALLBACK_INFO_ITCOUNT
(or CPX_CALLBACK_INFO_NODE_COUNT
), then result_p
must point to a value of type CPXINT
.
In this case, if
the value to be returned in result_p
exceeds the maximum
value of a 32-bit signed integer, the routine will store INT_MAX
in *result_p
and return the error
CPXERR_OVERFLOW
.
For LP algorithms:
whichinfo | type of *result_p | description |
CPX_CALLBACK_INFO_STARTDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_STARTTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_ENDDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_ENDTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_PRIMAL_OBJ |
double |
primal objective value |
CPX_CALLBACK_INFO_DUAL_OBJ |
double |
dual objective value |
CPX_CALLBACK_INFO_PRIMAL_INFMEAS |
double |
measure of primal infeasibility |
CPX_CALLBACK_INFO_DUAL_INFMEAS |
double |
measure of dual infeasibility |
CPX_CALLBACK_INFO_PRIMAL_FEAS |
int |
1 if primal feasible, 0 if not |
CPX_CALLBACK_INFO_DUAL_FEAS |
int |
1 if dual feasible, 0 if not |
CPX_CALLBACK_INFO_ITCOUNT |
CPXINT |
iteration count, truncated to 32bit |
CPX_CALLBACK_INFO_ITCOUNT_LONG |
CPXLONG |
iteration count |
CPX_CALLBACK_INFO_CROSSOVER_PPUSH |
CPXINT |
primal push crossover itn. count, truncated to 32bit |
CPX_CALLBACK_INFO_CROSSOVER_PPUSH_LONG |
CPXLONG |
primal push crossover itn. count |
CPX_CALLBACK_INFO_CROSSOVER_PEXCH |
CPXINT |
primal exchange crossover itn. count, truncated to 32bit |
CPX_CALLBACK_INFO_CROSSOVER_PEXCH_LONG |
CPXLONG |
primal exchange crossover itn. count |
CPX_CALLBACK_INFO_CROSSOVER_DPUSH |
CPXINT |
dual push crossover itn. count, truncated to 32bit |
CPX_CALLBACK_INFO_CROSSOVER_DPUSH_LONG |
CPXLONG |
dual push crossover itn. count |
CPX_CALLBACK_INFO_CROSSOVER_DEXCH |
int |
dual exchange crossover itn. count |
CPX_CALLBACK_INFO_CROSSOVER_SBCNT |
int |
number of super-basic variables left in the basis |
CPX_CALLBACK_INFO_USER_PROBLEM |
CPXCLPptr |
returns pointer to original user problem; available for primal, dual, barrier, mip |
Crossover from a barrier to a simplex solution reduces the super-basic count. In fact, in a barrier crossover, if the count reaches 0 (zero), the crossover has finished. Thus, the super-basic count serves as a measure of progress for the crossover algorithm.
For Network algorithms:
whichinfo | type of *result_p | description |
CPX_CALLBACK_INFO_STARTDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_STARTTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_ENDDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_ENDTIME |
double |
time stamp |
CPX_CALLBACK_INFO_PRIMAL_OBJ |
double |
primal objective value |
CPX_CALLBACK_INFO_PRIMAL_INFMEAS |
double |
measure of primal infeasibility |
CPX_CALLBACK_INFO_ITCOUNT |
CPXINT |
iteration count, truncate to 32bit |
CPX_CALLBACK_INFO_ITCOUNT_LONG |
CPXLONG |
iteration count |
CPX_CALLBACK_INFO_PRIMAL_FEAS |
int |
1 if primal feasible, 0 if not |
For Presolve algorithms:
whichinfo | type of *result_p | description |
CPX_CALLBACK_INFO_STARTDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_STARTTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_ENDDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_ENDTIME |
double |
time stamp |
CPX_CALLBACK_INFO_PRESOLVE_ROWSGONE |
CPXINT |
number of rows eliminated |
CPX_CALLBACK_INFO_PRESOLVE_COLSGONE |
CPXINT |
number of columns eliminated |
CPX_CALLBACK_INFO_PRESOLVE_AGGSUBST |
CPXINT |
number of aggregator substitutions, truncated to 32bit |
CPX_CALLBACK_INFO_PRESOLVE_AGGSUBST_LONG |
CPXLONG |
number of aggregator substitutions |
CPX_CALLBACK_INFO_PRESOLVE_COEFFS |
CPXINT |
number of modified coefficients, truncated to 32bit |
CPX_CALLBACK_INFO_PRESOLVE_COEFFS_LONG |
CPXLONG |
number of modified coefficients |
For MIP algorithms and informational callbacks:
whichinfo | type of *result_p | description |
CPX_CALLBACK_INFO_STARTDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_STARTTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_ENDDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_ENDTIME |
double |
time stamp |
CPX_CALLBACK_INFO_BEST_INTEGER |
double |
obj. value of best integer solution |
CPX_CALLBACK_INFO_BEST_REMAINING |
double |
obj. value of best remaining node |
CPX_CALLBACK_INFO_NODE_COUNT |
CPXINT |
total number of nodes solved, truncated to 32bit |
CPX_CALLBACK_INFO_NODE_COUNT_LONG |
CPXLONG |
total number of nodes solved |
CPX_CALLBACK_INFO_NODES_LEFT |
CPXINT |
number of remaining nodes, truncated to 32bit |
CPX_CALLBACK_INFO_NODES_LEFT_LONG |
CPXLONG |
number of remaining nodes |
CPX_CALLBACK_INFO_MIP_ITERATIONS |
CPXINT |
total number of MIP iterations, truncated to 32bit |
CPX_CALLBACK_INFO_MIP_ITERATIONS_LONG |
CPXLONG |
total number of MIP iterations |
CPX_CALLBACK_INFO_MIP_REL_GAP |
double |
accesses the current relative gap, like the routine
CPXXgetmiprelgap/CPXgetmiprelgap . |
CPX_CALLBACK_INFO_MIP_FEAS |
CPXINT |
returns 1 (one) if a feasible solution exists; otherwise, 0 (zero) |
CPX_CALLBACK_INFO_CUTOFF |
double |
updated cutoff value |
CPX_CALLBACK_INFO_PROBE_PHASE |
int |
current phase of probing (0-3) |
CPX_CALLBACK_INFO_PROBE_PROGRESS |
double |
fraction of probing phase completed (0.0-1.0) |
CPX_CALLBACK_INFO_FRACCUT_PROGRESS |
double |
fraction of Gomory cut generation for the pass completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_DISJCUT_PROGRESS |
double |
fraction of disjunctive cut generation for the pass completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_FLOWMIR_PROGRESS |
double |
fraction of flow cover and MIR cut generation for the pass completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_KAPPA_STABLE |
double |
percentage of stable simplex bases (condition number less than 1e+7) |
CPX_CALLBACK_INFO_KAPPA_SUSPICIOUS |
double |
percentage of questionable simplex bases (condition number between 1e+7 and 1e+10) |
CPX_CALLBACK_INFO_KAPPA_UNSTABLE |
double |
percentage of unstable simplex bases (condition number between 1e+10 and 1e+14) |
CPX_CALLBACK_INFO_KAPPA_ILLPOSED |
double |
percentage of ill-posed simplex bases (condition number greater than 1e+14) |
CPX_CALLBACK_INFO_KAPPA_MAX |
double |
highest condition number encountered |
CPX_CALLBACK_INFO_KAPPA_ATTENTION |
double |
Indicator of numerical difficulties. See the symbolic value
CPX_KAPPA_ATTENTION for more detail.
|
CPX_CALLBACK_INFO_BENDERS_COUNT |
int |
number of Benders cuts added |
The information specified by variations of
CPX_CALLBACK_INFO_KAPPA_
is available only
when all of these conditions are met:
- The subproblems are solved by simplex.
- The parameter to control
MIP kappa computation
(
CPXPARAM_MIP_Strategy_KappaStats
) is set. - CPLEX has processed at least one LP-basis during the solve.
In all
other cases, CPLEX returns the error CPXERR_NO_KAPPASTATS
.
You can query the relative MIP gap between the current
best primal and dual bounds outside a callback
with the routine
CPXXgetmiprelgap/CPXgetmiprelgap
.
For distributed parallel MIP algorithms and informational callbacks:
- Queries about cut counts, such as CPX_CALLBACK_INFO_COVER_COUNT, always return 0 (zero).
- Queries about MIP kappa statistics, such as CPX_CALLBACK_INFO_KAPPA_MAX, result in the error message CPXERR_NO_KAPPASTATS.
- The number of threads, as queried by CPX_CALLBACK_INFO_USER_THREADS, is always 1 (one).
- The user thread index as identified by CPX_CALLBACK_INFO_MY_THREAD_NUM is always 0 (zero).
- Queries about the current node count, the number of
nodes left, and the iteration count all return correct values during
distributed MIP tree search (that is, branch and bound) after ramp up terminates.
However, during ramp up, the following queries always return 0 (zero):
- CPX_CALLBACK_INFO_NODE_COUNT
- CPX_CALLBACK_INFO_NODE_COUNT_LONG
- CPX_CALLBACK_INFO_NODES_LEFT
- CPX_CALLBACK_INFO_NODES_LEFT_LONG
- CPX_CALLBACK_INFO_MIP_ITERATIONS
- CPX_CALLBACK_INFO_MIP_ITERATIONS_LONG
- The informational callback is only called at synchronization points during distributed MIP optimization; that is, less frequently than in conventional MIP optimization in shared memory.
For MIP algorithms and advanced callbacks:
whichinfo | type of *result_p | description |
CPX_CALLBACK_INFO_STARTDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_STARTTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_ENDDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_ENDTIME |
double |
time stamp |
CPX_CALLBACK_INFO_BEST_INTEGER |
double |
obj. value of best integer solution |
CPX_CALLBACK_INFO_BEST_REMAINING |
double |
obj. value of best remaining node |
CPX_CALLBACK_INFO_NODE_COUNT |
CPXINT |
total number of nodes solved, truncated to 32bit |
CPX_CALLBACK_INFO_NODE_COUNT_LONG |
CPXLONG |
total number of nodes solved |
CPX_CALLBACK_INFO_NODES_LEFT |
CPXINT |
number of remaining nodes, truncate to 32bit |
CPX_CALLBACK_INFO_NODES_LEFT_LONG |
CPXLONG |
number of remaining nodes |
CPX_CALLBACK_INFO_MIP_ITERATIONS |
CPXINT |
total number of MIP iterations, truncate to 32bit |
CPX_CALLBACK_INFO_MIP_ITERATIONS_LONG |
CPXLONG |
total number of MIP iterations |
CPX_CALLBACK_INFO_MIP_FEAS |
int |
returns 1 (one) if a feasible solution exists; otherwise, 0 (zero) |
CPX_CALLBACK_INFO_CUTOFF |
double |
updated cutoff value |
CPX_CALLBACK_INFO_CLIQUE_COUNT |
int |
number of clique cuts added |
CPX_CALLBACK_INFO_COVER_COUNT |
int |
number of cover cuts added |
CPX_CALLBACK_INFO_DISJCUT_COUNT |
int |
number of disjunctive cuts added |
CPX_CALLBACK_INFO_FLOWCOVER_COUNT |
int |
number of flow cover cuts added |
CPX_CALLBACK_INFO_FLOWPATH_COUNT |
int |
number of flow path cuts added |
CPX_CALLBACK_INFO_FRACCUT_COUNT |
int |
number of Gomory fractional cuts added |
CPX_CALLBACK_INFO_GUBCOVER_COUNT |
int |
number of GUB cover cuts added |
CPX_CALLBACK_INFO_IMPLBD_COUNT |
int |
number of implied bound cuts added |
CPX_CALLBACK_INFO_LANDPCUT_COUNT |
int |
number of lift and project cuts added |
CPX_CALLBACK_INFO_MCFCUT_COUNT |
int |
number of multi-commodity flow cuts added |
CPX_CALLBACK_INFO_MIRCUT_COUNT |
int |
number of mixed integer rounding cuts added |
CPX_CALLBACK_INFO_ZEROHALFCUT_COUNT |
int |
number of zero-half cuts added |
CPX_CALLBACK_INFO_USERCUT_COUNT |
int |
number of user cuts added |
CPX_CALLBACK_INFO_TABLECUT_COUNT |
int |
number of lazy constraints added |
CPX_CALLBACK_INFO_SOLNPOOLCUT_COUNT |
int |
number of solution pool cuts added |
CPX_CALLBACK_INFO_USER_PROBLEM |
CPXCLPptr |
returns pointer to original user problem; available for primal, dual, barrier, MIP |
CPX_CALLBACK_INFO_PROBE_PHASE |
int |
current phase of probing (0-3) |
CPX_CALLBACK_INFO_PROBE_PROGRESS |
double |
fraction of probing phase completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_FRACCUT_PROGRESS |
double |
fraction of Gomory cut generation for the pass completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_DISJCUT_PROGRESS |
double |
fraction of disjunctive cut generation for the pass completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_FLOWMIR_PROGRESS |
double |
fraction of flow cover and MIR cut generation for the pass completed (0.0 - 1.0) |
CPX_CALLBACK_INFO_KAPPA_STABLE |
double |
percentage of stable simplex bases (condition number less than 1e+7) |
CPX_CALLBACK_INFO_KAPPA_SUSPICIOUS |
double |
percentage of questionable simplex bases (condition number between 1e+7 and 1e+10) |
CPX_CALLBACK_INFO_KAPPA_UNSTABLE |
double |
percentage of unstable simplex bases (condition number between 1e+10 and 1e+14) |
CPX_CALLBACK_INFO_KAPPA_ILLPOSED |
double |
percentage of ill-posed simplex bases (condition number greater than 1e+14) |
CPX_CALLBACK_INFO_KAPPA_MAX |
double |
highest condition number encountered |
CPX_CALLBACK_INFO_KAPPA_ATTENTION |
double |
Indicator of numerical difficulties. See the symbolic value
CPX_KAPPA_ATTENTION for more detail.
|
CPX_CALLBACK_INFO_MY_THREAD_NUM |
int |
identifier of the parallel thread making this call |
CPX_CALLBACK_INFO_USER_THREADS |
int |
total number of parallel threads currently running |
For Tuning:
whichinfo | type of *result_p | description |
CPX_CALLBACK_INFO_STARTDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_STARTTIME |
double |
system time stamp |
CPX_CALLBACK_INFO_ENDDETTIME |
double |
deterministic time stamp |
CPX_CALLBACK_INFO_ENDTIME |
double |
time stamp |
CPX_CALLBACK_INFO_TUNING_PROGRESS |
double |
elapsed percentage of total tuning time |
Arguments
- env
-
A pointer to the CPLEX environment as returned by
CPXXopenCPLEX/CPXopenCPLEX
. - cbdata
-
The
cbdata
pointer passed to the user-written callback function. The argumentcbdata
must be the value ofcbdata
passed to the user-written callback function. - wherefrom
-
An integer value specifying the optimization algorithm from which the user-written callback function was called. The argument
wherefrom
must be the value ofwherefrom
passed to the user-written callback function. SeeCPXXgetlpcallbackfunc/CPXgetlpcallbackfunc
,CPXXgetmipcallbackfunc/CPXgetmipcallbackfunc
, andCPXXgetnetcallbackfunc/CPXgetnetcallbackfunc
for possible values ofwherefrom
and their meaning. - whichinfo
-
An integer value specifying the specific information that should be returned by
CPXXgetcallbackinfo/CPXgetcallbackinfo
to the result argument. Values forwhichinfo
, the type of the information returned into*result_p
, plus a description appear in the table. - result_p
-
A generic pointer to a variable of type
double
,CPXINT
, orCPXLONG
, depending on the value ofwhichinfo
, as documented in the following tables.
Return
The routine returns 0 (zero) if successful and nonzero if an error occurs. If nonzero, the requested value may not be available for the specific optimization algorithm. For example, the dual objective is not available from primal simplex.
Example
See lpex4.c
in the CPLEX User's Manual.
Suppose you want to know the objective value on each iteration for a
graphical user display. In addition, if primal simplex is not feasible after
1000 iterations, you want to stop the optimization. The function
mycallback
is a callback function to do this.
int mycallback (CPXCENVptr env, void *cbdata, int wherefrom,
void *cbhandle)
{
int itcount;
double objval;
int ispfeas;
int status = 0;
if ( wherefrom == CPX_CALLBACK_PRIMAL ) {
status = CPXgetcallbackinfo (env, cbdata, wherefrom,
CPX_CALLBACK_INFO_PRIMAL_FEAS,
&ispfeas);
if ( status ) {
fprintf (stderr,"error %d in CPXgetcallbackinfo \n", status);
status = 1;
goto TERMINATE;
}
if ( ispfeas ) {
status = CPXgetcallbackinfo (env, cbdata, wherefrom,
CPX_CALLBACK_INFO_PRIMAL_OBJ,
&objval) )
if ( status ) {
fprintf (stderr,"error %d in CPXgetcallbackinfo \n",
status);
status = 1;
goto TERMINATE;
}
}
else {
status = CPXgetcallbackinfo (env, cbdata, wherefrom,
CPX_CALLBACK_INFO_ITCOUNT,
&itcount);
if ( status ) {
fprintf (stderr,"error %d in CPXgetcallbackinfo \n", status);
status = 1;
goto TERMINATE;
}
if ( itcount > 1000 ) status = 1;
}
}
TERMINATE:
return (status);
}