[Clp] problem: CLP 1.17.3 Interior Point via OSI falsely not reporting unbounded

Lacroix, Robert ralacroix at hydro.mb.ca
Fri Nov 8 18:36:26 EST 2019


We have been relying on CLP daily for several years with our production planning tool for problems now typically having around 60,000 rows and 83,000 columns.
To have such confidence in CLP we tested it extensively and CLP came out superior or comparable to 3 other solvers at the time we evaluated it.
Having a working Open Solver Interface in our problem formulator was central to this evaluation and it is the key component which allowed us to change solvers (the previous solver had seen at least 20 years of service).

Naturally we have our own test suite of toy problems to ensure that we correctly implemented the Open Solver Interface.
CLP 1.14.8 and CLP 1.16.11 both passed this test suite, using both the Simplex and Interior Point methods of CLP.

But moving to CLP 1.17.3 the OSI incorrectly reports an unbounded toy problem as having an optimal solution with CLP's Interior Point method, even though CLP's own output says the problem is unbounded or infeasible. In contrast, CLP's Simplex method correctly reports the problem is unbounded in its output and through the OSI. So something has changed in CLP or the OSI between 1.16.11 and 1.17.3

The status checks section in our formulator is this

#include "OsiOslSolverInterface.hpp"
typedef OsiOslSolverInterface OsiXxxSolverInterface;

OsiXxxSolverInterface *si = new OsiXxxSolverInterface();

...

	if (si->isAbandoned()) {
		Namespace->solutionstate = mi_error;
		/* numerical issues, forget about variable values */
	}
	else if (si->isIterationLimitReached()) {
		Namespace->solutionstate = mi_max_iters_exceeded;
		solution = si->getColSolution();	/* no solution yet, get variable values anyway */
	}
	else if (si->isPrimalObjectiveLimitReached()) {
		Namespace->solutionstate = mi_not_solved;	/* solver has stopped */
		solution = si->getColSolution();	/* get variable values anyway */
	}
	else if (si->isProvenOptimal()) {
		Namespace->solutionstate = mi_normal;
		solution = si->getStrictColSolution();	/* ensure variables don't exceed bounds */
	}
	else if (si->isProvenPrimalInfeasible()) {
		Namespace->solutionstate = mi_infeasible;	/* also dual may be infeasible */
		solution = si->getColSolution();	/* solution can be anywhere */
	}
	else if (si->isProvenDualInfeasible()) {
		Namespace->solutionstate = mi_unbounded;	/* primal is feasible */
		solution = si->getColSolution();	/* solution can be anywhere */
	}
	else {
		Namespace->solutionstate = mi_error;	/* unknown, maybe cycling or error */
		/* potentially no variable values */
	}

I see the same issue whether isProvenOptimal() is coded as shown above or if it is moved to last place in this chain of if-else tests.
So I don't think it's a coding problem on our end.

Since we have been relying on Simplex and it still works, I don't have authorization to spend time bisecting the git tree and debugging CLP/OSI.
Any possibility of getting CLP/OSI fixed?

Robert Lacroix
Manitoba Hydro



More information about the Clp mailing list