AMPL tutorial
This tutorial shows how to solve a model written in AMPL with Penelopt.jl, using AmplNLReader.jl.
Penelopt.jl solves problems of the form minimize f(x) s.t. c(x) = 0. If your AMPL model has inequality constraints, the solver will fail.
1. The AMPL model
In this example, we use the Hock–Schittkowski problem HS6.
var x1 := -1.2;
var x2 := 1;
minimize obj: (1 - x1)^2;
subject to c1: 10 * (x2 - x1^2) = 0;We save this in a hs6.mod file.
2. Generate the .nl file
AMPL compiles a model into a .nl file that solvers read directly, without needing AMPL itself at solve time:
$ ampl -oghs6 assets/hs6.modThis produces file hs6.nl.
3. Read the model into Julia
using AmplNLReader
nlp = AmplModel(joinpath(@__DIR__, "assets", "hs6.nl"))4. Solve with Penelopt
using Penelopt
stats = L2Penalty(nlp; print_level = 1)┌ Info:
│ This is Penelopt.jl v0.1.0.
│ Running with linear solver LDLFactorizations.jl v0.10.2.
│
│ Problem name: hs6
│ 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: ( 66.67% sparsity) 1 linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0
│ nonlinear: ████████████████████ 1
│ nnzj: ( 0.00% sparsity) 2
│ lin_nnzj: (------% sparsity)
│ nln_nnzj: ( 0.00% sparsity) 2
│
└
[ 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 +5.9658917e-03 2.13e-01 5.60e-02 1.00e+00 2.13e-03 5.60e-04 1.24e+00
[ Info: 2 2 +4.0311094e-07 1.30e-03 4.59e-04 1.00e+00 1.30e-05 4.59e-06 1.41e+00
[ Info: 3 2 +2.3024446e-15 9.81e-10 3.85e-08 1.00e+00 8.05e-08 1.36e-07 1.41e+00
┌ Info:
│ Number of Iterations: 3
│
│
│ Objective...........: +2.302444565942107e-15
│ Primal Feasibility..: 9.806964129666085e-10
│ Dual Feasibility....: 3.847362065860079e-08
│
│
└ EXIT: first_order.println("status : ", stats.status)
println("objective : ", stats.objective)
println("solution : ", stats.solution)status : first_order
objective : 2.3024445659421074e-15
solution : [0.9999999520162052, 0.999999903934343]See the options reference for the full list of keyword arguments accepted by the solver.