# NLPModels

This package provides general guidelines to represent optimization problems in Julia and a standardized API to evaluate the functions and their derivatives. The main objective is to be able to rely on that API when designing optimization solvers in Julia.

## How to Cite

If you use NLPModels.jl in your work, please cite using the format given in CITATION.bib.

## Optimization Problems

Optimization problems are represented by an instance of (a subtype of) `AbstractNLPModel`

.
Such instances are composed of

- an instance of
`NLPModelMeta`

, which provides information about the problem, including the number of variables, constraints, bounds on the variables, etc. - other data specific to the provenance of the problem.

See the documentation for details on the models and the API.

## Installation

`pkg> add NLPModels`

## Models

This package provides no models, although it allows the definition of manually written models.

Check the list of packages that define models in this page of the docs

## Main Methods

If `model`

is an instance of an appropriate subtype of `AbstractNLPModel`

, the following methods are normally defined:

`obj(model, x)`

: evaluate*f(x)*, the objective at`x`

`cons(model x)`

: evaluate*c(x)*, the vector of general constraints at`x`

The following methods are defined if first-order derivatives are available:

`grad(model, x)`

: evaluate*∇f(x)*, the objective gradient at`x`

`jac(model, x)`

: evaluate*J(x)*, the Jacobian of*c*at`x`

as a sparse matrix

If Jacobian-vector products can be computed more efficiently than by evaluating the Jacobian explicitly, the following methods may be implemented:

`jprod(model, x, v)`

: evaluate the result of the matrix-vector product*J(x)⋅v*`jtprod(model, x, u)`

: evaluate the result of the matrix-vector product*J(x)ᵀ⋅u*

The following method is defined if second-order derivatives are available:

`hess(model, x, y)`

: evaluate*∇²L(x,y)*, the Hessian of the Lagrangian at`x`

and`y`

If Hessian-vector products can be computed more efficiently than by evaluating the Hessian explicitly, the following method may be implemented:

`hprod(model, x, v, y)`

: evaluate the result of the matrix-vector product*∇²L(x,y)⋅v*

Several in-place variants of the methods above may also be implemented.

The complete list of methods that an interface may implement can be found in the documentation.

## Attributes

`NLPModelMeta`

objects have the following attributes:

Attribute | Type | Notes |
---|---|---|

`nvar` |
`Int ` |
number of variables |

`x0 ` |
`Array{Float64,1}` |
initial guess |

`lvar` |
`Array{Float64,1}` |
vector of lower bounds |

`uvar` |
`Array{Float64,1}` |
vector of upper bounds |

`ifix` |
`Array{Int64,1}` |
indices of fixed variables |

`ilow` |
`Array{Int64,1}` |
indices of variables with lower bound only |

`iupp` |
`Array{Int64,1}` |
indices of variables with upper bound only |

`irng` |
`Array{Int64,1}` |
indices of variables with lower and upper bound (range) |

`ifree` |
`Array{Int64,1}` |
indices of free variables |

`iinf` |
`Array{Int64,1}` |
indices of visibly infeasible bounds |

`ncon` |
`Int ` |
total number of general constraints |

`nlin ` |
`Int ` |
number of linear constraints |

`nnln` |
`Int ` |
number of nonlinear general constraints |

`nnet` |
`Int ` |
number of nonlinear network constraints |

`y0 ` |
`Array{Float64,1}` |
initial Lagrange multipliers |

`lcon` |
`Array{Float64,1}` |
vector of constraint lower bounds |

`ucon` |
`Array{Float64,1}` |
vector of constraint upper bounds |

`lin ` |
`Range1{Int64} ` |
indices of linear constraints |

`nln` |
`Range1{Int64} ` |
indices of nonlinear constraints (not network) |

`nnet` |
`Range1{Int64} ` |
indices of nonlinear network constraints |

`jfix` |
`Array{Int64,1}` |
indices of equality constraints |

`jlow` |
`Array{Int64,1}` |
indices of constraints of the form c(x) ≥ cl |

`jupp` |
`Array{Int64,1}` |
indices of constraints of the form c(x) ≤ cu |

`jrng` |
`Array{Int64,1}` |
indices of constraints of the form cl ≤ c(x) ≤ cu |

`jfree` |
`Array{Int64,1}` |
indices of "free" constraints (there shouldn't be any) |

`jinf` |
`Array{Int64,1}` |
indices of the visibly infeasible constraints |

`nnzj` |
`Int ` |
number of nonzeros in the sparse Jacobian |

`nnzh` |
`Int ` |
number of nonzeros in the sparse Hessian |

`minimize` |
`Bool ` |
true if `optimize == minimize` |

`islp` |
`Bool ` |
true if the problem is a linear program |

`name` |
`ASCIIString ` |
problem name |