Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
f228263
reorder fields in OptimizationCache for cleaner dispatches
SebastianM-C Oct 15, 2025
f39ccb2
bump OptimizationBase compat for the reordering of the fields in Opti…
SebastianM-C Oct 17, 2025
2786ea5
Replace supports_opt_cache_interface with has_init in all optimizers
SebastianM-C Oct 22, 2025
b24295b
make OptimizationBase tests runnable on julia v1.11
SebastianM-C Oct 23, 2025
7b7a143
fix deprecatios
SebastianM-C Oct 23, 2025
279ae96
make CI run for LTS
SebastianM-C Oct 23, 2025
d9c1eb8
fix test env setup
SebastianM-C Oct 23, 2025
e1645a8
fix OptimizationPRIMA cache construction
SebastianM-C Oct 23, 2025
b732ced
fix tests for OptimizationSciPy
SebastianM-C Oct 23, 2025
ed1db98
fix test env for OptimizationPolyalgorithms
SebastianM-C Oct 23, 2025
b2a7eb2
fix IncompatibleOptimizerError location
SebastianM-C Oct 23, 2025
7a48505
fix test env for OptimizationNLPModels
SebastianM-C Oct 23, 2025
becf556
fix IncompatibleOptimizerError location
SebastianM-C Oct 23, 2025
9fd21df
cleanup OptimizationMadNLP interface
SebastianM-C Oct 23, 2025
d33c663
use the API from [email protected]
SebastianM-C Oct 23, 2025
70552a4
fix tests for OptimizationMadNLP
SebastianM-C Oct 23, 2025
9bbb4ec
avoid errors and warnings in OptimizationManopt tests
SebastianM-C Oct 24, 2025
7b8dfd0
fix docs env
SebastianM-C Oct 24, 2025
6839663
skip test_stale_deps on 1.10 due to lack of sources
SebastianM-C Oct 24, 2025
b0860b8
fix Enzyme HVP returning zeros instead of correct Hessian-vector product
SebastianM-C Oct 24, 2025
8d4ac3a
fix version check
SebastianM-C Oct 24, 2025
386dde0
Generate cons_h! when lag_h needs it
SebastianM-C Oct 24, 2025
6c9977e
add requiresconshess for MadNLPOptimizer
SebastianM-C Oct 24, 2025
01095ae
Add cons_h_weighted! to handle σ=0 in Lagrangian Hessian
SebastianM-C Oct 24, 2025
8e8cdb6
Add test for Lagrangian Hessian with σ=0 edge case
SebastianM-C Oct 24, 2025
b106f8a
add test for OptimziationMadNLP when σ == 0 in lag_h
SebastianM-C Oct 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 47 additions & 2 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,54 @@ jobs:
- uses: julia-actions/julia-buildpkg@v1
- if: ${{ matrix.group == 'OptimizationQuadDIRECT' }}
run: julia --project -e 'using Pkg; Pkg.Registry.add(RegistrySpec(url = "https://github.com/HolyLab/HolyLabRegistry.git")); Pkg.add("QuadDIRECT")'
- uses: julia-actions/julia-runtest@v1
- name: ${{ matrix.group }}
env:
GROUP: ${{ matrix.group }}
GROUP: ${{ matrix.group }}
shell: julia --color=yes --check-bounds=yes --depwarn=yes {0}
run: |
using Pkg
const GROUP = get(ENV, "GROUP", "Core")

function dev_subpkg(subpkg)
subpkg_path = "lib/$subpkg"
Pkg.develop(PackageSpec(path = subpkg_path))
end

if GROUP == "Core"
Pkg.activate(".")
else
subpkg_path = "lib/${{ matrix.group }}"
Pkg.activate(subpkg_path)
end

