Skip to content

Commit 73fd26c

Browse files
committed
test: add Pyomo tests
1 parent 0618c2e commit 73fd26c

File tree

1 file changed

+47
-4
lines changed

1 file changed

+47
-4
lines changed

test/extensions/dynamic_optimization.jl

Lines changed: 47 additions & 4 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[]
@@ -58,10 +61,16 @@ const M = ModelingToolkit
5861

5962
cprob = CasADiDynamicOptProblem(
6063
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01)
61-
csol = solve(cprob, CasADiCollocation("ipopt", constructTsitouras5()))
64+
csol = solve(pprob, CasADiCollocation("ipopt", constructTsitouras5()))
6265
@test csol.sol(0.6)[1] 3.5
6366
@test csol.sol(0.3)[1] 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,9 +138,7 @@ 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])
130-
# Test reached final position.
131142
@test (csol.sol.u[end][2], 0.25, rtol = 1e-5)
132143

133144
# Test dynamics
@@ -143,8 +154,15 @@ end
143154
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
144155
@test is_bangbang(isol.input_sol, [-1.0], [1.0])
145156
@test (isol.sol.u[end][2], 0.25, rtol = 1e-5)
157+
158+
pprob = PyomoDynamicOptProblem(block, u0map, tspan, parammap; dt = 0.01)
159+
psol = solve(pprob, PyomoCollocation("ipopt", BackwardEuler()))
160+
@test is_bangbang(psol.input_sol, [-1.0], [1.0])
161+
@test (psol.sol.u[end][2], 0.25, rtol = 1e-5)
162+
146163
osol = solve(oprob, ImplicitEuler(); dt = 0.01, adaptive = false)
147164
@test (isol.sol.u, osol.u, rtol = 0.05)
165+
@test (psol.sol.u, osol.u, rtol = 0.05)
148166

149167
###################
150168
### Bee example ###
@@ -172,6 +190,9 @@ end
172190
cprob = CasADiDynamicOptProblem(beesys, u0map, tspan, pmap; dt = 0.01)
173191
csol = solve(cprob, CasADiCollocation("ipopt", constructTsitouras5()))
174192
@test is_bangbang(csol.input_sol, [0.0], [1.0])
193+
pprob = PyomoDynamicOptProblem(beesys, u0map, tspan, pmap, dt = 0.01)
194+
psol = solve(pprob, PyomoCollocation("ipopt", BackwardEuler()))
195+
@test is_bangbang(psol.input_sol, [0.0], [1.0])
175196

176197
@parameters (α_interp::LinearInterpolation)(..)
177198
eqs = [D(w(t)) ~ -μ * w(t) + b * s * α_interp(t) * w(t),
@@ -186,6 +207,7 @@ end
186207
@test (osol.u, csol.sol.u, rtol = 0.01)
187208
osol2 = solve(oprob, ImplicitEuler(); dt = 0.01, adaptive = false)
188209
@test (osol2.u, isol.sol.u, rtol = 0.01)
210+
@test (osol2.u, psol.sol.u, rtol = 0.01)
189211
end
190212

191213
@testset "Rocket launch" begin
@@ -224,6 +246,10 @@ end
224246
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
225247
@test isol.sol.u[end][1] > 1.012
226248

249+
pprob = PyomoCollocationDynamicOptProblem(rocket, u0map, (ts, te), pmap; dt = 0.001, cse = false)
250+
psol = solve(pprob, PyomoCollocation("ipopt"))
251+
@test psol.sol.u[end][1] > 1.012
252+
227253
# Test solution
228254
@parameters (T_interp::CubicSpline)(..)
229255
eqs = [D(h(t)) ~ v(t),
@@ -240,6 +266,11 @@ end
240266
oprob1 = ODEProblem(rocket_ode, merge(Dict(u0map), Dict(pmap), interpmap1), (ts, te))
241267
osol1 = solve(oprob1, ImplicitEuler(); adaptive = false, dt = 0.001)
242268
@test (isol.sol.u, osol1.u, rtol = 0.01)
269+
270+
interpmap2 = Dict(T_interp => ctrl_to_spline(psol.input_sol, CubicSpline))
271+
oprob2 = ODEProblem(rocket_ode, u0map, (ts, te), merge(Dict(pmap), interpmap2))
272+
osol2 = solve(oprob2, RadauIIA5(); adaptive = false, dt = 0.001)
273+
@test (psol.sol.u, osol2.u, rtol = 0.01)
243274
end
244275

245276
@testset "Free final time problems" begin
@@ -269,6 +300,10 @@ end
269300
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
270301
@test isapprox(isol.sol.t[end], 10.0, rtol = 1e-3)
271302

303+
pprob = PyomoDynamicOptProblem(rocket, u0map, (0, tf), pmap; steps = 201)
304+
psol = solve(pprob, PyomoCollocation("ipopt"))
305+
@test isapprox(psol.sol.t[end], 10.0, rtol = 1e-3)
306+
272307
@variables x(..) v(..)
273308
@variables u(..) [bounds = (-1.0, 1.0), input = true]
274309
@parameters tf
@@ -293,6 +328,10 @@ end
293328
iprob = InfiniteOptDynamicOptProblem(block, u0map, tspan, parammap; steps = 51)
294329
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
295330
@test isapprox(isol.sol.t[end], 2.0, atol = 1e-5)
331+
332+
pprob = PyomoDynamicOptProblem(block, u0map, tspan, parammap; steps = 51)
333+
psol = solve(pprob, PyomoCollocation("ipopt"))
334+
@test isapprox(psol.sol.t[end], 2.0, atol = 1e-5)
296335
end
297336

298337
@testset "Cart-pole problem" begin
@@ -335,4 +374,8 @@ end
335374
iprob = InfiniteOptDynamicOptProblem(cartpole, u0map, tspan, pmap; dt = 0.04)
336375
isol = solve(iprob, InfiniteOptCollocation(Ipopt.Optimizer))
337376
@test isol.sol.u[end] [π, 0, 0, 0]
377+
378+
pprob = PyomoDynamicOptProblem(cartpole, u0map, tspan, pmap; dt = 0.04)
379+
psol = solve(pprob, PyomoCollocation("ipopt", LagrangeLegendre(4)))
380+
@test psol.sol.u[end] [π, 0, 0, 0]
338381
end

0 commit comments

Comments
 (0)