Skip to content

Commit 15ea65f

Browse files
committed
reduce allocation EMPC
1 parent 01984d8 commit 15ea65f

File tree

4 files changed

+20
-13
lines changed

4 files changed

+20
-13
lines changed

src/controller/explicitmpc.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,22 @@ struct ExplicitMPC{SE<:StateEstimator} <: PredictiveController
4949
P̃, q̃, p = init_quadprog(model, Ẽ, S̃, M_Hp, Ñ_Hc, L_Hp)
5050
P̃_chol = cholesky(P̃)
5151
Ks, Ps = init_stochpred(estim, Hp)
52-
d0, D̂0 = zeros(nd), zeros(nd*Hp)
52+
# dummy vals (updated just before optimization):
53+
d0, D̂0, D̂E = zeros(nd), zeros(nd*Hp), zeros(nd + nd*Hp)
5354
Ŷop, Dop = repeat(model.yop, Hp), repeat(model.dop, Hp)
5455
nvar = size(Ẽ, 2)
5556
ΔŨ = zeros(nvar)
5657
mpc = new(
5758
estim,
5859
ΔŨ, ŷ,
5960
Hp, Hc,
60-
M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt, R̂u, R̂y, noR̂u,
61+
M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt,
62+
R̂u, R̂y, noR̂u,
6163
S̃, T,
6264
Ẽ, F, G, J, K, V, P̃, q̃, p,
6365
P̃_chol,
6466
Ks, Ps,
65-
d0, D̂0,
67+
d0, D̂0, D̂E,
6668
Ŷop, Dop,
6769
)
6870
return mpc

src/controller/linmpc.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,21 @@ struct LinMPC{SE<:StateEstimator} <: PredictiveController
5050
con, S̃, Ñ_Hc, Ẽ = init_defaultcon(estim, Hp, Hc, C, S, N_Hc, E, ex̂, fx̂, gx̂, jx̂, kx̂, vx̂)
5151
P̃, q̃, p = init_quadprog(model, Ẽ, S̃, M_Hp, Ñ_Hc, L_Hp)
5252
Ks, Ps = init_stochpred(estim, Hp)
53-
d0, D̂0 = zeros(nd), zeros(nd*Hp)
53+
# dummy vals (updated just before optimization):
54+
d0, D̂0, D̂E = zeros(nd), zeros(nd*Hp), zeros(nd + nd*Hp)
5455
Ŷop, Dop = repeat(model.yop, Hp), repeat(model.dop, Hp)
5556
nvar = size(Ẽ, 2)
5657
ΔŨ = zeros(nvar)
5758
mpc = new(
5859
estim, optim, con,
5960
ΔŨ, ŷ,
6061
Hp, Hc,
61-
M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt, R̂u, R̂y, noR̂u,
62+
M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt,
63+
R̂u, R̂y, noR̂u,
6264
S̃, T,
6365
Ẽ, F, G, J, K, V, P̃, q̃, p,
6466
Ks, Ps,
65-
d0, D̂0,
67+
d0, D̂0, D̂E,
6668
Ŷop, Dop,
6769
)
6870
init_optimization!(mpc)

src/controller/nonlinmpc.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct NonLinMPC{SE<:StateEstimator, JEfunc<:Function} <: PredictiveController
3434
Ps::Matrix{Float64}
3535
d0::Vector{Float64}
3636
D̂0::Vector{Float64}
37+
D̂E::Vector{Float64}
3738
Ŷop::Vector{Float64}
3839
Dop::Vector{Float64}
3940
function NonLinMPC{SE, JEFunc}(
@@ -54,19 +55,21 @@ struct NonLinMPC{SE<:StateEstimator, JEfunc<:Function} <: PredictiveController
5455
con, S̃, Ñ_Hc, Ẽ = init_defaultcon(estim, Hp, Hc, C, S, N_Hc, E, ex̂, fx̂, gx̂, jx̂, kx̂, vx̂)
5556
P̃, q̃, p = init_quadprog(model, Ẽ, S̃, M_Hp, Ñ_Hc, L_Hp)
5657
Ks, Ps = init_stochpred(estim, Hp)
57-
d0, D̂0 = zeros(nd), zeros(nd*Hp)
58+
# dummy vals (updated just before optimization):
59+
d0, D̂0, D̂E = zeros(nd), zeros(nd*Hp), zeros(nd + nd*Hp)
5860
Ŷop, Dop = repeat(model.yop, Hp), repeat(model.dop, Hp)
5961
nvar = size(Ẽ, 2)
6062
ΔŨ = zeros(nvar)
6163
mpc = new(
6264
estim, optim, con,
6365
ΔŨ, ŷ,
6466
Hp, Hc,
65-
M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt, JE, R̂u, R̂y, noR̂u,
67+
M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt, JE,
68+
R̂u, R̂y, noR̂u,
6669
S̃, T,
6770
Ẽ, F, G, J, K, V, P̃, q̃, p,
6871
Ks, Ps,
69-
d0, D̂0,
72+
d0, D̂0, D̂E,
7073
Ŷop, Dop,
7174
)
7275
init_optimization!(mpc)

src/predictive_control.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ function initpred!(mpc::PredictiveController, model::LinModel, d, ym, D̂, R̂y,
562562
mpc.F[:] = mpc.K * mpc.estim.+ mpc.V * mpc.estim.lastu0 + mpc.Ŷop
563563
if model.nd 0
564564
mpc.d0[:], mpc.D̂0[:] = d - model.dop, D̂ - mpc.Dop
565+
mpc.D̂E[:] = [d; D̂]
565566
mpc.F[:] = mpc.F + mpc.G * mpc.d0 + mpc.J * mpc.D̂0
566567
end
567568
mpc.R̂y[:] = R̂y
@@ -592,6 +593,7 @@ function initpred!(mpc::PredictiveController, model::SimModel, d, ym, D̂, R̂y,
592593
predictstoch!(mpc, mpc.estim, d, ym) # init mpc.Ŷop for InternalModel
593594
if model.nd 0
594595
mpc.d0[:], mpc.D̂0[:] = d - model.dop, D̂ - mpc.Dop
596+
mpc.D̂E[:] = [d; D̂]
595597
end
596598
mpc.R̂y[:] = R̂y
597599
if ~mpc.noR̂u
@@ -963,8 +965,7 @@ function obj_nonlinprog(
963965
U = mpc.*ΔŨ + mpc.T*(mpc.estim.lastu0 + model.uop)
964966
UE = [U; U[(end - model.nu + 1):end]]
965967
ŶE = [mpc.ŷ; Ŷ]
966-
D̂E = [mpc.d0 + model.dop; mpc.D̂0 + mpc.Dop]
967-
J += mpc.E*mpc.JE(UE, ŶE, D̂E)
968+
J += mpc.E*mpc.JE(UE, ŶE, mpc.D̂E)
968969
end
969970
return J
970971
end
@@ -998,8 +999,7 @@ function obj_nonlinprog(
998999
if !iszero(mpc.E)
9991000
UE = [U; U[(end - model.nu + 1):end]]
10001001
ŶE = [mpc.ŷ; Ŷ]
1001-
D̂E = [mpc.d0 + model.dop; mpc.D̂0 + mpc.Dop]
1002-
E_JE = mpc.E*mpc.JE(UE, ŶE, D̂E)
1002+
E_JE = mpc.E*mpc.JE(UE, ŶE, mpc.D̂E)
10031003
else
10041004
E_JE = 0.0
10051005
end

0 commit comments

Comments
 (0)