if VERSION < v"1.11"
@info "Preparing env"
if GROUP == "Core"
@info "Testing Core"
dev_subpkg("OptimizationBase")
dev_subpkg("OptimizationLBFGSB")
dev_subpkg("OptimizationMOI")
dev_subpkg("OptimizationOptimJL")
dev_subpkg("OptimizationOptimisers")
elseif GROUP == "OptimizationBase"
dev_subpkg("OptimizationLBFGSB")
dev_subpkg("OptimizationManopt")
elseif GROUP == "OptimizationAuglag"
dev_subpkg("OptimizationOptimisers")
elseif GROUP == "OptimizationMultistartOptimization"
dev_subpkg("OptimizationNLopt")
elseif GROUP == "GPU" || GROUP == "OptimizationPolyalgorithms"
# special case
Pkg.develop([PackageSpec(path = "lib/OptimizationOptimJL"), PackageSpec(path = "lib/OptimizationOptimisers")])
elseif GROUP == "OptimizationNLPModels"
dev_subpkg("OptimizationMOI")
dev_subpkg("OptimizationOptimJL")
dev_subpkg("OptimizationLBFGSB")
end
end

@info "Starting tests"
Pkg.test()
- uses: julia-actions/julia-processcoverage@v1
with:
directories: src,lib/OptimizationBase/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
Expand Down
28 changes: 24 additions & 4 deletions docs/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ NLPModels = "a4795742-8479-5a88-8948-cc11e1c8c1a6"
NLPModelsTest = "7998695d-6960-4d3a-85c4-e1bceb8cd856"
NLopt = "76087f3c-5699-56af-9a33-bf431cd00edd"
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
OptimizationBBO = "3e6eede4-6085-4f62-9a71-46d9bc1eb92b"
OptimizationBase = "bca83a33-5cc9-4baa-983d-23429ab6bcbb"
OptimizationBBO = "3e6eede4-6085-4f62-9a71-46d9bc1eb92b"
OptimizationCMAEvolutionStrategy = "bd407f91-200f-4536-9381-e4ba712f53f8"
OptimizationEvolutionary = "cb963754-43f6-435e-8d4b-99009ff27753"
OptimizationGCMAES = "6f0a0517-dbc2-4a7a-8a20-99ae7f27e911"
Expand All @@ -47,6 +47,26 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"

[sources]
Optimization = {path = ".."}
OptimizationBase = {path = "../lib/OptimizationBase"}
OptimizationBBO = {path = "../lib/OptimizationBBO"}
OptimizationCMAEvolutionStrategy = {path = "../lib/OptimizationCMAEvolutionStrategy"}
OptimizationEvolutionary = {path = "../lib/OptimizationEvolutionary"}
OptimizationGCMAES = {path = "../lib/OptimizationGCMAES"}
OptimizationIpopt = {path = "../lib/OptimizationIpopt"}
OptimizationMOI = {path = "../lib/OptimizationMOI"}
OptimizationManopt = {path = "../lib/OptimizationManopt"}
OptimizationMetaheuristics = {path = "../lib/OptimizationMetaheuristics"}
OptimizationNLPModels = {path = "../lib/OptimizationNLPModels"}
OptimizationNLopt = {path = "../lib/OptimizationNLopt"}
OptimizationNOMAD = {path = "../lib/OptimizationNOMAD"}
OptimizationOptimJL = {path = "../lib/OptimizationOptimJL"}
OptimizationOptimisers = {path = "../lib/OptimizationOptimisers"}
OptimizationPRIMA = {path = "../lib/OptimizationPRIMA"}
OptimizationPolyalgorithms = {path = "../lib/OptimizationPolyalgorithms"}
OptimizationSpeedMapping = {path = "../lib/OptimizationSpeedMapping"}

[compat]
ADTypes = "1"
AmplNLWriter = "1"
Expand All @@ -66,9 +86,9 @@ ModelingToolkit = "10.23"
NLPModels = "0.21"
NLPModelsTest = "0.10"
NLopt = "0.6, 1"
Optimization = "4, 5"
Optimization = "5"
OptimizationBase = "4"
OptimizationBBO = "0.4"
OptimizationBase = "2, 3"
OptimizationCMAEvolutionStrategy = "0.3"
OptimizationEvolutionary = "0.4"
OptimizationGCMAES = "0.3"
Expand All @@ -88,7 +108,7 @@ OrdinaryDiffEq = "6"
Plots = "1"
Random = "1"
ReverseDiff = ">= 1.9.0"
SciMLBase = "2.30.0"
SciMLBase = "2.122.1"
SciMLSensitivity = "7"
SymbolicAnalysis = "0.3"
Symbolics = "6"
Expand Down
7 changes: 5 additions & 2 deletions lib/OptimizationAuglag/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@ MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
OptimizationOptimisers = "42dfb2eb-d2b4-4451-abcd-913932933ac1"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[sources]
OptimizationOptimisers = {path = "../OptimizationOptimisers"}

