@@ -563,7 +563,7 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
563
563
function update_simulations! (
564
564
Z̃arg:: Union{NTuple{N, T}, AbstractVector{T}} , Z̃cache
565
565
) where {N, T<: Real }
566
- if any (cache != = arg for (cache, arg) in zip ( Z̃cache, Z̃arg) ) # new Z̃, update:
566
+ if isdifferent ( Z̃cache, Z̃arg) # new Z̃, update:
567
567
for i in eachindex (Z̃cache)
568
568
# Z̃cache .= Z̃arg is type unstable with Z̃arg::NTuple{N, FowardDiff.Dual}
569
569
Z̃cache[i] = Z̃arg[i]
@@ -587,13 +587,6 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
587
587
end
588
588
return nothing
589
589
end
590
- # --------------------- normal cache for the AD functions ----------------------------
591
- Z̃arg_vec = Vector {JNT} (undef, nZ̃)
592
- ∇J = Vector {JNT} (undef, nZ̃) # gradient of objective J
593
- g_vec = Vector {JNT} (undef, ng)
594
- ∇g = Matrix {JNT} (undef, ng, nZ̃) # Jacobian of inequality constraints g
595
- geq_vec = Vector {JNT} (undef, neq)
596
- ∇geq = Matrix {JNT} (undef, neq, nZ̃) # Jacobian of equality constraints geq
597
590
# --------------------- objective functions -------------------------------------------
598
591
function Jfunc (Z̃arg:: Vararg{T, N} ) where {N, T<: Real }
599
592
update_simulations! (Z̃arg, get_tmp (Z̃_cache, T))
@@ -608,18 +601,20 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
608
601
Ue, Ŷe = get_tmp (Ue_cache, T), get_tmp (Ŷe_cache, T)
609
602
U0, Ŷ0 = get_tmp (U0_cache, T), get_tmp (Ŷ0_cache, T)
610
603
return obj_nonlinprog! (Ŷ0, U0, mpc, model, Ue, Ŷe, ΔŨ)
611
- end
612
- ∇J_buffer = GradientBuffer (Jfunc_vec, Z̃arg_vec)
604
+ end
605
+ Z̃_∇J = fill (myNaN, nZ̃)
606
+ ∇J = Vector {JNT} (undef, nZ̃) # gradient of objective J
607
+ ∇J_buffer = GradientBuffer (Jfunc_vec, Z̃_∇J)
613
608
∇Jfunc! = if nZ̃ == 1
614
609
function (Z̃arg:: T ) where T<: Real
615
- Z̃arg_vec .= Z̃arg
616
- gradient! (∇J, ∇J_buffer, Z̃arg_vec )
610
+ Z̃_∇J .= Z̃arg
611
+ gradient! (∇J, ∇J_buffer, Z̃_∇J )
617
612
return ∇J[begin ] # univariate syntax, see JuMP.@operator doc
618
613
end
619
614
else
620
615
function (∇J:: AbstractVector{T} , Z̃arg:: Vararg{T, N} ) where {N, T<: Real }
621
- Z̃arg_vec .= Z̃arg
622
- gradient! (∇J, ∇J_buffer, Z̃arg_vec )
616
+ Z̃_∇J .= Z̃arg
617
+ gradient! (∇J, ∇J_buffer, Z̃_∇J )
623
618
return ∇J # multivariate syntax, see JuMP.@operator doc
624
619
end
625
620
end
@@ -638,21 +633,27 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
638
633
g .= get_tmp (g_cache, T)
639
634
return g
640
635
end
641
- ∇g_buffer = JacobianBuffer (gfunc_vec!, g_vec, Z̃arg_vec)
642
- ∇gfuncs! = Vector {Function} (undef, ng)
636
+ Z̃_∇g = fill (myNaN, nZ̃)
637
+ g_vec = Vector {JNT} (undef, ng)
638
+ ∇g = Matrix {JNT} (undef, ng, nZ̃) # Jacobian of inequality constraints g
639
+ ∇g_buffer = JacobianBuffer (gfunc_vec!, g_vec, Z̃_∇g)
640
+ ∇gfuncs! = Vector {Function} (undef, ng)
643
641
for i in eachindex (∇gfuncs!)
644
642
∇gfuncs![i] = if nZ̃ == 1
645
643
function (Z̃arg:: T ) where T<: Real
646
- Z̃arg_vec .= Z̃arg
647
- jacobian! (∇g, ∇g_buffer, g_vec, Z̃arg_vec)
648
- return ∇g[i, begin ] # univariate syntax, see JuMP.@operator doc
644
+ if isdifferent (Z̃arg, Z̃_∇g)
645
+ Z̃_∇g .= Z̃arg
646
+ jacobian! (∇g, ∇g_buffer, g_vec, Z̃_∇g)
647
+ end
648
+ return ∇g[i, begin ] # univariate syntax, see JuMP.@operator doc
649
649
end
650
650
else
651
651
function (∇g_i, Z̃arg:: Vararg{T, N} ) where {N, T<: Real }
652
- Z̃arg_vec .= Z̃arg
653
- jacobian! (∇g, ∇g_buffer, g_vec, Z̃arg_vec)
654
- ∇g_i .= @views ∇g[i, :]
655
- return ∇g_i # multivariate syntax, see JuMP.@operator doc
652
+ if isdifferent (Z̃arg, Z̃_∇g)
653
+ Z̃_∇g .= Z̃arg
654
+ jacobian! (∇g, ∇g_buffer, g_vec, Z̃_∇g)
655
+ end
656
+ return ∇g_i .= @views ∇g[i, :] # multivariate syntax, see JuMP.@operator doc
656
657
end
657
658
end
658
659
end
@@ -671,17 +672,21 @@ function get_optim_functions(mpc::NonLinMPC, ::JuMP.GenericModel{JNT}) where JNT
671
672
geq .= get_tmp (geq_cache, T)
672
673
return geq
673
674
end
674
- ∇geq_buffer = JacobianBuffer (geqfunc_vec!, geq_vec, Z̃arg_vec)
675
- ∇geqfuncs! = Vector {Function} (undef, neq)
675
+ Z̃_∇geq = fill (myNaN, nZ̃) # NaN to force update at 1st call
676
+ geq_vec = Vector {JNT} (undef, neq)
677
+ ∇geq = Matrix {JNT} (undef, neq, nZ̃) # Jacobian of equality constraints geq
678
+ ∇geq_buffer = JacobianBuffer (geqfunc_vec!, geq_vec, Z̃_∇geq)
679
+ ∇geqfuncs! = Vector {Function} (undef, neq)
676
680
for i in eachindex (∇geqfuncs!)
677
681
# only multivariate syntax, univariate is impossible since nonlinear equality
678
682
# constraints imply MultipleShooting, thus input increment ΔU and state X̂0 in Z̃:
679
683
∇geqfuncs![i] =
680
684
function (∇geq_i, Z̃arg:: Vararg{T, N} ) where {N, T<: Real }
681
- Z̃arg_vec .= Z̃arg
682
- jacobian! (∇geq, ∇geq_buffer, geq_vec, Z̃arg_vec)
683
- ∇geq_i .= @views ∇geq[i, :]
684
- return ∇geq_i
685
+ if isdifferent (Z̃arg, Z̃_∇geq)
686
+ Z̃_∇geq .= Z̃arg
687
+ jacobian! (∇geq, ∇geq_buffer, geq_vec, Z̃_∇geq)
688
+ end
689
+ return ∇geq_i .= @views ∇geq[i, :]
685
690
end
686
691
end
687
692
return Jfunc, ∇Jfunc!, gfuncs, ∇gfuncs!, geqfuncs, ∇geqfuncs!
0 commit comments