@@ -236,9 +236,13 @@ 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̃)
241- estim. H̃. data[1 : nZ̃, 1 : nZ̃] .= lmul! (2 , (ẼZ̃' * M_Nk* ẼZ̃ .+ Ñ_Nk))
239+ M_Nk_ẼZ̃ = M_Nk* ẼZ̃
240+ @views mul! (estim. q̃[1 : nZ̃], M_Nk_ẼZ̃' , FZ̃)
241+ @views lmul! (2 , estim. q̃[1 : nZ̃])
242+ estim. p .= dot (FZ̃, M_Nk, FZ̃)
243+ estim. H̃. data[1 : nZ̃, 1 : nZ̃] = Ñ_Nk
244+ @views mul! (estim. H̃. data[1 : nZ̃, 1 : nZ̃], ẼZ̃' , M_Nk_ẼZ̃, 1 , 1 )
245+ @views lmul! (2 , estim. H̃. data[1 : nZ̃, 1 : nZ̃])
242246 Z̃var_Nk:: Vector{VariableRef} = @views optim[:Z̃var ][1 : nZ̃]
243247 H̃_Nk = @views estim. H̃[1 : nZ̃,1 : nZ̃]
244248 q̃_Nk = @views estim. q̃[1 : nZ̃]
@@ -283,8 +287,11 @@ function linconstraint!(estim::MovingHorizonEstimator, model::LinModel)
283287 estim. con. b[(n+ 1 ): (n+ nV̂)] .= @. - V̂min + estim. F
284288 n += nV̂
285289 estim. con. b[(n+ 1 ): (n+ nV̂)] .= @. + V̂max - estim. F
286- lincon = estim. optim[:linconstraint ]
287- set_normalized_rhs .(lincon, estim. con. b[estim. con. i_b])
290+ if any (estim. con. i_b)
291+ lincon = estim. optim[:linconstraint ]
292+ set_normalized_rhs (lincon, estim. con. b[estim. con. i_b])
293+ end
294+ return nothing
288295end
289296
290297" Set `b` excluding state and sensor noise bounds if `model` is not a [`LinModel`](@ref)."
@@ -299,8 +306,11 @@ function linconstraint!(estim::MovingHorizonEstimator, ::SimModel)
299306 estim. con. b[(n+ 1 ): (n+ nŴ)] .= @. - Ŵmin
300307 n += nŴ
301308 estim. con. b[(n+ 1 ): (n+ nŴ)] .= @. + Ŵmax
302- lincon = estim. optim[:linconstraint ]
303- set_normalized_rhs .(lincon, estim. con. b[estim. con. i_b])
309+ if any (estim. con. i_b)
310+ lincon = estim. optim[:linconstraint ]
311+ set_normalized_rhs (lincon, estim. con. b[estim. con. i_b])
312+ end
313+ return nothing
304314end
305315
306316" Truncate the bounds `Bmin` and `Bmax` to the window size `Nk` if `Nk < He`."
0 commit comments