|
|
|
|
|
Programming Language |
Python |
Python |
Julia |
C++, Python, Java, C# |
Official Documentation Link |
Link |
Link |
Link |
Link |
Open-source vs License requirement |
Requires Gurobi solver license for model generation. |
open-source |
Open-source |
Open-source |
|
|
|
|
|
However, for basic API testing restricted, size-limited license can be obtained freely that can handle model of size: 2000 variables, 2000 linear constraints, and 200 variables if quadratic terms. |
|
|
|
|
Maintainers |
|
|
|
|
Gurobi |
Open-source |
JuMP-dev |
Google |
|
Supported Problem Types |
LP, MIP, MILP, NLP, MINLP |
LP, MIP, MILP, NLP, MINLP |
LP, MIP, MILP, NLP, MINLP Link |
LP, MIP, MILP |
|
|
|
|
|
What hack to do when you have nonlinear functions? Piecewise? |
|
|
|
|
Solver independence vs Lock in |
Lock in. Gurobi solver is the only supported solver. |
Independent |
Independent |
Independent |
Supported Solvers |
Gurobi |
20+ solvers supported including major commercial and open-source ex. CPLEX, Gurobi, BARON, IPOPT, GLPK etc. |
Incredibly broad solver support. 40+ solvers supported (Link). |
Half a dozen solvers supported: commercial solvers such as Gurobi or CPLEX, or open-source solvers such as SCIP, GLPK, or Google's GLOP, CP-SAT. |
|
|
|
|
|
However, Pyomo is designed to be extensible and custom solver interfaces are supported. |
Includes nearly all major commercial and opens-source solvers. |
|
|
|
NEOS Server Compatible |
No. |
Yes |
Yes (Link) |
No |
|
|
|
|
|
Available solver interfaces: Link |
Solvers available: CPLEX, FICO-Xpress, Ipopt, Knitro, MOSEK, OCTERACT, SNOPT. |
|
|
|
** Ease of use and Learning Curve |
Quite Pythonic. |
Quite Pythonic. |
Has a few week learning curve for Julia if coming from Python. |
Relatively less steep for existing Python developers. |
** Expressiveness / Readability |
Considered Good. |
Clear Python based syntax |
Considered good. |
Complex models can be difficult to read. |
** Vendor / Community Support |
Developing. |
Strong community support. |
Moderate |
Developing |
|
|
|
|
|
Strong technical support from Gurobi through dedicated support as well as through forum (Link) |
Active discourse community platform (Link) |
|
|
|
Library Actively Maintained |
|
|
|
|
Yes |
|
|
|
|
|
|
|
|
|
Stability / Number of releases |
11 releases since April 2021. |
77 since Dec 2014. |
105 since Oct 2013 with a release every 2-4 weeks |
58 since Jan 2014. |
Data Transformation and Data Visualization |
|
|
|
|
Yes. |
|
|
|
|
|
|
|
|
|
Variable values, bounds, objective function value, constraints slacks can all be transformed to Python data structures and conversely, they can be used to initialize variable values, bounds, constraint limits etc. |
|
|
|
|
|
|
|
|
|
Notebooks: Interactive Graphical Environment |
|
|
|
|
Yes |
Yes |
Yes. Through IJulia. |
Yes |
|
** Automatic Differentiation? |
No |
yes |
Yes |
There is no code doing automatic-differentiation. That is one reason why NLP, MINLP models are not supported. |
Model Generation times |
|
|
|
|
** Memory Consumption |
|
|
|
|
Solver Callback |
Supports Gurobi Callback |
No |
For selected solvers: Gurobi, CPLEX, GLPK |
Is Possible with some solvers. |
|
|
|
|
|
JuMP's internal representation of the problem as close as possible to the solver's internal representation. This allows us to make efficient in-memory modifications to models in a loop |
|
|
|
|
** Support for Abstract Models |
No |
Abstract – Yes |
No. Default is concrete. |
Yes |
Concrete – Yes |
Abstract models need a way around. Link |
|
|
|
|
|
|
|
|
Presolve/Reformulate |
|
No |
|
|
Data Structures |
Tuplelist |
Leverages basic data structures of Python like list, dict, tuple. |
Arrays, DenseAxisArrays, and SparseAxisArrays |
|
Tupledict |
|
|
|
|
These data structures lend additional methods for efficient sub-listing and expression building. |
|
|
|
|
Ex. |
|
|
|
|
Other Features? |
Model updates are possible, but you have to use model.update() again and again. |
Stochastic programming |
|
|
|
|
|
|
|
Gurobipy pandas |
Bilevel programming |
|
|
|
|
|
|
|
|
Using machine learning predictors in Gurobipy |
Generalized disjunctive programming |
|
|
|
|
|
|
|
|
clear separation between declarative model and data |
|
|
|
|
MPS format vs NL format |
|
|
|
|
Parallel Solver Support? |
yes |
yes |
Yes |
yes |
|
|
|
|
|
JuMP is single threaded (JuMP model must be built sequentially on a single thread), but supports parallel solvers. |
|
|
|
|
Multiple Objectives |
Yes |
No |
No. |
No |
|
|
|
|
|
Model.getMultiobjEnv() |
Pyomo does not have special facilities to handle multi-objective models. The best method is to self-implement augmented epsilon-constraint method |
With the standard JuMP you can have only one goal function at a time. Running another @objective macro just overwrites the previous goal function. |
But can be achieved with custom epsilon-constraint method. |
|
|
|
|
|
|
|
|
Check MultiObjectiveAlgorithms.jl package |
|
|
** Piecewise Linear |
yes |
yes |
No |
yes |
Infeasibility Log |
Model.computeIIS() |
log_infeasible_constraints(model) |
Not as easy as in Pyomo, though sometimes solver functionality can be leveraged. |
Not straightforward again as in Gurobipy and Pyomo. |
Non-contiguous Intvar ?? |
|
|
|
|
Solution hint/Warm Start? |
|
|
|
|
IIS – Irreducible Infeasible Subset. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|