What is a generic callback?

Generic callbacks supercede legacy callbacks, such as informational callbacks, query callbacks, or control callbacks.

The generic callback is a callback invoked in many different places during the search for a solution. In contrast to the legacy CPLEX callbacks (such as informational callbacks, query callbacks, or control callbacks), a generic callback is not a dedicated callback (for example, dedicated to separating a cut). Instead, a generic callback is a multi-purpose function. What can be reasonably done in a callback invocation is defined by the context in which the callback is invoked. For more about contexts, see the topic What is a context for a generic callback?.

Tip:

Do not mix generic and legacy callbacks in your application. If you mix legacy callbacks with generic callbacks, CPLEX raises an error at the first invocation of optimization (for example, a call of CPXXmipopt).

How does a generic callback differ from legacy callbacks?

A generic callback differs from the legacy callbacks (informational, query, or control callbacks) in the following ways:
  • It is attached to the CPXLPptr, not the CPXENVptr.
  • It is compatible with dynamic search.
  • It does not require disabling any MIP features.
  • It monitors progress as well as guides the search.
  • It works almost exclusively on the original model; that is, with some exceptions, there is no access to the presolved model nor information available about the presolved model.
  • It does not implicitly change the number of threads that CPLEX uses.
  • It does not implicitly sequentialize the execution of callbacks in multithreaded solves.
  • It allows only routines that take a value of CPXCALLBACKCONTEXTptr as an argument.
  • It offers more flexibility than legacy callbacks; for example, you can inject heuristic solutions in almost any context. You can also inject more than one heuristic solution per callback invocation.