@@ -48,26 +48,32 @@ struct InfiniteOptDynamicOptProblem{uType, tType, isinplace, P, F, K} <:
4848end
4949
5050MTK. generate_internal_model (m:: Type{InfiniteOptModel} ) = InfiniteModel ()
51- MTK. generate_time_variable! (m:: InfiniteModel , tspan, tsteps) = @infinite_parameter (m, t in [tspan[1 ], tspan[2 ]], num_supports = length (tsteps))
52- MTK. generate_state_variable! (m:: InfiniteModel , u0:: Vector , ns, ts) = @variable (m, U[i = 1 : ns], Infinite (m[:t ]), start= u0[i])
53- MTK. generate_input_variable! (m:: InfiniteModel , c0, nc, ts) = @variable (m, V[i = 1 : nc], Infinite (m[:t ]), start= c0[i])
51+ function MTK. generate_time_variable! (m:: InfiniteModel , tspan, tsteps)
52+ @infinite_parameter (m, t in [tspan[1 ], tspan[2 ]], num_supports= length (tsteps))
53+ end
54+ function MTK. generate_state_variable! (m:: InfiniteModel , u0:: Vector , ns, ts)
55+ @variable (m, U[i = 1 : ns], Infinite (m[:t ]), start= u0[i])
56+ end
57+ function MTK. generate_input_variable! (m:: InfiniteModel , c0, nc, ts)
58+ @variable (m, V[i = 1 : nc], Infinite (m[:t ]), start= c0[i])
59+ end
5460
5561function MTK. generate_timescale! (m:: InfiniteModel , guess, is_free_t)
56- @variable (m, tₛ ≥ 0 , start = guess)
62+ @variable (m, tₛ≥ 0 , start= guess)
5763 if ! is_free_t
58- fix (tₛ, 1 , force= true )
64+ fix (tₛ, 1 , force = true )
5965 set_start_value (tₛ, 1 )
6066 end
6167 tₛ
6268end
6369
64- function MTK. add_constraint! (m:: InfiniteOptModel , expr:: Union{Equation, Inequality} )
70+ function MTK. add_constraint! (m:: InfiniteOptModel , expr:: Union{Equation, Inequality} )
6571 if expr isa Equation
66- @constraint (m. model, expr. lhs - expr. rhs == 0 )
72+ @constraint (m. model, expr. lhs - expr. rhs== 0 )
6773 elseif expr. relational_op === Symbolics. geq
68- @constraint (m. model, expr. lhs - expr. rhs ≥ 0 )
74+ @constraint (m. model, expr. lhs - expr. rhs≥ 0 )
6975 else
70- @constraint (m. model, expr. lhs - expr. rhs ≤ 0 )
76+ @constraint (m. model, expr. lhs - expr. rhs≤ 0 )
7177 end
7278end
7379MTK. set_objective! (m:: InfiniteOptModel , expr) = @objective (m. model, Min, expr)
@@ -76,20 +82,25 @@ function MTK.JuMPDynamicOptProblem(sys::System, op, tspan;
7682 dt = nothing ,
7783 steps = nothing ,
7884 guesses = Dict (), kwargs... )
79- prob, _ = MTK. process_DynamicOptProblem (JuMPDynamicOptProblem, InfiniteOptModel, sys, op, tspan; dt, steps, guesses, kwargs... )
85+ prob, _ = MTK. process_DynamicOptProblem (JuMPDynamicOptProblem, InfiniteOptModel, sys,
86+ op, tspan; dt, steps, guesses, kwargs... )
8087 prob
8188end
8289
8390function MTK. InfiniteOptDynamicOptProblem (sys:: System , op, tspan;
8491 dt = nothing ,
8592 steps = nothing ,
8693 guesses = Dict (), kwargs... )
87- prob, pmap = MTK. process_DynamicOptProblem (InfiniteOptDynamicOptProblem, InfiniteOptModel, sys, op, tspan; dt, steps, guesses, kwargs... )
94+ prob, pmap = MTK. process_DynamicOptProblem (
95+ InfiniteOptDynamicOptProblem, InfiniteOptModel,
96+ sys, op, tspan; dt, steps, guesses, kwargs... )
8897 MTK. add_equational_constraints! (prob. wrapped_model, sys, pmap, tspan)
8998 prob
9099end
91100
92- MTK. lowered_integral (model:: InfiniteOptModel , expr, lo, hi) = model. tₛ * InfiniteOpt.∫ (expr, model. model[:t ], lo, hi)
101+ function MTK. lowered_integral (model:: InfiniteOptModel , expr, lo, hi)
102+ model. tₛ * InfiniteOpt.∫ (expr, model. model[:t ], lo, hi)
103+ end
93104MTK. lowered_derivative (model:: InfiniteOptModel , i) = ∂ (model. U[i], model. model[:t ])
94105
95106function MTK. process_integral_bounds (model:: InfiniteOptModel , integral_span, tspan)
@@ -125,7 +136,7 @@ function add_solve_constraints!(prob::JuMPDynamicOptProblem, tableau)
125136 nᵥ = length (V)
126137 if MTK. is_explicit (tableau)
127138 K = Any[]
128- for τ in tsteps[1 : end - 1 ]
139+ for τ in tsteps[1 : ( end - 1 ) ]
129140 for (i, h) in enumerate (c)
130141 ΔU = sum ([A[i, j] * K[j] for j in 1 : (i - 1 )], init = zeros (nᵤ))
131142 Uₙ = [U[i](τ) + ΔU[i] * dt for i in 1 : nᵤ]
@@ -142,14 +153,15 @@ function add_solve_constraints!(prob::JuMPDynamicOptProblem, tableau)
142153 K = @variable (model, K[1 : length (α), 1 : nᵤ], Infinite (model[:t ]))
143154 ΔUs = A * K
144155 ΔU_tot = dt * (K' * α)
145- for τ in tsteps[1 : end - 1 ]
156+ for τ in tsteps[1 : ( end - 1 ) ]
146157 for (i, h) in enumerate (c)
147158 ΔU = @view ΔUs[i, :]
148159 Uₙ = U + ΔU * dt
149160 @constraint (model, [j = 1 : nᵤ], K[i, j]== (tₛ * f (Uₙ, V, p, τ + h * dt)[j]),
150161 DomainRestrictions (t => τ), base_name= " solve_K$i ($τ )" )
151162 end
152- @constraint (model, [n = 1 : nᵤ], U[n](τ) + ΔU_tot[n]== U[n](min (τ + dt, tsteps[end ])),
163+ @constraint (model,
164+ [n = 1 : nᵤ], U[n](τ) + ΔU_tot[n]== U[n](min (τ + dt, tsteps[end ])),
153165 DomainRestrictions (t => τ), base_name= " solve_U($τ )" )
154166 end
155167 end
@@ -159,15 +171,21 @@ struct JuMPCollocation <: AbstractCollocation
159171 solver:: Any
160172 tableau:: DiffEqBase.ODERKTableau
161173end
162- MTK. JuMPCollocation (solver, tableau = MTK. constructDefault ()) = JuMPCollocation (solver, tableau)
174+ function MTK. JuMPCollocation (solver, tableau = MTK. constructDefault ())
175+ JuMPCollocation (solver, tableau)
176+ end
163177
164178struct InfiniteOptCollocation <: AbstractCollocation
165179 solver:: Any
166180 derivative_method:: InfiniteOpt.AbstractDerivativeMethod
167181end
168- MTK. InfiniteOptCollocation (solver, derivative_method = InfiniteOpt. FiniteDifference (InfiniteOpt. Backward ())) = InfiniteOptCollocation (solver, derivative_method)
182+ function MTK. InfiniteOptCollocation (
183+ solver, derivative_method = InfiniteOpt. FiniteDifference (InfiniteOpt. Backward ()))
184+ InfiniteOptCollocation (solver, derivative_method)
185+ end
169186
170- function MTK. prepare_and_optimize! (prob:: JuMPDynamicOptProblem , solver:: JuMPCollocation ; verbose = false , kwargs... )
187+ function MTK. prepare_and_optimize! (
188+ prob:: JuMPDynamicOptProblem , solver:: JuMPCollocation ; verbose = false , kwargs... )
171189 model = prob. wrapped_model. model
172190 verbose || set_silent (model)
173191 # Unregister current solver constraints
@@ -190,7 +208,8 @@ function MTK.prepare_and_optimize!(prob::JuMPDynamicOptProblem, solver::JuMPColl
190208 model
191209end
192210
193- function MTK. prepare_and_optimize! (prob:: InfiniteOptDynamicOptProblem , solver:: InfiniteOptCollocation ; verbose = false , kwargs... )
211+ function MTK. prepare_and_optimize! (prob:: InfiniteOptDynamicOptProblem ,
212+ solver:: InfiniteOptCollocation ; verbose = false , kwargs... )
194213 model = prob. wrapped_model. model
195214 verbose || set_silent (model)
196215 set_derivative_method (model[:t ], solver. derivative_method)
@@ -223,8 +242,8 @@ function MTK.successful_solve(model::InfiniteModel)
223242 error (" Model not solvable; please report this to github.com/SciML/ModelingToolkit.jl with a MWE." )
224243
225244 pstatus === FEASIBLE_POINT &&
226- (tstatus === OPTIMAL || tstatus === LOCALLY_SOLVED || tstatus === ALMOST_OPTIMAL ||
227- tstatus === ALMOST_LOCALLY_SOLVED)
245+ (tstatus === OPTIMAL || tstatus === LOCALLY_SOLVED || tstatus === ALMOST_OPTIMAL ||
246+ tstatus === ALMOST_LOCALLY_SOLVED)
228247end
229248
230249import InfiniteOpt: JuMP, GeneralVariableRef
0 commit comments