Skip to content

Commit fe29a73

Browse files
committed
fix: don't use eval
1 parent 8773654 commit fe29a73

File tree

2 files changed

+14
-20
lines changed

2 files changed

+14
-20
lines changed

ext/MTKInfiniteOptExt.jl

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -348,20 +348,15 @@ end
348348
Solve JuMPDynamicOptProblem. Arguments:
349349
- prob: a JumpDynamicOptProblem
350350
- jump_solver: a LP solver such as HiGHS
351-
- ode_solver: Takes in a symbol representing the solver. Acceptable solvers may be found at https://docs.sciml.ai/DiffEqDevDocs/stable/internals/tableaus/. Note that the symbol may be different than the typical name of the solver, e.g. :Tsitouras5 rather than Tsit5.
351+
- tableau_getter: Takes in a function to fetch a tableau. Tableau loaders look like `constructRK4` and may be found at https://docs.sciml.ai/DiffEqDevDocs/stable/internals/tableaus/. If this argument is not passed in, the solver will default to Radau second order.
352352
- silent: set the model silent (suppress model output)
353353
354354
Returns a DynamicOptSolution, which contains both the model and the ODE solution.
355355
"""
356356
function DiffEqBase.solve(
357-
prob::JuMPDynamicOptProblem, jump_solver, ode_solver::Symbol = :Default; silent = false)
357+
prob::JuMPDynamicOptProblem, jump_solver, tableau_getter = constructDefault; silent = false)
358358
model = prob.model
359-
tableau_getter = Symbol(:construct, ode_solver)
360-
if ode_solver == :Default
361-
@eval tableau = $tableau_getter()
362-
else
363-
@eval tableau = @__MODULE__.$tableau_getter()
364-
end
359+
tableau = tableau_getter()
365360
silent && set_silent(model)
366361

367362
# Unregister current solver constraints
@@ -379,7 +374,7 @@ function DiffEqBase.solve(
379374
end
380375
end
381376
add_jump_solve_constraints!(prob, tableau; is_free_t = haskey(model, :tf))
382-
_solve(prob, jump_solver, ode_solver)
377+
_solve(prob, jump_solver, tableau_getter)
383378
end
384379

385380
"""

test/downstream/jump_control.jl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using ModelingToolkit
2-
@show @__MODULE__
32
import JuMP, InfiniteOpt
43
using DiffEqDevTools, DiffEqBase
54
using SimpleDiffEq
@@ -26,13 +25,13 @@ const M = ModelingToolkit
2625
# Test explicit method.
2726
jprob = JuMPDynamicOptProblem(sys, u0map, tspan, parammap, dt = 0.01)
2827
@test JuMP.num_constraints(jprob.model) == 2 # initials
29-
jsol = solve(jprob, Ipopt.Optimizer, :RK4, silent = true)
28+
jsol = solve(jprob, Ipopt.Optimizer, constructRK4, silent = true)
3029
oprob = ODEProblem(sys, u0map, tspan, parammap)
3130
osol = solve(oprob, SimpleRK4(), dt = 0.01)
3231
@test jsol.sol.u osol.u
3332

3433
# Implicit method.
35-
jsol2 = solve(jprob, Ipopt.Optimizer, :ImplicitEuler, silent = true) # 63.031 ms, 26.49 MiB
34+
jsol2 = solve(jprob, Ipopt.Optimizer, constructImplicitEuler, silent = true) # 63.031 ms, 26.49 MiB
3635
osol2 = solve(oprob, ImplicitEuler(), dt = 0.01, adaptive = false) # 129.375 μs, 61.91 KiB
3736
@test (jsol2.sol.u, osol2.u, rtol = 0.001)
3837
iprob = InfiniteOptDynamicOptProblem(sys, u0map, tspan, parammap, dt = 0.01)
@@ -49,7 +48,7 @@ const M = ModelingToolkit
4948

5049
jprob = JuMPDynamicOptProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
5150
@test JuMP.num_constraints(jprob.model) == 2
52-
jsol = solve(jprob, Ipopt.Optimizer, :Tsitouras5, silent = true) # 12.190 s, 9.68 GiB
51+
jsol = solve(jprob, Ipopt.Optimizer, constructTsitouras5, silent = true) # 12.190 s, 9.68 GiB
5352
@test jsol.sol(0.6)[1] 3.5
5453
@test jsol.sol(0.3)[1] 7.0
5554

@@ -71,7 +70,7 @@ const M = ModelingToolkit
7170
@test all(u -> u > [1, 1], isol.sol.u)
7271

