From 3605dd05f6d84e1da54f100cc17c8479a77b356a Mon Sep 17 00:00:00 2001 From: DSVarga Date: Sat, 22 Jun 2024 14:11:43 +0200 Subject: [PATCH] Enforce compliance with the enhanced DescriptorStateSpace object. --- .github/workflows/CI.yml | 2 +- Examples/CS1_2.jl | 2 +- Examples/CS1_2_noplot.jl | 3 +-- Examples/Ex7_1.jl | 2 +- Examples/Ex7_1a_noplot.jl | 4 ++-- Examples/cs1data.jld2 | Bin 89826 -> 89595 bytes Examples/cs2data.jld2 | Bin 19808 -> 19943 bytes Project.toml | 2 +- ReleaseNotes.md | 4 ++++ src/FDIsynthesis.jl | 6 +++--- src/types/FDIObjects.jl | 10 +++++++--- test/test_ammsyn.jl | 2 +- 12 files changed, 22 insertions(+), 15 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5dc827c..862ebfb 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -6,7 +6,7 @@ on: push: branches: - master - tags: '*' + # tags: '*' jobs: test: name: Tests, Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} diff --git a/Examples/CS1_2.jl b/Examples/CS1_2.jl index 2df0265..9a2ecd8 100644 --- a/Examples/CS1_2.jl +++ b/Examples/CS1_2.jl @@ -55,7 +55,7 @@ FDtol = 1.e-5 # weak fault detection threshold FDGainTol = 0.001 # strong fault detection threshold FDfreq = 0 # frequency for strong detectability checks S_strong = fdigenspec(sysactf[nom]; atol, FDtol, FDGainTol, - FDfreq, sdeg = -0.05) + FDfreq, sdeg = -0.01) # check resulting specifications @test size(S_strong,1) == 2^mf-1 diff --git a/Examples/CS1_2_noplot.jl b/Examples/CS1_2_noplot.jl index 014329f..d7ec656 100644 --- a/Examples/CS1_2_noplot.jl +++ b/Examples/CS1_2_noplot.jl @@ -54,8 +54,7 @@ println("sdeg_cloop = $sdeg_cloop") FDtol = 1.e-5 # weak fault detection threshold FDGainTol = 0.001 # strong fault detection threshold FDfreq = 0 # frequency for strong detectability checks -S_strong = fdigenspec(sysactf[nom]; atol, FDtol, FDGainTol, - FDfreq, sdeg = -0.05) +S_strong = fdigenspec(sysactf[nom]; atol, FDtol, FDGainTol, FDfreq, sdeg = -0.01) # check resulting specifications @test size(S_strong,1) == 2^mf-1 diff --git a/Examples/Ex7_1.jl b/Examples/Ex7_1.jl index cee8099..b4c0cf2 100644 --- a/Examples/Ex7_1.jl +++ b/Examples/Ex7_1.jl @@ -33,7 +33,7 @@ display(Fig7_1) # comment out next line to save plot -#save("Fig7_1.pdf", fig, resolution = (600, 600)) +#save("Fig7_1.pdf", fig, size = (600, 600)) end using Main.Ex7_1 diff --git a/Examples/Ex7_1a_noplot.jl b/Examples/Ex7_1a_noplot.jl index ff55a98..4427e05 100644 --- a/Examples/Ex7_1a_noplot.jl +++ b/Examples/Ex7_1a_noplot.jl @@ -16,7 +16,7 @@ poles = gpole(g) println(" Exact poles Computed poles") display([pexact poles]) -fig = Figure(;font = "CMU Serif", fontsize=14, resolution = (600, 600)) +fig = Figure(;font = "CMU Serif", fontsize=14, size = (600, 600)) ax = Axis(fig[1, 1], title = "Poles of 1/((s+1)(s+2)...(s+25))", ylabel = "Imaginary Axis", xlabel = "Real Axis") @@ -33,7 +33,7 @@ Fig7_1a = fig #display(Fig7_1a) # comment out next line to save plot -#save("Fig7_1a.pdf", fig, resolution = (600, 600)) +#save("Fig7_1a.pdf", fig, size = (600, 600)) end using Main.Ex7_1a diff --git a/Examples/cs1data.jld2 b/Examples/cs1data.jld2 index 6386e86236cca5094805a50e0a8a3320ce7efdbf..f779b1932394dc5345b91693b3d0f0f3e9fe39a6 100644 GIT binary patch delta 1973 zcmb7_Ye*DP6vyw`*&WAKvvPNJ%dj%-L2GN2OQezQ_A<=2j7;51wxtI}+opv*&?qW; zK;aV(5=GLB5TSeL+zYPE2V2d(^Gub_@;Kc~OjMHS|2rQ; z)SqHbeKpIk-ZkZ`WzrOo)Pqun(@YSfU>ez$hK5D`Yx01s=1LiLaXiM#W4t>ep`5}< zq^cGt6z(6%{asEpYQ~_(b3aED;U|0|o5xvsTsG(ULc4;IEnziTnlLkAm<*mumW*hP zW(~-#jalF1=!T%WJ0*Yf;M%0qKv5f3D^>+DHdDLW`O{Xi#JAE!d=~1L;(^YxK*>rZ z$s|z9Btpz&Jc%EaF0oSI2+nq?y|$ARMI_5*8xuFNFqS@6HTwb+NsIck^Q*!R_>a3L z4&ur5u63uo>o5ODK08pc9@Zypjbh9iV$;0v48-LODMBIvH;urqnNJkD5;IXkI)NsV zqsr~qm{~j|Q!if!KY7K)@}?4bEK8!N5T1rc_Z(E;QdDvMytj0@=Ffvgnrkw|wLeUS z4FyHRJEFnGXB)@jBRGM|m#yhj)m+>By5=&RlxSajsL3{|RI-JZk+!wyv+qQ$IfnZ3 z0_yB`)U!`fe|Z>=gn4jvS4?5=12?I>=Cya*nUNoNdq0apki}}0eL6464 zaM1vBl{XNi0(MMpJnH#GQ~_(ATy;dpcyAhDlI$1_d(zN|jz{g!jK%c4DE+Eqnw}Y8 zw)6Idt{Irt=RvKQ8;h~Zj)yu%>NUVT;oT3O#hB(VLG4%>i+Pc8sexhIf^grVX#sGJ z5${#mMqe8vL2=`6CP~xY2EbtztxjxFf2w9*2Pp|B8arF?A*6%)d$UXnjgvwRTmZw|IcR8pQ1S>e_H<*UNIylGlOL+_~cS@qgCB762~yP>WSG)pv{Ci{cn z{!nz9%yNx&7!xr}mtmZyEXELw#;Giuy2-Z8ZTBhObO3qr`P8Dagf zsDh3f47yh!?JJS;e0XT@nPpU;{KG*SAUoxj(666A`y3T)c|% z;a`!pH>TUHzv-FaHYbBQpyM+zigGCW0|WnG$leFjeQsYZKd1R5=j-{n{}VnPfG@0W z6=_dHO1Dosn-^+6nKdw&P5bh)p1PUavakj2&c>j@i|h|f_qxykltQ&n=I zq1f`=UWGk-Mitm&WiSx1i^~E%-ZHa2%%8bcSX!Q1ss#g+$Q)vz!aN?&hlzHSU%FK2H9AGWQ;gKJSC+cP6 z8HvgWcA z2+2qak{|+6lM4KiR0{P=0<8=Rf-E91>PHqqGxyBIt}fERz2BMh_~y)9)>Hjm9Q={UIV-=%#tl{Q5j{}oeA;xTR2-;YLBxFKtS#c2TV3c0-04jf5F?E#} zyDAmPMe^;2sMYa-Uj9mUkXMvpN6D$soOI#ISR=i>Br3C`6|1VL+`jx!z1}J;6XCC- ztLVq7&~vYV7O|Mv7OR>F&`_BrA?8{tk52qN3-L)RYEuSanwGr(K!mN-gE=9TkF<1y z5}h#{8yB>X-;xwVes@POD3r7j(y7P-v~|pRKeB{@O}_>3^H#vwZGa=&0nb|i8*P9N zMnp$c4&d*6z}LG0=dCXn<*acKSvK^V#jaU$-i2hl_b#NK42NYa!b1is;-!Vs`#;EZ zv@ti>0Hj))goMnfmnV()g@Yk|6W}?~!Z1aZUvz*M`x0ArVKN)br>Ps_t zuX-<|8Bg}Z@`!f}?y*Bub1LBEE?<`ZnC6;^0sF1BMH=Ldh8r>_6D-)DDXp* zvWL_B;=+d_P*_TQX=+*u=jCjwiyRV3E3??dhoq+81P;PlD-4^stXJvn!3L7(wn^2x zu8-tJS!@=)3uu_CrLnE;h$y9+{s^d2oWYu{xk(u)h=Q&3$(HZOC^?OX}piq{Gu@pQ>9w5Vr9jdeU9E-IcpHnF%&+iMY*n z?gZ@?*-UUD-3)BX0nOiL(`m$#1&NXmTekc}`v^as1p3WOH&x7?nD?XjACq z6MahPNg*ugu>%uDOaT0`(sE4FG!!dn;`AY-TV%h*(NPK"] -version = "1.3.1" +version = "1.3.2" [deps] Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" diff --git a/ReleaseNotes.md b/ReleaseNotes.md index c6b81b8..d6b0dbc 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,9 @@ # Release Notes +## Version 1.3.2 + +Patch release to comply with the new definition of `DescriptorStateSpace` object in v1.4.2 of `DescriptorSystems`. + ## Version 1.3.1 Patch release with updated examples to comply with new Makie functionality. diff --git a/src/FDIsynthesis.jl b/src/FDIsynthesis.jl index 4cad15b..542a06e 100644 --- a/src/FDIsynthesis.jl +++ b/src/FDIsynthesis.jl @@ -1000,7 +1000,7 @@ function efdisyn(sysf::FDIModel{T}, SFDI::Union{BitMatrix,BitVector,Array{Bool,2 # Step 2): of Procedure EFDI # initialize overall filters Q and R - QRt = similar(Vector{typeof(QR)},nb) + QRt = similar(Vector{DescriptorStateSpace{T}},nb) for i = 1:nb indd = Vector(1:mf)[SFDI[i,:] .== false] indf = Vector(1:mf)[SFDI[i,:] .== true] @@ -2859,7 +2859,7 @@ function afdisyn(sysf::FDIModel{T}, SFDI::Union{BitMatrix,BitVector,Array{Bool,2 # Step 2): of Procedure EFDI # initialize overall filters Q and R - QRt = similar(Vector{typeof(QR)},nb) + QRt = similar(Vector{DescriptorStateSpace{T}},nb) for i = 1:nb indd = Vector(1:mf)[SFDI[i,:] .== false] indf = Vector(1:mf)[SFDI[i,:] .== true] @@ -4433,7 +4433,7 @@ function ammsyn(sysf::FDIModel{T1}, sysr::Union{FDFilterIF{T2},FDIModel{T2}}; po end # form explicitly Rref = [ Mrf 0 ] - Rref = [ sysr.sys[:,sysr.faults] zeros(rdim,mw)]; + Rref = [ sysr.sys[:,sysr.faults] zeros(T,rdim,mw)]; # compute F = [ F1 F2 ] = Rref*Gi' F = Rref*Ri'; diff --git a/src/types/FDIObjects.jl b/src/types/FDIObjects.jl index faec24d..10cc927 100644 --- a/src/types/FDIObjects.jl +++ b/src/types/FDIObjects.jl @@ -283,7 +283,7 @@ struct FDIFilterIF{T} <: AbstractFDDObject where T mf::Int mw::Int ma::Int - function FDIFilterIF{T}(sys::Vector{<:DescriptorStateSpace{T}}, mu::Int, md::Int, mf::Int, mw::Int, ma::Int) where T + function FDIFilterIF{T}(sys::Vector{<:DescriptorStateSpace{T}}, mu::Int, md::Int, mf::Int, mw::Int, ma::Int) where {T} N = length(sys) sysn = similar(sys,N) inps = 1:mu+md+mf+mw+ma @@ -294,7 +294,7 @@ struct FDIFilterIF{T} <: AbstractFDDObject where T new{T}(sysn, mu, md, mf, mw, ma) end end -FDIFilterIF(sys::Vector{<:DescriptorStateSpace{T}}, mu::Int, md::Int, mf::Int, mw::Int, ma::Int) where T = +FDIFilterIF(sys::Vector{<:DescriptorStateSpace{T}}, mu::Int, md::Int, mf::Int, mw::Int, ma::Int) where {T} = FDIFilterIF{T}(sys, mu, md, mf, mw, ma) """ FDIFilterIF(sys; mu = 0, md = 0, mf = 0, mw = 0, ma = 0, moff = 0 ) -> R::FDIFilterIF @@ -321,8 +321,12 @@ function FDIFilterIF(sys::Vector{<:DescriptorStateSpace{T}}; mu::Int = 0, md::In m = moff+mu+md+mf+mw+ma any(m .> size.(sys,2)) && error("the specified total number of inputs exceeds the number of system inputs") N = length(sys) + sysn = similar(sys,N) inps = moff+1:m - return FDIFilterIF{T}([sys[i][:,inps] for i in 1:N], mu, md, mf, mw, ma) + for i = 1:N + sysn[i] = sys[i][:,inps] + end + return FDIFilterIF{T}(sysn, mu, md, mf, mw, ma) end function Base.show(io::IO, mime::MIME{Symbol("text/plain")}, filter::FDIFilterIF) diff --git a/test/test_ammsyn.jl b/test/test_ammsyn.jl index 558a204..b9ac56d 100644 --- a/test/test_ammsyn.jl +++ b/test/test_ammsyn.jl @@ -171,7 +171,7 @@ Ge = [sysf.sys[:,[sysf.faults;sysf.noise]]; zeros(mu,mf+mw)]; Me = [info.M*Mr.sy @test iszero(R.sys-Q.sys*Ge, atol = 1.e-7) && fdimmperf(R,info.M*Mr) ≈ info.gammasub && glinfnorm(Me-Q.sys*Ge)[1] ≈ info.gammasub -#fails + # Example 5.14 of (V,2017) s = rtf('s'); # define the Laplace variable s Gf = 1/(s+1); # enter $G_f(s)$