Skip to content

Commit e9f9d5f

Browse files
Merge branch 'master' into GCMAES
2 parents 05155c4 + 10023fa commit e9f9d5f

File tree

5 files changed

+114
-2
lines changed

5 files changed

+114
-2
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# SpeedMapping.jl
2+
[`SpeedMapping`](https://github.com/NicolasL-S/SpeedMapping.jl) accelerates the convergence of a mapping to a fixed point by the Alternating cyclic extrapolation algorithm which can also perform multivariate optimization based on the gradient function.
3+
4+
The SpeedMapping algorithm is called by `SpeedMappingOpt()`
5+
6+
## Global Optimizer
7+
### Without Constraint Equations
8+
9+
The method in [`SpeedMapping`](https://github.com/NicolasL-S/SpeedMapping.jl) is performing optimization on problems without
10+
constraint equations. Lower and upper constraints set by `lb` and `ub` in the `OptimizationProblem` are optional.
11+
12+
If no AD backend is defined via `OptimizationFunction` the gradient is calculated via `SpeedMapping`'s ForwardDiff AD backend.
13+
14+
The Rosenbrock function can be optimized using the `SpeedMappingOpt()` with and without bound as follows:
15+
16+
```julia
17+
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
18+
x0 = zeros(2)
19+
p = [1.0, 100.0]
20+
f = OptimizationFunction(rosenbrock, GalacticOptim.AutoForwardDiff())
21+
prob = OptimizationProblem(f, x0, _p)
22+
sol = solve(prob,SpeedMappingOpt())
23+
24+
prob = OptimizationProblem(f, x0, _p;lb=[0.0,0.0], ub=[1.0,1.0])
25+
sol = solve(prob,SpeedMappingOpt())
26+
```

src/GalacticOptim.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ function __init__()
4444
end
4545
end
4646
@require Metaheuristics="bcdb8e00-2c21-11e9-3065-2b553b22f898" include("solve/metaheuristics.jl")
47+
@require SpeedMapping="f1835b91-879b-4a3f-a438-e4baacf14412" include("solve/speedmapping.jl")
4748

4849
# AD backends
4950
@require FiniteDiff="6a86dc24-6348-571c-b903-95158fe2bd41" include("function/finitediff.jl")

src/solve/speedmapping.jl

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
export SpeedMappingOpt
2+
3+
struct SpeedMappingOpt end
4+
5+
function __map_optimizer_args(prob::OptimizationProblem, opt::SpeedMappingOpt;
6+
cb=nothing,
7+
maxiters::Union{Number, Nothing}=nothing,
8+
maxtime::Union{Number, Nothing}=nothing,
9+
abstol::Union{Number, Nothing}=nothing,
10+
reltol::Union{Number, Nothing}=nothing,
11+
kwargs...)
12+
13+
# add optimiser options from kwargs
14+
mapped_args = (; kwargs...)
15+
16+
if !(isnothing(maxiters))
17+
@info "maxiters defines maximum gradient calls for $(opt)"
18+
mapped_args = (; mapped_args..., maps_limit = maxiters)
19+
end
20+
21+
if !(isnothing(maxtime))
22+
mapped_args = (; mapped_args..., time_limit = maxtime)
23+
end
24+
25+
if !isnothing(abstol)
26+
@warn "common abstol is currently not used by $(opt)"
27+
end
28+
29+
if !isnothing(reltol)
30+
@warn "common reltol is currently not used by $(opt)"
31+
end
32+
33+
return mapped_args
34+
end
35+
36+
37+
function __solve(prob::OptimizationProblem, opt::SpeedMappingOpt;
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,
43+
kwargs...)
44+
local x
45+
46+
maxiters = _check_and_convert_maxiters(maxiters)
47+
maxtime = _check_and_convert_maxtime(maxtime)
48+
49+
f = instantiate_function(prob.f,prob.u0,prob.f.adtype,prob.p)
50+
51+
_loss = function(θ)
52+
x = f.f(θ, prob.p)
53+
return first(x)
54+
end
55+
56+
if isnothing(f.grad)
57+
@info "SpeedMapping's ForwardDiff AD backend is used to calculate the gradient information."
58+
end
59+
60+
opt_args = _map_optimizer_args(prob,opt, maxiters=maxiters, maxtime=maxtime, abstol=abstol, reltol=reltol; kwargs...)
61+
62+
t0 = time()
63+
opt_res = SpeedMapping.speedmapping(prob.u0; f = _loss, g! =f.grad, lower=prob.lb, upper=prob.ub, opt_args...)
64+
t1 = time()
65+
opt_ret = Symbol(opt_res.converged)
66+
67+
SciMLBase.build_solution(prob, opt, opt_res.minimizer, _loss(opt_res.minimizer); original=opt_res, retcode=opt_ret)
68+
end

test/Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
3131
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
3232
ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
3333
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
34+
SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412"
3435
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
3536
Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
3637
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
@@ -65,6 +66,7 @@ Optim = ">= 1.4.1"
6566
OrdinaryDiffEq = ">= 5"
6667
ReverseDiff = ">= 1.9.0"
6768
SafeTestsets = ">= 0.0.1"
69+
SpeedMapping = ">= 0.3.0"
6870
Tracker = ">= 0.2"
6971
Zygote = ">= 0.5"
7072
julia = "1.5"

test/rosenbrock.jl

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ end
173173
# sol = solve(prob, QuadDirect(); splits = ([-0.5, 0.0, 0.5],[-0.5, 0.0, 0.5]))
174174
# @test 10*sol.minimum < l1
175175

176-
@testset "Evolutionary, BlackBoxOptim, Metaheuristics, Nonconvex, GCMAES" begin
176+
@testset "Evolutionary, BlackBoxOptim, Metaheuristics, Nonconvex, GCMAES, SpeedMapping" begin
177177
optprob = OptimizationFunction(rosenbrock, GalacticOptim.AutoZygote())
178178
using Evolutionary
179179
prob = GalacticOptim.OptimizationProblem(optprob, x0, _p)
@@ -426,7 +426,7 @@ end
426426

427427
sol = solve(prob, BayesOptAlg(NLoptAlg(:LN_NELDERMEAD)), sub_options=(;maxeval=100))
428428
@test 10*sol.minimum < l1
429-
429+
430430
using GCMAES
431431
f_ad = OptimizationFunction(rosenbrock, GalacticOptim.AutoForwardDiff())
432432
f_noad = OptimizationFunction(rosenbrock)
@@ -438,4 +438,19 @@ end
438438
prob = GalacticOptim.OptimizationProblem(f_noad, x0, _p, lb=[-1.0, -1.0], ub=[1.0, 1.0])
439439
sol = solve(prob, GCMAESOpt(), maxiters=1000)
440440
@test 10*sol.minimum < l1
441+
442+
using SpeedMapping
443+
f = OptimizationFunction(rosenbrock, GalacticOptim.AutoForwardDiff())
444+
prob = OptimizationProblem(f, x0, _p)
445+
sol = solve(prob,SpeedMappingOpt())
446+
447+
prob = OptimizationProblem(f, x0, _p;lb=[0.0,0.0], ub=[1.0,1.0])
448+
sol = solve(prob,SpeedMappingOpt())
449+
450+
f = OptimizationFunction(rosenbrock)
451+
prob = OptimizationProblem(f, x0, _p)
452+
sol = solve(prob,SpeedMappingOpt())
453+
454+
prob = OptimizationProblem(f, x0, _p;lb=[0.0,0.0], ub=[1.0,1.0])
455+
sol = solve(prob,SpeedMappingOpt())
441456
end

0 commit comments

Comments
 (0)