My favorite return code from an LP/MIP solver is:
MIP status(4): Model was proven to be either infeasible or unbounded.
Come on guys, you really can do better than this! OK, what to do as a user? My simplest suggestion – using GAMS – is to add a bound on the objective variable and solve again:
solve m minimizing z using mip;
Now at least we see:
MIP status(3): Model was proven to be infeasible.
If the model was actually unbounded you would have seen large numbers in the solution, making it easy to find out what was wrong.
Note: Please don’t tell me “dual infeasible” is a good return code. That is just another name for the same thing, and just as useless for a modeler. If you are working on a model you really want to know if the model is infeasible or unbounded. I understand it is an easy way out for the algorithm-developer to return something like “dual infeasible” (I have heard some users saying that is just laziness, and I understand that sentiment). The return code should really relate to the model and not what is the easiest for the algorithm-developer to implement.
Not everyone agrees with these opinions (see the comments).
The model was fairly small. If we compare the time both the user needed to email me the question and the model, for me to look at it and respond (say in total half an hour) and the time the solver would need to spend to get a better diagnostic (let’s say 0.1 seconds) then we can say a huge efficiency gain is possible here.