Skip to content

Commit 943181e

Browse files
committed
more test fixes
1 parent ac08f9a commit 943181e

File tree

3 files changed

+51
-39
lines changed

3 files changed

+51
-39
lines changed

ext/MTKJuMPControlExt.jl

+4-5
Original file line numberDiff line numberDiff line change
@@ -289,17 +289,16 @@ function add_jump_solve_constraints!(prob, tableau; is_free_t = false)
289289
base_name="solve_time_")
290290
empty!(K)
291291
end
292-
@show num_variables(model)
293292
else
294-
@variable(model, K[1:length(α), 1:nᵤ], Infinite(t), start=tsteps[1])
293+
@variable(model, K[1:length(α), 1:nᵤ], Infinite(t))
295294
ΔUs = A * K
296295
ΔU_tot = dt * (K' * α)
297296
for τ in tsteps
298297
for (i, h) in enumerate(c)
299298
ΔU = @view ΔUs[i, :]
300-
Uₙ = U + ΔU * dt
301-
@constraint(model, [j = 1:nᵤ], K[i, j](τ)==(tₛ * f(Uₙ, V, p, τ + h * dt)[j]),
302-
DomainRestrictions(t => min+ h * dt, tmax)), base_name="solve_K()")
299+
Uₙ = U + ΔU * h * dt
300+
@constraint(model, [j = 1:nᵤ], K[i, j]==(tₛ * f(Uₙ, V, p, τ + h * dt)[j]),
301+
DomainRestrictions(t => τ), base_name="solve_K$i()")
303302
end
304303
@constraint(model, [n = 1:nᵤ], U[n](τ) + ΔU_tot[n]==U[n](min+ dt, tmax)),
305304
DomainRestrictions(t => τ), base_name="solve_U()")

src/systems/diffeqs/odesystem.jl

