@@ -23,7 +23,7 @@ struct JuMPDynamicOptProblem{uType, tType, isinplace, P, F, K} <:
23
23
u0:: uType
24
24
tspan:: tType
25
25
p:: P
26
- model :: InfiniteOptModel
26
+ wrapped_model :: InfiniteOptModel
27
27
kwargs:: K
28
28
29
29
function JuMPDynamicOptProblem (f, u0, tspan, p, model, kwargs... )
@@ -38,7 +38,7 @@ struct InfiniteOptDynamicOptProblem{uType, tType, isinplace, P, F, K} <:
38
38
u0:: uType
39
39
tspan:: tType
40
40
p:: P
41
- model :: InfiniteOptModel
41
+ wrapped_model :: InfiniteOptModel
42
42
kwargs:: K
43
43
44
44
function InfiniteOptDynamicOptProblem (f, u0, tspan, p, model, kwargs... )
@@ -110,34 +110,10 @@ function MTK.InfiniteOptDynamicOptProblem(sys::System, u0map, tspan, pmap;
110
110
steps = nothing ,
111
111
guesses = Dict (), kwargs... )
112
112
prob = MTK. process_DynamicOptProblem (InfiniteOptDynamicOptProblem, InfiniteOptModel, sys, u0map, tspan, pmap; dt, steps, guesses, kwargs... )
113
- MTK. add_equational_constraints! (prob. model , sys, pmap, tspan)
113
+ MTK. add_equational_constraints! (prob. wrapped_model , sys, pmap, tspan)
114
114
prob
115
115
end
116
116
117
- function MTK. set_variable_bounds! (model:: InfiniteOptModel , sys, pmap, tf)
118
- for (i, u) in enumerate (unknowns (sys))
119
- if MTK. hasbounds (u)
120
- lo, hi = MTK. getbounds (u)
121
- set_lower_bound (model. U[i], Symbolics. fixpoint_sub (lo, pmap))
122
- set_upper_bound (model. U[i], Symbolics. fixpoint_sub (hi, pmap))
123
- end
124
- end
125
-
126
- for (i, v) in enumerate (MTK. unbound_inputs (sys))
127
- if MTK. hasbounds (v)
128
- lo, hi = MTK. getbounds (v)
129
- set_lower_bound (model. V[i], Symbolics. fixpoint_sub (lo, pmap))
130
- set_upper_bound (model. V[i], Symbolics. fixpoint_sub (hi, pmap))
131
- end
132
- end
133
-
134
- if MTK. symbolic_type (tf) === MTK. ScalarSymbolic () && hasbounds (tf)
135
- lo, hi = MTK. getbounds (tf)
136
- set_lower_bound (model. tₛ, lo)
137
- set_upper_bound (model. tₛ, hi)
138
- end
139
- end
140
-
141
117
function MTK. substitute_integral (model, exprs, tspan)
142
118
intmap = Dict ()
143
119
for int in MTK. collect_applied_operators (exprs, Symbolics. Integral)
@@ -191,14 +167,12 @@ end
191
167
192
168
function add_solve_constraints! (prob:: JuMPDynamicOptProblem , tableau)
193
169
@unpack A, α, c = tableau
194
- @unpack model, f, p = prob
195
- t = model. model[:t ]
170
+ @unpack wrapped_model, f, p = prob
171
+ @unpack tₛ, U, V, model = wrapped_model
172
+ t = model[:t ]
196
173
tsteps = supports (t)
197
174
dt = tsteps[2 ] - tsteps[1 ]
198
175
199
- tₛ = model. tₛ
200
- U = model. U
201
- V = model. V
202
176
nᵤ = length (U)
203
177
nᵥ = length (V)
204
178
if MTK. is_explicit (tableau)
@@ -212,22 +186,22 @@ function add_solve_constraints!(prob::JuMPDynamicOptProblem, tableau)
212
186
push! (K, Kₙ)
213
187
end
214
188
ΔU = dt * sum ([α[i] * K[i] for i in 1 : length (α)])
215
- @constraint (model. model , [n = 1 : nᵤ], U[n](τ) + ΔU[n]== U[n](τ + dt),
189
+ @constraint (model, [n = 1 : nᵤ], U[n](τ) + ΔU[n]== U[n](τ + dt),
216
190
base_name= " solve_time_$τ " )
217
191
empty! (K)
218
192
end
219
193
else
220
- @variable (model. model , K[1 : length (α), 1 : nᵤ], Infinite (t ))
194
+ K = @variable (model, K[1 : length (α), 1 : nᵤ], Infinite (model[ :t ] ))
221
195
ΔUs = A * K
222
196
ΔU_tot = dt * (K' * α)
223
197
for τ in tsteps[1 : end - 1 ]
224
198
for (i, h) in enumerate (c)
225
199
ΔU = @view ΔUs[i, :]
226
- Uₙ = U + ΔU * h * dt
227
- @constraint (model. model , [j = 1 : nᵤ], K[i, j]== (tₛ * f (Uₙ, V, p, τ + h * dt)[j]),
200
+ Uₙ = U + ΔU * dt
201
+ @constraint (model, [j = 1 : nᵤ], K[i, j]== (tₛ * f (Uₙ, V, p, τ + h * dt)[j]),
228
202
DomainRestrictions (t => τ), base_name= " solve_K$i ($τ )" )
229
203
end
230
- @constraint (model. model , [n = 1 : nᵤ], U[n](τ) + ΔU_tot[n]== U[n](min (τ + dt, tsteps[end ])),
204
+ @constraint (model, [n = 1 : nᵤ], U[n](τ) + ΔU_tot[n]== U[n](min (τ + dt, tsteps[end ])),
231
205
DomainRestrictions (t => τ), base_name= " solve_U($τ )" )
232
206
end
233
207
end
256
230
MTK. InfiniteOptCollocation (solver, derivative_method = InfiniteOpt. FiniteDifference (InfiniteOpt. Backward ())) = InfiniteOptCollocation (solver, derivative_method)
257
231
258
232
function MTK. prepare_and_optimize! (prob:: JuMPDynamicOptProblem , solver:: JuMPCollocation ; verbose = false , kwargs... )
259
- model = prob. model . model
233
+ model = prob. wrapped_model . model
260
234
verbose || set_silent (model)
261
235
# Unregister current solver constraints
262
236
for con in all_constraints (model)
@@ -278,7 +252,7 @@ function MTK.prepare_and_optimize!(prob::JuMPDynamicOptProblem, solver::JuMPColl
278
252
end
279
253
280
254
function MTK. prepare_and_optimize! (prob:: InfiniteOptDynamicOptProblem , solver:: InfiniteOptCollocation ; verbose = false , kwargs... )
281
- model = prob. model . model
255
+ model = prob. wrapped_model . model
282
256
verbose || set_silent (model)
283
257
set_derivative_method (model[:t ], solver. derivative_method)
284
258
set_optimizer (model, solver. solver)
0 commit comments