Skip to content

Commit 0c8642a

Browse files
committed
added let block for nonlinmpc
1 parent 440dbca commit 0c8642a

File tree

1 file changed

+38
-36
lines changed

1 file changed

+38
-36
lines changed

src/controller/nonlinmpc.jl

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -204,47 +204,49 @@ function init_optimization!(mpc::NonLinMPC)
204204
b = con.b[con.i_b]
205205
@constraint(optim, linconstraint, A*ΔŨvar .≤ b)
206206
# --- nonlinear optimization init ---
207-
model = mpc.estim.model
208-
last_ΔŨtup, C, Ŷ = nothing, nothing, nothing
209-
last_dΔŨtup, dC, dŶ = nothing, nothing, nothing
210-
function Jfunc(ΔŨtup::Float64...)
211-
ΔŨ = collect(ΔŨtup)
212-
if ΔŨtup !== last_ΔŨtup
213-
= predict(mpc, model, ΔŨ)
214-
C = con_nonlinprog(mpc, model, Ŷ, ΔŨ)
215-
last_ΔŨtup = ΔŨtup
216-
end
217-
return obj_nonlinprog(mpc, model, Ŷ, ΔŨ)
218-
end
219-
function Jfunc(dΔŨtup::T...) where {T<:Real}
220-
dΔŨ = collect(dΔŨtup)
221-
if dΔŨtup !== last_dΔŨtup
222-
dŶ = predict(mpc, model, dΔŨ)
223-
dC = con_nonlinprog(mpc, model, dŶ, dΔŨ)
224-
last_dΔŨtup = dΔŨtup
225-
end
226-
return obj_nonlinprog(mpc, model, dŶ, dΔŨ)
227-
end
228-
function con_nonlinprog_i(i, ΔŨtup::NTuple{N, Float64}) where {N}
229-
if ΔŨtup !== last_ΔŨtup
207+
ncon = length(mpc.con.Ŷmin) + length(mpc.con.Ŷmax)
208+
Jfunc, Cfunc = let mpc=mpc, model=mpc.estim.model, nvar=nvar, ncon=ncon
209+
last_ΔŨtup, C, Ŷ = nothing, nothing, nothing
210+
last_dΔŨtup, dC, dŶ = nothing, nothing, nothing
211+
function Jfunc(ΔŨtup::Float64...)
230212
ΔŨ = collect(ΔŨtup)
231-
= predict(mpc, model, ΔŨ)
232-
C = con_nonlinprog(mpc, model, Ŷ, ΔŨ)
233-
last_ΔŨtup = ΔŨtup
213+
if ΔŨtup !== last_ΔŨtup
214+
= predict(mpc, model, ΔŨ)
215+
C = con_nonlinprog(mpc, model, Ŷ, ΔŨ)
216+
last_ΔŨtup = ΔŨtup
217+
end
218+
return obj_nonlinprog(mpc, model, Ŷ, ΔŨ)
234219
end
235-
return C[i]
236-
end
237-
function con_nonlinprog_i(i, dΔŨtup::NTuple{N, T}) where {N, T<:Real}
238-
if dΔŨtup !== last_dΔŨtup
220+
function Jfunc(dΔŨtup::T...) where {T<:Real}
239221
dΔŨ = collect(dΔŨtup)
240-
dŶ = predict(mpc, model, dΔŨ)
241-
dC = con_nonlinprog(mpc, model, dŶ, dΔŨ)
242-
last_dΔŨtup = dΔŨtup
222+
if dΔŨtup !== last_dΔŨtup
223+
dŶ = predict(mpc, model, dΔŨ)
224+
dC = con_nonlinprog(mpc, model, dŶ, dΔŨ)
225+
last_dΔŨtup = dΔŨtup
226+
end
227+
return obj_nonlinprog(mpc, model, dŶ, dΔŨ)
228+
end
229+
function con_nonlinprog_i(i, ΔŨtup::NTuple{N, Float64}) where {N}
230+
if ΔŨtup !== last_ΔŨtup
231+
ΔŨ = collect(ΔŨtup)
232+
= predict(mpc, model, ΔŨ)
233+
C = con_nonlinprog(mpc, model, Ŷ, ΔŨ)
234+
last_ΔŨtup = ΔŨtup
235+
end
236+
return C[i]
243237
end
244-
return dC[i]
238+
function con_nonlinprog_i(i, dΔŨtup::NTuple{N, T}) where {N, T<:Real}
239+
if dΔŨtup !== last_dΔŨtup
240+
dΔŨ = collect(dΔŨtup)
241+
dŶ = predict(mpc, model, dΔŨ)
242+
dC = con_nonlinprog(mpc, model, dŶ, dΔŨ)
243+
last_dΔŨtup = dΔŨtup
244+
end
245+
return dC[i]
246+
end
247+
Cfunc = [(ΔŨ...) -> con_nonlinprog_i(i, ΔŨ) for i in 1:ncon]
248+
(Jfunc, Cfunc)
245249
end
246-
ncon = length(mpc.con.Ŷmin) + length(mpc.con.Ŷmax)
247-
Cfunc = [(ΔŨ...) -> con_nonlinprog_i(i, ΔŨ) for i in 1:ncon]
248250
register(optim, :Jfunc, nvar, Jfunc, autodiff=true)
249251
@NLobjective(optim, Min, Jfunc(ΔŨvar...))
250252
n = 0

0 commit comments

Comments
 (0)