[compat]
ForwardDiff = "1.0.1"
OptimizationBase = "3"
OptimizationBase = "4"
MLUtils = "0.4.8"
LinearAlgebra = "1.10"
OptimizationOptimisers = "0.3.8"
Test = "1.10.0"
SciMLBase = "2.58"
SciMLBase = "2.122.1"
julia = "1.10"

[targets]
Expand Down
37 changes: 4 additions & 33 deletions lib/OptimizationAuglag/src/OptimizationAuglag.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,7 @@ using LinearAlgebra: norm
ϵ = 1e-8
end

@static if isdefined(SciMLBase, :supports_opt_cache_interface)
SciMLBase.supports_opt_cache_interface(::AugLag) = true
end
@static if isdefined(OptimizationBase, :supports_opt_cache_interface)
OptimizationBase.supports_opt_cache_interface(::AugLag) = true
end
SciMLBase.has_init(::AugLag) = true
SciMLBase.allowsbounds(::AugLag) = true
SciMLBase.requiresgradient(::AugLag) = true
SciMLBase.allowsconstraints(::AugLag) = true
Expand Down Expand Up @@ -59,32 +54,7 @@ function __map_optimizer_args(cache::OptimizationBase.OptimizationCache, opt::Au
return mapped_args
end

function SciMLBase.__solve(cache::OptimizationCache{
F,
RC,
LB,
UB,
LC,
UC,
S,
O,
D,
P,
C
}) where {
F,
RC,
LB,
UB,
LC,
UC,
S,
O <:
AugLag,
D,
P,
C
}
function SciMLBase.__solve(cache::OptimizationCache{O}) where {O <: AugLag}
maxiters = OptimizationBase._check_and_convert_maxiters(cache.solver_args.maxiters)

local x
Expand Down Expand Up @@ -121,7 +91,8 @@ function SciMLBase.__solve(cache::OptimizationCache{
if cache.callback(opt_state, x...)
error("Optimization halted by callback.")
end
return x[1] + sum(@. λ * cons_tmp[eq_inds] + ρ / 2 * (cons_tmp[eq_inds] .^ 2)) + 1 / (2 * ρ) * sum((max.(Ref(0.0), μ .+ (ρ .* cons_tmp[ineq_inds]))) .^ 2)
return x[1] + sum(@. λ * cons_tmp[eq_inds] + ρ / 2 * (cons_tmp[eq_inds] .^ 2)) +
1 / (2 * ρ) * sum((max.(Ref(0.0), μ .+ (ρ .* cons_tmp[ineq_inds]))) .^ 2)
end

prev_eqcons = zero(λ)
Expand Down
4 changes: 2 additions & 2 deletions lib/OptimizationBBO/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[compat]
julia = "1.10"
BlackBoxOptim = "0.6"
OptimizationBase = "3"
SciMLBase = "2.58"
OptimizationBase = "4"
SciMLBase = "2.122.1"
Reexport = "1.2"

[targets]
Expand Down
48 changes: 9 additions & 39 deletions lib/OptimizationBBO/src/OptimizationBBO.jl
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
module OptimizationBBO

using Reexport
import OptimizationBase
import OptimizationBase: SciMLBase
import BlackBoxOptim
import SciMLBase: MultiObjectiveOptimizationFunction
using OptimizationBase
using SciMLBase
using BlackBoxOptim: BlackBoxOptim

abstract type BBO end

SciMLBase.requiresbounds(::BBO) = true
SciMLBase.allowsbounds(::BBO) = true
@static if isdefined(SciMLBase, :supports_opt_cache_interface)
SciMLBase.supports_opt_cache_interface(opt::BBO) = true
end
@static if isdefined(OptimizationBase, :supports_opt_cache_interface)
OptimizationBase.supports_opt_cache_interface(opt::BBO) = true
end

SciMLBase.has_init(opt::BBO) = true

for j in string.(BlackBoxOptim.SingleObjectiveMethodNames)
eval(Meta.parse("Base.@kwdef struct BBO_" * j * " <: BBO method=:" * j * " end"))
Expand All @@ -36,19 +31,19 @@ function decompose_trace(opt::BlackBoxOptim.OptRunController, progress)
if iszero(max_time)
# we stop at either convergence or max_steps
n_steps = BlackBoxOptim.num_steps(opt)
Base.@logmsg(Base.LogLevel(-1), msg, progress=n_steps/maxiters,
Base.@logmsg(Base.LogLevel(-1), msg, progress=n_steps / maxiters,
_id=:OptimizationBBO)
else
# we stop at either convergence or max_time
elapsed = BlackBoxOptim.elapsed_time(opt)
Base.@logmsg(Base.LogLevel(-1), msg, progress=elapsed/max_time,
Base.@logmsg(Base.LogLevel(-1), msg, progress=elapsed / max_time,
_id=:OptimizationBBO)
end
end
return BlackBoxOptim.best_candidate(opt)
end

function __map_optimizer_args(prob::OptimizationBase.OptimizationCache, opt::BBO;
function __map_optimizer_args(prob::OptimizationCache, opt::BBO;
callback = nothing,
maxiters::Union{Number, Nothing} = nothing,
maxtime::Union{Number, Nothing} = nothing,
Expand Down Expand Up @@ -96,32 +91,7 @@ function map_objective(obj::BlackBoxOptim.IndexedTupleFitness)
obj.orig
end

function SciMLBase.__solve(cache::OptimizationBase.OptimizationCache{
F,
RC,
LB,
UB,
LC,
UC,
S,
O,
D,
P,
C
}) where {
F,
RC,
LB,
UB,
LC,
UC,
S,
O <:
BBO,
D,
P,
C
}
function SciMLBase.__solve(cache::OptimizationCache{O}) where {O <: BBO}
function _cb(trace)
if cache.callback === OptimizationBase.DEFAULT_CALLBACK
cb_call = false
Expand Down
2 changes: 1 addition & 1 deletion lib/OptimizationBase/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ ModelingToolkit = "10.23"
PDMats = "0.11"
Reexport = "1.2"
ReverseDiff = "1.14"
SciMLBase = "2.122"
SciMLBase = "2.122.1"
SparseConnectivityTracer = "0.6, 1"
SparseMatrixColorings = "0.4"
SymbolicAnalysis = "0.3"
Expand Down
36 changes: 24 additions & 12 deletions lib/OptimizationBase/ext/OptimizationEnzymeExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,17 @@ function OptimizationBase.instantiate_function(f::OptimizationFunction{true}, x,

if hv == true && f.hv === nothing
function hv!(H, θ, v, p = p)
x = Duplicated(θ, v)
dx = Enzyme.make_zero(x)
H .= Enzyme.autodiff(
fmode, hv_f2_alloc, Const(rmode), Duplicated(x,dx),
Const(f.f), Const(p)
)[1].dval
dθ = zero(θ)
Enzyme.make_zero!(H)
Enzyme.autodiff(
fmode,
inner_grad,
Const(rmode),
Duplicated(θ, v),
Duplicated(dθ, H),
Const(f.f),
Const(p)
)
end
elseif hv == true
hv! = (H, θ, v, p = p) -> f.hv(H, θ, v, p)
Expand Down Expand Up @@ -553,13 +558,20 @@ function OptimizationBase.instantiate_function(f::OptimizationFunction{false}, x
end

if hv == true && f.hv === nothing
H = zero(x)
function hv!(θ, v, p = p)
x = Duplicated(θ, v)
dx = Enzyme.make_zero(x)
return Enzyme.autodiff(
fmode, hv_f2_alloc, DuplicatedNoNeed, Const(rmode), Duplicated(x, dx),
Const(_f), Const(f.f), Const(p)
)[1].dval
dθ = zero(θ)
Enzyme.make_zero!(H)
Enzyme.autodiff(
fmode,
inner_grad,
Const(rmode),
Duplicated(θ, v),
Duplicated(dθ, H),
Const(f.f),
Const(p)
)
return H
end
elseif hv == true
hv! = (θ, v, p = p) -> f.hv(θ, v, p)
Expand Down
Loading
Loading