Skip to content

Commit f880035

Browse files
Merge pull request #1067 from SebastianM-C/cleanup
Clean up and update to OptimizationBase@v4
2 parents 7c28259 + b106f8a commit f880035

File tree

64 files changed

+860
-1043
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+860
-1043
lines changed

.github/workflows/CI.yml

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,54 @@ jobs:
6666
- uses: julia-actions/julia-buildpkg@v1
6767
- if: ${{ matrix.group == 'OptimizationQuadDIRECT' }}
6868
run: julia --project -e 'using Pkg; Pkg.Registry.add(RegistrySpec(url = "https://github.com/HolyLab/HolyLabRegistry.git")); Pkg.add("QuadDIRECT")'
69-
- uses: julia-actions/julia-runtest@v1
69+
- name: ${{ matrix.group }}
7070
env:
71-
GROUP: ${{ matrix.group }}
71+
GROUP: ${{ matrix.group }}
72+
shell: julia --color=yes --check-bounds=yes --depwarn=yes {0}
73+
run: |
74+
using Pkg
75+
const GROUP = get(ENV, "GROUP", "Core")
76+
77+
function dev_subpkg(subpkg)
78+
subpkg_path = "lib/$subpkg"
79+
Pkg.develop(PackageSpec(path = subpkg_path))
80+
end
81+
82+
if GROUP == "Core"
83+
Pkg.activate(".")
84+
else
85+
subpkg_path = "lib/${{ matrix.group }}"
86+
Pkg.activate(subpkg_path)
87+
end
88+
89+
if VERSION < v"1.11"
90+
@info "Preparing env"
91+
if GROUP == "Core"
92+
@info "Testing Core"
93+
dev_subpkg("OptimizationBase")
94+
dev_subpkg("OptimizationLBFGSB")
95+
dev_subpkg("OptimizationMOI")
96+
dev_subpkg("OptimizationOptimJL")
97+
dev_subpkg("OptimizationOptimisers")
98+
elseif GROUP == "OptimizationBase"
99+
dev_subpkg("OptimizationLBFGSB")
100+
dev_subpkg("OptimizationManopt")
101+
elseif GROUP == "OptimizationAuglag"
102+
dev_subpkg("OptimizationOptimisers")
103+
elseif GROUP == "OptimizationMultistartOptimization"
104+
dev_subpkg("OptimizationNLopt")
105+
elseif GROUP == "GPU" || GROUP == "OptimizationPolyalgorithms"
106+
# special case
107+
Pkg.develop([PackageSpec(path = "lib/OptimizationOptimJL"), PackageSpec(path = "lib/OptimizationOptimisers")])
108+
elseif GROUP == "OptimizationNLPModels"
109+
dev_subpkg("OptimizationMOI")
110+
dev_subpkg("OptimizationOptimJL")
111+
dev_subpkg("OptimizationLBFGSB")
112+
end
113+
end
114+
115+
@info "Starting tests"
116+
Pkg.test()
72117
- uses: julia-actions/julia-processcoverage@v1
73118
with:
74119
directories: src,lib/OptimizationBase/src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationGCMAES/src,lib/OptimizationIpopt/src,lib/OptimizationMadNLP/src,lib/OptimizationManopt/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src

docs/Project.toml

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ NLPModels = "a4795742-8479-5a88-8948-cc11e1c8c1a6"
1919
NLPModelsTest = "7998695d-6960-4d3a-85c4-e1bceb8cd856"
2020
NLopt = "76087f3c-5699-56af-9a33-bf431cd00edd"
2121
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
22-
OptimizationBBO = "3e6eede4-6085-4f62-9a71-46d9bc1eb92b"
2322
OptimizationBase = "bca83a33-5cc9-4baa-983d-23429ab6bcbb"
23+
OptimizationBBO = "3e6eede4-6085-4f62-9a71-46d9bc1eb92b"
2424
OptimizationCMAEvolutionStrategy = "bd407f91-200f-4536-9381-e4ba712f53f8"
2525
OptimizationEvolutionary = "cb963754-43f6-435e-8d4b-99009ff27753"
2626
OptimizationGCMAES = "6f0a0517-dbc2-4a7a-8a20-99ae7f27e911"
@@ -47,6 +47,26 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
4747
Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
4848
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
4949

