Skip to content

Commit cae7520

Browse files
Merge pull request #220 from SciML/subpckgs
Create sub packages for each optimiser
2 parents 1748c13 + 5c234ad commit cae7520

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

+1677
-875
lines changed

.github/workflows/CI.yml

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,26 @@ on:
99
jobs:
1010
test:
1111
runs-on: ubuntu-latest
12+
continue-on-error: ${{ matrix.group == 'Downstream' }}
1213
strategy:
14+
fail-fast: false
1315
matrix:
1416
group:
15-
- All
17+
- Core
18+
- GalacticBBO
19+
- GalacticCMAEvolutionStrategy
20+
- GalacticEvolutionary
21+
- GalacticFlux
22+
- GalacticGCMAES
23+
- GalacticMetaheuristics
24+
- GalacticMOI
25+
- GalacticMultistartOptimization
26+
- GalacticNLopt
27+
- GalacticNOMAD
28+
- GalacticNonconvex
29+
- GalacticOptimJL
30+
- GalacticQuadDIRECT
31+
- GalacticSpeedMapping
1632
version:
1733
- '1'
1834
- '1.6'
@@ -38,4 +54,4 @@ jobs:
3854
- uses: julia-actions/julia-processcoverage@v1
3955
- uses: codecov/codecov-action@v1
4056
with:
41-
file: lcov.info
57+
file: lcov.info

lib/GalacticBBO/Project.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name = "GalacticBBO"
2+
uuid = "80c49c3a-6557-47d9-8f5b-13d0a2920315"
3+
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4+
version = "0.1.0"
5+
6+
[deps]
7+
BlackBoxOptim = "a134a8b2-14d6-55f6-9291-3336d3ab0209"
8+
GalacticOptim = "a75be94c-b780-496d-a8a9-0878b188d577"
9+
10+
[compat]
11+
julia = "1"
12+
13+
[extras]
14+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
15+
16+
[targets]
17+
test = ["Test"]

lib/GalacticBBO/src/GalacticBBO.jl

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
module GalacticBBO
2+
3+
using BlackBoxOptim, GalacticOptim, GalacticOptim.SciMLBase
4+
5+
abstract type BBO end
6+
7+
for j = string.(BlackBoxOptim.SingleObjectiveMethodNames)
8+
eval(Meta.parse("Base.@kwdef struct BBO_" * j * " <: BBO method=:" * j * " end"))
9+
eval(Meta.parse("export BBO_" * j))
10+
end
11+
12+
decompose_trace(opt::BlackBoxOptim.OptRunController) = BlackBoxOptim.best_candidate(opt)
13+
14+
function __map_optimizer_args(prob::SciMLBase.OptimizationProblem, opt::BBO;
15+
cb=nothing,
16+
maxiters::Union{Number,Nothing}=nothing,
17+
maxtime::Union{Number,Nothing}=nothing,
18+
abstol::Union{Number,Nothing}=nothing,
19+
reltol::Union{Number,Nothing}=nothing,
20+
kwargs...)
21+
22+
if !isnothing(reltol)
23+
@warn "common reltol is currently not used by $(opt)"
24+
end
25+
26+
mapped_args = (; Method=opt.method,
27+
SearchRange=[(prob.lb[i], prob.ub[i]) for i in 1:length(prob.lb)])
28+
29+
if !isnothing(cb)
30+
mapped_args = (; mapped_args..., CallbackFunction=cb, CallbackInterval=0.0)
31+
end
32+
33+
mapped_args = (; mapped_args..., kwargs...)
34+
35+
if !isnothing(maxiters)
36+
mapped_args = (; mapped_args..., MaxSteps=maxiters)
37+
end
38+
39+
if !isnothing(maxtime)
40+
mapped_args = (; mapped_args..., MaxTime=maxtime)
41+
end
42+
43+
if !isnothing(abstol)
44+
mapped_args = (; mapped_args..., MinDeltaFitnessTolerance=abstol)
45+
end
46+
47+
return mapped_args
48+
end
49+
50+
function SciMLBase.__solve(prob::SciMLBase.OptimizationProblem, opt::BBO, data=GalacticOptim.DEFAULT_DATA;
51+
cb=(args...) -> (false),
52+
maxiters::Union{Number,Nothing}=nothing,
53+
maxtime::Union{Number,Nothing}=nothing,
54+
abstol::Union{Number,Nothing}=nothing,
55+
reltol::Union{Number,Nothing}=nothing,
56+
progress=false, kwargs...)
57+
58+
local x, cur, state
59+
60+
if data != GalacticOptim.DEFAULT_DATA
61+
maxiters = length(data)
62+
end
63+
64+
cur, state = iterate(data)
65+
66+
function _cb(trace)
67+
cb_call = cb(decompose_trace(trace), x...)
68+
if !(typeof(cb_call) <: Bool)
69+
error("The callback should return a boolean `halt` for whether to stop the optimization process.")
70+
end
71+
if cb_call == true
72+
BlackBoxOptim.shutdown_optimizer!(trace) #doesn't work
73+
end
74+
cur, state = iterate(data, state)
75+
cb_call
76+
end
77+
78+
maxiters = GalacticOptim._check_and_convert_maxiters(maxiters)
79+
maxtime = GalacticOptim._check_and_convert_maxtime(maxtime)
80+
81+
82+
_loss = function (θ)
83+
x = prob.f(θ, prob.p, cur...)
84+
return first(x)
85+
end
86+
87+
opt_args = __map_optimizer_args(prob, opt, cb=_cb, maxiters=maxiters, maxtime=maxtime, abstol=abstol, reltol=reltol; kwargs...)
88+
89+
opt_setup = BlackBoxOptim.bbsetup(_loss; opt_args...)
90+
91+
t0 = time()
92+
opt_res = BlackBoxOptim.bboptimize(opt_setup)
93+
t1 = time()
94+
95+
opt_ret = Symbol(opt_res.stop_reason)
96+
97+
SciMLBase.build_solution(prob, opt, BlackBoxOptim.best_candidate(opt_res),
98+
BlackBoxOptim.best_fitness(opt_res); original=opt_res, retcode=opt_ret)
99+
end
100+
101+
end

