Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
1d322a1
Create OptimizationODE.jl
ParasPuneetSingh May 22, 2025
a81ae86
Create runtests.jl
ParasPuneetSingh May 22, 2025
ab80dcc
Create Project.toml
ParasPuneetSingh May 22, 2025
7558b76
Update CI.yml
ChrisRackauckas May 24, 2025
967ce77
Update OptimizationODE.jl
ParasPuneetSingh May 26, 2025
38733ac
Update runtests.jl
ParasPuneetSingh May 26, 2025
e2b310c
Update OptimizationODE.jl
ParasPuneetSingh May 27, 2025
6b79113
Update runtests.jl
ParasPuneetSingh May 27, 2025
1c7a004
Update Project.toml
ParasPuneetSingh May 27, 2025
792d6cf
Update OptimizationODE.jl
ParasPuneetSingh May 28, 2025
dffe5f5
Update runtests.jl
ParasPuneetSingh May 28, 2025
a2d406e
Update OptimizationODE.jl
ParasPuneetSingh May 30, 2025
cb0668a
Update runtests.jl
ParasPuneetSingh May 30, 2025
c7a06c4
Merge branch 'SciML:master' into master
ParasPuneetSingh May 30, 2025
8e451e1
Update OptimizationODE.jl
ParasPuneetSingh May 30, 2025
9e03221
Update runtests.jl
ParasPuneetSingh May 30, 2025
f9e6a78
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
e53a9e9
Update lib/OptimizationODE/Project.toml
ChrisRackauckas May 30, 2025
18b0614
Update lib/OptimizationODE/Project.toml
ChrisRackauckas May 30, 2025
df75819
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
6aa89af
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
5c20429
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
962832b
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
b437cd8
Update lib/OptimizationODE/test/runtests.jl
ChrisRackauckas May 30, 2025
bcd6f75
Update lib/OptimizationODE/test/runtests.jl
ChrisRackauckas May 30, 2025
a10cb04
Update lib/OptimizationODE/test/runtests.jl
ChrisRackauckas May 30, 2025
6164774
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
b8a7fe4
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 30, 2025
8c2a16e
Update lib/OptimizationODE/test/runtests.jl
ChrisRackauckas May 30, 2025
72a4b62
Update lib/OptimizationODE/Project.toml
ChrisRackauckas May 30, 2025
f977f0d
Update Project.toml
ChrisRackauckas May 30, 2025
2267a46
Update lib/OptimizationODE/test/runtests.jl
ChrisRackauckas May 31, 2025
45d09aa
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 31, 2025
238ba5d
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 31, 2025
43c7ea7
Update Project.toml
ChrisRackauckas May 31, 2025
e68e640
Update lib/OptimizationODE/src/OptimizationODE.jl
ChrisRackauckas May 31, 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
1 change: 1 addition & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ jobs:
- OptimizationMultistartOptimization
- OptimizationNLopt
- OptimizationNOMAD
- OptimizationODE
- OptimizationOptimJL
- OptimizationOptimisers
- OptimizationPRIMA
Expand Down
17 changes: 17 additions & 0 deletions lib/OptimizationODE/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name = "OptimizationODE"
uuid = "dfa73e59-e644-4d8a-bf84-188d7ecb34e4"
authors = ["Paras Puneet Singh <[email protected]>"]
version = "0.1.0"

[deps]
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[compat]
Optimization = "3"
Reexport = "1"
julia = "1.9"
45 changes: 45 additions & 0 deletions lib/OptimizationODE/src/OptimizationODE.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module OptimizationODE

using Reexport
@reexport using Optimization, Optimization.SciMLBase
using OrdinaryDiffEq

export ODEOptimizer, ODEGradientDescent, RKChebyshevDescent, RKAccelerated, PRKChebyshevDescent

# ODEOptimizer is a simple wrapper
struct ODEOptimizer{Solver} end

