# Percival.jl

*an Augmented Lagrangian method*

## Description

This package implements a JSO-compliant augmented Lagrangian method based on the paper

```
S. Arreckx, A. Lambe, Martins, J. R. R. A., & Orban, D. (2016).
A Matrix-Free Augmented Lagrangian Algorithm with Application to Large-Scale Structural Design Optimization.
Optimization And Engineering, 17, 359–384. doi:10.1007/s11081-015-9287-9
```

It was implemented as part of the Master's dissertation of Egmara Antunes.

### JSO-compliant solver

The `percival`

method expects a single mandatory argument - an AbstractNLPModel - and returns a GenericExecutionStats from SolverCore.jl.

We refer to juliasmoothoptimizers.github.io for tutorials on the NLPModel API. The functions used to access the NLPModel in general, are defined in `NLPModels.jl`

. So, for instance, you can access the objective function's documentation as follows

```
using NLPModels
? obj
```

or visit directly NLPModels.jl's documentation. This framework allows the usage of models from Ampl (using AmplNLReader.jl), CUTEst (using CUTEst.jl), JuMP (using NLPModelsJuMP.jl), PDE-constrained optimization problems (using PDENLPModels.jl) and models defined with automatic differentiation (using ADNLPModels.jl).

## Installation

`Percival`

is a registered package. To install this package, open the Julia REPL (i.e., execute the julia binary), type `]`

to enter package mode, and install `Percival`

as follows

`add Percival`

### Main exported functions and types

`percival`

: The function to call the method. Pass an NLPModel to it.`AugLagModel`

: A model representing the bound-constrained augmented Lagrangian subproblem. This is a subtype of AbstractNLPModel.

## Example

How to solve the simple problem

\[\min_{(x_1,x_2)} \quad (x_1 - 1)^2 + 100 (x_2 - x_1^2)^2 \quad \text{s.to} \quad x_1^2 + x_2^2 \leq 1.\]

The problem is modeled using `ADNLPModels.jl`

with `[-1.2; 1.0]`

as default initial point, and then solved using `percival`

.

```
using ADNLPModels, Percival
nlp = ADNLPModel(
x -> (x[1] - 1)^2 + 100 * (x[2] - x[1]^2)^2,
[-1.2; 1.0],
x -> [x[1]^2 + x[2]^2],
[-Inf],
[1.0]
)
output = percival(nlp)
print(output)
```

```
Generic Execution stats
status: first-order stationary
objective value: 0.04567480870735006
primal feasibility: 1.0000422712153068e-10
dual feasibility: 2.3041857093134093e-13
solution: [0.7864151541968352 0.6176983125681761]
multipliers: [-0.12149655697399275]
multipliers_L: [0.0 6.92596594105416e-310 0.0]
multipliers_U: [0.0 6.92610496795223e-310 1.27e-321]
iterations: 6
elapsed time: 5.759799003601074
```

# Bug reports and discussions

If you think you found a bug, feel free to open an issue. Focused suggestions and requests can also be opened as issues. Before opening a pull request, start an issue or a discussion on the topic, please.

If you want to ask a question not suited for a bug report, feel free to start a discussion here. This forum is for general discussion about this repository and the JuliaSmoothOptimizers, so questions about any of our packages are welcome.