Skip to content

Commit 7fda5b0

Browse files
committed
test: add Pyomo tests
1 parent 072824c commit 7fda5b0

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

test/extensions/dynamic_optimization.jl

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ const M = ModelingToolkit
4444
@test (isol.sol.u, osol2.u, rtol = 0.001)
4545
csol2 = solve(cprob, CasADiCollocation("ipopt", constructImplicitEuler()))
4646
@test (csol2.sol.u, osol2.u, rtol = 0.001)
47+
pprob = PyomoDynamicOptProblem(sys, u0map, tspan, parammap, dt = 0.01)
48+
psol = solve(cprob, PyomoCollocation("ipopt", BackwardEuler()))
49+
@test psol.sol.u osol2.u
4750

4851
# With a constraint
4952
u0map = Pair[]
@@ -62,6 +65,12 @@ const M = ModelingToolkit
6265
@test csol.sol(0.6; idxs = x(t)) 3.5
6366
@test csol.sol(0.3; idxs = x(t)) 7.0
6467

68+
pprob = PyomoDynamicOptProblem(
69+
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
70+
psol = solve(pprob, PyomoCollocation("ipopt", LagrangeLegendre(3)))
71+
@test psol.sol(0.6)[1] 3.5
72+
@test psol.sol(0.3)[1] 7.0
73+
6574
iprob = InfiniteOptDynamicOptProblem(
6675
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
6776
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer, InfiniteOpt.OrthogonalCollocation(3))) # 48.564 ms, 9.58 MiB
@@ -77,10 +86,14 @@ const M = ModelingToolkit
7786
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer, InfiniteOpt.OrthogonalCollocation(3)))
7887
@test all(u -> u > [1, 1], isol.sol.u)
7988

80-
jprob = JuMPDynamicOptProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
89+
jprob = PyoDynamicOptProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
8190
jsol = solve(jprob, JuMPCollocation(Ipopt.Optimizer, constructRadauIA3()))
8291
@test all(u -> u > [1, 1], jsol.sol.u)
8392

