[Coin-osi-devel] Why Osi.branchAndBound()?

Lou Hafer lou at cs.sfu.ca
Wed Mar 14 16:37:44 EDT 2007


	Ted and I have been exchanging a bit of email related to the discussion 
about OsiCbc, Osi.branchAndBound(), etc., and I thought I'd bring a piece of it 
back out to the list.

	Why does OSI include a branchAndBound() call?
	OSI (to my mind) is fundamentally oriented to continuous simplex 
optimisation. The definitions of the methods make that clear. Why add this one 
method  (branchAndBound) to handle MIP?  If MIP, why not NLP, or MINLP, or CLP 
(as in constraint logic programming)?
	There's just a basic wrongness to creating an OsiXXX object that calls
OsiXXX.branchAndBound() that creates a CbcModel object that creates a new OsiXXX
object (several, actually :-) and finally calls CbcModel.branchAndBound().

	If what we want is a `solve anything' class, then by all means let's 
make one. But let's not clutter it up with a bunch of methods that are specific 
to some particular problem class. And go top down. A `solve anything' solver 
should be capable of diagnosing the problem and farming it out to a more 
restricted solver class.
	OsiCbc, OsiSym, and OsiXXX.branchAndBound() make little sense to me as
solvers for MIP problems. Sort of like trying to use a Blackberry while wearing
boxing gloves.

	Going the other way, it is possible to write a good, efficient
branch-and-cut code that's agnostic about the underlying LP solver.  And can use
other types of solvers where appropriate.

	So, let's hear it --- why do we need this method at all? And if we do 
need it, why does it belong in OsiSolverInterface?

More information about the Osi mailing list