Description
The abstraction is a getting a bit crowded with methods overloaded to mean different things depending on the sequence of operations you perform on a model object. E.g., if you load a nonlinear problem, then getconstrduals
returns the multipliers for all constraints, while if you load a linear problem, it returns the multipliers for the linear constraints. A similar issue leads to jump-dev/JuMP.jl#472 where you're only allowed to call setquadobj!
after loadproblem!
but not after loadnonlinearproblem!
. I think we should be a bit more careful about solver features (jump-dev/JuMP.jl#83).
Concrete proposal:
Define a finite list of problem classes which a solver might support, and force users to request the features that they need as arguments to model()
. Example:
m = model(IpoptSolver(), Nonlinear)
or
m = model(IpoptSolver(), LP)
Having these as arguments to model
lets the solver wrapper potentially return different types depending on the input. The major problem classes might be LP
, Conic
, and Nonlinear
. These are meant to be very broad but capture the different styles of input that we currently support. Further distinctions can be made by using applicable
as we do now. (Extra bonus if we can resolve the GLPKSolverMIP
/GLPKSolverLP
split.) These changes would most directly affect JuMP; Convex.jl shouldn't need more than a couple lines of code tweaked.