@@ -48,26 +48,32 @@ struct InfiniteOptDynamicOptProblem{uType, tType, isinplace, P, F, K} <:
48
48
end
49
49
50
50
MTK. 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
54
60
55
61
function MTK. generate_timescale! (m:: InfiniteModel , guess, is_free_t)
56
- @variable (m, tₛ ≥ 0 , start = guess)
62
+ @variable (m, tₛ≥ 0 , start= guess)
57
63
if ! is_free_t
58
- fix (tₛ, 1 , force= true )
64
+ fix (tₛ, 1 , force = true )
59
65
set_start_value (tₛ, 1 )
60
66
end
61
67
tₛ
62
68
end
63
69
64
- function MTK. add_constraint! (m:: InfiniteOptModel , expr:: Union{Equation, Inequality} )
70
+ function MTK. add_constraint! (m:: InfiniteOptModel , expr:: Union{Equation, Inequality} )
65
71
if expr isa Equation
66
- @constraint (m. model, expr. lhs - expr. rhs == 0 )
72
+ @constraint (m. model, expr. lhs - expr. rhs== 0 )
67
73
elseif expr. relational_op === Symbolics. geq
68
- @constraint (m. model, expr. lhs - expr. rhs ≥ 0 )
74
+ @constraint (m. model, expr. lhs - expr. rhs≥ 0 )
69
75
else
70
- @constraint (m. model, expr. lhs - expr. rhs ≤ 0 )
76
+ @constraint (m. model, expr. lhs - expr. rhs≤ 0 )
71
77
end
72
78
end
73
79
MTK. set_objective! (m:: InfiniteOptModel , expr) = @objective (m. model, Min, expr)
@@ -76,20 +82,25 @@ function MTK.JuMPDynamicOptProblem(sys::System, op, tspan;
76
82
dt = nothing ,
77
83
steps = nothing ,
78
84
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... )
80
87
prob
81
88
end
82
89
83
90
function MTK. InfiniteOptDynamicOptProblem (sys:: System , op, tspan;
84
91
dt = nothing ,
85
92
steps = nothing ,
86
93
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... )
88
97
MTK. add_equational_constraints! (prob. wrapped_model, sys, pmap, tspan)
89
98
prob
90
99
end
91
100
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
93
104
MTK. lowered_derivative (model:: InfiniteOptModel , i) = ∂ (model. U[i], model. model[:t ])
94
105
95
106
function MTK. process_integral_bounds (model:: InfiniteOptModel , integral_span, tspan)
@@ -125,7 +136,7 @@ function add_solve_constraints!(prob::JuMPDynamicOptProblem, tableau)
125
136
nᵥ = length (V)
126
137
if MTK. is_explicit (tableau)
127
138
K = Any[]
128
- for τ in tsteps[1 : end - 1 ]
139
+ for τ in tsteps[1 : ( end - 1 ) ]
129
140
for (i, h) in enumerate (c)
130
141
ΔU = sum ([A[i, j] * K[j] for j in 1 : (i - 1 )], init = zeros (nᵤ))
131
142
Uₙ = [U[i](τ) + ΔU[i] * dt for i in 1 : nᵤ]
@@ -142,14 +153,15 @@ function add_solve_constraints!(prob::JuMPDynamicOptProblem, tableau)
142
153
K = @variable (model, K[1 : length (α), 1 : nᵤ], Infinite (model[:t ]))
143
154
ΔUs = A * K
144
155
ΔU_tot = dt * (K' * α)
145
- for τ in tsteps[1 : end - 1 ]
156
+ for τ in tsteps[1 : ( end - 1 ) ]
146
157
for (i, h) in enumerate (c)
147
158
ΔU = @view ΔUs[i, :]
148
159
Uₙ = U + ΔU * dt
149
160
@constraint (model, [j = 1 : nᵤ], K[i, j]== (tₛ * f (Uₙ, V, p, τ + h * dt)[j]),
150
161
DomainRestrictions (t => τ), base_name= " solve_K$i ($τ )" )
151
162
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 ])),
153
165
DomainRestrictions (t => τ), base_name= " solve_U($τ )" )
154
166
end
155
167
end
@@ -159,15 +171,21 @@ struct JuMPCollocation <: AbstractCollocation
159
171
solver:: Any
160
172
tableau:: DiffEqBase.ODERKTableau
161
173
end
162
- MTK. JuMPCollocation (solver, tableau = MTK. constructDefault ()) = JuMPCollocation (solver, tableau)
174
+ function MTK. JuMPCollocation (solver, tableau = MTK. constructDefault ())
175
+ JuMPCollocation (solver, tableau)
176
+ end
163
177
164
178
struct InfiniteOptCollocation <: AbstractCollocation
165
179
solver:: Any
166
180
derivative_method:: InfiniteOpt.AbstractDerivativeMethod
167
181
end
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
169
186
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... )
171
189
model = prob. wrapped_model. model
172
190
verbose || set_silent (model)
173
191
# Unregister current solver constraints
@@ -190,7 +208,8 @@ function MTK.prepare_and_optimize!(prob::JuMPDynamicOptProblem, solver::JuMPColl
190
208
model
191
209
end
192
210
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... )
194
213
model = prob. wrapped_model. model
195
214
verbose || set_silent (model)
196
215
set_derivative_method (model[:t ], solver. derivative_method)
@@ -223,8 +242,8 @@ function MTK.successful_solve(model::InfiniteModel)
223
242
error (" Model not solvable; please report this to github.com/SciML/ModelingToolkit.jl with a MWE." )
224
243
225
244
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)
228
247
end
229
248
230
249
import InfiniteOpt: JuMP, GeneralVariableRef
0 commit comments