Skip to content

Commit 52fe019

Browse files
committed
test: new test to validate the type of weight matrices in MPC objects
1 parent 14b871a commit 52fe019

File tree

2 files changed

+40
-19
lines changed

2 files changed

+40
-19
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ModelPredictiveControl"
22
uuid = "61f9bdb8-6ae4-484a-811f-bbf86720c31c"
33
authors = ["Francis Gagnon"]
4-
version = "1.6.0"
4+
version = "1.6.1"
55

66
[deps]
77
ControlSystemsBase = "aaaaaaaa-a6ca-5380-bf3e-84a91bcd477e"

test/3_test_predictive_control.jl

+39-18
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
@test mpc3.weights.Ñ_Hc[end] 1e6
1212
mpc4 = LinMPC(model, Mwt=[1,2], Hp=15)
1313
@test mpc4.weights.M_Hp Diagonal(diagm(repeat(Float64[1, 2], 15)))
14+
@test mpc4.weights.M_Hp isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
1415
mpc5 = LinMPC(model, Nwt=[3,4], Cwt=1e3, Hc=5)
1516
@test mpc5.weights.Ñ_Hc Diagonal(diagm([repeat(Float64[3, 4], 5); [1e3]]))
17+
@test mpc5.weights.Ñ_Hc isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
1618
mpc6 = LinMPC(model, Lwt=[0,1], Hp=15)
1719
@test mpc6.weights.L_Hp Diagonal(diagm(repeat(Float64[0, 1], 15)))
20+
@test mpc6.weights.L_Hp isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
1821
mpc7 = @test_logs(
1922
(:warn, "Solving time limit is not supported by the optimizer."),
2023
LinMPC(model, optim=JuMP.Model(DAQP.Optimizer))
@@ -26,15 +29,19 @@
2629
mpc9 = LinMPC(model, nint_u=[1, 1], nint_ym=[0, 0])
2730
@test mpc9.estim.nint_u == [1, 1]
2831
@test mpc9.estim.nint_ym == [0, 0]
29-
mpc10 = LinMPC(model, M_Hp=Diagonal(collect(1.01:0.01:1.2)))
30-
@test mpc10.weights.M_Hp Diagonal(collect(1.01:0.01:1.2))
31-
mpc11 = LinMPC(model, N_Hc=Diagonal([0.1,0.11,0.12,0.13]), Cwt=Inf)
32-
@test mpc11.weights.Ñ_Hc Diagonal([0.1,0.11,0.12,0.13])
33-
mcp12 = LinMPC(model, L_Hp=Diagonal(collect(0.001:0.001:0.02)))
34-
@test mcp12.weights.L_Hp Diagonal(collect(0.001:0.001:0.02))
32+
mpc10 = LinMPC(model, M_Hp=diagm(collect(1.01:0.01:1.2)))
33+
@test mpc10.weights.M_Hp diagm(collect(1.01:0.01:1.2))
34+
@test mpc10.weights.M_Hp isa Hermitian{Float64, Matrix{Float64}}
35+
mpc11 = LinMPC(model, N_Hc=diagm([0.1,0.11,0.12,0.13]), Cwt=Inf)
36+
@test mpc11.weights.Ñ_Hc diagm([0.1,0.11,0.12,0.13])
37+
@test mpc11.weights.Ñ_Hc isa Hermitian{Float64, Matrix{Float64}}
38+
mcp12 = LinMPC(model, L_Hp=diagm(collect(0.001:0.001:0.02)))
39+
@test mcp12.weights.L_Hp diagm(collect(0.001:0.001:0.02))
40+
@test mcp12.weights.L_Hp isa Hermitian{Float64, Matrix{Float64}}
3541
model2 = LinModel{Float32}(0.5*ones(1,1), ones(1,1), ones(1,1), zeros(1,0), zeros(1,0), 1.0)
3642
mpc13 = LinMPC(model2)
3743
@test isa(mpc13, LinMPC{Float32})
44+
@test isa(mpc13.estim, SteadyKalmanFilter{Float32})
3845
@test isa(mpc13.optim, JuMP.GenericModel{Float64}) # OSQP does not support Float32
3946
mpc14 = LinMPC(model2, transcription=MultipleShooting())
4047
@test mpc14.transcription == MultipleShooting()
@@ -400,25 +407,32 @@ end
400407
@test size(mpc1.Ẽ,1) == 15*mpc1.estim.model.ny
401408
mpc4 = ExplicitMPC(model, Mwt=[1,2], Hp=15)
402409
@test mpc4.weights.M_Hp Diagonal(diagm(repeat(Float64[1, 2], 15)))
410+
@test mpc4.weights.M_Hp isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
403411
mpc5 = ExplicitMPC(model, Nwt=[3,4], Hc=5)
404412
@test mpc5.weights.Ñ_Hc Diagonal(diagm(repeat(Float64[3, 4], 5)))
413+
@test mpc5.weights.Ñ_Hc isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
405414
mpc6 = ExplicitMPC(model, Lwt=[0,1], Hp=15)
406415
@test mpc6.weights.L_Hp Diagonal(diagm(repeat(Float64[0, 1], 15)))
416+
@test mpc6.weights.L_Hp isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
407417
kf = KalmanFilter(model)
408418
mpc8 = ExplicitMPC(kf)
409419
@test isa(mpc8.estim, KalmanFilter)
410420
mpc9 = ExplicitMPC(model, nint_u=[1, 1], nint_ym=[0, 0])
411421
@test mpc9.estim.nint_u == [1, 1]
412422
@test mpc9.estim.nint_ym == [0, 0]
413-
mpc10 = ExplicitMPC(model, M_Hp=Diagonal(collect(1.01:0.01:1.2)))
414-
@test mpc10.weights.M_Hp Diagonal(collect(1.01:0.01:1.2))
415-
mpc11 = ExplicitMPC(model, N_Hc=Diagonal([0.1,0.11,0.12,0.13]))
416-
@test mpc11.weights.Ñ_Hc Diagonal([0.1,0.11,0.12,0.13])
417-
mcp12 = ExplicitMPC(model, L_Hp=Diagonal(collect(0.001:0.001:0.02)))
418-
@test mcp12.weights.L_Hp Diagonal(collect(0.001:0.001:0.02))
423+
mpc10 = ExplicitMPC(model, M_Hp=diagm(collect(1.01:0.01:1.2)))
424+
@test mpc10.weights.M_Hp diagm(collect(1.01:0.01:1.2))
425+
@test mpc10.weights.M_Hp isa Hermitian{Float64, Matrix{Float64}}
426+
mpc11 = ExplicitMPC(model, N_Hc=diagm([0.1,0.11,0.12,0.13]))
427+
@test mpc11.weights.Ñ_Hc diagm([0.1,0.11,0.12,0.13])
428+
@test mpc11.weights.Ñ_Hc isa Hermitian{Float64, Matrix{Float64}}
429+
mcp12 = ExplicitMPC(model, L_Hp=diagm(collect(0.001:0.001:0.02)))
430+
@test mcp12.weights.L_Hp diagm(collect(0.001:0.001:0.02))
431+
@test mcp12.weights.L_Hp isa Hermitian{Float64, Matrix{Float64}}
419432
model2 = LinModel{Float32}(0.5*ones(1,1), ones(1,1), ones(1,1), zeros(1,0), zeros(1,0), 1.0)
420433
mpc13 = ExplicitMPC(model2)
421434
@test isa(mpc13, ExplicitMPC{Float32})
435+
@test isa(mpc13.estim, SteadyKalmanFilter{Float32})
422436

423437
@test_logs(
424438
(:warn,
@@ -582,10 +596,13 @@ end
582596
@test nmpc3.weights.Ñ_Hc[end] == 1e6
583597
nmpc4 = NonLinMPC(nonlinmodel, Hp=15, Mwt=[1,2])
584598
@test nmpc4.weights.M_Hp Diagonal(diagm(repeat(Float64[1, 2], 15)))
599+
@test nmpc4.weights.M_Hp isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
585600
nmpc5 = NonLinMPC(nonlinmodel, Hp=15 ,Nwt=[3,4], Cwt=1e3, Hc=5)
586601
@test nmpc5.weights.Ñ_Hc Diagonal(diagm([repeat(Float64[3, 4], 5); [1e3]]))
602+
@test nmpc5.weights.Ñ_Hc isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
587603
nmpc6 = NonLinMPC(nonlinmodel, Hp=15, Lwt=[0,1])
588604
@test nmpc6.weights.L_Hp Diagonal(diagm(repeat(Float64[0, 1], 15)))
605+
@test nmpc6.weights.L_Hp isa Hermitian{Float64, Diagonal{Float64, Vector{Float64}}}
589606
nmpc7 = NonLinMPC(nonlinmodel, Hp=15, Ewt=1e-3, JE=(Ue,Ŷe,D̂e,p) -> p*dot(Ue,Ŷe)+sum(D̂e), p=10)
590607
@test nmpc7.weights.E == 1e-3
591608
@test nmpc7.JE([1,2],[3,4],[4,6],10) == 10*dot([1,2],[3,4])+sum([4,6])
@@ -602,12 +619,15 @@ end
602619
nmpc11 = NonLinMPC(nonlinmodel, Hp=15, nint_u=[1, 1], nint_ym=[0, 0])
603620
@test nmpc11.estim.nint_u == [1, 1]
604621
@test nmpc11.estim.nint_ym == [0, 0]
605-
nmpc12 = NonLinMPC(nonlinmodel, Hp=10, M_Hp=Diagonal(collect(1.01:0.01:1.2)))
606-
@test nmpc12.weights.M_Hp Diagonal(collect(1.01:0.01:1.2))
607-
nmpc13 = NonLinMPC(nonlinmodel, Hp=10, N_Hc=Diagonal([0.1,0.11,0.12,0.13]), Cwt=Inf)
608-
@test nmpc13.weights.Ñ_Hc Diagonal([0.1,0.11,0.12,0.13])
609-
nmcp14 = NonLinMPC(nonlinmodel, Hp=10, L_Hp=Diagonal(collect(0.001:0.001:0.02)))
610-
@test nmcp14.weights.L_Hp Diagonal(collect(0.001:0.001:0.02))
622+
nmpc12 = NonLinMPC(nonlinmodel, Hp=10, M_Hp=diagm(collect(1.01:0.01:1.2)))
623+
@test nmpc12.weights.M_Hp diagm(collect(1.01:0.01:1.2))
624+
@test nmpc12.weights.M_Hp isa Hermitian{Float64, Matrix{Float64}}
625+
nmpc13 = NonLinMPC(nonlinmodel, Hp=10, N_Hc=diagm([0.1,0.11,0.12,0.13]), Cwt=Inf)
626+
@test nmpc13.weights.Ñ_Hc diagm([0.1,0.11,0.12,0.13])
627+
@test nmpc13.weights.Ñ_Hc isa Hermitian{Float64, Matrix{Float64}}
628+
nmcp14 = NonLinMPC(nonlinmodel, Hp=10, L_Hp=diagm(collect(0.001:0.001:0.02)))
629+
@test nmcp14.weights.L_Hp diagm(collect(0.001:0.001:0.02))
630+
@test nmcp14.weights.L_Hp isa Hermitian{Float64, Matrix{Float64}}
611631
nmpc15 = NonLinMPC(nonlinmodel, Hp=10, gc=(Ue,Ŷe,D̂e,p,ϵ)-> [p*dot(Ue,Ŷe)+sum(D̂e)+ϵ], nc=1, p=10)
612632
LHS = zeros(1)
613633
nmpc15.con.gc!(LHS,[1,2],[3,4],[4,6],10,0.1)
@@ -632,6 +652,7 @@ end
632652
nonlinmodel2 = NonLinModel{Float32}(f, h, Ts, 2, 4, 2, 1, solver=nothing)
633653
nmpc15 = NonLinMPC(nonlinmodel2, Hp=15)
634654
@test isa(nmpc15, NonLinMPC{Float32})
655+
@test isa(nmpc15.estim, UnscentedKalmanFilter{Float32})
635656
@test isa(nmpc15.optim, JuMP.GenericModel{Float64}) # Ipopt does not support Float32
636657

637658
@test_throws ArgumentError NonLinMPC(nonlinmodel, Hp=15, Ewt=[1, 1])

0 commit comments

Comments
 (0)