Skip to content

Commit 26953ce

Browse files
authored
fix display and col/rowsupport for symmetric lower banded (#28)
* fix display and col/rowsupport for symmetric lower * removed dependency on BandedMatrices * replaced `data` with `parent` * abandon `parent`
1 parent dc76b65 commit 26953ce

File tree

2 files changed

+58
-23
lines changed

2 files changed

+58
-23
lines changed

src/memorylayout.jl

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,19 @@ rowsupport(::BidiagonalLayout, A, j) =
606606
colsupport(::AbstractTridiagonalLayout, A, j) = max(minimum(j)-1,1):min(size(A,1),maximum(j)+1)
607607
rowsupport(::AbstractTridiagonalLayout, A, j) = max(minimum(j)-1,1):min(size(A,2),maximum(j)+1)
608608

609-
colsupport(::SymmetricLayout, A, j) = first(colsupport(symmetricdata(A),j)):last(rowsupport(symmetricdata(A),j))
610-
rowsupport(::SymmetricLayout, A, j) = colsupport(A, j)
609+
function colsupport(::SymmetricLayout, A, j)
610+
if symmetricuplo(A) == 'U'
611+
first(colsupport(symmetricdata(A),j)):last(rowsupport(symmetricdata(A),j))
612+
else
613+
first(rowsupport(symmetricdata(A),j)):last(colsupport(symmetricdata(A),j))
614+
end
615+
end
616+
function colsupport(::HermitianLayout, A, j)
617+
if symmetricuplo(A) == 'U'
618+
first(colsupport(hermitiandata(A),j)):last(rowsupport(hermitiandata(A),j))
619+
else
620+
first(rowsupport(hermitiandata(A),j)):last(colsupport(hermitiandata(A),j))
621+
end
622+
end
623+
rowsupport(::Union{SymmetricLayout,HermitianLayout}, A, j) = colsupport(A, j)
611624

612-
colsupport(::HermitianLayout, A, j) = first(colsupport(hermitiandata(A),j)):last(rowsupport(hermitiandata(A),j))
613-
rowsupport(::HermitianLayout, A, j) = colsupport(A, j)

test/test_layouts.jl

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -176,26 +176,50 @@ struct FooNumber <: Number end
176176
@test symmetricdata(Symmetric(transpose(B))) transpose(B)
177177
@test hermitiandata(Hermitian(transpose(B))) transpose(B)
178178

179-
@testset "Bidiagonal" begin
180-
B = Bidiagonal(randn(6),randn(5),:U)
181-
Bc = Bidiagonal(randn(6) .+ 0im,randn(5) .+ 1im,:U)
182-
S = Symmetric(B)
183-
H = Hermitian(B)
184-
Sc = Symmetric(Bc)
185-
Hc = Hermitian(Bc)
186-
187-
@test MemoryLayout(S) isa SymTridiagonalLayout
188-
@test MemoryLayout(H) isa SymTridiagonalLayout
189-
@test MemoryLayout(Sc) isa SymTridiagonalLayout
190-
@test MemoryLayout(Hc) isa HermitianLayout
191-
192-
@test diagonaldata(S) == diagonaldata(B)
193-
@test subdiagonaldata(S) == supdiagonaldata(S) == supdiagonaldata(B)
194-
195-
@test colsupport(S,3) == colsupport(H,3) == colsupport(Sc,3) == colsupport(Hc,3) == 2:4
196-
@test rowsupport(S,3) == rowsupport(H,3) == rowsupport(Sc,3) == rowsupport(Hc,3) == 2:4
179+
end
180+
181+
@testset "Symmetric of Banded" begin
182+
@eval struct BandedMock{T} <: AbstractMatrix{T} end
183+
ArrayLayouts.colsupport(A::BandedMock, j) = j:min(j+1, 4)
184+
ArrayLayouts.rowsupport(A::BandedMock, j) = max(j-1, 1):j
185+
ArrayLayouts.MemoryLayout(::Type{<:BandedMock}) = DenseColumnMajor()
186+
Base.size(::BandedMock) = (4, 4)
187+
188+
A = BandedMock{Float64}()
189+
190+
for X in (Symmetric(A), Hermitian(A))
191+
@test colsupport(X, 1) == rowsupport(X, 1) == 1:1
192+
@test colsupport(X, 2) == rowsupport(X, 2) == 2:2
193+
@test colsupport(X, 3) == rowsupport(X, 3) == 3:3
194+
@test colsupport(X, 4) == rowsupport(X, 4) == 4:4
195+
end
196+
for X in (Symmetric(A, :L), Hermitian(A, :L))
197+
@test colsupport(X, 1) == rowsupport(X, 1) == 1:2
198+
@test colsupport(X, 2) == rowsupport(X, 2) == 1:3
199+
@test colsupport(X, 3) == rowsupport(X, 3) == 2:4
200+
@test colsupport(X, 4) == rowsupport(X, 4) == 3:4
197201
end
198-
end
202+
end
203+
204+
@testset "Bidiagonal" begin
205+
B = Bidiagonal(randn(6),randn(5),:U)
206+
Bc = Bidiagonal(randn(6) .+ 0im,randn(5) .+ 1im,:U)
207+
S = Symmetric(B)
208+
H = Hermitian(B)
209+
Sc = Symmetric(Bc)
210+
Hc = Hermitian(Bc)
211+
212+
@test MemoryLayout(S) isa SymTridiagonalLayout
213+
@test MemoryLayout(H) isa SymTridiagonalLayout
214+
@test MemoryLayout(Sc) isa SymTridiagonalLayout
215+
@test MemoryLayout(Hc) isa HermitianLayout
216+
217+
@test diagonaldata(S) == diagonaldata(B)
218+
@test subdiagonaldata(S) == supdiagonaldata(S) == supdiagonaldata(B)
219+
220+
@test colsupport(S,3) == colsupport(H,3) == colsupport(Sc,3) == colsupport(Hc,3) == 2:4
221+
@test rowsupport(S,3) == rowsupport(H,3) == rowsupport(Sc,3) == rowsupport(Hc,3) == 2:4
222+
end
199223

200224
@testset "triangular MemoryLayout" begin
201225
A = [1.0 2; 3 4]

0 commit comments

Comments
 (0)