Skip to content

Commit 0c9522d

Browse files
arnavk23ChrisRackauckas
authored andcommitted
try
1 parent 40bbd90 commit 0c9522d

File tree

6 files changed

+633
-590
lines changed

6 files changed

+633
-590
lines changed

benchmarks/OptimizationCUTEst/CUTEst_bounded.jmd

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,21 @@ problems.
3636

3737
```julia
3838
optimizers = [
39-
#Optimization.LBFGS(),
40-
MOI.OptimizerWithAttributes(Ipopt.Optimizer, "print_level" => 0)
41-
]
42-
43-
function get_stats(sol, ::Optimization.LBFGS)
44-
return (length(sol.u), sol.stats.time, "LBFGS", Symbol(sol.retcode))
45-
end
46-
47-
function get_stats(sol, ::OptimizationMOI.MOI.OptimizerWithAttributes)
48-
return (length(sol.u), MOI.get(sol.original.model, MOI.SolveTimeSec()),
49-
"Ipopt", Symbol(sol.retcode))
39+
("GradientDescent", Optimization.GradientDescent()),
40+
("LBFGS", Optimization.LBFGS()),
41+
("ConjugateGradient", Optimization.ConjugateGradient()),
42+
("NelderMead", Optimization.NelderMead()),
43+
("SimulatedAnnealing", Optimization.SimulatedAnnealing()),
44+
("ParticleSwarm", Optimization.ParticleSwarm()),
45+
]
46+
47+
function get_stats(sol, optimizer_name)
48+
if hasfield(typeof(sol), :stats) && hasfield(typeof(sol.stats), :time)
49+
solve_time = sol.stats.time
50+
else
51+
solve_time = NaN
52+
end
53+
return (length(sol.u), solve_time, optimizer_name, Symbol(sol.retcode))
5054
end
5155

5256
function run_benchmarks(problems, optimizers; chunk_size=1)
@@ -87,38 +91,34 @@ function run_benchmarks(problems, optimizers; chunk_size=1)
8791

8892
prob = OptimizationNLPModels.OptimizationProblem(nlp_prob, Optimization.AutoForwardDiff())
8993

90-
for optimizer in optimizers
94+
for (optimizer_name, optimizer) in optimizers
9195
try
92-
# Generous limits for 100GB memory
9396
sol = solve(prob, optimizer; maxiters = 1000, maxtime = 30.0)
94-
95-
@info "✓ Solved $(prob_name) with $(optimizer)"
96-
vars, time, alg, code = get_stats(sol, optimizer)
97-
97+
@info "✓ Solved $(prob_name) with $(optimizer_name) - Status: $(sol.retcode)"
98+
vars, time, alg, code = get_stats(sol, optimizer_name)
9899
push!(problem, prob_name)
99100
push!(n_vars, vars)
100101
push!(secs, time)
101102
push!(solver, alg)
102103
push!(retcode, code)
103104
catch e
104-
@warn "✗ Failed to solve $(prob_name) with $(optimizer): $(e)"
105-
# Add failure entry
105+
@warn "✗ Failed to solve $(prob_name) with $(optimizer_name): $(e)"
106106
push!(problem, prob_name)
107107
push!(n_vars, -1)
108108
push!(secs, NaN)
109-
push!(solver, string(optimizer))
109+
push!(solver, optimizer_name)
110110
push!(retcode, :FAILED)
111111
end
112112
end
113113

114114
catch e
115115
@warn "✗ Failed to load problem $(prob_name): $(e)"
116116
# Add failure entries for all optimizers
117-
for optimizer in optimizers
117+
for (optimizer_name, optimizer) in optimizers
118118
push!(problem, prob_name)
119119
push!(n_vars, -1)
120120
push!(secs, NaN)
121-
push!(solver, string(optimizer))
121+
push!(solver, optimizer_name)
122122
push!(retcode, :LOAD_FAILED)
123123
end
124124
finally

benchmarks/OptimizationCUTEst/CUTEst_quadratic.jmd

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,21 @@ problems.
3636

3737
```julia
3838
optimizers = [
39-
MOI.OptimizerWithAttributes(Ipopt.Optimizer, "print_level" => 0)
40-
]
41-
42-
function get_stats(sol, ::Optimization.LBFGS)
43-
return (length(sol.u), sol.stats.time, "LBFGS", Symbol(sol.retcode))
44-
end
45-
46-
function get_stats(sol, ::OptimizationMOI.MOI.OptimizerWithAttributes)
47-
return (length(sol.u), MOI.get(sol.original.model, MOI.SolveTimeSec()),
48-
"Ipopt", Symbol(sol.retcode))
39+
("GradientDescent", Optimization.GradientDescent()),
40+
("LBFGS", Optimization.LBFGS()),
41+
("ConjugateGradient", Optimization.ConjugateGradient()),
42+
("NelderMead", Optimization.NelderMead()),
43+
("SimulatedAnnealing", Optimization.SimulatedAnnealing()),
44+
("ParticleSwarm", Optimization.ParticleSwarm()),
45+
]
46+
47+
function get_stats(sol, optimizer_name)
48+
if hasfield(typeof(sol), :stats) && hasfield(typeof(sol.stats), :time)
49+
solve_time = sol.stats.time
50+
else
51+
solve_time = NaN
52+
end
53+
return (length(sol.u), solve_time, optimizer_name, Symbol(sol.retcode))
4954
end
5055

