@@ -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