7.6 Progress and data callback¶
Callbacks are a very useful mechanism that allow the caller to track the progress of the MOSEK optimizer. A callback function provided by the user is regularly called during the optimization and can be used to
obtain a customized log of the solver execution,
collect information for debugging purposes or
ask the solver to terminate.
7.6.1 Data callback¶
In the data callback MOSEK passes a callback code and values of all information items to a user-defined function. The callback function is called, in particular, at the beginning of each iteration of the interior-point optimizer. For the simplex optimizers MSK_IPAR_LOG_SIM_FREQ
controls how frequently the call-back is called.
The callback is set by attaching a structure callback
as a parameter in mosekopt
. This structure specifies a global callback function and can contain arbitrary user-defined data.
7.6.2 Working example: Data callback¶
The following example defines a data callback function that prints out some of the information items. It interrupts the solver after a certain time limit.
function [r] = callback_handler(handle,where,info)
r = 0; % r should always be assigned a value.
if handle.symbcon.MSK_CALLBACK_BEGIN_INTPNT==where
disp(sprintf('Interior point optimizer started\n'));
end
if handle.symbcon.MSK_CALLBACK_END_INTPNT==where
disp(sprintf('Interior-point optimizer terminated\n'));
disp(sprintf('Interior-point primal obj.: %e\n', info.MSK_DINF_INTPNT_PRIMAL_OBJ));
disp(sprintf('Iterations: %d\n', info.MSK_IINF_INTPNT_ITER));
end
if handle.symbcon.MSK_CALLBACK_NEW_INT_MIO==where
disp(sprintf('New mixed-integer solution found\n'));
disp(sprintf('Best objective.: %e\n', info.MSK_DINF_MIO_OBJ_BOUND));
end
% Decide if to terminate the optimization
% Terminate when cputime > handle.maxtime
if info.MSK_DINF_INTPNT_TIME > handle.maxtime
r = 1;
else
r = 0;
end
Assuming that we have defined some problem prob
the callback function is attached as follows:
% Define user defined handle.
[r,res] = mosekopt('echo(0) symbcon');
data.maxtime = 100.0;
data.symbcon = res.symbcon;
callback.iter = 'callback_handler'; % Defined in callback_handler.m
callback.iterhandle = data;
% Perform the optimization.
[r,res] = mosekopt('minimize echo(0)',prob,[],callback);