5156
function run_benchmarks(problems, optimizers; chunk_size=3)
@@ -86,38 +91,34 @@ function run_benchmarks(problems, optimizers; chunk_size=3)
8691

8792
prob = OptimizationNLPModels.OptimizationProblem(nlp_prob, Optimization.AutoForwardDiff())
8893

89-
for optimizer in optimizers
94+
for (optimizer_name, optimizer) in optimizers
9095
try
91-
# Generous limits for 100GB memory
9296
sol = solve(prob, optimizer; maxiters = 1000, maxtime = 30.0)
93-
94-
@info "✓ Solved $(prob_name) with $(optimizer)"
95-
vars, time, alg, code = get_stats(sol, optimizer)
96-
97+
@info "✓ Solved $(prob_name) with $(optimizer_name) - Status: $(sol.retcode)"
98+
vars, time, alg, code = get_stats(sol, optimizer_name)
9799
push!(problem, prob_name)
98100
push!(n_vars, vars)
99101
push!(secs, time)
100102
push!(solver, alg)
101103
push!(retcode, code)
102104
catch e
103-
@warn "✗ Failed to solve $(prob_name) with $(optimizer): $(e)"
104-
# Add failure entry
105+
@warn "✗ Failed to solve $(prob_name) with $(optimizer_name): $(e)"
105106
push!(problem, prob_name)
106107
push!(n_vars, -1)
107108
push!(secs, NaN)
108-
push!(solver, string(optimizer))
109+
push!(solver, optimizer_name)
109110
push!(retcode, :FAILED)
110111
end
111112
end
112113

113114
catch e
114115
@warn "✗ Failed to load problem $(prob_name): $(e)"
115116
# Add failure entries for all optimizers
116-
for optimizer in optimizers
117+
for (optimizer_name, optimizer) in optimizers
117118
push!(problem, prob_name)
118119
push!(n_vars, -1)
119120
push!(secs, NaN)
120-
push!(solver, string(optimizer))
121+
push!(solver, optimizer_name)
121122
push!(retcode, :LOAD_FAILED)
122123
end
123124
finally

benchmarks/OptimizationCUTEst/CUTEst_safe_solvers.jmd

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,26 @@ using Statistics
2424
using Printf
2525
```
2626

27-
# Verified Optimizer Set
27+
# Extended Optimizer Set
2828

2929
This version includes the same optimizers as the original benchmark, demonstrating that the framework can be extended:
3030

3131
```julia
32-
# Carefully selected optimizers that are known to work reliably
3332
optimizers = [
34-
# Core gradient-based methods (OptimizationOptimJL)
33+
("GradientDescent", Optimization.GradientDescent()),
3534
("LBFGS", Optimization.LBFGS()),
36-
37-
# Constrained optimization (OptimizationMOI)
38-
("Ipopt", MOI.OptimizerWithAttributes(Ipopt.Optimizer, "print_level" => 0)),
35+
("ConjugateGradient", Optimization.ConjugateGradient()),
36+
("NelderMead", Optimization.NelderMead()),
37+
("SimulatedAnnealing", Optimization.SimulatedAnnealing()),
38+
("ParticleSwarm", Optimization.ParticleSwarm()),
3939
]
4040