# Define solver aliases using stable methods
const ODEGradientDescent = ODEOptimizer{Euler}()
const RKChebyshevDescent = ODEOptimizer{ROCK2}()
const RKAccelerated = ODEOptimizer{BS3}()
const PRKChebyshevDescent = ODEOptimizer{ROCK4}()

function SciMLBase.supports_opt_cache_interface(::ODEOptimizer)
return true
end

function SciMLBase.requiresgradient(::ODEOptimizer)
return true
end

function SciMLBase.__solve(
cache::OptimizationCache{F, RC, LB, UB, LC, UC, S, ODEOptimizer{Solver}, D, P, C}
) where {F, RC, LB, UB, LC, UC, S, Solver, D, P, C}

prob = ODEProblem((du, u, p, t) -> begin
cache.f.grad(du, u, cache.p)
du .*= -1
end, cache.u0, (0.0, cache.solver_args[:maxiters] * cache.solver_args[:dt]), cache.p)

sol = solve(prob, Solver(); dt = cache.solver_args[:dt])

final_u = sol.u[end]
final_f = cache.f(final_u, cache.p)[1]
stats = Optimization.OptimizationStats(; time = sol.t[end])

return SciMLBase.build_solution(cache, ODEOptimizer{Solver}(), final_u, final_f;
original = sol, retcode = ReturnCode.Success, stats)
end

end
67 changes: 67 additions & 0 deletions lib/OptimizationODE/test/runtests.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

using Test
using Optimization
using Optimization.SciMLBase
using Optimization.ADTypes
using OptimizationODE

function quad(u, p)
return sum(u .^ 2) + p[1] * u[2]^2
end

function quad_grad!(g, u, p, data)
g[1] = 2u[1]
g[2] = 2p[1]*u[2]
return g
end

function rosenbrock(u, p)
return (p[1] - u[1])^2 + p[2]*(u[2] - u[1]^2)^2
end

function rosenbrock_grad!(g, u, p, data)
g[1] = -2(p[1] - u[1]) - 4p[2]*u[1]*(u[2] - u[1]^2)
g[2] = 2p[2]*(u[2] - u[1]^2)
return g
end

@testset "OptimizationODE Solvers" begin
u0q = [2.0, -3.0]
pq = [5.0]
fq = OptimizationFunction(quad, SciMLBase.NoAD(); grad = quad_grad!)
probQ = OptimizationProblem(fq, u0q, pq)

@testset "ODEGradientDescent on Quadratic" begin
sol = solve(probQ, ODEGradientDescent; dt = 0.1, maxiters = 1000)
@test isapprox(sol.u, zeros(length(sol.u)); atol=1e-2)
end

@testset "RKChebyshevDescent on Quadratic" begin
sol = solve(probQ, RKChebyshevDescent; dt = 0.1, maxiters = 1000)
@test isapprox(sol.u, zeros(length(sol.u)); atol=1e-2)
end

@testset "RKAccelerated on Quadratic" begin
sol = solve(probQ, RKAccelerated; dt = 0.1, maxiters = 1000)
@test isapprox(sol.u, zeros(length(sol.u)); atol=1e-2)
end

@testset "PRKChebyshevDescent on Quadratic" begin
sol = solve(probQ, PRKChebyshevDescent; dt = 0.1, maxiters = 1000)
@test isapprox(sol.u, zeros(length(sol.u)); atol=1e-2)
end

u0r = [-1.2, 1.0]
pr = [1.0, 100.0]

for (mode, desc) in [(SciMLBase.NoAD(), "NoAD"),
(ADTypes.AutoForwardDiff(), "AutoForwardDiff")]
@testset "ODEGradientDescent on Rosenbrock ($desc)" begin
fr = OptimizationFunction(rosenbrock, mode; grad = rosenbrock_grad!)
probR = OptimizationProblem(fr, u0r, pr)
sol = solve(probR, ODEGradientDescent; dt = 0.001, maxiters = 5000)
@test isapprox(sol.u[1], 1.0; atol=1e-1)
@test isapprox(sol.u[2], 1.0; atol=2e-1)
end
end
end
Loading