7.2 Errors and exceptions¶
Response codes
The function mosekopt
and its variants return a response code (and its human-readable description), informing if optimization was performed correctly, and if not, what error occurred. The expected response, indicating successful execution, is always "MSK_RES_OK"
. Typical errors include:
referencing a nonexisting variable (for example with too large index),
incompatible dimensions of input data matrices,
NaN in the input data,
duplicate conic variable,
error in the optimizer.
Some errors in data preprocessing, such as incorrect command or wrong parameter value will result in mosekopt
exiting without assigning output; the error message will just be printed out. For this reason it may be a good idea to call mosekopt
in a try-catch block. A full list of response codes, error, warning and termination codes can be found in the API reference. For example, the following code
prob.a = sparse(0,1);
prob.c = [NaN];
[r, res] = mosekopt('minimize', prob);
res
will produce as output:
res =
rcode: 1470
rmsg: 'The objective vector c contains an invalid value for variable '' (0).'
rcodestr: 'MSK_RES_ERR_NAN_IN_C'
Optimizer errors and warnings
The optimizer may also produce warning messages. They indicate non-critical but important events, that will not prevent solver execution, but may be an indication that something in the optimization problem might be improved. Warning messages are normally printed to a log stream (see Sec. 7.3 (Input/Output)). A typical warning is, for example:
MOSEK warning 53: A numerically large upper bound value 6.6e+09 is specified for constraint 'C69200' (46020).
Warnings can also be suppressed by setting the MSK_IPAR_MAX_NUM_WARNINGS
parameter to zero, if they are well-understood.
Error and solution status handling example
Below is a source code example with a simple framework for handling major errors when assessing and retrieving the solution to a conic optimization problem.
function response(inputfile)
cmd = sprintf('read(%s)', inputfile)
% In this example we read the problem from file
[r, res] = mosekopt(cmd)
% Read was successful
if strcmp(res.rcodestr, 'MSK_RES_OK')
prob = res.prob;
param = []
% (Optionally) Uncomment the next line to get solution status Unknown
% param.MSK_IPAR_INTPNT_MAX_ITERATIONS = 1
% Perform the optimization.
[r, res] = mosekopt('minimize', prob, param);
% Expected result: The solution status of the interior-point solution is optimal.
% Check if we have non-error termination code or OK
if isempty(strfind(res.rcodestr, 'MSK_RES_ERR'))
solsta = strcat('MSK_SOL_STA_', res.sol.itr.solsta)
if strcmp(solsta, 'MSK_SOL_STA_OPTIMAL')
fprintf('An optimal interior-point solution is located:\n');
res.sol.itr.xx;
elseif strcmp(solsta, 'MSK_SOL_STA_DUAL_INFEASIBLE_CER')
fprintf('Dual infeasibility certificate found.');
elseif strcmp(solsta, 'MSK_SOL_STA_PRIMAL_INFEASIBLE_CER')
fprintf('Primal infeasibility certificate found.');
elseif strcmp(solsta, 'MSK_SOL_STA_UNKNOWN')
% The solutions status is unknown. The termination code
% indicates why the optimizer terminated prematurely.
fprintf('The solution status is unknown.\n');
fprintf('Termination code: %s (%d) %s.\n', res.rcodestr, res.rcode, res.rmsg);
else
fprintf('An unexpected solution status is obtained.');
end
else
fprintf('Error during optimization: %s (%d) %s.\n', res.rcodestr, res.rcode, res.rmsg);
end
else
fprintf('Could not read input file, error: %s (%d) %s.\n', res.rcodestr, res.rcode, res.rmsg)
end
end