+1-2
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ end
762762
Build the constraint system for the ODESystem.
763763
"""
764764
function process_constraint_system(
765-
constraints::Vector{Equation}, sts, ps, iv; consname = :cons)
765+
constraints::Vector, sts, ps, iv; consname = :cons)
766766
isempty(constraints) && return nothing
767767

768768
constraintsts = OrderedSet()
@@ -771,7 +771,6 @@ function process_constraint_system(
771771
collect_vars!(constraintsts, constraintps, cons, iv)
772772
union!(constraintsts, collect_applied_operators(cons, Differential))
773773
end
774-
@show constraintsts
775774

776775
# Validate the states.
777776
validate_vars_and_find_ps!(constraintsts, constraintps, sts, iv)

test/dynamic_optimization/jump_control.jl

+46-32
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ using DiffEqDevTools, DiffEqBase
44
using SimpleDiffEq
55
using OrdinaryDiffEqSDIRK, OrdinaryDiffEqVerner, OrdinaryDiffEqTsit5, OrdinaryDiffEqFIRK
66
using Ipopt
7-
using BenchmarkTools
8-
using CairoMakie
97
using DataInterpolations
10-
const M = ModelingToolkit
8+
#const M = ModelingToolkit
119

1210
@testset "ODE Solution, no cost" begin
1311
# Test solving without anything attached.
@@ -26,19 +24,19 @@ const M = ModelingToolkit
2624

2725
# Test explicit method.
2826
jprob = JuMPControlProblem(sys, u0map, tspan, parammap, dt = 0.01)
29-
@test num_constraints(jprob.model) == 2 # initials
27+
@test JuMP.num_constraints(jprob.model) == 2 # initials
3028
jsol = solve(jprob, Ipopt.Optimizer, :RK4)
3129
oprob = ODEProblem(sys, u0map, tspan, parammap)
3230
osol = solve(oprob, SimpleRK4(), dt = 0.01)
3331
@test jsol.sol.u osol.u
3432

3533
# Implicit method.
36-
jsol2 = @btime solve($jprob, Ipopt.Optimizer, :ImplicitEuler, silent = true) # 63.031 ms, 26.49 MiB
37-
osol2 = @btime solve($oprob, ImplicitEuler(), dt = 0.01, adaptive = false) # 129.375 μs, 61.91 KiB
34+
jsol2 = solve(jprob, Ipopt.Optimizer, :ImplicitEuler, silent = true) # 63.031 ms, 26.49 MiB
35+
osol2 = solve(oprob, ImplicitEuler(), dt = 0.01, adaptive = false) # 129.375 μs, 61.91 KiB
3836
@test (jsol2.sol.u, osol2.u, rtol = 0.001)
3937
iprob = InfiniteOptControlProblem(sys, u0map, tspan, parammap, dt = 0.01)
40-
isol = @btime solve(
41-
$iprob, Ipopt.Optimizer, derivative_method = FiniteDifference(Backward()), silent = true) # 11.540 ms, 4.00 MiB
38+
isol = solve(iprob, Ipopt.Optimizer, derivative_method = InfiniteOpt.FiniteDifference(InfiniteOpt.Backward()), silent = true) # 11.540 ms, 4.00 MiB
39+
@test (jsol2.sol.u, osol2.u, rtol = 0.001)
4240

4341
# With a constraint
4442
u0map = Pair[]
@@ -47,34 +45,29 @@ const M = ModelingToolkit
4745
@mtkbuild lksys = ODESystem(eqs, t; constraints = constr)
4846

4947
jprob = JuMPControlProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
50-
@test num_constraints(jprob.model) == 2
51-
jsol = @btime solve($jprob, Ipopt.Optimizer, :Tsitouras5, silent = true) # 12.190 s, 9.68 GiB
52-
sol = jsol.sol
53-
@test sol(0.6)[1] 3.5
54-
@test sol(0.3)[1] 7.0
48+
@test JuMP.num_constraints(jprob.model) == 2
49+
jsol = solve(jprob, Ipopt.Optimizer, :Tsitouras5, silent = true) # 12.190 s, 9.68 GiB
50+
@test jsol.sol(0.6)[1] 3.5
51+
@test jsol.sol(0.3)[1] 7.0
5552

5653
iprob = InfiniteOptControlProblem(
5754
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
58-
isol = @btime solve(
59-
$iprob, Ipopt.Optimizer, derivative_method = OrthogonalCollocation(3), silent = true) # 48.564 ms, 9.58 MiB
55+
isol = solve(iprob, Ipopt.Optimizer, derivative_method = InfiniteOpt.OrthogonalCollocation(3), silent = true) # 48.564 ms, 9.58 MiB
6056
sol = isol.sol
6157
@test sol(0.6)[1] 3.5
6258
@test sol(0.3)[1] 7.0
6359

6460
# Test whole-interval constraints
65-
constr = [x(t) > 3, y(t) > 4]
61+
constr = [x(t) 1, y(t) 1]
6662
@mtkbuild lksys = ODESystem(eqs, t; constraints = constr)
6763
iprob = InfiniteOptControlProblem(
6864
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
69-
isol = @btime solve(
70-
$iprob, Ipopt.Optimizer, derivative_method = OrthogonalCollocation(3), silent = true) # 48.564 ms, 9.58 MiB
71-
sol = isol.sol
72-
@test all(u -> u .> [3, 4], sol.u)
65+
isol = solve(iprob, Ipopt.Optimizer, derivative_method = InfiniteOpt.OrthogonalCollocation(3), silent = true) # 48.564 ms, 9.58 MiB
66+
@test all(u -> u > [1, 1], isol.sol.u)
7367

7468
jprob = JuMPControlProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
75-
jsol = @btime solve($jprob, Ipopt.Optimizer, :RadauIA3, silent = true) # 12.190 s, 9.68 GiB
76-
sol = jsol.sol
77-
@test all(u -> u .> [3, 4], sol.u)
69+
jsol = solve(jprob, Ipopt.Optimizer, :RadauIA3, silent = true) # 12.190 s, 9.68 GiB
70+
@test all(u -> u > [1, 1], jsol.sol.u)
7871
end
7972

8073
function is_bangbang(input_sol, lbounds, ubounds, rtol = 1e-4)
@@ -186,11 +179,11 @@ end
186179
g₀ => 1, m₀ => 1.0, h_c => 500, c => 0.5 * (g₀ * h₀), D_c => 0.5 * 620 * m₀ / g₀,
187180
Tₘ => 3.5 * g₀ * m₀, T(t) => 0.0, h₀ => 1, m_c => 0.6]
188181
jprob = JuMPControlProblem(rocket, u0map, (ts, te), pmap; dt = 0.005, cse = false)
189-
jsol = solve(jprob, Ipopt.Optimizer, :RadauIIA3)
182+
jsol = solve(jprob, Ipopt.Optimizer, :RadauIIA5, silent = true)
190183
@test jsol.sol.u[end][1] > 1.012
191184

192185
iprob = InfiniteOptControlProblem(rocket, u0map, (ts, te), pmap; dt = 0.005, cse = false)
193-
isol = solve(iprob, Ipopt.Optimizer, derivative_method = OrthogonalCollocation(3))
186+
isol = solve(iprob, Ipopt.Optimizer, derivative_method = InfiniteOpt.OrthogonalCollocation(3), silent = true)
194187
@test isol.sol.u[end][1] > 1.012
195188

196189
# Test solution
@@ -201,8 +194,8 @@ end
201194
@mtkbuild rocket_ode = ODESystem(eqs, t)
202195
interpmap = Dict(T_interp => ctrl_to_spline(jsol.input_sol, CubicSpline))
203196
oprob = ODEProblem(rocket_ode, u0map, (ts, te), merge(Dict(pmap), interpmap))
204-
osol = solve(oprob, RadauIIA3())
205-
@test jsol.sol.u osol.u
197+
osol = solve(oprob, RadauIIA5(); adaptive = false, dt = 0.005)
198+
@test (jsol.sol.u, osol.u, rtol = 0.02)
206199
end
207200

208201
@testset "Free final time problem" begin
@@ -266,8 +259,29 @@ end
266259
end
267260

268261
# RC Circuit
269-
@testset "MTK Components" begin
270-
end
271-
272-
#@testset "Constrained optimal control problems" begin
273-
#end
262+
# using ModelingToolkitStandardLibrary.Electrical
263+
# @testset "MTK Components" begin
264+
# @mtkmodel RL begin
265+
# @parameters begin
266+
# R = 1.0
267+
# L = 1.0
268+
# end
269+
# @components begin
270+
# resistor = Resistor(R = R)
271+
# inductor = Inductor(L = L)
272+
# source = Voltage()
273+
# ground = Ground()
274+
# end
275+
# @equations begin
276+
# connect(source.p, resistor.p)
277+
# connect(resistor.n, inductor.p)
278+
# connect(inductor.n, source.n, ground.g)
279+
# end
280+
# end
281+
#
282+
# costs = []
283+
# coalesce = sum
284+
# @named sys = RL()
285+
# sys, _ = structural_simplify(sys, inputs = [sys.source.V.u])
286+
# @parameters tf λ i₀
287+
# end

0 commit comments

Comments
 (0)