Filter Content By
Version
Languages

## Callback Codes

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 can be passed to an appropriate get method for your language to obtain additional information (e.g., GRBcbget in C, GRBCallback::getIntInfo in C++, GRBCallback.getIntInfo in Java, GRBCallback.GetIntInfo in .NET, and Model.cbGet in Python).

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).

Note that changing parameters from within a callback is not supported, doing so may lead to undefined behavior.

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:

Numeric value Optimizer status where 0 Periodic polling callback 1 Currently performing presolve 2 Currently in simplex 3 Currently in MIP 4 Found a new MIP incumbent 5 Currently exploring a MIP node 6 Printing a log message 7 Currently in barrier 8 Currently in multi-objective optimization

Allowable what values depend on the value of the where argument. Valid combinations are:

Result type Description RUNTIME what where Any except POLLING double Elapsed solver runtime (seconds). PRESOLVE int The number of columns removed by presolve to this point. PRESOLVE int The number of rows removed by presolve to this point. PRESOLVE int The number of constraint senses changed by presolve to this point. PRESOLVE int The number of variable bounds changed by presolve to this point. PRESOLVE int The number of coefficients changed by presolve to this point. SIMPLEX double Current simplex iteration count. SIMPLEX double Current simplex objective value. SIMPLEX double Current primal infeasibility. SIMPLEX double Current dual infeasibility. SIMPLEX int Is problem current perturbed? MIP double Current best objective. MIP double Current best objective bound. MIP double Current explored node count. MIP int Current count of feasible solutions found. MIP int Current count of cutting planes applied. MIP double Current unexplored node count. MIP double Current simplex iteration count. 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. Use the getSolution callback method in the object-oriented interfaces. MIPSOL double Objective value for new solution. MIPSOL double Current best objective. MIPSOL double Current best objective bound. MIPSOL double Current explored node count. MIPSOL int Current count of feasible solutions found. MIPNODE int Optimization status of current MIP node (see the Status Code section for further information). MIPNODE double Current best objective. MIPNODE double Current best objective bound. MIPNODE double Current explored node count. MIPNODE int Current count of feasible solutions found. 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. Use the getNodeRel callback method in the object-oriented interfaces. BARRIER int Current barrier iteration count. BARRIER double Primal objective value for current barrier iterate. BARRIER double Dual objective value for current barrier iterate. BARRIER double Primal infeasibility for current barrier iterate. BARRIER double Dual infeasibility for current barrier iterate. BARRIER double Complementarity violation for current barrier iterate. MULTIOBJ int Current count of objectives already optimized. MULTIOBJ int Current count of feasible solutions found. MULTIOBJ 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. Use the getSolution callback method in the object-oriented interfaces. 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.

Callback notes

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.

The object-oriented interfaces have specialized methods for obtaining the incumbent or relaxation solution. While in C you would use GRBcbget, you use getSolution or getNodeRel in the object-oriented interfaces. Please consult the callback descriptions for C++, Java, .NET, or Python for further details.

Note that the MIPNODE callback will be called once for each cut pass during the root node solve. The MIPNODE_NODCNT value will remain at 0 until the root node is complete. If you query relaxation values from during the root node, the first MIPNODE callback will give the relaxation with no cutting planes, and the last will give the relaxation after all root cuts have been applied.

Note that the multi-objective optimization algorithm solves a sequence of optimization problems. In each solve the MULTIOBJ callback will be called. Also, MIP-related callbacks will be called if the original model is a MIP, and LP-related callbacks will be called if the original model is an LP.