# The JuMP ecosystem

The JuMP project consists of the main JuMP package, and a large collection of supporting Julia packages.

The JuMP source code can be found at https://github.com/jump-dev/JuMP.jl.

## MathOptInterface

Beneath JuMP, there is an abstraction layer called MathOptInterface (source code).

MathOptInterface defines an API that solvers should implement so that they can
be used by JuMP, handles the automatic reformulation of problems via *bridges*,
and has a large infrastructure for automatically testing solvers.

## Solvers and solver-wrappers

At the bottom of the stack, there are solvers. These packages are either pure-Julia implementations of optimization algorithms, or they provide a Julia interface to external solvers (often written in C or C++). Each solver also implements the API defined by MathOptInterface so that it can be used from JuMP.

A non-exhaustive list of solvers available through JuMP is available in the JuMP documentation.

## JuMP extensions

JuMP extensions are Julia packages which extend JuMP’s algebraic modeling language by providing additional syntax and functionality for specific problem classes.

Examples of JuMP extensions include:

- BilevelJuMP, which extends JuMP to support bi-level programs.
- Coluna.jl, which extends JuMP to support a branch-and-cut-and-price solution framework.
- InfiniteOpt, which extends JuMP to support infinite-dimensional optimization problems.
- Plasmo.jl, which extends JuMP to support a graph-based algebraic modeling framework.
- SDDP.jl, which extends JuMP to support multistage stochastic programs.
- StochasticPrograms.jl, which extends JuMP to support stochastic programs.
- SumOfSquares, which extends JuMP to support polynomial optimization.
- vOptGeneric.jl, which extends JuMP to support multiobjective programs.

Note that with the exception of SumOfSquares, these JuMP extensions are not part of the core JuMP-dev ecosystem, but are developed independently by the community.

(This list of JuMP extensions is open to new contributions! If you know one that isn’t listed here, tell us by making a pull-request to edit the file code.md.)

## Convex.jl

An alternative to JuMP is Convex.jl. Convex.jl is a Julia package for disciplined convex programming, built on-top-of MathOptInterface. Thus, it can use all of the same MathOptInterface-compatible solvers as JuMP.