@@ -481,10 +481,10 @@ function init_optimization!(mpc::NonLinMPC, model::SimModel, optim)
481481 JuMP. set_attribute (optim, " nlp_scaling_max_gradient" , 10.0 / C)
482482 end
483483 end
484- Jfunc, gfunc = get_optim_functions (mpc, mpc. optim)
484+ Jfunc, gfuncs = get_optim_functions (mpc, mpc. optim)
485485 @operator (optim, J, nΔŨ, Jfunc)
486486 @objective (optim, Min, J (ΔŨvar... ))
487- init_nonlincon! (mpc, model, gfunc )
487+ init_nonlincon! (mpc, model, gfuncs )
488488 set_nonlincon! (mpc, model, mpc. optim)
489489 return nothing
490490end
@@ -532,7 +532,7 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
532532 end
533533 return nothing
534534 end
535- function Jfunc (ΔŨtup:: T... ) where T<: Real
535+ function Jfunc (ΔŨtup:: Vararg{T, N} ) where {N, T<: Real }
536536 ΔŨ1 = ΔŨtup[begin ]
537537 ΔŨ = get_tmp (ΔŨ_cache, ΔŨ1)
538538 update_simulations! (ΔŨ, ΔŨtup)
@@ -547,51 +547,58 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
547547 g = get_tmp (g_cache, ΔŨ1)
548548 return g[i]:: T
549549 end
550- gfunc = [(ΔŨ... ) -> gfunc_i (i, ΔŨ) for i in 1 : ng]
551- return Jfunc, gfunc
550+ gfuncs = Vector {Function} (undef, ng)
551+ for i in 1 : ng
552+ # this is another syntax for anonymous function, allowing parameters T and N:
553+ gfuncs[i] = function (ΔŨtup:: Vararg{T, N} ) where {N, T<: Real }
554+ return gfunc_i (i, ΔŨtup)
555+ end
556+ end
557+ # gfunc = [(ΔŨ::Vararg{T, N}) -> gfunc_i(i, ΔŨ) where {N, T<:Real} for i in 1:ng]
558+ return Jfunc, gfuncs
552559end
553560
554- function init_nonlincon! (mpc:: NonLinMPC , :: LinModel , gfunc :: Vector{<:Function} )
561+ function init_nonlincon! (mpc:: NonLinMPC , :: LinModel , gfuncs :: Vector{<:Function} )
555562 optim, con = mpc. optim, mpc. con
556563 nΔŨ = length (mpc. ΔŨ)
557564 if length (con. i_g) ≠ 0
558565 i_base = 0
559566 for i in 1 : con. nc
560567 name = Symbol (" g_c_$i " )
561- optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfunc [i_base+ i]; name)
568+ optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfuncs [i_base+ i]; name)
562569 end
563570 end
564571 return nothing
565572end
566573
567- function init_nonlincon! (mpc:: NonLinMPC , :: NonLinModel , gfunc :: Vector{<:Function} )
574+ function init_nonlincon! (mpc:: NonLinMPC , :: NonLinModel , gfuncs :: Vector{<:Function} )
568575 optim, con = mpc. optim, mpc. con
569576 ny, nx̂, Hp, nΔŨ = mpc. estim. model. ny, mpc. estim. nx̂, mpc. Hp, length (mpc. ΔŨ)
570577 if length (con. i_g) ≠ 0
571578 i_base = 0
572579 for i in eachindex (con. Y0min)
573580 name = Symbol (" g_Y0min_$i " )
574- optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfunc [i_base+ i]; name)
581+ optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfuncs [i_base+ i]; name)
575582 end
576583 i_base = 1 Hp* ny
577584 for i in eachindex (con. Y0max)
578585 name = Symbol (" g_Y0max_$i " )
579- optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfunc [i_base+ i]; name)
586+ optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfuncs [i_base+ i]; name)
580587 end
581588 i_base = 2 Hp* ny
582589 for i in eachindex (con. x̂0min)
583590 name = Symbol (" g_x̂0min_$i " )
584- optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfunc [i_base+ i]; name)
591+ optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfuncs [i_base+ i]; name)
585592 end
586593 i_base = 2 Hp* ny + nx̂
587594 for i in eachindex (con. x̂0max)
588595 name = Symbol (" g_x̂0max_$i " )
589- optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfunc [i_base+ i]; name)
596+ optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfuncs [i_base+ i]; name)
590597 end
591598 i_base = 2 Hp* ny + 2 nx̂
592599 for i in 1 : con. nc
593600 name = Symbol (" g_c_$i " )
594- optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfunc [i_base+ i]; name)
601+ optim[name] = JuMP. add_nonlinear_operator (optim, nΔŨ, gfuncs [i_base+ i]; name)
595602 end
596603 end
597604 return nothing
0 commit comments