**NOTE** `JuMP.jl`

`v0.21`

has started supporting complementarity constraints. It is unclear which solvers support optimization problems with complementarity constraints (or MPEC) yet. For solving Mixed Complementarity Problems via the PATH solver, watch PATH.jl, which provides a Julia native access to the PATH solver and integration with JuMP.jl.

# Complementarity.jl

This package provides modeling language for (1) mixed complementarity problems (MCP) and (2) mathematical programs with equilibrium problems (MPEC).

**NOTE** `@complmentarity`

for MCP and `@complements`

for MPEC.

## Mixed Complementarity Problems (MCP)

- This package provides a modeling and computational interface for solving Mixed Complementarity Problems (MCP): modeling by JuMP.jl and computing by PATHSolver.jl and NLsolve.jl. See the documentation.

```
F(x) ⟂ lb ≤ x ≤ ub
```

A very simple example:

```
(x+2) x = 0, x ≥ 0, x+2 ≥ 0
```

```
using Complementarity, JuMP
m = MCPModel()
@variable(m, x >= 0)
@mapping(m, F, x+2)
@complementarity(m, F, x)
status = solveMCP(m)
@show result_value(x)
```

## Mathematical Programs with Equilibrium Constraints (MPEC)

- For solving mathematical programs with equilibrium constraints (MPEC), this package provides an extension to JuMP.jl by providing a macro that accepts complementarity conditions as constraints. Then it reformulates the complementarity conditions as a set of equality and inequality constraints so that a nonlinear optimization solver such as Ipopt.jl can solve the problem. See the documentation.

```
min f(x)
s.t. g(x) ≤ 0
F(x) ⟂ lb ≤ x ≤ ub
```

A very simple example:

```
min x^3
s.t. (x+2) x = 0, x ≥ 0, x+2 ≥ 0
```

```
using JuMP, Ipopt, Complementarity
m = Model(solver=IpoptSolver())
@variable(m, x>=0)
@NLobjective(m, Min, x^3)
@complements(m, 0 <= x+2, x >= 0)
solve(m)
@show getvalue(x)
```

# Installation

`Pkg.add("Complementarity")`

This will also install a few other packages.