93+
pprob = PyomoDynamicOptProblem(lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
94+
psol = solve(pprob, PyomoCollocation("ipopt", MidpointEuler()))
95+
@test all(u -> u > [1, 1], psol.sol.u)
96+
8497
cprob = CasADiDynamicOptProblem(
8598
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
8699
csol = solve(cprob, CasADiCollocation("ipopt", constructRadauIA3()))
@@ -125,7 +138,6 @@ end
125138

126139
cprob = CasADiDynamicOptProblem(block, u0map, tspan, parammap; dt = 0.01)
127140
csol = solve(cprob, CasADiCollocation("ipopt", constructVerner8()))
128-
# Linear systems have bang-bang controls
129141
@test is_bangbang(csol.input_sol, [-1.0], [1.0])
130142
# Test reached final position.
131143
@test (csol.sol[x(t)][end], 0.25, rtol = 1e-5)
@@ -143,8 +155,15 @@ end
143155
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
144156
@test is_bangbang(isol.input_sol, [-1.0], [1.0])
145157
@test (isol.sol[x(t)][end], 0.25, rtol = 1e-5)
158+
159+
pprob = PyomoDynamicOptProblem(block, u0map, tspan, parammap; dt = 0.01)
160+
psol = solve(pprob, PyomoCollocation("ipopt", BackwardEuler()))
161+
@test is_bangbang(psol.input_sol, [-1.0], [1.0])
162+
@test (psol.sol.u[end][2], 0.25, rtol = 1e-5)
163+
146164
osol = solve(oprob, ImplicitEuler(); dt = 0.01, adaptive = false)
147165
@test (isol.sol.u, osol.u, rtol = 0.05)
166+
@test (psol.sol.u, osol.u, rtol = 0.05)
148167

149168
###################
150169
### Bee example ###
@@ -172,6 +191,9 @@ end
172191
cprob = CasADiDynamicOptProblem(beesys, u0map, tspan, pmap; dt = 0.01)
173192
csol = solve(cprob, CasADiCollocation("ipopt", constructTsitouras5()))
174193
@test is_bangbang(csol.input_sol, [0.0], [1.0])
194+
pprob = PyomoDynamicOptProblem(beesys, u0map, tspan, pmap, dt = 0.01)
195+
psol = solve(pprob, PyomoCollocation("ipopt", BackwardEuler()))
196+
@test is_bangbang(psol.input_sol, [0.0], [1.0])
175197

176198
@parameters (α_interp::LinearInterpolation)(..)
177199
eqs = [D(w(t)) ~ -μ * w(t) + b * s * α_interp(t) * w(t),
@@ -186,6 +208,7 @@ end
186208
@test (osol.u, csol.sol.u, rtol = 0.01)
187209
osol2 = solve(oprob, ImplicitEuler(); dt = 0.01, adaptive = false)
188210
@test (osol2.u, isol.sol.u, rtol = 0.01)
211+
@test (osol2.u, psol.sol.u, rtol = 0.01)
189212
end
190213

191214
@testset "Rocket launch" begin
@@ -224,6 +247,10 @@ end
224247
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
225248
@test isol.sol[h(t)][end] > 1.012
226249

250+
pprob = PyomoCollocationDynamicOptProblem(rocket, u0map, (ts, te), pmap; dt = 0.001, cse = false)
251+
psol = solve(pprob, PyomoCollocation("ipopt"))
252+
@test psol.sol.u[end][1] > 1.012
253+
227254
# Test solution
228255
@parameters (T_interp::CubicSpline)(..)
229256
eqs = [D(h(t)) ~ v(t),
@@ -240,6 +267,11 @@ end
240267
oprob1 = ODEProblem(rocket_ode, merge(Dict(u0map), Dict(pmap), interpmap1), (ts, te))
241268
osol1 = solve(oprob1, ImplicitEuler(); adaptive = false, dt = 0.001)
242269
@test (isol.sol.u, osol1.u, rtol = 0.01)
270+
271+
interpmap2 = Dict(T_interp => ctrl_to_spline(psol.input_sol, CubicSpline))
272+
oprob2 = ODEProblem(rocket_ode, u0map, (ts, te), merge(Dict(pmap), interpmap2))
273+
osol2 = solve(oprob2, RadauIIA5(); adaptive = false, dt = 0.001)
274+
@test (psol.sol.u, osol2.u, rtol = 0.01)
243275
end
244276

245277
@testset "Free final time problems" begin
@@ -269,6 +301,10 @@ end
269301
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
270302
@test isapprox(isol.sol.t[end], 10.0, rtol = 1e-3)
271303

304+
pprob = PyomoDynamicOptProblem(rocket, u0map, (0, tf), pmap; steps = 201)
305+
psol = solve(pprob, PyomoCollocation("ipopt"))
306+
@test isapprox(psol.sol.t[end], 10.0, rtol = 1e-3)
307+
272308
@variables x(..) v(..)
273309
@variables u(..) [bounds = (-1.0, 1.0), input = true]
274310
@parameters tf
@@ -293,6 +329,10 @@ end
293329
iprob = InfiniteOptDynamicOptProblem(block, u0map, tspan, parammap; steps = 51)
294330
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
295331
@test isapprox(isol.sol.t[end], 2.0, atol = 1e-5)
332+
333+
pprob = PyomoDynamicOptProblem(block, u0map, tspan, parammap; steps = 51)
334+
psol = solve(pprob, PyomoCollocation("ipopt"))
335+
@test isapprox(psol.sol.t[end], 2.0, atol = 1e-5)
296336
end
297337

298338
@testset "Cart-pole problem" begin
@@ -335,4 +375,8 @@ end
335375
iprob = InfiniteOptDynamicOptProblem(cartpole, u0map, tspan, pmap; dt = 0.04)
336376
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
337377
@test isol.sol.u[end] [π, 0, 0, 0]
378+
379+
pprob = PyomoDynamicOptProblem(cartpole, u0map, tspan, pmap; dt = 0.04)
380+
psol = solve(pprob, PyomoCollocation("ipopt", LagrangeLegendre(4)))
381+
@test psol.sol.u[end] [π, 0, 0, 0]
338382
end

0 commit comments

Comments
 (0)