11const DEFAULT_LINMPC_OPTIMIZER = OSQP. MathOptInterfaceOSQP. Optimizer
22
3- struct LinMPC{SE<: StateEstimator } <: PredictiveController
3+ struct LinMPC{
4+ NT<: Real ,
5+ SE<: StateEstimator ,
6+ JM<: JuMP.GenericModel
7+ } <: PredictiveController{NT}
48 estim:: SE
5- optim:: JuMP.Model
6- con:: ControllerConstraint
7- ΔŨ:: Vector{Float64}
8- ŷ :: Vector{Float64}
9+ # note: `NT` and the number type `JNT` in `JuMP.GenericModel{JNT}` can be
10+ # different since solvers that support non-Float64 are scarce.
11+ optim:: JM
12+ con:: ControllerConstraint{NT}
13+ ΔŨ:: Vector{NT}
14+ ŷ :: Vector{NT}
915 Hp:: Int
1016 Hc:: Int
11- M_Hp:: Diagonal{Float64 , Vector{Float64 }}
12- Ñ_Hc:: Diagonal{Float64 , Vector{Float64 }}
13- L_Hp:: Diagonal{Float64 , Vector{Float64 }}
14- C:: Float64
15- E:: Float64
16- R̂u:: Vector{Float64 }
17- R̂y:: Vector{Float64 }
17+ M_Hp:: Diagonal{NT , Vector{NT }}
18+ Ñ_Hc:: Diagonal{NT , Vector{NT }}
19+ L_Hp:: Diagonal{NT , Vector{NT }}
20+ C:: NT
21+ E:: NT
22+ R̂u:: Vector{NT }
23+ R̂y:: Vector{NT }
1824 noR̂u:: Bool
1925 S̃:: Matrix{Bool}
2026 T:: Matrix{Bool}
21- Ẽ:: Matrix{Float64}
22- F:: Vector{Float64}
23- G:: Matrix{Float64}
24- J:: Matrix{Float64}
25- K:: Matrix{Float64}
26- V:: Matrix{Float64}
27- P̃:: Hermitian{Float64, Matrix{Float64}}
28- q̃:: Vector{Float64}
29- p:: Vector{Float64}
30- Ks:: Matrix{Float64}
31- Ps:: Matrix{Float64}
32- d0:: Vector{Float64}
33- D̂0:: Vector{Float64}
34- D̂E:: Vector{Float64}
35- Ŷop:: Vector{Float64}
36- Dop:: Vector{Float64}
37- function LinMPC {SE} (estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, optim) where {SE<: StateEstimator }
27+ Ẽ:: Matrix{NT}
28+ F:: Vector{NT}
29+ G:: Matrix{NT}
30+ J:: Matrix{NT}
31+ K:: Matrix{NT}
32+ V:: Matrix{NT}
33+ P̃:: Hermitian{NT, Matrix{NT}}
34+ q̃:: Vector{NT}
35+ p:: Vector{NT}
36+ Ks:: Matrix{NT}
37+ Ps:: Matrix{NT}
38+ d0:: Vector{NT}
39+ D̂0:: Vector{NT}
40+ D̂E:: Vector{NT}
41+ Ŷop:: Vector{NT}
42+ Dop:: Vector{NT}
43+ function LinMPC {NT, SE, JM} (
44+ estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, optim:: JM
45+ ) where {NT<: Real , SE<: StateEstimator , JM<: JuMP.GenericModel }
3846 model = estim. model
3947 nu, ny, nd = model. nu, model. ny, model. nd
4048 ŷ = copy (model. yop) # dummy vals (updated just before optimization)
4149 Ewt = 0 # economic costs not supported for LinMPC
4250 validate_weights (model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
4351 M_Hp, N_Hc, L_Hp = float (M_Hp), float (N_Hc), float (L_Hp) # debug julia 1.6
44- R̂y, R̂u = zeros (ny* Hp), zeros (nu* Hp) # dummy vals (updated just before optimization)
52+ # dummy vals (updated just before optimization):
53+ R̂y, R̂u = zeros (NT, ny* Hp), zeros (NT, nu* Hp)
4554 noR̂u = iszero (L_Hp)
4655 S, T = init_ΔUtoU (nu, Hp, Hc)
4756 E, F, G, J, K, V, ex̂, fx̂, gx̂, jx̂, kx̂, vx̂ = init_predmat (estim, model, Hp, Hc)
4857 con, S̃, Ñ_Hc, Ẽ = init_defaultcon (estim, Hp, Hc, Cwt, S, N_Hc, E, ex̂, fx̂, gx̂, jx̂, kx̂, vx̂)
4958 P̃, q̃, p = init_quadprog (model, Ẽ, S̃, M_Hp, Ñ_Hc, L_Hp)
5059 Ks, Ps = init_stochpred (estim, Hp)
5160 # dummy vals (updated just before optimization):
52- d0, D̂0, D̂E = zeros (nd), zeros (nd* Hp), zeros (nd + nd* Hp)
61+ d0, D̂0, D̂E = zeros (NT, nd), zeros (NT, nd* Hp), zeros (NT, nd + nd* Hp)
5362 Ŷop, Dop = repeat (model. yop, Hp), repeat (model. dop, Hp)
5463 nvar = size (Ẽ, 2 )
55- ΔŨ = zeros (nvar)
56- mpc = new (
64+ ΔŨ = zeros (NT, nvar)
65+ mpc = new {NT, SE, JM} (
5766 estim, optim, con,
5867 ΔŨ, ŷ,
5968 Hp, Hc,
@@ -65,7 +74,7 @@ struct LinMPC{SE<:StateEstimator} <: PredictiveController
6574 d0, D̂0, D̂E,
6675 Ŷop, Dop,
6776 )
68- init_optimization! (mpc)
77+ init_optimization! (mpc, optim )
6978 return mpc
7079 end
7180end
@@ -163,7 +172,7 @@ function LinMPC(
163172 M_Hp = nothing ,
164173 N_Hc = nothing ,
165174 L_Hp = nothing ,
166- optim:: JuMP.Model = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
175+ optim:: JuMP.GenericModel = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
167176 kwargs...
168177)
169178 estim = SteadyKalmanFilter (model; kwargs... )
@@ -204,24 +213,24 @@ function LinMPC(
204213 M_Hp = nothing ,
205214 N_Hc = nothing ,
206215 L_Hp = nothing ,
207- optim:: JuMP.Model = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
208- ) where {SE<: StateEstimator }
216+ optim:: JM = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
217+ ) where {NT <: Real , SE<: StateEstimator{NT} , JM <: JuMP.GenericModel }
209218 isa (estim. model, LinModel) || error (" estim.model type must be LinModel" )
210219 Hp = default_Hp (estim. model, Hp)
211- isnothing (M_Hp) && (M_Hp = Diagonal (repeat (Mwt, Hp)))
212- isnothing (N_Hc) && (N_Hc = Diagonal (repeat (Nwt, Hc)))
213- isnothing (L_Hp) && (L_Hp = Diagonal (repeat (Lwt, Hp)))
214- return LinMPC {SE } (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, optim)
220+ isnothing (M_Hp) && (M_Hp = Diagonal {NT} (repeat (Mwt, Hp)))
221+ isnothing (N_Hc) && (N_Hc = Diagonal {NT} (repeat (Nwt, Hc)))
222+ isnothing (L_Hp) && (L_Hp = Diagonal {NT} (repeat (Lwt, Hp)))
223+ return LinMPC {NT, SE, JM } (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, optim)
215224end
216225
217226"""
218- init_optimization!(mpc::LinMPC)
227+ init_optimization!(mpc::LinMPC, optim::JuMP.GenericModel )
219228
220229Init the quadratic optimization for [`LinMPC`](@ref) controllers.
221230"""
222- function init_optimization! (mpc:: LinMPC )
231+ function init_optimization! (mpc:: LinMPC , optim :: JuMP.GenericModel )
223232 # --- variables and linear constraints ---
224- optim, con = mpc . optim, mpc. con
233+ con = mpc. con
225234 nvar = length (mpc. ΔŨ)
226235 set_silent (optim)
227236 limit_solve_time (mpc)
0 commit comments