Skip to content

Commit 4aa95de

Browse files
committed
reduce allocations LinMPC and KalmanFilter
1 parent 0493147 commit 4aa95de

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

src/controller/execute.jl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,17 +173,18 @@ function initpred!(mpc::PredictiveController, model::LinModel, d, ym, D̂, R̂y,
173173
mul!(F, mpc.J, mpc.D̂0, 1, 1)
174174
end
175175
mpc.R̂y .= R̂y
176-
C_y = similar(F)
177-
C_y .= mpc.F .- mpc.R̂y
178-
q̃ .= lmul!(2,(mpc.M_Hp*mpc.Ẽ)'*C_y)
179-
p .= dot(C_y, mpc.M_Hp, C_y)
176+
C_y = F .- mpc.R̂y
177+
M_Hp_Ẽ = mpc.M_Hp*mpc.
178+
mul!(q̃, M_Hp_Ẽ', C_y)
179+
p .= dot(C_y, mpc.M_Hp, C_y)
180180
if ~mpc.noR̂u
181181
mpc.R̂u .= R̂u
182-
C_u = similar(mpc.T_lastu)
183-
C_u .= mpc.T_lastu .- mpc.R̂u
184-
mpc..+= lmul!(2, (mpc.L_Hp*mpc.S̃)'*C_u)
185-
mpc.p .+= dot(C_u, mpc.L_Hp, C_u)
182+
C_u = mpc.T_lastu .- mpc.R̂u
183+
L_Hp_S̃ = mpc.L_Hp*mpc.
184+
mul!(q̃, L_Hp_S̃', C_u, 1, 1)
185+
p .+= dot(C_u, mpc.L_Hp, C_u)
186186
end
187+
lmul!(2, q̃)
187188
return nothing
188189
end
189190

src/estimator/kalman.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,7 @@ function update_estimate_kf!(estim::StateEstimator{NT}, u, ym, d, Â, Ĉm, P̂
818818
Q̂, R̂, M̂, K̂ = estim.Q̂, estim.R̂, estim.M̂, estim.
819819
nx̂, nu, ny = estim.nx̂, estim.model.nu, estim.model.ny
820820
x̂next, û, ŷ = Vector{NT}(undef, nx̂), Vector{NT}(undef, nu), Vector{NT}(undef, ny)
821-
mul!(M̂, P̂, Ĉm')
821+
mul!(M̂, P̂.data, Ĉm') # the ".data" weirdly remove a type instability in mul!
822822
rdiv!(M̂, cholesky!(Hermitian(Ĉm ** Ĉm' .+ R̂)))
823823
mul!(K̂, Â, M̂)
824824
ĥ!(ŷ, estim, estim.model, x̂, d)

src/estimator/mhe/execute.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,10 @@ function initpred!(estim::MovingHorizonEstimator, model::LinModel)
236236
invQ̂_Nk, invR̂_Nk = @views estim.invQ̂_He[1:nŴ, 1:nŴ], estim.invR̂_He[1:nYm, 1:nYm]
237237
M_Nk = [estim.invP̄ zeros(nx̂, nYm); zeros(nYm, nx̂) invR̂_Nk]
238238
Ñ_Nk = [fill(C, nϵ, nϵ) zeros(nϵ, nx̂+nŴ); zeros(nx̂, nϵ+nx̂+nŴ); zeros(nŴ, nϵ+nx̂) invQ̂_Nk]
239-
estim.q̃[1:nZ̃] .= lmul!(2, (M_Nk*ẼZ̃)'*FZ̃)
240-
estim.p .= dot(FZ̃, M_Nk, FZ̃)
239+
M_Nk_ẼZ̃ = M_Nk*ẼZ̃
240+
mul!(estim.q̃[1:nZ̃], M_Nk_ẼZ̃', FZ̃)
241+
lmul!(2, estim.q̃[1:nZ̃])
242+
estim.p .= dot(FZ̃, M_Nk, FZ̃)
241243
estim..data[1:nZ̃, 1:nZ̃] .= lmul!(2, (ẼZ̃'*M_Nk*ẼZ̃ .+ Ñ_Nk))
242244
Z̃var_Nk::Vector{VariableRef} = @views optim[:Z̃var][1:nZ̃]
243245
H̃_Nk = @views estim.H̃[1:nZ̃,1:nZ̃]

0 commit comments

Comments
 (0)