50+
[sources]
51+
Optimization = {path = ".."}
52+
OptimizationBase = {path = "../lib/OptimizationBase"}
53+
OptimizationBBO = {path = "../lib/OptimizationBBO"}
54+
OptimizationCMAEvolutionStrategy = {path = "../lib/OptimizationCMAEvolutionStrategy"}
55+
OptimizationEvolutionary = {path = "../lib/OptimizationEvolutionary"}
56+
OptimizationGCMAES = {path = "../lib/OptimizationGCMAES"}
57+
OptimizationIpopt = {path = "../lib/OptimizationIpopt"}
58+
OptimizationMOI = {path = "../lib/OptimizationMOI"}
59+
OptimizationManopt = {path = "../lib/OptimizationManopt"}
60+
OptimizationMetaheuristics = {path = "../lib/OptimizationMetaheuristics"}
61+
OptimizationNLPModels = {path = "../lib/OptimizationNLPModels"}
62+
OptimizationNLopt = {path = "../lib/OptimizationNLopt"}
63+
OptimizationNOMAD = {path = "../lib/OptimizationNOMAD"}
64+
OptimizationOptimJL = {path = "../lib/OptimizationOptimJL"}
65+
OptimizationOptimisers = {path = "../lib/OptimizationOptimisers"}
66+
OptimizationPRIMA = {path = "../lib/OptimizationPRIMA"}
67+
OptimizationPolyalgorithms = {path = "../lib/OptimizationPolyalgorithms"}
68+
OptimizationSpeedMapping = {path = "../lib/OptimizationSpeedMapping"}
69+
5070
[compat]
5171
ADTypes = "1"
5272
AmplNLWriter = "1"
@@ -66,9 +86,9 @@ ModelingToolkit = "10.23"
6686
NLPModels = "0.21"
6787
NLPModelsTest = "0.10"
6888
NLopt = "0.6, 1"
69-
Optimization = "4, 5"
89+
Optimization = "5"
90+
OptimizationBase = "4"
7091
OptimizationBBO = "0.4"
71-
OptimizationBase = "2, 3"
7292
OptimizationCMAEvolutionStrategy = "0.3"
7393
OptimizationEvolutionary = "0.4"
7494
OptimizationGCMAES = "0.3"
@@ -88,7 +108,7 @@ OrdinaryDiffEq = "6"
88108
Plots = "1"
89109
Random = "1"
90110
ReverseDiff = ">= 1.9.0"
91-
SciMLBase = "2.30.0"
111+
SciMLBase = "2.122.1"
92112
SciMLSensitivity = "7"
93113
SymbolicAnalysis = "0.3"
94114
Symbolics = "6"

lib/OptimizationAuglag/Project.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@ MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
1414
OptimizationOptimisers = "42dfb2eb-d2b4-4451-abcd-913932933ac1"
1515
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1616

17+
[sources]
18+
OptimizationOptimisers = {path = "../OptimizationOptimisers"}
19+
1720
[compat]
1821
ForwardDiff = "1.0.1"
19-
OptimizationBase = "3"
22+
OptimizationBase = "4"
2023
MLUtils = "0.4.8"
2124
LinearAlgebra = "1.10"
2225
OptimizationOptimisers = "0.3.8"
2326
Test = "1.10.0"
24-
SciMLBase = "2.58"
27+
SciMLBase = "2.122.1"
2528
julia = "1.10"
2629

2730
[targets]

lib/OptimizationAuglag/src/OptimizationAuglag.jl

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,7 @@ using LinearAlgebra: norm
1616
ϵ = 1e-8
1717
end
1818

