Monday, February 9, 2009

Solver Status

There are two cases when it is really important that the Model Status and Solver Status is set correctly by the solver:
  1. When building algorithms in GAMS. In this case the progress and flow of control is determined by the return codes from the SOLVE statement.
  2. When building user interfaces around a model. In this case we want to provide informative messages to the user.
  3. Or both (this was my case: solve is both embedded in an algorithm and I need to report useful messages to the user).

When relying on the Model Status and Solver Status in these cases, we assume that the solver is predictable. Here is a case where the GAMS/Cplex link is sloppy in reporting an iteration limit:


               S O L V E      S U M M A R Y

MODEL m OBJECTIVE z
TYPE MIP DIRECTION MINIMIZE
SOLVER CPLEX FROM LINE 27

**** SOLVER STATUS 4 TERMINATED BY SOLVER
**** MODEL STATUS 14 NO SOLUTION RETURNED
**** OBJECTIVE VALUE 0.0000

RESOURCE USAGE, LIMIT 226.084 1000.000
ITERATION COUNT, LIMIT 0 100000

ILOG CPLEX Dec 1, 2008 22.9.2 WIN 7311.8080 VIS x86/MS Windows
Cplex 11.2.0, GAMS Link 34
Cplex licensed for 1 use of lp, qp, mip and barrier, with 4 parallel threads.

MIP status(110): error termination, no integer solution
*** CPLEX Error 3019: Failure to solve MIP subproblem.

Error solving MIP subproblem.
Solution aborted due to iteration limit.

The correct solver status would be 2:

**** SOLVER STATUS 2 ITERATION INTERRUPT

Note also that the iteration count is not returned correctly. The link claims zero iterations have been performed. The correct number is 100000. This also means M.ITERUSD is wrong and can not be relied on when reporting back.

4 comments:

  1. I'm getting this error for a model which I am running in GAMS. How can I solve this issue?

    ReplyDelete
  2. Hi did you get a solution to your problem? I am in the same situation too.

    ReplyDelete
  3. Erwin,

    Have you ever tried saving the value of your "Iteration Count" into a variable? How do you go about that? I tried declaring a parameter then I placed this statement "parameterVar = Iteration Count;" after the solve statement. But I got errors and it did not work.

    Are you aware of any way to handle that?

    ReplyDelete
  4. This should be in the documentation:


    model m/all/;
    solve m minimizing z using lp;
    scalar p 'iterations used';
    p = m.iterusd;
    display p;

    ReplyDelete