Skip to content

Commit 9b14073

Browse files
committed
Resolve stack-overflow in Diagonal*Bidiagonal and (Sym)Tridiagonal
1 parent d315ce3 commit 9b14073

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/diagonal.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ copy(M::Rdiv{<:DiagonalLayout,<:DiagonalLayout{<:AbstractFillLayout}}) = diagona
5757

5858

5959
## bi/tridiagonal copy
60-
copy(M::Rmul{<:BidiagonalLayout,<:DiagonalLayout}) = convert(Bidiagonal, M.A) * M.B
61-
copy(M::Lmul{<:DiagonalLayout,<:BidiagonalLayout}) = M.A * convert(Bidiagonal, M.B)
62-
copy(M::Rmul{<:TridiagonalLayout,<:DiagonalLayout}) = convert(Tridiagonal, M.A) * M.B
63-
copy(M::Lmul{<:DiagonalLayout,<:TridiagonalLayout}) = M.A * convert(Tridiagonal, M.B)
64-
copy(M::Rmul{<:SymTridiagonalLayout,<:DiagonalLayout}) = convert(SymTridiagonal, M.A) * M.B
65-
copy(M::Lmul{<:DiagonalLayout,<:SymTridiagonalLayout}) = M.A * convert(SymTridiagonal, M.B)
60+
copy(M::Rmul{<:BidiagonalLayout,<:DiagonalLayout}) = convert(Bidiagonal, M.A) .* permutedims(parent(convert(Diagonal, M.B)))
61+
copy(M::Lmul{<:DiagonalLayout,<:BidiagonalLayout}) = parent(convert(Diagonal, M.A)) .* convert(Bidiagonal, M.B)
62+
copy(M::Rmul{<:TridiagonalLayout,<:DiagonalLayout}) = convert(Tridiagonal, M.A) .* permutedims(parent(convert(Diagonal, M.B)))
63+
copy(M::Lmul{<:DiagonalLayout,<:TridiagonalLayout}) = parent(convert(Diagonal, M.A)) .* convert(Tridiagonal, M.B)
64+
copy(M::Rmul{<:SymTridiagonalLayout,<:DiagonalLayout}) = convert(SymTridiagonal, M.A) .* permutedims(parent(convert(Diagonal, M.B)))
65+
copy(M::Lmul{<:DiagonalLayout,<:SymTridiagonalLayout}) = parent(convert(Diagonal, M.A)) .* convert(SymTridiagonal, M.B)
6666

6767
copy(M::Lmul{DiagonalLayout{OnesLayout}}) = _copy_oftype(M.B, eltype(M))
6868
copy(M::Lmul{DiagonalLayout{OnesLayout},<:DiagonalLayout}) = Diagonal(_copy_oftype(diagonaldata(M.B), eltype(M)))

test/test_layoutarray.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,22 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
337337
@test\D \Matrix(D)
338338
@test D\\D
339339
@test/D /Matrix(D)
340+
341+
@testset "Diagonal * Bidiagonal/Tridiagonal with structured diags" begin
342+
n = size(D,1)
343+
B = Bidiagonal(map(MyVector, (rand(n), rand(n-1)))..., :U)
344+
S = SymTridiagonal(map(MyVector, (rand(n), rand(n-1)))...)
345+
T = Tridiagonal(map(MyVector, (rand(n-1), rand(n), rand(n-1)))...)
346+
DA, BA, SA, TA = map(Array, (D, B, S, T))
347+
@test D * B DA * BA
348+
@test B * D BA * DA
349+
if VERSION >= v"1.12.0-DEV.824"
350+
@test D * S DA * SA
351+
@test D * T DA * TA
352+
@test S * D SA * DA
353+
@test T * D TA * DA
354+
end
355+
end
340356
end
341357

342358
@testset "Adj/Trans" begin

0 commit comments

Comments
 (0)