JuMP tutorial
This tutorial shows how to solve a model written in JuMP with Penelopt.jl, using NLPModelsJuMP.jl.
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.