4141
function get_stats(sol, optimizer_name)
42-
"""Extract statistics from solution - unified for all optimizer types"""
4342
if hasfield(typeof(sol), :stats) && hasfield(typeof(sol.stats), :time)
4443
solve_time = sol.stats.time
45-
elseif hasfield(typeof(sol), :original) && hasfield(typeof(sol.original), :model)
46-
solve_time = MOI.get(sol.original.model, MOI.SolveTimeSec())
4744
else
4845
solve_time = NaN
4946
end
50-
5147
return (length(sol.u), solve_time, optimizer_name, Symbol(sol.retcode))
5248
end
5349

@@ -95,28 +91,22 @@ function run_benchmarks(problems, optimizers; chunk_size=3)
9591

9692
for (optimizer_name, optimizer) in optimizers
9793
@printf(" Testing %-20s... ", optimizer_name)
98-
9994
try
10095
sol = solve(prob, optimizer;
10196
maxiters = 1000,
102-
maxtime = 30.0, # 30 seconds timeout for 100GB system
97+
maxtime = 30.0,
10398
abstol = 1e-6,
10499
reltol = 1e-6)
105-
106100
vars, time, alg, code = get_stats(sol, optimizer_name)
107-
108101
push!(problem, prob_name)
109102
push!(n_vars, vars)
110103
push!(secs, time)
111104
push!(solver, alg)
112105
push!(retcode, code)
113-
114106
success = code == :Success
115107
@printf("%s (%.3fs)\n", success ? "✓" : "✗", time)
116-
117108
catch e
118109
@printf("ERROR: %s\n", string(e))
119-
# Still record failed attempts
120110
push!(problem, prob_name)
121111
push!(n_vars, nlp_prob.meta.nvar)
122112
push!(secs, NaN)
@@ -301,6 +291,18 @@ end
301291
```
302292

303293
```julia, echo = false
304-
using SciMLBenchmarks
305-
SciMLBenchmarks.bench_footer(WEAVE_ARGS[:folder], WEAVE_ARGS[:file])
294+
# Only add the footer if WEAVE_ARGS is defined and has the required keys
295+
try
296+
if isdefined(Main, :WEAVE_ARGS) && haskey(WEAVE_ARGS, :folder) && haskey(WEAVE_ARGS, :file)
297+
using SciMLBenchmarks
298+
SciMLBenchmarks.bench_footer(WEAVE_ARGS[:folder], WEAVE_ARGS[:file])
299+
end
300+
catch e
301+
@warn "Footer not added: $e"
302+
end
306303
```
304+
# Introduction
305+
306+
"""
307+
NOTE: Ensure all code chunks are evaluated in order. If running in a notebook or Weave, do not skip any chunks.
308+
"""

benchmarks/OptimizationCUTEst/CUTEst_unbounded.jmd

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
# Setup chunk for Weave: must be first in file
2+
```julia; setup=true
3+
using Pkg; Pkg.instantiate()
4+
using Optimization
5+
using OptimizationNLPModels
6+
using CUTEst
7+
using OptimizationOptimJL
8+
using Ipopt
9+
using OptimizationMOI
10+
using OptimizationMOI: MOI as MOI
11+
# Analysis and plotting
12+
using DataFrames
13+
using Plots
14+
using StatsPlots
15+
using StatsBase: countmap
16+
```
117
---
218
title: CUTEst Unbounded Constrained Nonlinear Optimization Benchmarks
319
author: Alonso M. Cisneros
@@ -12,7 +28,6 @@ optimization routines. The wrapper
1228
to the problem collection, which we can leverage to test the optimizers made available by
1329
Optimization.jl.
1430

15-
This benchmark uses the following packages:
1631

1732
```julia
1833
using Optimization
@@ -35,17 +50,23 @@ We will be testing the [Ipopt]() and the [LBFGS]() optimizers on these classes o
3550
problems.
3651