lib/GalacticBBO/test/runtests.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using GalacticBBO, GalacticOptim, Zygote
2+
using Test
3+
4+
@testset "GalacticBBO.jl" begin
5+
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
6+
x0 = zeros(2)
7+
_p = [1.0, 100.0]
8+
l1 = rosenbrock(x0, _p)
9+
10+
optprob = OptimizationFunction(rosenbrock, GalacticOptim.AutoZygote())
11+
prob = GalacticOptim.OptimizationProblem(optprob, x0, _p, lb=[-1.0, -1.0], ub=[0.8, 0.8])
12+
sol = solve(prob, BBO_adaptive_de_rand_1_bin_radiuslimited())
13+
@test 10 * sol.minimum < l1
14+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name = "GalacticCMAEvolutionStrategy"
2+
uuid = "12fbe61e-72e2-4b68-be42-232f99b30434"
3+
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4+
version = "0.1.0"
5+
6+
[deps]
7+
CMAEvolutionStrategy = "8d3b24bd-414e-49e0-94fb-163cc3a3e411"
8+
GalacticOptim = "a75be94c-b780-496d-a8a9-0878b188d577"
9+
10+
[compat]
11+
julia = "1"
12+
13+
[extras]
14+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
15+
16+
[targets]
17+
test = ["Test"]
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
1+
module GalacticCMAEvolutionStrategy
2+
3+
using CMAEvolutionStrategy, GalacticOptim, GalacticOptim.SciMLBase
4+
15
export CMAEvolutionStrategyOpt
6+
27
struct CMAEvolutionStrategyOpt end
38

49
function __map_optimizer_args(prob::OptimizationProblem, opt::CMAEvolutionStrategyOpt;
510
cb=nothing,
6-
maxiters::Union{Number, Nothing}=nothing,
7-
maxtime::Union{Number, Nothing}=nothing,
8-
abstol::Union{Number, Nothing}=nothing,
9-
reltol::Union{Number, Nothing}=nothing,
11+
maxiters::Union{Number,Nothing}=nothing,
12+
maxtime::Union{Number,Nothing}=nothing,
13+
abstol::Union{Number,Nothing}=nothing,
14+
reltol::Union{Number,Nothing}=nothing,
1015
kwargs...)
1116

1217
if !isnothing(reltol)
1318
@warn "common reltol is currently not used by $(opt)"
1419
end
1520

