Skip to content

Commit 9950c2c

Browse files
committed
WIP
1 parent 83a13f8 commit 9950c2c

File tree

4 files changed

+106
-37
lines changed

4 files changed

+106
-37
lines changed

src/selection.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ There are 7 optimizers available:
5757
```
5858
"""
5959
function select_optimizers(
60-
nlp::AbstractNLPModel{T, S},
60+
nlp::AbstractNLPModel{T, S};
6161
verbose = 1,
6262
highest_derivative_available::Integer = 2,
6363
) where {T, S}

src/solve.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ function minimize(
44
highest_derivative_available::Integer = 2,
55
kwargs...,
66
)
7-
select = select_optimizers(nlp, verbose, highest_derivative_available)
7+
select = select_optimizers(
8+
nlp;
9+
verbose = verbose,
10+
highest_derivative_available = highest_derivative_available,
11+
)
812
(verbose 1) && println("Solve using $(first(select).name):")
913
solver = first(select)
1014
return minimize(Val(Symbol(solver.name)), nlp; verbose = verbose, kwargs...)
@@ -16,7 +20,11 @@ function minimize(
1620
highest_derivative_available::Integer = 2,
1721
kwargs...,
1822
)
19-
select = select_optimizers(nlp, verbose, highest_derivative_available)
23+
select = select_optimizers(
24+
nlp;
25+
verbose = verbose,
26+
highest_derivative_available = highest_derivative_available,
27+
)
2028
nls_select = select[select.specialized_nls, :]
2129
solver = if !isempty(nls_select)
2230
first(nls_select)

test/qp_tests.jl

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@
88
c0 = 1.0
99
x0 = [-1.2; 1.0]
1010
qp_model = QuadraticModel(c, H, c0 = c0, x0 = x0, name = "uncqp_QP")
11-
stats = minimize(qp_model)
11+
stats = with_logger(NullLogger()) do
12+
minimize(qp_model)
13+
end
1214
@test true
13-
minimize(c, H, c0 = c0, x0 = x0, name = "uncqp_QP")
15+
with_logger(NullLogger()) do
16+
minimize(c, H, c0 = c0, x0 = x0, name = "uncqp_QP")
17+
end
1418
@test true
15-
minimize("RipQP", c, H, c0 = c0, x0 = x0, name = "uncqp_QP")
19+
with_logger(NullLogger()) do
20+
minimize("RipQP", c, H, c0 = c0, x0 = x0, name = "uncqp_QP")
21+
end
1622
@test true
1723
end
1824

@@ -23,11 +29,17 @@
2329
lvar = [0.0; 0.0]
2430
x0 = [0.5; 0.5]
2531
qp_model = QuadraticModel(c, H, lvar, uvar, x0 = x0, name = "bndqp_QP")
26-
stats = minimize(qp_model)
32+
stats = with_logger(NullLogger()) do
33+
minimize(qp_model)
34+
end
2735
@test true
28-
minimize(c, H, lvar, uvar, x0 = x0, name = "bndqp_QP")
36+
with_logger(NullLogger()) do
37+
minimize(c, H, lvar, uvar, x0 = x0, name = "bndqp_QP")
38+
end
2939
@test true
30-
minimize("RipQP", c, H, lvar, uvar, x0 = x0, name = "bndqp_QP")
40+
with_logger(NullLogger()) do
41+
minimize("RipQP", c, H, lvar, uvar, x0 = x0, name = "bndqp_QP")
42+
end
3143
@test true
3244
end
3345

@@ -40,11 +52,17 @@
4052
lcon = [1.0]
4153
ucon = [1.0]
4254
qp_model = QuadraticModel(c, H, A, lcon, ucon, name = "eqconqp_QP")
43-
stats = minimize(qp_model)
55+
stats = with_logger(NullLogger()) do
56+
minimize(qp_model)
57+
end
4458
@test true
45-
minimize(c, H, A, lcon, ucon, name = "eqconqp_QP")
59+
with_logger(NullLogger()) do
60+
minimize(c, H, A, lcon, ucon, name = "eqconqp_QP")
61+
end
4662
@test true
47-
minimize("RipQP", c, H, A, lcon, ucon, name = "eqconqp_QP")
63+
with_logger(NullLogger()) do
64+
minimize("RipQP", c, H, A, lcon, ucon, name = "eqconqp_QP")
65+
end
4866
@test true
4967
end
5068

@@ -63,11 +81,17 @@
6381
ucon = [Inf; 0.0; 1.0]
6482
x0 = ones(2)
6583
qp_model = QuadraticModel(c, H, A, lcon, ucon, c0 = c0, x0 = x0, name = "ineqconqp_QP")
66-
stats = minimize(qp_model)
84+
stats = with_logger(NullLogger()) do
85+
minimize(qp_model)
86+
end
6787
@test true
68-
minimize(c, H, A, lcon, ucon, c0 = c0, x0 = x0, name = "ineqconqp_QP")
88+
with_logger(NullLogger()) do
89+
minimize(c, H, A, lcon, ucon, c0 = c0, x0 = x0, name = "ineqconqp_QP")
90+
end
6991
@test true
70-
minimize("RipQP", c, H, A, lcon, ucon, c0 = c0, x0 = x0, name = "ineqconqp_QP")
92+
with_logger(NullLogger()) do
93+
minimize("RipQP", c, H, A, lcon, ucon, c0 = c0, x0 = x0, name = "ineqconqp_QP")
94+
end
7195
@test true
7296
end
7397
end

test/runtests.jl

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using JSOSuite
33

44
# stdlib
5-
using LinearAlgebra, SparseArrays, Test
5+
using LinearAlgebra, Logging, SparseArrays, Test
66

77
# others
88
using JuMP, NLPModelsJuMP
@@ -11,6 +11,7 @@ using JuMP, NLPModelsJuMP
1111
using ADNLPModels, NLPModels, NLSProblems, QuadraticModels, OptimizationProblems, SparseMatricesCOO
1212
using JSOSolvers, Percival, SolverCore
1313

14+
#=
1415
@testset "Test not loaded solvers" begin
1516
nlp = ADNLPModel(x -> sum(x), ones(2))
1617
@@ -22,6 +23,7 @@ using JSOSolvers, Percival, SolverCore
2223
@test_throws ArgumentError minimize("RipQP", nlp)
2324
end
2425
26+
=#
2527
# optionals
2628
using KNITRO
2729
if KNITRO.has_knitro()
@@ -30,17 +32,25 @@ end
3032
using CaNNOLeS, DCISolver, FletcherPenaltySolver, NLPModelsIpopt, RipQP
3133
using SolverBenchmark
3234

35+
default_solver_options = (verbose = 0,)
36+
solver_options = Dict(:IpoptSolver => (print_level = 0,), :RipQP => ())
37+
get_solver_options(name) = get(solver_options, name, default_solver_options)
38+
3339
meta = OptimizationProblems.meta
3440

3541
function test_in_place_solve(nlp, solver_name)
3642
pkg_name = JSOSuite.optimizers[JSOSuite.optimizers.name_solver .== solver_name, :name_pkg][1]
3743
pkg_name = replace(pkg_name, ".jl" => "")
3844
solver = eval(Meta.parse(pkg_name * ".$solver_name"))(nlp)
39-
stats = solve!(solver, nlp)
45+
stats = with_logger(NullLogger()) do
46+
solve!(solver, nlp; get_solver_options(solver_name)...)
47+
end
4048
@test stats.status == :first_order
4149
reset!(solver, nlp)
4250
stats = GenericExecutionStats(nlp)
43-
solve!(solver, nlp, stats)
51+
with_logger(NullLogger()) do
52+
solve!(solver, nlp, stats; get_solver_options(solver_name)...)
53+
end
4454
@test stats.status == :first_order
4555
end
4656

@@ -49,14 +59,19 @@ function test_in_place_solve(model::JuMP.Model, solver_name)
4959
pkg_name = JSOSuite.optimizers[JSOSuite.optimizers.name_solver .== solver_name, :name_pkg][1]
5060
pkg_name = replace(pkg_name, ".jl" => "")
5161
solver = eval(Meta.parse(pkg_name * ".$solver_name"))(nlp)
52-
stats = solve!(solver, model)
62+
stats = with_logger(NullLogger()) do
63+
solve!(solver, model; get_solver_options(solver_name)...)
64+
end
5365
@test stats.status == :first_order
5466
reset!(solver, nlp)
5567
stats = GenericExecutionStats(nlp)
56-
solve!(solver, model, stats)
68+
with_logger(NullLogger()) do
69+
solve!(solver, model, stats; get_solver_options(solver_name)...)
70+
end
5771
@test stats.status == :first_order
5872
end
5973

74+
#=
6075
@testset "Test in-place solve!" begin
6176
nlp = OptimizationProblems.ADNLPProblems.arglina()
6277
model = OptimizationProblems.PureJuMP.arglina()
@@ -81,30 +96,46 @@ end
8196
end
8297
end
8398
end
99+
=#
84100

85101
include("qp_tests.jl")
86102

87103
@testset "Test `Float32`" begin
88104
nlp = OptimizationProblems.ADNLPProblems.genrose(type = Val(Float32))
89105
atol, rtol = eps(Float32), eps(Float32)
90-
for solver in eachrow(JSOSuite.select_optimizers(nlp))
106+
for solver in eachrow(JSOSuite.select_optimizers(nlp, verbose = 0))
91107
if solver.nonlinear_obj
92-
minimize(solver.name, nlp, verbose = 0, atol = atol, rtol = rtol)
108+
minimize(
109+
solver.name,
110+
nlp,
111+
verbose = 0,
112+
atol = atol,
113+
rtol = rtol;
114+
get_solver_options(solver_name)...,
115+
)
93116
@test true
94117
else
95118
nlp_qm = QuadraticModel(nlp, nlp.meta.x0)
96-
minimize(solver.name, nlp_qm, verbose = 0, atol = atol, rtol = rtol)
119+
minimize(
120+
solver.name,
121+
nlp_qm,
122+
verbose = 0,
123+
atol = atol,
124+
rtol = rtol;
125+
get_solver_options(solver_name)...,
126+
)
97127
@test true
98128
end
99129
end
100130
end
101131

132+
#=
102133
@testset "JSOSuite JuMP API" begin
103134
model = OptimizationProblems.PureJuMP.genrose()
104135
jum = MathOptNLPModel(model)
105-
@test JSOSuite.select_optimizers(model) == JSOSuite.select_optimizers(jum)
106-
for solver in eachrow(JSOSuite.select_optimizers(model))
107-
minimize(solver.name, model, verbose = 0)
136+
@test JSOSuite.select_optimizers(model, verbose=0) == JSOSuite.select_optimizers(jum, verbose=0)
137+
for solver in eachrow(JSOSuite.select_optimizers(model, verbose=0))
138+
minimize(solver.name, model, verbose = 0; get_solver_options(solver_name)...)
108139
@test true
109140
end
110141
end
@@ -124,27 +155,27 @@ end
124155
125156
@testset "Basic solve tests" begin
126157
f = x -> 100 * (x[2] - x[1]^2)^2 + (x[1] - 1)^2
127-
stats = minimize(f, [-1.2; 1.0], verbose = 0)
158+
stats = minimize(f, [-1.2; 1.0], verbose = 0; get_solver_options(solver_name)...)
128159
@test stats.status_reliable && (stats.status == :first_order)
129160
130-
stats = minimize("DCISolver", f, [-1.2; 1.0], verbose = 0)
161+
stats = minimize("DCISolver", f, [-1.2; 1.0], verbose = 0; get_solver_options(solver_name)...)
131162
@test stats.status_reliable && (stats.status == :first_order)
132163
133164
F = x -> [10 * (x[2] - x[1]^2); x[1] - 1]
134-
stats = minimize(F, [-1.2; 1.0], 2, verbose = 0)
165+
stats = minimize(F, [-1.2; 1.0], 2, verbose = 0; get_solver_options(solver_name)...)
135166
@test stats.status_reliable && (stats.status == :first_order)
136167
137-
stats = minimize("DCISolver", F, [-1.2; 1.0], 2, verbose = 0)
168+
stats = minimize("DCISolver", F, [-1.2; 1.0], 2, verbose = 0; get_solver_options(solver_name)...)
138169
@test stats.status_reliable && (stats.status == :first_order)
139170
end
140171
141172
@testset "Test solve OptimizationProblems: $name" for name in first(meta[meta.nvar .< 10, :name], 5)
142173
name in ["bennett5", "channel", "hs253", "hs73", "misra1c"] && continue
143174
nlp = OptimizationProblems.ADNLPProblems.eval(Meta.parse(name))()
144-
minimize(nlp, verbose = 0)
175+
minimize(nlp, verbose = 0; get_solver_options(solver_name)...)
145176
@test true
146177
model = OptimizationProblems.PureJuMP.eval(Meta.parse(name))()
147-
minimize(model, verbose = 0)
178+
minimize(model, verbose = 0; get_solver_options(solver_name)...)
148179
@test true
149180
end
150181
@@ -169,7 +200,8 @@ for solver in eachrow(JSOSuite.optimizers)
169200
rtol = 1e-5,
170201
max_time = 12.0,
171202
max_eval = 10,
172-
verbose = 0,
203+
verbose = 0;
204+
get_solver_options(solver_name)...)
173205
)
174206
@test true
175207
else
@@ -181,7 +213,8 @@ for solver in eachrow(JSOSuite.optimizers)
181213
rtol = 1e-5,
182214
max_time = 12.0,
183215
max_eval = 10,
184-
verbose = 0,
216+
verbose = 0;
217+
get_solver_options(solver_name)...)
185218
)
186219
@test true
187220
end
@@ -208,7 +241,8 @@ end
208241
max_iter = 100,
209242
max_eval = 10,
210243
callback = callback,
211-
verbose = 0,
244+
verbose = 0;
245+
get_solver_options(solver_name)...)
212246
)
213247
@test true
214248
elseif solver.specialized_nls
@@ -223,7 +257,8 @@ end
223257
max_iter = 100,
224258
max_eval = 10,
225259
callback = callback,
226-
verbose = 0,
260+
verbose = 0;
261+
get_solver_options(solver_name)...)
227262
)
228263
@test true
229264
else # RipQP
@@ -237,10 +272,12 @@ end
237272
max_iter = 100,
238273
max_eval = 10,
239274
callback = callback,
240-
verbose = 0,
275+
verbose = 0;
276+
get_solver_options(solver_name)...)
241277
)
242278
@test true
243279
end
244280
end
245281
end
246282
end
283+
=#

0 commit comments

Comments
 (0)