6.7 Optimizer Termination Handling

After solving an optimization problem with MOSEK an approriate action must be taken depending on the outcome. Usually the expected outcome is an optimal solution, but there may be several situations where this is not the result. E.g., if the problem is infeasible or nearly so or if the solver ran out of memory or stalled while optimizing, the result may not be as expected.

This section discusses what should be considered when an optimization has ended unsuccessfully.

Before continuing, let us consider the four status codes available in MOSEK that is relevant for the error handing:

  • Termination code: It provides information about why the optimizer terminated. For instance if a time limit has been specfied (this is common for mixed integer problems), the termination code will tell if this termination limit was the cause of the termination. Note that reaching a prespecfied time limit is not considered an exceptional case. It must be expected that this occurs occasionally.
  • Response code: It is an information about the system status and the outcome of the call to a MOSEK functionalities. This code is used to report the unexpected failures such as out of space.

The response code is the returned value of most functions of the API, and its type is rescode. See Sec. 17.5 (Response codes) for a list of possible return codes.

  • Solution status: It contains information about the status of the solution, e.g., whether the solution is optimal or a certificate of infeasibility.
  • Problem status: It describes what MOSEK knows about the feasibility of the problem, i.e., if the is problem feasible or infeasible.

The problem status is mostly used for integer problems. For continuous problems a problem status of, say, infeasible will always mean that the solution is a certificate of infeasibility. For integer problems it is not possible to provide a certificate, and thus a separate problem status is useful.

Note that if we want to report, e.g., that the optimizer terminated due to a time limit or because it stalled but with a feasible solution, we have to consider both the termination code, and the solution status.

The following pseudo code demonstrates a best practice way of dealing with the status codes.

  • if ( the solution status is as expected )

    • The normal case:

      Do whatever that was planned. Note the response code is ignored because the solution has the expected status. Of course we may check the response anyway if we like.

  • else

    • Exceptional case:

      Based on solution status, response and termination codes take appropriate action.

In Listing 13 the pseudo code is implemented. The idea of the example is to read an optimization problem from a file, e.g., an MPS file and optimize it. Based on status codes an appropriate action is taken, which in this case is to print a suitable message.

Listing 13 A typical code that handle MOSEK response code. Click here to download.
function response(inputfile, solfile)


  cmd      = sprintf('read(%s)', inputfile)
  % Read the problem from file
  [r, res] = mosekopt(cmd)
  
  if strcmp( res.rcodestr , 'MSK_RES_OK')

      % Perform the optimization.
      [r,res] = mosekopt('minimize', res.prob); 
      r
      res
      %Expected result: The solution status of the basic solution is optimal.
      if strcmp(res.rcodestr, 'MSK_RES_OK')
      
          solsta = strcat('MSK_SOL_STA_', res.sol.itr.solsta)

          if strcmp( solsta , 'MSK_SOL_STA_OPTIMAL') || ...
             strcmp( solsta , 'MSK_SOL_STA_NEAR_OPTIMAL')

              fprintf('An optimal basic solution is located.');
              
          elseif strcmp( solsta , 'MSK_SOL_STA_DUAL_INFEAS_CER') || ...
                 strcmp( solsta , 'MSK_SOL_STA_NEAR_DUAL_INFEAS_CER')
              fprintf('Dual infeasibility certificate found.');

          elseif strcmp( solsta , 'MSK_SOL_STA_PRIM_INFEAS_CER') || ...
                 strcmp( soslta , 'MSK_SOL_STA_NEAR_PRIM_INFEAS_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.');
      
              if ~strcmp(res.rcodestr, 'MSK_RES_OK' ) 
                  
                  % A system failure e.g. out of space.
                  fprintf('  Response code: %s\n', res);  
            
              else
            
                  %No system failure e.g. an iteration limit is reached.
                  printf('  Termination code: %s\n', res);  
              end
            
          else
            fprintf('An unexpected solution status is obtained.');
          end
        
      
      else
        fprintf('Could not obtain the solution status for the requested solution.');  
    
  end

  fprintf('Return code: %d (0 means no error occurred.)\n',r);

end