Skip to content

Commit 2d51c59

Browse files
Add GalacticMultistartOptimization
1 parent 1c15380 commit 2d51c59

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name = "GalacticMultistartOptimization"
2+
uuid = "969b6d83-0cb9-4e98-85e3-a6a04e06aec6"
3+
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4+
version = "0.1.0"
5+
6+
[deps]
7+
GalacticOptim = "a75be94c-b780-496d-a8a9-0878b188d577"
8+
MultistartOptimization = "3933049c-43be-478e-a8bb-6e0f7fd53575"
9+
10+
[compat]
11+
julia = "1"
12+
13+
[extras]
14+
NLopt = "76087f3c-5699-56af-9a33-bf431cd00edd"
15+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
16+
17+
[targets]
18+
test = ["Test"]
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module GalacticMultistartOptimization
2+
3+
using MultistartOptimization, GalacticOptim, GalacticOptim.SciMLBase
4+
5+
function SciMLBase.__solve(prob::OptimizationProblem, multiopt::MultistartOptimization.TikTak, opt;
6+
use_threads=true,
7+
kwargs...)
8+
local x, _loss
9+
10+
_loss = function (θ)
11+
x = prob.f(θ, prob.p)
12+
return first(x)
13+
end
14+
15+
opt_setup = MultistartOptimization.MinimizationProblem(_loss, prob.lb, prob.ub)
16+
17+
_local_optimiser = function (pb, θ0, prob)
18+
prob_tmp = remake(prob, u0=θ0)
19+
res = solve(prob_tmp, opt;
20+
kwargs...)
21+
return (value=res.minimum, location=res.minimizer, ret=res.retcode)
22+
end
23+
24+
local_optimiser(pb, θ0) = _local_optimiser(pb, θ0, prob)
25+
26+
t0 = time()
27+
opt_res = MultistartOptimization.multistart_minimization(multiopt, local_optimiser, opt_setup; use_threads=use_threads)
28+
t1 = time()
29+
opt_ret = hasproperty(opt_res, :ret) ? opt_res.ret : nothing
30+
31+
SciMLBase.build_solution(prob, (multiopt, opt), opt_res.location, opt_res.value; (isnothing(opt_ret) ? (; original=opt_res) : (; original=opt_res, retcode=opt_ret))...)
32+
end
33+
34+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using GalacticMultistartOptimization, GalacticOptim, MultistartOptimization, NLopt, ForwardDiff
2+
using Test
3+
4+
@testset "GalacticMultistartOptimization.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 = GalacticOptim.OptimizationProblem(f, x0, _p, lb=[-1.0, -1.0], ub=[1.5, 1.5])
11+
sol = solve(prob, MultistartOptimization.TikTak(100), NLopt.LD_LBFGS())
12+
@test 10 * sol.minimum < l1
13+
end

0 commit comments

Comments
 (0)