16-
mapped_args = (;lower = prob.lb,
17-
upper = prob.ub,
18-
kwargs...)
19-
21+
mapped_args = (; lower=prob.lb,
22+
upper=prob.ub,
23+
kwargs...)
24+
2025
if !isnothing(maxiters)
2126
mapped_args = (; mapped_args..., maxiter=maxiters)
2227
end
@@ -28,44 +33,44 @@ function __map_optimizer_args(prob::OptimizationProblem, opt::CMAEvolutionStrate
2833
if !isnothing(abstol)
2934
mapped_args = (; mapped_args..., ftol=abstol)
3035
end
31-
36+
3237
return mapped_args
3338
end
3439

3540

36-
function __solve(prob::OptimizationProblem, opt::CMAEvolutionStrategyOpt, data = DEFAULT_DATA;
37-
cb = (args...) -> (false),
38-
maxiters::Union{Number, Nothing} = nothing,
39-
maxtime::Union{Number, Nothing} = nothing,
40-
abstol::Union{Number, Nothing}=nothing,
41-
reltol::Union{Number, Nothing}=nothing,
42-
progress = false, kwargs...)
41+
function SciMLBase.__solve(prob::OptimizationProblem, opt::CMAEvolutionStrategyOpt, data=GalacticOptim.DEFAULT_DATA;
42+
cb=(args...) -> (false),
43+
maxiters::Union{Number,Nothing}=nothing,
44+
maxtime::Union{Number,Nothing}=nothing,
45+
abstol::Union{Number,Nothing}=nothing,
46+
reltol::Union{Number,Nothing}=nothing,
47+
kwargs...)
4348
local x, cur, state
4449

45-
if data != DEFAULT_DATA
50+
if data != GalacticOptim.DEFAULT_DATA
4651
maxiters = length(data)
4752
end
4853

4954
cur, state = iterate(data)
5055

5156
function _cb(trace)
52-
cb_call = cb(decompose_trace(trace).metadata["x"],trace.value...)
57+
cb_call = cb(decompose_trace(trace).metadata["x"], trace.value...)
5358
if !(typeof(cb_call) <: Bool)
5459
error("The callback should return a boolean `halt` for whether to stop the optimization process.")
5560
end
5661
cur, state = iterate(data, state)
5762
cb_call
5863
end
5964

60-
maxiters = _check_and_convert_maxiters(maxiters)
61-
maxtime = _check_and_convert_maxtime(maxtime)
65+
maxiters = GalacticOptim._check_and_convert_maxiters(maxiters)
66+
maxtime = GalacticOptim._check_and_convert_maxtime(maxtime)
6267

63-
_loss = function(θ)
68+
_loss = function (θ)
6469
x = prob.f(θ, prob.p, cur...)
6570
return first(x)
6671
end
6772

68-
opt_args = _map_optimizer_args(prob, opt, cb=_cb, maxiters=maxiters, maxtime=maxtime,abstol=abstol, reltol=reltol; kwargs...)
73+
opt_args = __map_optimizer_args(prob, opt, cb=_cb, maxiters=maxiters, maxtime=maxtime, abstol=abstol, reltol=reltol; kwargs...)
6974

7075
t0 = time()
7176
opt_res = CMAEvolutionStrategy.minimize(_loss, prob.u0, 0.1; opt_args...)
@@ -75,3 +80,5 @@ function __solve(prob::OptimizationProblem, opt::CMAEvolutionStrategyOpt, data =
7580

7681
SciMLBase.build_solution(prob, opt, opt_res.logger.xbest[end], opt_res.logger.fbest[end]; original=opt_res, retcode=opt_ret)
7782
end
83+
84+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using GalacticCMAEvolutionStrategy, GalacticOptim, ForwardDiff
2+
using Test
3+
4+
@testset "GalacticCMAEvolutionStrategy.jl" begin
5+
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
6+
x0 = zeros(2)
7+
_p = [1.0, 100.0]
8+
l1 = rosenbrock(x0, _p)
9+
f = OptimizationFunction(rosenbrock, GalacticOptim.AutoForwardDiff())
10+
prob = OptimizationProblem(f, x0, _p, lb=[-1.0, -1.0], ub=[0.8, 0.8])
11+
sol = solve(prob, CMAEvolutionStrategyOpt())
12+
@test 10 * sol.minimum < l1
13+
end

lib/GalacticEvolutionary/Project.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name = "GalacticEvolutionary"
2+
uuid = "e82bed00-89d9-4bf2-a298-ae594e22fac7"
3+
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4+
version = "0.1.0"
5+
6+
[deps]
7+
Evolutionary = "86b6b26d-c046-49b6-aa0b-5f0f74682bd6"
8+
GalacticOptim = "a75be94c-b780-496d-a8a9-0878b188d577"
9+
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
10+
11+
[compat]
12+
julia = "1"
13+
14+
[extras]
15+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
16+
17+
[targets]
18+
test = ["Test"]

0 commit comments

Comments
 (0)