Home

Awesome

Nonconvex

Actions Status codecov

Nonconvex.jl is an umbrella package over implementations and wrappers of a number of nonconvex constrained optimization algorithms and packages making use of automatic differentiation. Zero, first and second order methods are available. Nonlinear equality and inequality constraints as well as integer and nonlinear semidefinite constraints are supported. A detailed description of all the algorithms and features available in Nonconvex can be found in the documentation.

The JuliaNonconvex organization

The JuliaNonconvex organization hosts a number of packages which are available for use in Nonconvex.jl. The correct package is loaded using the Nonconvex.@load macro with the algorithm or package name. See the documentation for more details. The following is a summary of all the packages in the JuliaNonconvex organization.

PackageDescriptionTestsCoverage
Nonconvex.jlUmbrella package for nonconvex optimizationActions Statuscodecov
NonconvexCore.jlAll the interface functions and structsBuild StatusCoverage
NonconvexMMA.jlMethod of moving asymptotes implementation in pure JuliaBuild StatusCoverage
NonconvexIpopt.jlIpopt.jl wrapperBuild StatusCoverage
NonconvexNLopt.jlNLopt.jl wrapperBuild StatusCoverage
NonconvexPercival.jlPercival.jl wrapper (an augmented Lagrangian algorithm implementation)Build StatusCoverage
NonconvexJuniper.jlJuniper.jl wrapperBuild StatusCoverage
NonconvexPavito.jlPavito.jl wrapperBuild StatusCoverage
NonconvexSemidefinite.jlNonlinear semi-definite programming algorithmBuild StatusCoverage
NonconvexMultistart.jlMulti-start optimization algorithmsBuild StatusCoverage
NonconvexBayesian.jlConstrained Bayesian optimization implementationBuild StatusCoverage
NonconvexSearch.jlMulti-trajectory and local search methodsBuild StatusCoverage
NonconvexAugLagLab.jlExperimental augmented Lagrangian packageBuild StatusCoverage
NonconvexUtils.jlSome utility functions for automatic differentiation, history tracing, implicit functions and more.Build StatusCoverage
NonconvexTOBS.jlBinary optimization algorithm called "topology optimization of binary structures" (TOBS) which was originally developed in the context of optimal distribution of material in mechanical components.Build StatusCoverage
NonconvexMetaheuristics.jlMetaheuristic gradient-free optimization algorithms as implemented in Metaheuristics.jl.Build StatusCoverage
NonconvexNOMAD.jlNOMAD algorithm as wrapped in the NOMAD.jl.Build StatusCoverage

Design philosophy

Nonconvex.jl is a Julia package that implements and wraps a number of constrained nonlinear and mixed integer nonlinear programming solvers. There are 3 focus points of Nonconvex.jl compared to similar packages such as JuMP.jl and NLPModels.jl:

  1. Emphasis on a function-based API. Objectives and constraints are normal Julia functions.
  2. The ability to nest algorithms to create more complicated algorithms.
  3. The ability to automatically handle structs and different container types in the decision variables by automatically vectorizing and un-vectorizing them in an AD compatible way.

Installing Nonconvex

To install Nonconvex.jl, open a Julia REPL and type ] to enter the package mode. Then run:

add Nonconvex

Alternatively, copy and paste the following code to a Julia REPL:

using Pkg; Pkg.add("Nonconvex")

Loading Nonconvex

To load and start using Nonconvex.jl, run:

using Nonconvex

Quick example

using Nonconvex
Nonconvex.@load NLopt

f(x) = sqrt(x[2])
g(x, a, b) = (a*x[1] + b)^3 - x[2]

model = Model(f)
addvar!(model, [0.0, 0.0], [10.0, 10.0])
add_ineq_constraint!(model, x -> g(x, 2, 0))
add_ineq_constraint!(model, x -> g(x, -1, 1))

alg = NLoptAlg(:LD_MMA)
options = NLoptOptions()
r = optimize(model, alg, [1.0, 1.0], options = options)
r.minimum # objective value
r.minimzer # decision variables

Algorithms

A summary of all the algorithms available in Nonconvex through different packages is shown in the table below. Scroll right to see more columns and see a description of the columns below the table.

