Skip to content

Commit fc1e87c

Browse files
committed
Use extension
1 parent 29cab77 commit fc1e87c

15 files changed

+200
-175
lines changed

Project.toml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,56 @@ ADNLPModels = "54578032-b7ea-4c30-94aa-7cbd1cce6c9a"
88
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
99
JSOSolvers = "10dff2fc-5484-5881-a0e0-c90441020f8a"
1010
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
11+
KNITRO = "67920dd8-b58e-52a8-8622-53c4cffbe346"
1112
LLSModels = "39f5bc3e-5160-4bf8-ac48-504fd2534d24"
1213
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1314
LinearOperators = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125"
1415
Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
1516
NLPModels = "a4795742-8479-5a88-8948-cc11e1c8c1a6"
1617
NLPModelsJuMP = "792afdf1-32c1-5681-94e0-d7bf7a5df49e"
1718
NLPModelsModifiers = "e01155f1-5c6f-4375-a9d8-616dd036575f"
19+
PackageExtensionCompat = "65ce6f38-6b18-4e1d-a461-8949797d7930"
1820
Percival = "01435c0c-c90d-11e9-3788-63660f8fbccc"
1921
QuadraticModels = "f468eda6-eac5-11e8-05a5-ff9e497bcd19"
20-
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
2122
SolverCore = "ff4d7338-4cf1-434d-91df-b86cb86fb843"
2223
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
2324

25+
[weakdeps]
26+
CaNNOLeS = "5a1c9e79-9c58-5ec0-afc4-3298fdea2875"
27+
DCISolver = "bee2e536-65f6-11e9-3844-e5bb4c9c55c9"
28+
FletcherPenaltySolver = "e59f0261-166d-4fee-8bf3-5e50457de5db"
29+
NLPModelsIpopt = "f4238b75-b362-5c4c-b852-0801c9a21d71"
30+
NLPModelsKnitro = "bec4dd0d-7755-52d5-9a02-22f0ffc7efcb"
31+
RipQP = "1e40b3f8-35eb-4cd8-8edd-3e515bb9de08"
32+
SolverBenchmark = "581a75fa-a23a-52d0-a590-d6201de2218a"
33+
34+
[extensions]
35+
CaNNOLeSExt = ["CaNNOLeS"]
36+
DCISolverExt = ["DCISolver"]
37+
FletcherPenaltySolverExt = ["FletcherPenaltySolver"]
38+
NLPModelsIpoptExt = ["NLPModelsIpopt"]
39+
NLPModelsKnitroExt = ["NLPModelsKnitro"]
40+
RipQPExt = ["RipQP"]
41+
SolverBenchmarkExt = ["SolverBenchmark"]
42+
2443
[compat]
2544
ADNLPModels = "0.4, 0.5, 0.6, 0.7"
45+
CaNNOLeS = "0.7"
2646
DataFrames = "1"
47+
FletcherPenaltySolver = "0.2"
2748
JSOSolvers = "0.10, 0.11"
2849
JuMP = "1"
50+
KNITRO = "0.13.0"
2951
LLSModels = "0.3.6"
3052
LinearOperators = "2"
3153
NLPModels = "0.19, 0.20"
54+
NLPModelsIpopt = "0.10"
3255
NLPModelsJuMP = "0.11, 0.12"
56+
NLPModelsKnitro = "0.7"
3357
NLPModelsModifiers = "0.6.2"
3458
Percival = "0.6, 0.7"
3559
QuadraticModels = "0.9.2"
36-
Requires = "1"
60+
RipQP = "0.5, 0.6"
61+
SolverBenchmark = "0.5"
3762
SolverCore = "0.3"
3863
julia = "^1.6.0"

