The Gurobi callback routines make use of a pair of arguments: where and what. When a user callback function is called, the where argument indicates from where in the Gurobi optimizer it is being called (presolve, simplex, barrier, MIP, etc.). When the user callback wishes to obtain more detailed information about the state of the optimization, the what argument indicates exactly what piece of information the callback is requesting.
More detailed information on how to use callbacks in your application can be found in the reference manuals for the different Gurobi language interfaces (C, C++, Java, .NET, and Python).
Possible values for the where and what arguments are listed in the following tables. Note that these values are referred to in slightly different ways from the different Gurobi interfaces. Consider the SIMPLEX value as an example. You would refer to this constant as follows from the different Gurobi APIs:
Language | Callback constant |
---|---|
C | GRB_CB_SIMPLEX |
C++ | GRB_CB_SIMPLEX |
Java | GRB.Callback.SIMPLEX |
.NET | GRB.Callback.SIMPLEX |
Python | GRB.Callback.SIMPLEX |
Possible where values are:
where | Optimizer status |
---|---|
POLLING | Periodic polling callback |
PRESOLVE | Currently performing presolve |
SIMPLEX | Currently in simplex |
MIP | Currently in MIP |
MIPSOL | Found a new MIP incumbent |
MIPNODE | Currently exploring a MIP node |
BARRIER | Currently in barrier |
MESSAGE | Printing a log message |
Allowable what values depend on the value of the where argument. Valid combinations are:
what | where | Result type | Description |
---|---|---|---|
RUNTIME | Any except POLLING | double | Elapsed solver runtime (seconds). |
PRE_COLDEL | PRESOLVE | int | The number of columns removed by presolve to this point. |
PRE_ROWDEL | PRESOLVE | int | The number of rows removed by presolve to this point. |
PRE_SENCHG | PRESOLVE | int | The number of constraint senses changed by presolve to this point. |
PRE_BNDCHG | PRESOLVE | int | The number of variable bounds changed by presolve to this point. |
PRE_COECHG | PRESOLVE | int | The number of coefficients changed by presolve to this point. |
SPX_ITRCNT | SIMPLEX | double | Current simplex iteration count. |
SPX_OBJVAL | SIMPLEX | double | Current simplex objective value. |
SPX_PRIMINF | SIMPLEX | double | Current primal infeasibility. |
SPX_DUALINF | SIMPLEX | double | Current dual infeasibility. |
SPX_ISPERT | SIMPLEX | int | Is problem current perturbed? |
MIP_OBJBST | MIP | double | Current best objective. |
MIP_OBJBND | MIP | double | Current best objective bound. |
MIP_NODCNT | MIP | double | Current explored node count. |
MIP_SOLCNT | MIP | int | Current count of feasible solutions found. |
MIP_CUTCNT | MIP | int | Current count of cutting planes applied. |
MIP_NODLFT | MIP | double | Current unexplored node count. |
MIP_ITRCNT | MIP | double | Current simplex iteration count. |
MIPSOL_SOL | MIPSOL | double * | Solution vector for new solution (C only). The resultP argument to C routine GRBcbget should point to an array of doubles that is at least as long as the number of variables in the user model. |
MIPSOL_OBJ | MIPSOL | double | Objective value for new solution. |
MIPSOL_OBJBST | MIPSOL | double | Current best objective. |
MIPSOL_OBJBND | MIPSOL | double | Current best objective bound. |
MIPSOL_NODCNT | MIPSOL | double | Current explored node count. |
MIPSOL_SOLCNT | MIPSOL | int | Current count of feasible solutions found. |
MIPNODE_STATUS | MIPNODE | int | Optimization status of current MIP node (see the Status Code section for further information). |
MIPNODE_OBJBST | MIPNODE | double | Current best objective. |
MIPNODE_OBJBND | MIPNODE | double | Current best objective bound. |
MIPNODE_NODCNT | MIPNODE | double | Current explored node count. |
MIPNODE_SOLCNT | MIPNODE | int | Current count of feasible solutions found. |
MIPNODE_REL | MIPNODE | double * | Relaxation solution for the current node, when its optimization status is GRB_OPTIMAL (C only). The resultP argument to C routine GRBcbget should point to an array of doubles that is at least as long as the number of variables in the user model. |
BARRIER_ITRCNT | BARRIER | int | Current barrier iteration count. |
BARRIER_PRIMOBJ | BARRIER | double | Primal objective value for current barrier iterate. |
BARRIER_DUALOBJ | BARRIER | double | Dual objective value for current barrier iterate. |
BARRIER_PRIMINF | BARRIER | double | Primal infeasibility for current barrier iterate. |
BARRIER_DUALINF | BARRIER | double | Dual infeasibility for current barrier iterate. |
BARRIER_COMPL | BARRIER | double | Complementarity violation for current barrier iterate. |
MSG_STRING | MESSAGE | char * | The message that is being printed. |
Remember that the appropriate prefix must be added to the what or where name listed above, depending on the language you are using.
Note that the POLLING callback does not allow any additional information to be retreived. It is provided in order to allow interactive applications to regain control frequently, so that they can maintain application responsiveness.