Algorithm nameIs meta-algorithm?Algorithm packageOrderFinite boundsInfinite boundsInequality constraintsEquality constraintsSemidefinite constraintsInteger variables
Method of moving asymptotes (MMA)NonconvexMMA.jl (pure Julia) or NLopt.jl1
Primal dual interior point methodIpopt.jl1 or 2
DIviding RECTangles algorithm (DIRECT)NLopt.jl0
Controlled random search (CRS)NLopt.jl0
Multi-Level Single-Linkage (MLSL)LimitedNLopt.jlDepends on sub-solver
StoGoNLopt.jl1
AGSNLopt.jl0
Improved Stochastic Ranking Evolution Strategy (ISRES)NLopt.jl0
ESCHNLopt.jl0
COBYLANLopt.jl0
BOBYQANLopt.jl0
NEWUOANLopt.jl0
Principal AXIS (PRAXIS)NLopt.jl0
Nelder MeadNLopt.jl0
SubplexNLopt.jl0
CCSAQNLopt.jl1
SLSQPNLopt.jl1
TNewtonNLopt.jl1
Shifted limited-memory variable-metricNLopt.jl1
Augmented Lagrangian in NLoptLimitedNLopt.jlDepends on sub-solver
Augmented Lagrangian in PercivalPercival.jl1 or 2
Multiple trajectory searchNonconvexSearch.jl0
Branch and bound for mixed integer nonlinear programmingJuniper.jl1 or 2
Sequential polyhedral outer-approximations for mixed integer nonlinear programmingPavito.jl1 or 2
Evolutionary centers algorithm (ECA)Metaheuristics.jl0
Differential evolution (DE)Metaheuristics.jl0
Particle swarm optimization (PSO)Metaheuristics.jl0
Artificial bee colony (ABC)Metaheuristics.jl0
Gravitational search algorithm (GSA)Metaheuristics.jl0
Simulated annealing (SA)Metaheuristics.jl0
Whale optimization algorithm (WOA)Metaheuristics.jl0
Machine-coded compact genetic algorithm (MCCGA)Metaheuristics.jl0
Genetic algorithm (GA)Metaheuristics.jl0
Nonlinear optimization with the MADS algorithm (NOMAD)NOMAD.jl0Limited
Topology optimization of binary structures (TOBS)NonconvexTOBS.jl1BinaryBinary
HyperbandHyperopt.jlDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solver
Random searchHyperopt.jlDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solver
Latin hypercube searchHyperopt.jlDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solver
Surrogate assisted optimizationNonconvexBayesian.jlDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solver
Log barrier method for nonlinear semidefinite constraint handlingNonconvexSemidefinite.jlDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solverDepends on sub-solver

The following is an explanation of all the columns in the table:

How to contribute?

A beginner? The easiest way to contribute is to read the documentation, test the package and report issues.

An impulsive tester? Improving the test coverage of any package is another great way to contribute to the JuliaNonconvex org. Check the coverage report of any of the packages above by clicking the coverage badge. Find the red lines in the report and figure out tests that would cover these lines of code.

An algorithm head? There are plenty of optimization algorithms that can be implemented and interfaced in Nonconvex.jl. You could be developing the next big nonconvex semidefinite programming algorithm right now! Or the next constraint handling method for evolutionary algorithms!

A hacker? Let's figure out how to wrap some optimization package in Julia in the unique, simple and nimble Nonconvex.jl style.

A software designer? Let's talk about design decisions and how to improve the modularity of the ecosystem.

You can always reach out by opening an issue.

How to cite?

If you use Nonconvex.jl for your own research, please consider citing the following publication: Mohamed Tarek. Nonconvex.jl: A Comprehensive Julia Package for Non-Convex Optimization. 2023. doi: 10.13140/RG.2.2.36120.37121.

@article{MohamedTarekNonconvexjl,
  doi = {10.13140/RG.2.2.36120.37121},
  url = {https://rgdoi.net/10.13140/RG.2.2.36120.37121},
  author = {Tarek,  Mohamed},
  language = {en},
  title = {Nonconvex.jl: A Comprehensive Julia Package for Non-Convex Optimization},
  year = {2023}
}