@@ -11,6 +11,8 @@ using Pyomo
1111import DiffEqBase: solve
1212const M = ModelingToolkit
1313
14+ const ENABLE_CASADI = VERSION >= v " 1.11"
15+
1416@testset " ODE Solution, no cost" begin
1517 # Test solving without anything attached.
1618 @parameters α= 1.5 β= 1.0 γ= 3.0 δ= 1.0
@@ -31,10 +33,13 @@ const M = ModelingToolkit
3133 jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRK4 ()))
3234 oprob = ODEProblem (sys, [u0map; parammap], tspan)
3335 osol = solve (oprob, SimpleRK4 (), dt = 0.01 )
34- cprob = CasADiDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
35- csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
36+
3637 @test jsol. sol. u ≈ osol. u
37- @test csol. sol. u ≈ osol. u
38+ if ENABLE_CASADI
39+ cprob = CasADiDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
40+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
41+ @test csol. sol. u ≈ osol. u
42+ end
3843
3944 # Implicit method.
4045 osol2 = solve (oprob, ImplicitEuler (), dt = 0.01 , adaptive = false )
@@ -43,8 +48,10 @@ const M = ModelingToolkit
4348 iprob = InfiniteOptDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
4449 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
4550 @test ≈ (isol. sol. u, osol2. u, rtol = 0.001 )
46- csol2 = solve (cprob, CasADiCollocation (" ipopt" , constructImplicitEuler ()))
47- @test ≈ (csol2. sol. u, osol2. u, rtol = 0.001 )
51+ if ENABLE_CASADI
52+ csol2 = solve (cprob, CasADiCollocation (" ipopt" , constructImplicitEuler ()))
53+ @test ≈ (csol2. sol. u, osol2. u, rtol = 0.001 )
54+ end
4855 pprob = PyomoDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
4956 psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
5057 @test all ([≈ (psol. sol (t), osol2 (t), rtol = 1e-2 ) for t in 0.0 : 0.01 : 1.0 ])
@@ -61,11 +68,13 @@ const M = ModelingToolkit
6168 @test jsol. sol (0.6 ; idxs = x (t)) ≈ 3.5
6269 @test jsol. sol (0.3 ; idxs = x (t)) ≈ 7.0
6370
64- cprob = CasADiDynamicOptProblem (
65- lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
66- csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
67- @test csol. sol (0.6 ; idxs = x (t)) ≈ 3.5
68- @test csol. sol (0.3 ; idxs = x (t)) ≈ 7.0
71+ if ENABLE_CASADI
72+ cprob = CasADiDynamicOptProblem (
73+ lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
74+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
75+ @test csol. sol (0.6 ; idxs = x (t)) ≈ 3.5
76+ @test csol. sol (0.3 ; idxs = x (t)) ≈ 7.0
77+ end
6978
7079 pprob = PyomoDynamicOptProblem (
7180 lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
@@ -100,10 +109,12 @@ const M = ModelingToolkit
100109 psol = solve (pprob, PyomoCollocation (" ipopt" , MidpointEuler ()))
101110 @test all (u -> u > [1 , 1 ], psol. sol. u)
102111
103- cprob = CasADiDynamicOptProblem (
104- lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
105- csol = solve (cprob, CasADiCollocation (" ipopt" , constructRadauIA3 ()))
106- @test all (u -> u > [1 , 1 ], csol. sol. u)
112+ if ENABLE_CASADI
113+ cprob = CasADiDynamicOptProblem (
114+ lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
115+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructRadauIA3 ()))
116+ @test all (u -> u > [1 , 1 ], csol. sol. u)
117+ end
107118end
108119
109120function is_bangbang (input_sol, lbounds, ubounds, rtol = 1e-4 )
@@ -143,11 +154,13 @@ end
143154 # Test reached final position.
144155 @test ≈ (jsol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
145156
146- cprob = CasADiDynamicOptProblem (block, [u0map; parammap], tspan; dt = 0.01 )
147- csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
148- @test is_bangbang (csol. input_sol, [- 1.0 ], [1.0 ])
149- # Test reached final position.
150- @test ≈ (csol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
157+ if ENABLE_CASADI
158+ cprob = CasADiDynamicOptProblem (block, [u0map; parammap], tspan; dt = 0.01 )
159+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
160+ @test is_bangbang (csol. input_sol, [- 1.0 ], [1.0 ])
161+ # Test reached final position.
162+ @test ≈ (csol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
163+ end
151164
152165 # Test dynamics
153166 @parameters (u_interp:: ConstantInterpolation )(.. )
156169 oprob = ODEProblem (block_ode, [u0map; [u_interp => spline]], tspan)
157170 osol = solve (oprob, Vern8 (), dt = 0.01 , adaptive = false )
158171 @test ≈ (jsol. sol. u, osol. u, rtol = 0.05 )
159- @test ≈ (csol. sol. u, osol. u, rtol = 0.05 )
172+ if ENABLE_CASADI
173+ @test ≈ (csol. sol. u, osol. u, rtol = 0.05 )
174+ end
160175
161176 iprob = InfiniteOptDynamicOptProblem (block, [u0map; parammap], tspan; dt = 0.01 )
162177 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
196211 iprob = InfiniteOptDynamicOptProblem (beesys, [u0map; pmap], tspan, dt = 0.01 )
197212 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
198213 @test is_bangbang (isol. input_sol, [0.0 ], [1.0 ])
199- cprob = CasADiDynamicOptProblem (beesys, [u0map; pmap], tspan; dt = 0.01 )
200- csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
201- @test is_bangbang (csol. input_sol, [0.0 ], [1.0 ])
214+ if ENABLE_CASADI
215+ cprob = CasADiDynamicOptProblem (beesys, [u0map; pmap], tspan; dt = 0.01 )
216+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
217+ @test is_bangbang (csol. input_sol, [0.0 ], [1.0 ])
218+ end
202219 pprob = PyomoDynamicOptProblem (beesys, [u0map; pmap], tspan, dt = 0.01 )
203220 psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
204221 @test is_bangbang (psol. input_sol, [0.0 ], [1.0 ])
213230 tspan)
214231 osol = solve (oprob, Tsit5 (); dt = 0.01 , adaptive = false )
215232 @test ≈ (osol. u, jsol. sol. u, rtol = 0.01 )
216- @test ≈ (osol. u, csol. sol. u, rtol = 0.01 )
233+ if ENABLE_CASADI
234+ @test ≈ (osol. u, csol. sol. u, rtol = 0.01 )
235+ end
217236 osol2 = solve (oprob, ImplicitEuler (); dt = 0.01 , adaptive = false )
218237 @test ≈ (osol2. u, isol. sol. u, rtol = 0.01 )
219238 @test all ([≈ (psol. sol (t), osol2 (t), rtol = 0.01 ) for t in 0.0 : 0.01 : 4.0 ])
@@ -246,10 +265,12 @@ end
246265 jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRadauIIA5 ()))
247266 @test jsol. sol[h (t)][end ] > 1.012
248267
249- cprob = CasADiDynamicOptProblem (
250- rocket, [u0map; pmap], (ts, te); dt = 0.001 , cse = false )
251- csol = solve (cprob, CasADiCollocation (" ipopt" ))
252- @test csol. sol[h (t)][end ] > 1.012
268+ if ENABLE_CASADI
269+ cprob = CasADiDynamicOptProblem (
270+ rocket, [u0map; pmap], (ts, te); dt = 0.001 , cse = false )
271+ csol = solve (cprob, CasADiCollocation (" ipopt" ))
272+ @test csol. sol[h (t)][end ] > 1.012
273+ end
253274
254275 iprob = InfiniteOptDynamicOptProblem (rocket, [u0map; pmap], (ts, te); dt = 0.001 )
255276 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
269290 oprob = ODEProblem (rocket_ode, merge (Dict (u0map), Dict (pmap), interpmap), (ts, te))
270291 osol = solve (oprob, RadauIIA5 (); adaptive = false , dt = 0.001 )
271292 @test ≈ (jsol. sol. u, osol. u, rtol = 0.02 )
272- @test ≈ (csol. sol. u, osol. u, rtol = 0.02 )
293+ if ENABLE_CASADI
294+ @test ≈ (csol. sol. u, osol. u, rtol = 0.02 )
295+ end
273296
274297 interpmap1 = Dict (T_interp => ctrl_to_spline (isol. input_sol, CubicSpline))
275298 oprob1 = ODEProblem (rocket_ode, merge (Dict (u0map), Dict (pmap), interpmap1), (ts, te))
@@ -302,10 +325,12 @@ end
302325 @test isapprox (jsol. sol. t[end ], 10.0 , rtol = 1e-3 )
303326 @test ≈ (M. objective_value (jsol), - 92.75 , atol = 0.25 )
304327
305- cprob = CasADiDynamicOptProblem (rocket, [u0map; pmap], (0 , tf); steps = 201 )
306- csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
307- @test isapprox (csol. sol. t[end ], 10.0 , rtol = 1e-3 )
308- @test ≈ (M. objective_value (csol), - 92.75 , atol = 0.25 )
328+ if ENABLE_CASADI
329+ cprob = CasADiDynamicOptProblem (rocket, [u0map; pmap], (0 , tf); steps = 201 )
330+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
331+ @test isapprox (csol. sol. t[end ], 10.0 , rtol = 1e-3 )
332+ @test ≈ (M. objective_value (csol), - 92.75 , atol = 0.25 )
333+ end
309334
310335 iprob = InfiniteOptDynamicOptProblem (rocket, [u0map; pmap], (0 , tf); steps = 200 )
311336 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
334359 jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructVerner8 ()))
335360 @test isapprox (jsol. sol. t[end ], 2.0 , atol = 1e-5 )
336361
337- cprob = CasADiDynamicOptProblem (block, [u0map; parammap], (0 , tf); steps = 51 )
338- csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
339- @test isapprox (csol. sol. t[end ], 2.0 , atol = 1e-5 )
362+ if ENABLE_CASADI
363+ cprob = CasADiDynamicOptProblem (block, [u0map; parammap], (0 , tf); steps = 51 )
364+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
365+ @test isapprox (csol. sol. t[end ], 2.0 , atol = 1e-5 )
366+ end
340367
341368 iprob = InfiniteOptDynamicOptProblem (block, [u0map; parammap], tspan; steps = 51 )
342369 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer), verbose = true )
380407 jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRK4 ()))
381408 @test jsol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
382409
383- cprob = CasADiDynamicOptProblem (cartpole, [u0map; pmap], tspan; dt = 0.04 )
384- csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
385- @test csol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
410+ if ENABLE_CASADI
411+ cprob = CasADiDynamicOptProblem (cartpole, [u0map; pmap], tspan; dt = 0.04 )
412+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
413+ @test csol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
414+ end
386415
387416 iprob = InfiniteOptDynamicOptProblem (cartpole, [u0map; pmap], tspan; dt = 0.04 )
388417 isol = solve (iprob,
0 commit comments