Skip to content

Commit 121c426

Browse files
authored
Merge branch 'master' into rw-progressbar
2 parents ee9f9f9 + d201417 commit 121c426

File tree

18 files changed

+1228
-19
lines changed

18 files changed

+1228
-19
lines changed

.github/workflows/CI.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
- OptimizationGCMAES
2727
- OptimizationLBFGSB
2828
- OptimizationIpopt
29+
- OptimizationMadNLP
2930
- OptimizationManopt
3031
- OptimizationMetaheuristics
3132
- OptimizationMOI
@@ -69,7 +70,7 @@ jobs:
6970
GROUP: ${{ matrix.group }}
7071
- uses: julia-actions/julia-processcoverage@v1
7172
with:
72-
directories: src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationGCMAES/src,lib/OptimizationIpopt/src,lib/OptimizationManopt/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src
73+
directories: src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationGCMAES/src,lib/OptimizationIpopt/src,lib/OptimizationMadNLP/src,lib/OptimizationManopt/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src
7374
- uses: codecov/codecov-action@v5
7475
with:
7576
file: lcov.info

docs/Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ ModelingToolkit = "10.23"
6666
NLPModels = "0.21"
6767
NLPModelsTest = "0.10"
6868
NLopt = "0.6, 1"
69-
Optimization = "4"
69+
Optimization = "4, 5"
7070
OptimizationBBO = "0.4"
7171
OptimizationBase = "2, 3"
7272
OptimizationCMAEvolutionStrategy = "0.3"
@@ -76,7 +76,7 @@ OptimizationIpopt = "0.2"
7676
OptimizationMOI = "0.5"
7777
OptimizationManopt = "1"
7878
OptimizationMetaheuristics = "0.3"
79-
OptimizationNLPModels = "0.0.2"
79+
OptimizationNLPModels = "0.0.2, 1"
8080
OptimizationNLopt = "0.3"
8181
OptimizationNOMAD = "0.3"
8282
OptimizationOptimJL = "0.4"

