Optimization in Julia is organized through projects in the JuliaOpt and JuliaDiff communities, which coordinate the development of a wide breadth of functionality in mathematical programming, optimization and Operations Research.
Julia, JuliaOpt and JuliaDiff packages address a variety of optimization problem categories (e.g. linear, nonlinear, semidefinite, second-order conic, and mixed-integer), provide functionality for advanced acceleration techniques (automatic differentiation and dual-number calculations), as well as provide high-level, embedded, domain-specific algebraic modeling languages directly in Julia.
The excellent work on these packages is done by the JuliaOpt and JuliaDiff communities – most notably by Miles Lubin, Iain Dunning, Joey Huchette, Jarrett Revels, Luis Benet, John Myles White, Theodore Papamarkou and others. Julia Computing provides support and training for clients looking to use these packages, and contributes back enhancements as open source.
The optimization ecosystem consists of both packages implemented as liberally-licensed, pure Julia code, as well as integrations with other best-of-breed commercial and open-source optimization libraries implemented in C, C++ and Fortran.
Optimization and differentiation packages implemented as pure Julia packages allow for easy embedding within your own distributed software without concerns regarding potential differences in the deployed environment or possible license restrictions. Standalone Julia packages include:
Optim.jl – implementations of standard optimization algorithms for unconstrained or boxed constrained problems including BFGS, Nelder-Mead, Conjugate Gradient and others.
LsqFit.jl – Least-squares non-linear curve fitting in Julia.
ForwardDiff.jl – Forward mode automatic differentiation functionality for determining derivatives, gradients, Jacobians, Hessians of native Julia functions
ReverseDiffSource.jl – Source code transformation for generating derivatives of arbitrary order
DualNumbers.jl – Implementation of dual numbers and associated mathematical operations
HyperDualNumbers.jl – Hyper-dual number functionality used in the numerical computation of first and second derivatives without the cancellation errors of finite-differencing schemes
Modeling language and solver independent interfaces in Julia consist of the following packages:
JuMP.jl – An embedded, domain-specific, algebraic modeling language for generating and solving optimization models for linear, quadratic and nonlinear constrained optimization problems.
Convex.jl – An algebraic modeling language for disciplined convex programming
MathProgBase.jl – A standard solver-agnostic interface providing base functionality utilized by all low-level library wrappers in the JuliaOpt ecosystem as well as functionality for use at a high-level by JuMP and Convex.jl. Also allows for end-users to write their own solver-agnostic interfaces.
The Julia optimization ecosystem includes interfaces to the following commercial and open-source optimization libraries:
|Bonmin (via AmplNLwriter.jl)||✔||✔||✔||✔|
|Couenne (via ApmlNLWriter.jl)||✔||✔||✔||✔|
|Artelys Knitro (.jl)||✔||✔||✔||✔|
LP = Linear Programming
MILP = Mixed Integer LP
SOCP = Second-order cone programming (includes convex QP, QCQP)
MISOCP = Mixed Integer SOCP
SDP = Semidefinite Programming
NLP = (constrained) Nonlinear Programming (includes general QP, QCQP)
CPLEX® is a registered trademark of IBM Corporation
Gurobi® is a registered trademark of Gurobi Optimization
KNITRO® is a registered trademark of Artelys
Mosek™ is a trademark of Mosek ApS
Xpress® is a registered trademark of Fair Isaac Corporation