Skip to content

Commit cf18e88

Browse files
Merge branch 'master' into add-reinit-documentation
2 parents a9f74e5 + 21f1bea commit cf18e88

File tree

20 files changed

+306
-25
lines changed

20 files changed

+306
-25
lines changed

docs/src/optimization_packages/optimization.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,18 @@ ps_ca = ComponentArray(ps)
7676
smodel = StatefulLuxLayer{true}(model, nothing, st)
7777
7878
function callback(state, l)
79-
state.iter % 25 == 1 && @show "Iteration: %5d, Loss: %.6e\n" state.iter l
79+
state.iter % 25 == 1 && @show "Iteration: $(state.iter), Loss: $l"
8080
return l < 1e-1 ## Terminate if loss is small
8181
end
8282
8383
function loss(ps, data)
84-
ypred = [smodel([data[1][i]], ps)[1] for i in eachindex(data[1])]
85-
return sum(abs2, ypred .- data[2])
84+
x_batch, y_batch = data
85+
ypred = [smodel([x_batch[i]], ps)[1] for i in eachindex(x_batch)]
86+
return sum(abs2, ypred .- y_batch)
8687
end
8788
8889
optf = OptimizationFunction(loss, AutoZygote())
8990
prob = OptimizationProblem(optf, ps_ca, data)
9091
91-
res = Optimization.solve(prob, Optimization.Sophia(), callback = callback)
92+
res = Optimization.solve(prob, Optimization.Sophia(), callback = callback, epochs = 100)
9293
```

lib/OptimizationBBO/src/OptimizationBBO.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ function SciMLBase.__solve(cache::Optimization.OptimizationCache{
126126
opt_state = Optimization.OptimizationState(;
127127
iter = n_steps,
128128
u = curr_u,
129+
p = cache.p,
129130
objective,
130131
original = trace)
131132
cb_call = cache.callback(opt_state, objective)

lib/OptimizationCMAEvolutionStrategy/src/OptimizationCMAEvolutionStrategy.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ function __map_optimizer_args(prob::OptimizationCache, opt::CMAEvolutionStrategy
2020
maxiters::Union{Number, Nothing} = nothing,
2121
maxtime::Union{Number, Nothing} = nothing,
2222
abstol::Union{Number, Nothing} = nothing,
23-
reltol::Union{Number, Nothing} = nothing)
23+
reltol::Union{Number, Nothing} = nothing,
24+
verbose::Bool = false)
2425
if !isnothing(reltol)
2526
@warn "common reltol is currently not used by $(opt)"
2627
end
2728

2829
mapped_args = (; lower = prob.lb,
2930
upper = prob.ub,
3031
logger = CMAEvolutionStrategy.BasicLogger(prob.u0;
31-
verbosity = 0,
32+
verbosity = verbose ? 1 : 0,
3233
callback = callback))
3334

3435
if !isnothing(maxiters)
@@ -78,6 +79,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
7879
curr_u = opt.logger.xbest[end]
7980
opt_state = Optimization.OptimizationState(; iter = length(opt.logger.fmedian),
8081
u = curr_u,
82+
p = cache.p,
8183
objective = opt.logger.fbest[end],
8284
original = opt.logger)
8385

lib/OptimizationEvolutionary/src/OptimizationEvolutionary.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
104104
opt_state = Optimization.OptimizationState(;
105105
iter = decompose_trace(trace).iteration,
106106
u = curr_u,
107+
p = cache.p,
107108
objective = x[1],
108109
original = trace)
109110
cb_call = cache.callback(opt_state, decompose_trace(trace).value...)

lib/OptimizationMOI/src/nlp.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ function MOI.eval_objective(evaluator::MOIOptimizationNLPEvaluator, x)
239239
evaluator.iteration += 1
240240
state = Optimization.OptimizationState(iter = evaluator.iteration,
241241
u = x,
242+
p = evaluator.p,
242243
objective = l[1])
243244
evaluator.callback(state, l)
244245
return l
@@ -490,10 +491,10 @@ function _add_moi_variables!(opt_setup, evaluator::MOIOptimizationNLPEvaluator)
490491

491492
for i in 1:num_variables
492493
if evaluator.lb !== nothing && evaluator.lb[i] > -Inf
493-
MOI.add_constraint(opt_setup, θ[i], MOI.GreaterThan(evaluator.lb[i]))
494+
MOI.add_constraint(opt_setup, θ[i], MOI.GreaterThan(Float64(evaluator.lb[i])))
494495
end
495496
if evaluator.ub !== nothing && evaluator.ub[i] < Inf
496-
MOI.add_constraint(opt_setup, θ[i], MOI.LessThan(evaluator.ub[i]))
497+
MOI.add_constraint(opt_setup, θ[i], MOI.LessThan(Float64(evaluator.ub[i])))
497498
end
498499
if evaluator.int !== nothing && evaluator.int[i]
499500
if evaluator.lb !== nothing && evaluator.lb[i] == 0 &&

lib/OptimizationManopt/src/OptimizationManopt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
416416
function _cb(x, θ)
417417
opt_state = Optimization.OptimizationState(iter = 0,
418418
u = θ,
419+
p = cache.p,
419420
objective = x[1])
420421
cb_call = cache.callback(opt_state, x...)
421422
if !(cb_call isa Bool)

lib/OptimizationNLopt/src/OptimizationNLopt.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function __map_optimizer_args!(cache::OptimizationCache, opt::NLopt.Opt;
7575

7676
if !isnothing(local_options)
7777
for j in Dict(pairs(local_options))
78-
eval(Meta.parse("NLopt." * string(j.first) * "!"))(local_meth, j.second)
78+
NLopt.nlopt_set_param(opt, j.first, j.second)
7979
end
8080
end
8181

@@ -93,7 +93,7 @@ function __map_optimizer_args!(cache::OptimizationCache, opt::NLopt.Opt;
9393
# add optimiser options from kwargs
9494
for j in kwargs
9595
if j.first != :cons_tol
96-
eval(Meta.parse("NLopt." * string(j.first) * "!"))(opt, j.second)
96+
NLopt.nlopt_set_param(opt, j.first, j.second)
9797
end
9898
end
9999

@@ -156,7 +156,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
156156

157157
_loss = function (θ)
158158
x = cache.f(θ, cache.p)
159-
opt_state = Optimization.OptimizationState(u = θ, objective = x[1])
159+
opt_state = Optimization.OptimizationState(u = θ, p = cache.p, objective = x[1])
160160
if cache.callback(opt_state, x...)
161161
NLopt.force_stop!(opt_setup)
162162
end

lib/OptimizationNLopt/test/runtests.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,29 @@ using Test, Random
100100
@test sol.retcode == ReturnCode.MaxTime
101101
end
102102

103+
@testset "dual_ftol_rel parameter" begin
104+
# Test that dual_ftol_rel parameter can be passed to NLopt without errors
105+
# This parameter is specific to MMA/CCSA algorithms for dual optimization tolerance
106+
x0_test = zeros(2)
107+
optprob = OptimizationFunction(rosenbrock, Optimization.AutoZygote())
108+
prob = OptimizationProblem(optprob, x0_test, _p)
109+
110+
# Test with NLopt.Opt interface
111+
opt = NLopt.Opt(:LD_MMA, 2)
112+
# This should not throw an error - the PR fixed the UndefVarError
113+
sol = solve(prob, opt, dual_ftol_rel = 1e-6, maxiters = 100)
114+
@test sol.retcode [ReturnCode.Success, ReturnCode.MaxIters]
115+
116+
# Test with direct algorithm interface
117+
sol = solve(prob, NLopt.LD_MMA(), dual_ftol_rel = 1e-5, maxiters = 100)
118+
@test sol.retcode [ReturnCode.Success, ReturnCode.MaxIters]
119+
120+
# Verify it works with other solver options
121+
sol = solve(prob, NLopt.LD_MMA(), dual_ftol_rel = 1e-4, ftol_rel = 1e-6,
122+
xtol_rel = 1e-6, maxiters = 100)
123+
@test sol.retcode [ReturnCode.Success, ReturnCode.MaxIters]
124+
end
125+
103126
@testset "constrained" begin
104127
Random.seed!(1)
105128
cons = (res, x, p) -> res .= [x[1]^2 + x[2]^2 - 1.0]

lib/OptimizationODE/src/OptimizationODE.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function SciMLBase.__solve(
6868
end
6969
function affect!(integrator)
7070
u_now = integrator.u
71-
state = Optimization.OptimizationState(u=u_now, objective=cache.f(integrator.u, integrator.p))
71+
state = Optimization.OptimizationState(u=u_now, p=integrator.p, objective=cache.f(integrator.u, integrator.p))
7272
Optimization.callback_function(cb, state)
7373
end
7474
cb_struct = DiscreteCallback(condition, affect!)

lib/OptimizationOptimJL/src/OptimizationOptimJL.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
143143
θ = metadata[cache.opt isa Optim.NelderMead ? "centroid" : "x"]
144144
opt_state = Optimization.OptimizationState(iter = trace.iteration,
145145
u = θ,
146+
p = cache.p,
146147
objective = trace.value,
147148
grad = get(metadata, "g(x)", nothing),
148149
hess = get(metadata, "h(x)", nothing),
@@ -262,6 +263,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
262263
metadata["x"]
263264
opt_state = Optimization.OptimizationState(iter = trace.iteration,
264265
u = θ,
266+
p = cache.p,
265267
objective = trace.value,
266268
grad = get(metadata, "g(x)", nothing),
267269
hess = get(metadata, "h(x)", nothing),
@@ -348,6 +350,7 @@ function SciMLBase.__solve(cache::OptimizationCache{
348350
metadata = decompose_trace(trace).metadata
349351
opt_state = Optimization.OptimizationState(iter = trace.iteration,
350352
u = metadata["x"],
353+
p = cache.p,
351354
grad = get(metadata, "g(x)", nothing),
352355
hess = get(metadata, "h(x)", nothing),
353356
objective = trace.value,

0 commit comments

Comments
 (0)