7372
jprob = JuMPDynamicOptProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
74-
jsol = solve(jprob, Ipopt.Optimizer, :RadauIA3, silent = true) # 12.190 s, 9.68 GiB
73+
jsol = solve(jprob, Ipopt.Optimizer, constructRadauIA3, silent = true) # 12.190 s, 9.68 GiB
7574
@test all(u -> u > [1, 1], jsol.sol.u)
7675
end
7776

@@ -105,7 +104,7 @@ end
105104
tspan = (0.0, 1.0)
106105
parammap = [u(t) => 0.0]
107106
jprob = JuMPDynamicOptProblem(block, u0map, tspan, parammap; dt = 0.01)
108-
jsol = solve(jprob, Ipopt.Optimizer, :Verner8, silent = true)
107+
jsol = solve(jprob, Ipopt.Optimizer, constructVerner8, silent = true)
109108
# Linear systems have bang-bang controls
110109
@test is_bangbang(jsol.input_sol, [-1.0], [1.0])
111110
# Test reached final position.
@@ -143,7 +142,7 @@ end
143142
pmap = [b => 1, c => 1, μ => 1, s => 1, ν => 1, α => 1]
144143

145144
jprob = JuMPDynamicOptProblem(beesys, u0map, tspan, pmap, dt = 0.01)
146-
jsol = solve(jprob, Ipopt.Optimizer, :Tsitouras5, silent = true)
145+
jsol = solve(jprob, Ipopt.Optimizer, constructTsitouras5, silent = true)
147146
@test is_bangbang(jsol.input_sol, [0.0], [1.0])
148147
iprob = InfiniteOptDynamicOptProblem(beesys, u0map, tspan, pmap, dt = 0.01)
149148
isol = solve(iprob, Ipopt.Optimizer; silent = true)
@@ -188,7 +187,7 @@ end
188187
g₀ => 1, m₀ => 1.0, h_c => 500, c => 0.5 * (g₀ * h₀), D_c => 0.5 * 620 * m₀ / g₀,
189188
Tₘ => 3.5 * g₀ * m₀, T(t) => 0.0, h₀ => 1, m_c => 0.6]
190189
jprob = JuMPDynamicOptProblem(rocket, u0map, (ts, te), pmap; dt = 0.001, cse = false)
191-
jsol = solve(jprob, Ipopt.Optimizer, :RadauIIA5, silent = true)
190+
jsol = solve(jprob, Ipopt.Optimizer, constructRadauIIA5, silent = true)
192191
@test jsol.sol.u[end][1] > 1.012
193192

194193
iprob = InfiniteOptDynamicOptProblem(
@@ -229,7 +228,7 @@ end
229228
u0map = [x(t) => 17.5]
230229
pmap = [u(t) => 0.0, tf => 8]
231230
jprob = JuMPDynamicOptProblem(rocket, u0map, (0, tf), pmap; steps = 201)
232-
jsol = solve(jprob, Ipopt.Optimizer, :Tsitouras5, silent = true)
231+
jsol = solve(jprob, Ipopt.Optimizer, constructTsitouras5, silent = true)
233232
@test isapprox(jsol.sol.t[end], 10.0, rtol = 1e-3)
234233

235234
iprob = InfiniteOptDynamicOptProblem(rocket, u0map, (0, tf), pmap; steps = 200)
@@ -250,7 +249,7 @@ end
250249
tspan = (0.0, tf)
251250
parammap = [u(t) => 0.0, tf => 1.0]
252251
jprob = JuMPDynamicOptProblem(block, u0map, tspan, parammap; steps = 51)
253-
jsol = solve(jprob, Ipopt.Optimizer, :Verner8, silent = true)
252+
jsol = solve(jprob, Ipopt.Optimizer, constructVerner8, silent = true)
254253
@test isapprox(jsol.sol.t[end], 2.0, atol = 1e-5)
255254

256255
iprob = InfiniteOptDynamicOptProblem(block, u0map, tspan, parammap; steps = 51)
@@ -288,7 +287,7 @@ end
288287
u0map = [D(x(t)) => 0.0, D(θ(t)) => 0.0, θ(t) => 0.0, x(t) => 0.0]
289288
pmap = [mₖ => 1.0, mₚ => 0.2, l => 0.5, g => 9.81, u => 0]
290289
jprob = JuMPDynamicOptProblem(cartpole, u0map, tspan, pmap; dt = 0.04)
291-
jsol = solve(jprob, Ipopt.Optimizer, :RK4, silent = true)
290+
jsol = solve(jprob, Ipopt.Optimizer, constructRK4, silent = true)
292291
@test jsol.sol.u[end] [π, 0, 0, 0]
293292

294293
iprob = InfiniteOptDynamicOptProblem(cartpole, u0map, tspan, pmap; dt = 0.04)

0 commit comments

Comments
 (0)