docs/src/benchmark.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ using NLPModelsIpopt
4343
selected_optimizers = JSOSuite.optimizers
4444
# optimizers can solve general `nlp` as some are specific to variants (NLS, ...)
4545
selected_optimizers = selected_optimizers[selected_optimizers.can_solve_nlp, :]
46-
selected_optimizers[selected_optimizers.is_available, :] # optimizers available
46+
is_available(selected_optimizers) # optimizers available
4747
```
4848

4949
For the purpose of this example, we will consider 3 optimizers.

ext/CaNNOLeSExt.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ module CaNNOLeSExt
22

33
using CaNNOLeS, JSOSuite
44

5-
JSOSuite.optimizers[JSOSuite.optimizers.name .== "CaNNOLeS", :is_available] .= 1
6-
75
function minimize(::Val{:CaNNOLeS}, nlp; kwargs...)
86
return CaNNOLeS.cannoles(nlp; linsolve = :ldlfactorizations, kwargs...)
97
end

ext/DCISolverExt.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ module DCISolverExt
22

33
using DCISolver, JSOSuite
44

5-
JSOSuite.optimizers[JSOSuite.optimizers.name .== "DCISolver", :is_available] .= 1
6-
function minimize(::Val{:DCISolver}, nlp; kwargs...)
7-
return DCISolver.dci(nlp; kwargs...)
8-
end
5+
minimize(::Val{:DCISolver}, nlp; kwargs...) = DCISolver.dci(nlp; kwargs...)
96

107
end

ext/FletcherPenaltySolverExt.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
module FletcherPenaltySolverExt
22

33
using FletcherPenaltySolver, JSOSuite
4-
JSOSuite.optimizers[JSOSuite.optimizers.name .== "FletcherPenaltySolver", :is_available] .= 1
5-
function minimize(::Val{:FletcherPenaltySolver}, nlp; kwargs...)
6-
return FletcherPenaltySolver.fps_solve(nlp; kwargs...)
7-
end
4+
5+
function minimize(::Val{:FletcherPenaltySolver}, nlp; kwargs...)
6+
return FletcherPenaltySolver.fps_solve(nlp; kwargs...)
7+
end
8+
89
end

ext/NLPModelsIpoptExt.jl

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,41 @@
11
module NLPModelsIpoptExt
22

33
using NLPModelsIpopt, JSOSuite
4-
JSOSuite.optimizers[JSOSuite.optimizers.name .== "IPOPT", :is_available] .= 1
5-
include("solvers/ipopt_solve.jl")
4+
# Selection of possible [options](https://coin-or.github.io/Ipopt/OPTIONS.html#OPTIONS_REF).
5+
function minimize(::Val{:IPOPT}, nlp; kwargs...)
6+
keywords = Dict(kwargs)
7+
if :verbose in keys(keywords)
8+
if keywords[:verbose] == 0
9+
keywords[:print_level] = keywords[:verbose]
10+
end
11+
delete!(keywords, :verbose)
12+
end
13+
if :atol in keys(keywords)
14+
@warn "Not implemented option `atol` for IPOPT."
15+
delete!(keywords, :atol)
16+
end
17+
if :rtol in keys(keywords)
18+
keywords[:tol] = keywords[:rtol]
19+
delete!(keywords, :rtol)
20+
end
21+
if :max_time in keys(keywords)
22+
max_time = keywords[:max_time]
23+
if max_time > 0
24+
keywords[:max_cpu_time] = max_time
25+
else
26+
@warn "`max_time` should be positive, ignored parameter."
27+
end
28+
delete!(keywords, :max_time)
29+
end
30+
if :max_eval in keys(keywords)
31+
@warn "Not implemented option `max_eval` for IPOPT."
32+
delete!(keywords, :max_eval)
33+
end
34+
if :callback in keys(keywords)
35+
@warn "Not implemented option `callback` for IPOPT."
36+
delete!(keywords, :callback)
37+
end
38+
return NLPModelsIpopt.ipopt(nlp; keywords...)
39+
end
40+
641
end

ext/NLPModelsKnitroExt.jl

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
11
module NLPModelsKnitroExt
22

3-
using KNITRO, NLPModelsKnitro, JSOSuite
4-
JSOSuite.optimizers[JSOSuite.optimizers.name .== "KNITRO", :is_available] .= KNITRO.has_knitro()
5-
include("solvers/knitro_solve.jl")
3+
using NLPModelsKnitro, JSOSuite
4+
5+
# See https://www.artelys.com/docs/knitro/3_referenceManual/userOptions.html for the list of options accepted.
6+
function minimize(::Val{:KNITRO}, nlp; kwargs...)
7+
keywords = Dict(kwargs)
8+
if :verbose in keys(keywords)
9+
keywords[:outlev] = keywords[:verbose]
10+
delete!(keywords, :verbose)
11+
end
12+
if :atol in keys(keywords)
13+
keywords[:opttol_abs] = keywords[:atol]
14+
keywords[:feastol_abs] = keywords[:atol]
15+
delete!(keywords, :atol)
16+
end
17+
if :rtol in keys(keywords)
18+
keywords[:opttol] = keywords[:rtol]
19+
keywords[:feastol] = keywords[:rtol]
20+
delete!(keywords, :rtol)
21+
end
22+
if :max_time in keys(keywords)
23+
keywords[:maxtime_real] = keywords[:max_time]
24+
delete!(keywords, :max_time)
25+
end
26+
if :max_eval in keys(keywords)
27+
keywords[:maxfevals] = keywords[:max_eval]
28+
delete!(keywords, :max_eval)
29+
end
30+
return NLPModelsKnitro.knitro(nlp; keywords...)
31+
end
32+
633
end

ext/RipQPExt.jl

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,68 @@
11
module RipQPExt
22

33
using RipQP, JSOSuite, LLSModels, QuadraticModels
4-
JSOSuite.optimizers[JSOSuite.optimizers.name .== "RipQP", :is_available] .= 1
5-
include("solvers/ripqp_solve.jl")
4+
5+
function minimize(
6+
::Val{:RipQP},
7+
nlp::Union{QuadraticModel{T0}, LLSModel{T0}};
8+
max_iter = 200,
9+
max_time = 1200.0,
10+
kwargs...,
11+
) where {T0}
12+
keywords = Dict(kwargs)
13+
if :verbose in keys(keywords)
14+
keywords[:display] = convert(Bool, keywords[:verbose])
15+
delete!(keywords, :verbose)
16+
end
17+
itol = if (:atol in keys(keywords)) && (:rtol in keys(keywords))
18+
ϵ_pdd = T0(keywords[:rtol])
19+
ϵ_rb = ϵ_rc = T0(keywords[:atol])
20+
delete!(keywords, :atol)
21+
delete!(keywords, :rtol)
22+
RipQP.InputTol(
23+
T0,
24+
ϵ_pdd = ϵ_pdd,
25+
ϵ_rb = ϵ_rb,
26+
ϵ_rc = ϵ_rc,
27+
max_iter = max_iter,
28+
max_time = max_time,
29+
)
30+
elseif :atol in keys(keywords)
31+
ϵ_pdd = T0(keywords[:rtol])
32+
ϵ_rb = ϵ_rc = T0(keywords[:atol])
33+
delete!(keywords, :atol)
34+
RipQP.InputTol(
35+
T0,
36+
ϵ_pdd = ϵ_pdd,
37+
ϵ_rb = ϵ_rb,
38+
ϵ_rc = ϵ_rc,
39+
max_iter = max_iter,
40+
max_time = max_time,
41+
)
42+
elseif :rtol in keys(keywords)
43+
ϵ_pdd = T0(keywords[:rtol])
44+
ϵ_rb = ϵ_rc = T0(keywords[:atol])
45+
delete!(keywords, :rtol)
46+
RipQP.InputTol(
47+
T0,
48+
ϵ_pdd = ϵ_pdd,
49+
ϵ_rb = ϵ_rb,
50+
ϵ_rc = ϵ_rc,
51+
max_iter = max_iter,
52+
max_time = max_time,
53+
)
54+
else
55+
RipQP.InputTol(T0)
56+
end
57+
if :max_eval in keys(keywords)
58+
@warn "Not implemented option `max_eval` for RipQP."
59+
delete!(keywords, :max_eval)
60+
end
61+
if :callback in keys(keywords)
62+
@warn "Not implemented option `callback` for RipQP."
63+
delete!(keywords, :callback)
64+
end
65+
return RipQP.ripqp(nlp; itol = itol, keywords...)
66+
end
67+
668
end

ext/solvers/ipopt_solve.jl

Lines changed: 0 additions & 36 deletions
This file was deleted.

ext/solvers/knitro_solve.jl

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)