JuMP tutorial

This tutorial shows how to solve a model written in JuMP with Penelopt.jl, using NLPModelsJuMP.jl.

Inequality Constraints

Penelopt.jl solves problems of the form minimize f(x) s.t. c(x) = 0. If your JuMP model has inequality constraints, the solver will fail.

1. Build the JuMP model

In this example, we use the Hock–Schittkowski problem HS6.

using JuMP
model = Model()

@variable(model, x1, start = -1.2)
@variable(model, x2, start = 1.0)

@objective(model, Min, (1 - x1)^2)

@constraint(model, 10 * (x2 - x1^2) == 0)

2. Wrap it as an NLPModel

using NLPModelsJuMP

nlp = MathOptNLPModel(model)

3. Solve with Penelopt

using Penelopt

stats = L2Penalty(nlp; print_level = 1)
┌ Info: 
│ This is Penelopt.jl v1.0.0.
│ Running with linear solver MUMPS v5.8.2.
│ 
│ ScaledModel{Float64, Vector{Float64}, NLPModelsJuMP.MathOptNLPModel, NLPModels.NLPModelMeta{Float64, Vector{Float64}}}
│   Problem name: Generic (scaled)
│    All variables: ████████████████████ 2      All constraints: ████████████████████ 1
│             free: ████████████████████ 2                 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│            lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│            upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│          low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│            fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                fixed: ████████████████████ 1
│           infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│             nnzh: ( 33.33% sparsity)   2               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│                                                     nonlinear: ████████████████████ 1
│                                                          nnzj: (  0.00% sparsity)   2
│                                                      lin_nnzj: (------% sparsity)
│                                                      nln_nnzj: (  0.00% sparsity)   2
│ 
│   Counters:
│              obj: ████████████████████ 1                 grad: ████████████████████ 1                 cons: ████████████████████ 1
│         cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│            jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ████████████████████ 1              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│          jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│        jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│       jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ████████████████████ 1                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│            jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
└ 
[ Info: ------------------------------------------------------------------------------------------------------
[ Info: Iter   sIter  Objective       pfeas       dfeas       τ           ptol        dtol        ‖x‖
[ Info: ------------------------------------------------------------------------------------------------------
[ Info: 0      0      +4.8400000e+00  8.15e+00    4.40e+00    1.00e+00    1.00e+00    8.15e-02    1.56e+00
[ Info: 1      7      +2.2503618e-03  1.03e-01    3.27e-02    1.00e+00    1.03e-03    3.27e-04    1.31e+00
[ Info: 2      2      +1.8092083e-07  5.04e-04    3.18e-04    1.00e+00    5.04e-06    3.18e-06    1.41e+00
[ Info: 3      2      +1.7763568e-15  5.61e-10    3.42e-08    1.00e+00    8.05e-08    1.36e-07    1.41e+00
┌ Info: 
│ Number of Iterations: 3
│ 
│ 
│ Objective...........: +1.776356839400250e-15
│ Primal Feasibility..:  5.611457964960209e-10
│ Dual Feasibility....:  3.416864829239490e-08
│ 
│ 
└ EXIT: first_order.
println("status    : ", stats.status)
println("objective : ", stats.objective)
println("solution  : ", stats.solution)
status    : first_order
objective : 1.7763568394002505e-15
solution  : [0.9999999573428975, 0.9999999146296821]

See the options reference for the full list of keyword arguments accepted by the solver.