docs/src/optimization_packages/multistartoptimization.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ using Optimization, OptimizationMultistartOptimization, OptimizationNLopt
3636
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
3737
x0 = zeros(2)
3838
p = [1.0, 100.0]
39-
f = OptimizationFunction(rosenbrock)
39+
f = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
4040
prob = Optimization.OptimizationProblem(f, x0, p, lb = [-1.0, -1.0], ub = [1.0, 1.0])
4141
sol = solve(prob, MultistartOptimization.TikTak(100), NLopt.LD_LBFGS())
4242
```

lib/OptimizationBase/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "OptimizationBase"
22
uuid = "bca83a33-5cc9-4baa-983d-23429ab6bcbb"
33
authors = ["Vaibhav Dixit <[email protected]> and contributors"]
4-
version = "3.2.0"
4+
version = "3.3.1"
55

66
[deps]
77
ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b"

lib/OptimizationBase/ext/OptimizationZygoteExt.jl

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ function OptimizationBase.instantiate_function(
208208
lag_extras = prepare_hessian(
209209
lagrangian, soadtype, x, Constant(one(eltype(x))),
210210
Constant(ones(eltype(x), num_cons)), Constant(p), strict = Val(false))
211-
lag_hess_prototype = zeros(Bool, num_cons, length(x))
211+
lag_hess_prototype = zeros(Bool, length(x), length(x))
212212

213213
function lag_h!(H::AbstractMatrix, θ, σ, λ)
214214
if σ == zero(eltype(θ))
@@ -288,6 +288,18 @@ function OptimizationBase.instantiate_function(
288288
f, x, adtype, p, num_cons; kwargs...)
289289
end
290290

291+
function OptimizationBase.instantiate_function(
292+
f::OptimizationFunction{true}, cache::OptimizationBase.ReInitCache,
293+
adtype::DifferentiationInterface.SecondOrder{
294+
<:ADTypes.AbstractADType, <:ADTypes.AutoZygote},
295+
num_cons = 0; kwargs...)
296+
x = cache.u0
297+
p = cache.p
298+
299+
return OptimizationBase.instantiate_function(
300+
f, x, adtype, p, num_cons; kwargs...)
301+
end
302+
291303
function OptimizationBase.instantiate_function(
292304
f::OptimizationFunction{true}, x,
293305
adtype::ADTypes.AutoSparse{<:Union{ADTypes.AutoZygote,
@@ -575,4 +587,15 @@ function OptimizationBase.instantiate_function(
575587
return OptimizationBase.instantiate_function(f, x, adtype, p, num_cons; kwargs...)
576588
end
577589

590+
function OptimizationBase.instantiate_function(
591+
f::OptimizationFunction{true}, cache::OptimizationBase.ReInitCache,
592+
adtype::ADTypes.AutoSparse{<:DifferentiationInterface.SecondOrder{
593+
<:ADTypes.AbstractADType, <:ADTypes.AutoZygote}},
594+
num_cons = 0; kwargs...)
595+
x = cache.u0
596+
p = cache.p
597+
598+
return OptimizationBase.instantiate_function(f, x, adtype, p, num_cons; kwargs...)
599+
end
600+
578601
end

lib/OptimizationBase/src/OptimizationBase.jl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ import SciMLBase: solve, init, solve!, __init, __solve,
1515
requireshessian, requiresconsjac,
1616
requiresconshess
1717

18-
@static if isdefined(SciMLBase, :supports_opt_cache_interface)
19-
import SciMLBase: supports_opt_cache_interface
20-
else
21-
supports_opt_cache_interface(alg) = false
18+
supports_opt_cache_interface(alg) = false
19+
@static if !hasmethod(SciMLBase.__solve, Tuple{OptimizationProblem, SciMLBase.AbstractOptimizationAlgorithm})
20+
include("solve.jl")
2221
end
2322

2423
export ObjSense, MaxSense, MinSense
@@ -40,7 +39,6 @@ Base.length(::NullData) = 0
4039
include("adtypes.jl")
4140
include("symify.jl")
4241
include("cache.jl")
43-
include("solve.jl")
4442
include("OptimizationDIExt.jl")
4543
include("OptimizationDISparseExt.jl")
4644
include("function.jl")

lib/OptimizationBase/src/OptimizationDIExt.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ function instantiate_function(
198198
lag_prep = prepare_hessian(
199199
lagrangian, soadtype, x, Constant(one(eltype(x))),
200200
Constant(ones(eltype(x), num_cons)), Constant(p))
201-
lag_hess_prototype = zeros(Bool, num_cons, length(x))
201+
lag_hess_prototype = zeros(Bool, length(x), length(x))
202202

203203
function lag_h!(H::AbstractMatrix, θ, σ, λ)
204204
if σ == zero(eltype(θ))
@@ -457,7 +457,7 @@ function instantiate_function(
457457
lag_prep = prepare_hessian(
458458
lagrangian, soadtype, x, Constant(one(eltype(x))),
459459
Constant(ones(eltype(x), num_cons)), Constant(p))
460-
lag_hess_prototype = zeros(Bool, num_cons, length(x))
460+
lag_hess_prototype = zeros(Bool, length(x), length(x))
461461

462462
function lag_h!(θ, σ, λ)
463463
if σ == zero(eltype(θ))

lib/OptimizationBase/src/cache.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ function OptimizationCache(prob::SciMLBase.OptimizationProblem, opt;
6262
g = SciMLBase.requiresgradient(opt), h = SciMLBase.requireshessian(opt),
6363
hv = SciMLBase.requireshessian(opt), fg = SciMLBase.allowsfg(opt),
6464
fgh = SciMLBase.allowsfgh(opt), cons_j = SciMLBase.requiresconsjac(opt), cons_h = SciMLBase.requiresconshess(opt),
65-
cons_vjp = SciMLBase.allowsconsjvp(opt), cons_jvp = SciMLBase.allowsconsjvp(opt), lag_h = SciMLBase.requireslagh(opt))
65+
cons_vjp = SciMLBase.allowsconsvjp(opt), cons_jvp = SciMLBase.allowsconsjvp(opt), lag_h = SciMLBase.requireslagh(opt))
6666

6767
if structural_analysis
6868
obj_res, cons_res = symify_cache(f, prob, num_cons, manifold)

lib/OptimizationBase/src/solve.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ from NLopt for an example. The common local optimizer arguments are:
9292
"""
9393
function solve(prob::SciMLBase.OptimizationProblem, alg, args...;
9494
kwargs...)::SciMLBase.AbstractOptimizationSolution
95-
if supports_opt_cache_interface(alg)
95+
if SciMLBase.supports_opt_cache_interface(alg)
9696
solve!(init(prob, alg, args...; kwargs...))
9797
else
9898
if prob.u0 !== nothing && !isconcretetype(eltype(prob.u0))

lib/OptimizationBase/test/adtests.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,17 @@ optprob.cons_h(H3, x0)
144144
optprob.lag_h(H4, x0, σ, μ)
145145
@test H4σ * H2 + μ[1] * H3[1] rtol=1e-6
146146

147+
# Test that the AD-generated lag_hess_prototype has correct dimensions
148+
@test !isnothing(optprob.lag_hess_prototype)
149+
@test size(optprob.lag_hess_prototype) == (length(x0), length(x0)) # Should be n×n, not num_cons×n
150+
151+
# Test that we can actually use it as a buffer
152+
if !isnothing(optprob.lag_hess_prototype)
153+
H_proto = similar(optprob.lag_hess_prototype, Float64)
154+
optprob.lag_h(H_proto, x0, σ, μ)
155+
@test H_proto σ * H2 + μ[1] * H3[1] rtol=1e-6
156+
end
157+
147158
G2 = Array{Float64}(undef, 2)
148159
H2 = Array{Float64}(undef, 2, 2)
149160

@@ -257,6 +268,17 @@ optprob.cons_h(H3, x0)
257268
optprob.lag_h(H4, x0, σ, μ)
258269
@test H4σ * H2 + μ[1] * H3[1] rtol=1e-6
259270

271+
# Test that the AD-generated lag_hess_prototype has correct dimensions
272+
@test !isnothing(optprob.lag_hess_prototype)
273+
@test size(optprob.lag_hess_prototype) == (length(x0), length(x0)) # Should be n×n, not num_cons×n
274+
275+
# Test that we can actually use it as a buffer (this would fail with the bug)
276+
if !isnothing(optprob.lag_hess_prototype)
277+
H_proto = similar(optprob.lag_hess_prototype, Float64)
278+
optprob.lag_h(H_proto, x0, σ, μ)
279+
@test H_proto σ * H2 + μ[1] * H3[1] rtol=1e-6
280+
end
281+
260282
G2 = Array{Float64}(undef, 2)
261283
H2 = Array{Float64}(undef, 2, 2)
262284

@@ -490,6 +512,17 @@ end
490512
optprob.lag_h(H4, x0, σ, μ)
491513
@test H4σ * H1 + sum.* H3) rtol=1e-6
492514

515+
# Test that the AD-generated lag_hess_prototype has correct dimensions
516+
@test !isnothing(optprob.lag_hess_prototype)
517+
@test size(optprob.lag_hess_prototype) == (length(x0), length(x0)) # Should be n×n, not num_cons×n
518+
519+
# Test that we can actually use it as a buffer (this would fail with the bug)
520+
if !isnothing(optprob.lag_hess_prototype)
521+
H_proto = similar(optprob.lag_hess_prototype, Float64)
522+
optprob.lag_h(H_proto, x0, σ, μ)
523+
@test H_proto σ * H1 + sum.* H3) rtol=1e-6
524+
end
525+
493526
G2 = Array{Float64}(undef, 2)
494527
H2 = Array{Float64}(undef, 2, 2)
495528

0 commit comments

Comments
 (0)