KPI/Feature Gurobipy Pyomo JuMP OR-Tools
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.