19-
@static if isdefined(SciMLBase, :supports_opt_cache_interface)
20-
SciMLBase.supports_opt_cache_interface(::AugLag) = true
21-
end
22-
@static if isdefined(OptimizationBase, :supports_opt_cache_interface)
23-
OptimizationBase.supports_opt_cache_interface(::AugLag) = true
24-
end
19+
SciMLBase.has_init(::AugLag) = true
2520
SciMLBase.allowsbounds(::AugLag) = true
2621
SciMLBase.requiresgradient(::AugLag) = true
2722
SciMLBase.allowsconstraints(::AugLag) = true
@@ -59,32 +54,7 @@ function __map_optimizer_args(cache::OptimizationBase.OptimizationCache, opt::Au
5954
return mapped_args
6055
end
6156

62-
function SciMLBase.__solve(cache::OptimizationCache{
63-
F,
64-
RC,
65-
LB,
66-
UB,
67-
LC,
68-
UC,
69-
S,
70-
O,
71-
D,
72-
P,
73-
C
74-
}) where {
75-
F,
76-
RC,
77-
LB,
78-
UB,
79-
LC,
80-
UC,
81-
S,
82-
O <:
83-
AugLag,
84-
D,
85-
P,
86-
C
87-
}
57+
function SciMLBase.__solve(cache::OptimizationCache{O}) where {O <: AugLag}
8858
maxiters = OptimizationBase._check_and_convert_maxiters(cache.solver_args.maxiters)
8959

9060
local x
@@ -121,7 +91,8 @@ function SciMLBase.__solve(cache::OptimizationCache{
12191
if cache.callback(opt_state, x...)
12292
error("Optimization halted by callback.")
12393
end
124-
return x[1] + sum(@. λ * cons_tmp[eq_inds] + ρ / 2 * (cons_tmp[eq_inds] .^ 2)) + 1 / (2 * ρ) * sum((max.(Ref(0.0), μ .+.* cons_tmp[ineq_inds]))) .^ 2)
94+
return x[1] + sum(@. λ * cons_tmp[eq_inds] + ρ / 2 * (cons_tmp[eq_inds] .^ 2)) +
95+
1 / (2 * ρ) * sum((max.(Ref(0.0), μ .+.* cons_tmp[ineq_inds]))) .^ 2)
12596
end
12697

12798
prev_eqcons = zero(λ)

lib/OptimizationBBO/Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1414
[compat]
1515
julia = "1.10"
1616
BlackBoxOptim = "0.6"
17-
OptimizationBase = "3"
18-
SciMLBase = "2.58"
17+
OptimizationBase = "4"
18+
SciMLBase = "2.122.1"
1919
Reexport = "1.2"
2020

2121
[targets]

lib/OptimizationBBO/src/OptimizationBBO.jl

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
module OptimizationBBO
22

33
using Reexport
4-
import OptimizationBase
5-
import OptimizationBase: SciMLBase
6-
import BlackBoxOptim
7-
import SciMLBase: MultiObjectiveOptimizationFunction
4+
using OptimizationBase
5+
using SciMLBase
6+
using BlackBoxOptim: BlackBoxOptim
87

98
abstract type BBO end
109

1110
SciMLBase.requiresbounds(::BBO) = true
1211
SciMLBase.allowsbounds(::BBO) = true
13-
@static if isdefined(SciMLBase, :supports_opt_cache_interface)
14-
SciMLBase.supports_opt_cache_interface(opt::BBO) = true
15-
end
16-
@static if isdefined(OptimizationBase, :supports_opt_cache_interface)
17-
OptimizationBase.supports_opt_cache_interface(opt::BBO) = true
18-
end
12+
13+
SciMLBase.has_init(opt::BBO) = true
1914

2015
for j in string.(BlackBoxOptim.SingleObjectiveMethodNames)
2116
eval(Meta.parse("Base.@kwdef struct BBO_" * j * " <: BBO method=:" * j * " end"))
@@ -36,19 +31,19 @@ function decompose_trace(opt::BlackBoxOptim.OptRunController, progress)
3631
if iszero(max_time)
3732
# we stop at either convergence or max_steps
3833
n_steps = BlackBoxOptim.num_steps(opt)
39-
Base.@logmsg(Base.LogLevel(-1), msg, progress=n_steps/maxiters,
34+
Base.@logmsg(Base.LogLevel(-1), msg, progress=n_steps / maxiters,
4035
_id=:OptimizationBBO)
4136
else
4237
# we stop at either convergence or max_time
4338
elapsed = BlackBoxOptim.elapsed_time(opt)
44-
Base.@logmsg(Base.LogLevel(-1), msg, progress=elapsed/max_time,
39+
Base.@logmsg(Base.LogLevel(-1), msg, progress=elapsed / max_time,
4540
_id=:OptimizationBBO)
4641
end
4742
end
4843
return BlackBoxOptim.best_candidate(opt)
4944
end
5045

51-
function __map_optimizer_args(prob::OptimizationBase.OptimizationCache, opt::BBO;
46+
function __map_optimizer_args(prob::OptimizationCache, opt::BBO;
5247
callback = nothing,
5348
maxiters::Union{Number, Nothing} = nothing,
5449
maxtime::Union{Number, Nothing} = nothing,
@@ -96,32 +91,7 @@ function map_objective(obj::BlackBoxOptim.IndexedTupleFitness)
9691
obj.orig
9792
end
9893

99-
function SciMLBase.__solve(cache::OptimizationBase.OptimizationCache{
100-
F,
101-
RC,
102-
LB,
103-
UB,
104-
LC,
105-
UC,
106-
S,
107-
O,
108-
D,
109-
P,
110-
C
111-
}) where {
112-
F,
113-
RC,
114-
LB,
115-
UB,
116-
LC,
117-
UC,
118-
S,
119-
O <:
120-
BBO,
121-
D,
122-
P,
123-
C
124-
}
94+
function SciMLBase.__solve(cache::OptimizationCache{O}) where {O <: BBO}
12595
function _cb(trace)
12696
if cache.callback === OptimizationBase.DEFAULT_CALLBACK
12797
cb_call = false

lib/OptimizationBase/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ ModelingToolkit = "10.23"
5555
PDMats = "0.11"
5656
Reexport = "1.2"
5757
ReverseDiff = "1.14"
58-
SciMLBase = "2.122"
58+
SciMLBase = "2.122.1"
5959
SparseConnectivityTracer = "0.6, 1"
6060
SparseMatrixColorings = "0.4"
6161
SymbolicAnalysis = "0.3"

lib/OptimizationBase/ext/OptimizationEnzymeExt.jl

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,17 @@ function OptimizationBase.instantiate_function(f::OptimizationFunction{true}, x,
199199

200200
if hv == true && f.hv === nothing
201201
function hv!(H, θ, v, p = p)
202-
x = Duplicated(θ, v)
203-
dx = Enzyme.make_zero(x)
204-
H .= Enzyme.autodiff(
205-
fmode, hv_f2_alloc, Const(rmode), Duplicated(x,dx),
206-
Const(f.f), Const(p)
207-
)[1].dval
202+
= zero(θ)
203+
Enzyme.make_zero!(H)
204+
Enzyme.autodiff(
205+
fmode,
206+
inner_grad,
207+
Const(rmode),
208+
Duplicated(θ, v),
209+
Duplicated(dθ, H),
210+
Const(f.f),
211+
Const(p)
212+
)
208213
end
209214
elseif hv == true
210215
hv! = (H, θ, v, p = p) -> f.hv(H, θ, v, p)
@@ -553,13 +558,20 @@ function OptimizationBase.instantiate_function(f::OptimizationFunction{false}, x
553558
end
554559

555560
if hv == true && f.hv === nothing
561+
H = zero(x)
556562
function hv!(θ, v, p = p)
557-
x = Duplicated(θ, v)
558-
dx = Enzyme.make_zero(x)
559-
return Enzyme.autodiff(
560-
fmode, hv_f2_alloc, DuplicatedNoNeed, Const(rmode), Duplicated(x, dx),
561-
Const(_f), Const(f.f), Const(p)
562-
)[1].dval
563+
= zero(θ)
564+
Enzyme.make_zero!(H)
565+
Enzyme.autodiff(
566+
fmode,
567+
inner_grad,
568+
Const(rmode),
569+
Duplicated(θ, v),
570+
Duplicated(dθ, H),
571+
Const(f.f),
572+
Const(p)
573+
)
574+
return H
563575
end
564576
elseif hv == true
565577
hv! = (θ, v, p = p) -> f.hv(θ, v, p)

0 commit comments

Comments
 (0)