3752
```julia
53+
# Standard low-memory optimizer set
3854
optimizers = [
39-
MOI.OptimizerWithAttributes(Ipopt.Optimizer, "print_level" => 0)
40-
]
41-
42-
function get_stats(sol, ::Optimization.LBFGS)
43-
return (length(sol.u), sol.stats.time, "LBFGS", Symbol(sol.retcode))
44-
end
45-
46-
function get_stats(sol, ::OptimizationMOI.MOI.OptimizerWithAttributes)
47-
return (length(sol.u), MOI.get(sol.original.model, MOI.SolveTimeSec()),
48-
"Ipopt", Symbol(sol.retcode))
55+
("GradientDescent", Optimization.GradientDescent()),
56+
("LBFGS", Optimization.LBFGS()),
57+
("ConjugateGradient", Optimization.ConjugateGradient()),
58+
("NelderMead", Optimization.NelderMead()),
59+
("SimulatedAnnealing", Optimization.SimulatedAnnealing()),
60+
("ParticleSwarm", Optimization.ParticleSwarm()),
61+
]
62+
63+
function get_stats(sol, optimizer_name)
64+
if hasfield(typeof(sol), :stats) && hasfield(typeof(sol.stats), :time)
65+
solve_time = sol.stats.time
66+
else
67+
solve_time = NaN
68+
end
69+
return (length(sol.u), solve_time, optimizer_name, Symbol(sol.retcode))
4970
end
5071

5172
function run_benchmarks(problems, optimizers; chunk_size=3)
@@ -86,38 +107,34 @@ function run_benchmarks(problems, optimizers; chunk_size=3)
86107

87108
prob = OptimizationNLPModels.OptimizationProblem(nlp_prob, Optimization.AutoForwardDiff())
88109

89-
for optimizer in optimizers
110+
for (optimizer_name, optimizer) in optimizers
90111
try
91-
# Generous limits for 100GB memory
92112
sol = solve(prob, optimizer; maxiters = 1000, maxtime = 30.0)
93-
94-
@info "✓ Solved $(prob_name) with $(optimizer)"
95-
vars, time, alg, code = get_stats(sol, optimizer)
96-
113+
@info "✓ Solved $(prob_name) with $(optimizer_name) - Status: $(sol.retcode)"
114+
vars, time, alg, code = get_stats(sol, optimizer_name)
97115
push!(problem, prob_name)
98116
push!(n_vars, vars)
99117
push!(secs, time)
100118
push!(solver, alg)
101119
push!(retcode, code)
102120
catch e
103-
@warn "✗ Failed to solve $(prob_name) with $(optimizer): $(e)"
104-
# Add failure entry
121+
@warn "✗ Failed to solve $(prob_name) with $(optimizer_name): $(e)"
105122
push!(problem, prob_name)
106123
push!(n_vars, -1)
107124
push!(secs, NaN)
108-
push!(solver, string(optimizer))
125+
push!(solver, optimizer_name)
109126
push!(retcode, :FAILED)
110127
end
111128
end
112129

113130
catch e
114131
@warn "✗ Failed to load problem $(prob_name): $(e)"
115132
# Add failure entries for all optimizers
116-
for optimizer in optimizers
133+
for (optimizer_name, optimizer) in optimizers
117134
push!(problem, prob_name)
118135
push!(n_vars, -1)
119136
push!(secs, NaN)
120-
push!(solver, string(optimizer))
137+
push!(solver, optimizer_name)
121138
push!(retcode, :LOAD_FAILED)
122139
end
123140
finally
@@ -203,6 +220,12 @@ success_rate = total_attempts > 0 ? round(successful_attempts / total_attempts *
203220
```
204221

205222
```julia, echo = false
206-
using SciMLBenchmarks
207-
SciMLBenchmarks.bench_footer(WEAVE_ARGS[:folder],WEAVE_ARGS[:file])
223+
try
224+
using SciMLBenchmarks
225+
folder = haskey(WEAVE_ARGS, :folder) ? WEAVE_ARGS[:folder] : ""
226+
file = haskey(WEAVE_ARGS, :file) ? WEAVE_ARGS[:file] : ""
227+
SciMLBenchmarks.bench_footer(folder, file)
228+
catch e
229+
@warn "bench_footer failed: $e"
230+
end
208231
```

0 commit comments

Comments
 (0)