Skip to content

Commit b4b1a07

Browse files
Merge pull request #899 from SebastianM-C/smc/cleanup
Cleanup BBO and MOI
2 parents 9fc7f3a + d357411 commit b4b1a07

File tree

7 files changed

+86
-23
lines changed

7 files changed

+86
-23
lines changed

lib/OptimizationBBO/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "OptimizationBBO"
22
uuid = "3e6eede4-6085-4f62-9a71-46d9bc1eb92b"
33
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4-
version = "0.4.0"
4+
version = "0.4.1"
55

66
[deps]
77
BlackBoxOptim = "a134a8b2-14d6-55f6-9291-3336d3ab0209"

lib/OptimizationBBO/src/OptimizationBBO.jl

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ function __map_optimizer_args(prob::Optimization.OptimizationCache, opt::BBO;
8383
return mapped_args
8484
end
8585

86+
# single objective
87+
map_objective(obj) = obj
88+
# multiobjective
89+
function map_objective(obj::BlackBoxOptim.IndexedTupleFitness)
90+
obj.orig
91+
end
92+
8693
function SciMLBase.__solve(cache::Optimization.OptimizationCache{
8794
F,
8895
RC,
@@ -109,20 +116,19 @@ function SciMLBase.__solve(cache::Optimization.OptimizationCache{
109116
P,
110117
C
111118
}
112-
local x, cur, state
113-
114119
function _cb(trace)
115120
if cache.callback === Optimization.DEFAULT_CALLBACK
116121
cb_call = false
117122
else
118123
n_steps = BlackBoxOptim.num_steps(trace)
119124
curr_u = decompose_trace(trace, cache.progress)
125+
objective = map_objective(BlackBoxOptim.best_fitness(trace))
120126
opt_state = Optimization.OptimizationState(;
121127
iter = n_steps,
122128
u = curr_u,
123-
objective = x[1],
129+
objective,
124130
original = trace)
125-
cb_call = cache.callback(opt_state, x...)
131+
cb_call = cache.callback(opt_state, objective)
126132
end
127133

128134
if !(cb_call isa Bool)
@@ -139,13 +145,7 @@ function SciMLBase.__solve(cache::Optimization.OptimizationCache{
139145
maxtime = Optimization._check_and_convert_maxtime(cache.solver_args.maxtime)
140146

141147
_loss = function (θ)
142-
if isa(cache.f, MultiObjectiveOptimizationFunction)
143-
x = (cache.f(θ, cache.p),)
144-
return x[1]
145-
else
146-
x = cache.f(θ, cache.p)
147-
return first(x)
148-
end
148+
cache.f(θ, cache.p)
149149
end
150150

151151
opt_args = __map_optimizer_args(cache, cache.opt;
@@ -157,8 +157,6 @@ function SciMLBase.__solve(cache::Optimization.OptimizationCache{
157157

158158
opt_setup = BlackBoxOptim.bbsetup(_loss; opt_args...)
159159

160-
t0 = time()
161-
162160
if isnothing(cache.u0)
163161
opt_res = BlackBoxOptim.bboptimize(opt_setup)
164162
else
@@ -170,13 +168,11 @@ function SciMLBase.__solve(cache::Optimization.OptimizationCache{
170168
Base.@logmsg(Base.LogLevel(-1), "", progress=1, _id=:OptimizationBBO)
171169
end
172170

173-
t1 = time()
174-
175171
# Use the improved convert function
176172
opt_ret = Optimization.deduce_retcode(opt_res.stop_reason)
177173
stats = Optimization.OptimizationStats(;
178174
iterations = opt_res.iterations,
179-
time = t1 - t0,
175+
time = opt_res.elapsed_time,
180176
fevals = opt_res.f_calls)
181177
SciMLBase.build_solution(cache, cache.opt,
182178
BlackBoxOptim.best_candidate(opt_res),

lib/OptimizationBBO/test/runtests.jl

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,20 @@ using Test
2626
@test 10 * sol.objective < l1
2727

2828
fitness_progress_history = []
29+
fitness_progress_history_orig = []
30+
loss_history = []
2931
function cb(state, fitness)
30-
push!(fitness_progress_history, [state.u, fitness])
32+
push!(fitness_progress_history, state.objective)
33+
push!(fitness_progress_history_orig, BlackBoxOptim.best_fitness(state.original))
34+
push!(loss_history, fitness)
3135
return false
3236
end
3337
sol = solve(prob, BBO_adaptive_de_rand_1_bin_radiuslimited(), callback = cb)
3438
# println(fitness_progress_history)
3539
@test !isempty(fitness_progress_history)
40+
fp1 = fitness_progress_history[1]
41+
fp2 = fitness_progress_history_orig[1]
42+
@test fp2 == fp1 == loss_history[1]
3643

3744
@test_logs begin
3845
(Base.LogLevel(-1), "loss: 0.0")
@@ -77,6 +84,39 @@ using Test
7784
@test sol_1.objective[2]1.7763568e-15 atol=1e-3
7885
end
7986

87+
@testset "Sphere and Rastrigin Functions with callback" begin
88+
function multi_obj_func_1(x, p)
89+
f1 = sum(x .^ 2) # Sphere function
90+
f2 = sum(x .^ 2 .- 10 .* cos.(2π .* x) .+ 10) # Rastrigin function
91+
return (f1, f2)
92+
end
93+
94+
fitness_progress_history = []
95+
fitness_progress_history_orig = []
96+
function cb(state, fitness)
97+
push!(fitness_progress_history, state.objective)
98+
push!(fitness_progress_history_orig,
99+
BlackBoxOptim.best_fitness(state.original))
100+
return false
101+
end
102+
103+
mof_1 = MultiObjectiveOptimizationFunction(multi_obj_func_1)
104+
prob_1 = Optimization.OptimizationProblem(mof_1, u0; lb = lb, ub = ub)
105+
sol_1 = solve(prob_1, opt, NumDimensions = 2,
106+
FitnessScheme = ParetoFitnessScheme{2}(is_minimizing = true),
107+
callback = cb)
108+
109+
fp1 = fitness_progress_history[1]
110+
fp2 = fitness_progress_history_orig[1]
111+
@test fp2.orig == fp1
112+
@test length(fp1) == 2
113+
114+
@test sol_1 nothing
115+
println("Solution for Sphere and Rastrigin: ", sol_1)
116+
@test sol_1.objective[1]6.9905986e-18 atol=1e-3
117+
@test sol_1.objective[2]1.7763568e-15 atol=1e-3
118+
end
119+
80120
# Test 2: Rosenbrock and Ackley Functions
81121
@testset "Rosenbrock and Ackley Functions" begin
82122
function multi_obj_func_2(x, p)

lib/OptimizationMOI/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "OptimizationMOI"
22
uuid = "fd9f6733-72f4-499f-8506-86b2bdd0dea1"
33
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4-
version = "0.5.2"
4+
version = "0.5.3"
55

66
[deps]
77
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

lib/OptimizationMOI/src/nlp.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,19 @@ function SciMLBase.__solve(cache::MOIOptimizationNLPCache)
559559
minimum = NaN
560560
opt_ret = SciMLBase.ReturnCode.Default
561561
end
562-
stats = Optimization.OptimizationStats()
562+
563+
# check if the solver supports BarrierIterations
564+
iterations = try
565+
MOI.get(opt_setup, MOI.BarrierIterations())
566+
catch e
567+
if !(e isa MOI.GetAttributeNotAllowed)
568+
rethrow(e)
569+
end
570+
0
571+
end
572+
573+
stats = Optimization.OptimizationStats(; time = MOI.get(opt_setup, MOI.SolveTimeSec()),
574+
iterations)
563575
return SciMLBase.build_solution(cache,
564576
cache.opt,
565577
minimizer,

lib/OptimizationMOI/test/runtests.jl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ end
7777
# cache interface
7878
cache = init(prob, Ipopt.Optimizer())
7979
sol = solve!(cache)
80-
@test 10 * sol.minimum < l1
80+
@test 10 * sol.objective < l1
8181

8282
optprob = OptimizationFunction(rosenbrock, Optimization.AutoZygote())
8383
prob = OptimizationProblem(optprob, x0, _p; sense = Optimization.MinSense)
@@ -88,16 +88,30 @@ end
8888
sol = solve(prob, opt) #test reuse of optimizer
8989
@test 10 * sol.objective < l1
9090

91+
# test stats
92+
@test sol.stats.time > 0
93+
@test sol.stats.iterations > 0
94+
9195
sol = solve(prob,
9296
OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
9397
"max_cpu_time" => 60.0))
9498
@test 10 * sol.objective < l1
9599

100+
# test stats with AbstractBridgeOptimizer
101+
sol = solve(prob,
102+
OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
103+
"max_cpu_time" => 60.0, "max_iter" => 5))
104+
105+
@test 60 > sol.stats.time > 0
106+
@test sol.stats.iterations == 5
107+
96108
sol = solve(prob,
97109
OptimizationMOI.MOI.OptimizerWithAttributes(NLopt.Optimizer,
98110
"algorithm" => :LN_BOBYQA))
99111
@test 10 * sol.objective < l1
100112

113+
@test sol.stats.time > 0
114+
101115
sol = solve(prob,
102116
OptimizationMOI.MOI.OptimizerWithAttributes(NLopt.Optimizer,
103117
"algorithm" => :LD_LBFGS))
@@ -161,6 +175,7 @@ end
161175
res = solve(optprob, minlp_solver)
162176
@test res.u == [0.0, 0.0, 1.0, 0.0]
163177
@test res.objective == -4.0
178+
@test res.stats.time > 0
164179
end
165180

166181
@testset "Integer Domain" begin

lib/OptimizationNOMAD/Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "OptimizationNOMAD"
22
uuid = "2cab0595-8222-4775-b714-9828e6a9e01b"
33
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4-
version = "0.3.0"
4+
version = "0.3.1"
55

66
[deps]
77
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
@@ -10,7 +10,7 @@ Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
1010

1111
[compat]
1212
julia = "1"
13-
NOMAD = "2"
13+
NOMAD = "2.4.1"
1414
Optimization = "4"
1515
Reexport = "1.2"
1616

0 commit comments

Comments
 (0)