From b91387c1f1867cde9b3d9b4709eacd09c9821c74 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Thu, 12 Dec 2024 16:30:13 +0000 Subject: [PATCH 1/4] =?UTF-8?q?Overload=20simplifiable=20for=20=E2=88=9E-K?= =?UTF-8?q?ronTrav=20multiplication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext/LazyBandedMatricesInfiniteArraysExt.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/LazyBandedMatricesInfiniteArraysExt.jl b/ext/LazyBandedMatricesInfiniteArraysExt.jl index b6a9cad..66aca9b 100644 --- a/ext/LazyBandedMatricesInfiniteArraysExt.jl +++ b/ext/LazyBandedMatricesInfiniteArraysExt.jl @@ -8,7 +8,7 @@ import LazyBandedMatrices: _krontrav_axes, _block_interlace_axes, _broadcast_sub import InfiniteArrays: InfFill, TridiagonalToeplitzLayout, BidiagonalToeplitzLayout, LazyArrayStyle, OneToInf import LazyBandedMatrices.ArrayLayouts: MemoryLayout, sublayout, RangeCumsum, Mul import LazyBandedMatrices.BlockArrays: sizes_from_blocks, BlockedOneTo, BlockSlice1, BlockSlice -import LazyBandedMatrices.LazyArrays: BroadcastBandedLayout, AbstractPaddedLayout +import LazyBandedMatrices.LazyArrays: BroadcastBandedLayout, AbstractPaddedLayout, simplifiable const OneToInfCumsum = RangeCumsum{Int,OneToInf{Int}} @@ -39,6 +39,7 @@ MemoryLayout(::Type{<:KronTrav{<:Any,2,<:Any,NTuple{2,BlockedOneTo{Int,OneToInfC sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice1}}) = BroadcastBandedLayout{typeof(*)}() sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice{BlockRange{1,Tuple{OneTo{Int}}}}}}) = KronTravBandedBlockBandedLayout() +simplifiable(::Mul{InfKronTravBandedBlockBandedLayout, InfKronTravBandedBlockBandedLayout}) = Val(true) copy(M::Mul{InfKronTravBandedBlockBandedLayout, InfKronTravBandedBlockBandedLayout}) = KronTrav((krontravargs(M.A) .* krontravargs(M.B))...) _broadcast_sub_arguments(::InfKronTravBandedBlockBandedLayout, M, V) = _broadcast_sub_arguments(KronTravBandedBlockBandedLayout(), M, V) From d08792aaa8003752647386e0de5a39abeecad0d8 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Thu, 19 Dec 2024 16:52:02 +0000 Subject: [PATCH 2/4] Add krontrav function --- src/blockkron.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/blockkron.jl b/src/blockkron.jl index 18d2554..49e5099 100644 --- a/src/blockkron.jl +++ b/src/blockkron.jl @@ -391,6 +391,11 @@ function _krontrav_mul_diagtrav((A,B,C), X::AbstractArray{<:Any,3}, ::Type{T}) w DiagTrav(Y) end +kron_materialize_layout(_, K) = BlockedMatrix(K) +kron_materialize_layout(::AbstractBandedBlockBandedLayout, K) = BandedBlockBandedMatrix(K) +kron_materialize(K) = kron_materialize_layout(MemoryLayout(K), K) +krontrav(A...) = kron_materialize(KronTrav(A...)) + # C = α*B*X*A' + β*C \ No newline at end of file From ac239792de4d66f9d5c311591cfdccd404560dae Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Tue, 7 Jan 2025 20:47:09 +0000 Subject: [PATCH 3/4] v0.11.1 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index c927fce..902c9a9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "LazyBandedMatrices" uuid = "d7e5e226-e90b-4449-9968-0f923699bf6f" authors = ["Sheehan Olver "] -version = "0.11.0" +version = "0.11.1" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" From 57709c0af41be114045b0fa2f99d6b5001c82c5d Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Thu, 9 Jan 2025 11:29:12 +0000 Subject: [PATCH 4/4] add tests --- src/blockkron.jl | 2 +- test/test_blockkron.jl | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/blockkron.jl b/src/blockkron.jl index 49e5099..95c27cb 100644 --- a/src/blockkron.jl +++ b/src/blockkron.jl @@ -391,7 +391,7 @@ function _krontrav_mul_diagtrav((A,B,C), X::AbstractArray{<:Any,3}, ::Type{T}) w DiagTrav(Y) end -kron_materialize_layout(_, K) = BlockedMatrix(K) +kron_materialize_layout(_, K) = BlockedArray(K) kron_materialize_layout(::AbstractBandedBlockBandedLayout, K) = BandedBlockBandedMatrix(K) kron_materialize(K) = kron_materialize_layout(MemoryLayout(K), K) krontrav(A...) = kron_materialize(KronTrav(A...)) diff --git a/test/test_blockkron.jl b/test/test_blockkron.jl index 522ef0b..eda2b8d 100644 --- a/test/test_blockkron.jl +++ b/test/test_blockkron.jl @@ -1,9 +1,10 @@ module TestBlockKron using LazyBandedMatrices, FillArrays, BandedMatrices, BlockBandedMatrices, BlockArrays, ArrayLayouts, LazyArrays, Test + using LinearAlgebra import BlockBandedMatrices: isbandedblockbanded, isbanded, BandedBlockBandedStyle, BandedLayout, _BandedBlockBandedMatrix -import LazyBandedMatrices: KronTravBandedBlockBandedLayout, BroadcastBandedLayout, BroadcastBandedBlockBandedLayout, arguments, call, blockcolsupport, InvDiagTrav, invdiagtrav, pad +import LazyBandedMatrices: KronTravBandedBlockBandedLayout, BroadcastBandedLayout, BroadcastBandedBlockBandedLayout, arguments, call, blockcolsupport, InvDiagTrav, invdiagtrav, pad, krontrav import ArrayLayouts: FillLayout, OnesLayout import LazyArrays: resizedata!, FillLayout, arguments, colsupport, call, LazyArrayStyle import BandedMatrices: BandedColumns @@ -333,6 +334,26 @@ LinearAlgebra.factorize(A::MyLazyArray) = factorize(A.data) x = DiagTrav(C) @test D*x ≈ Matrix(D) * Vector(x) end + + @testset "krontrav" begin + a = [1,2,3] + b = [4,5,6] + c = [7,8,9] + @test krontrav(a,b) == KronTrav(a,b) + @test krontrav(a,b,c) == KronTrav(a,b,c) + @test krontrav(a,b) isa BlockedVector + @test krontrav(a,b,c) isa BlockedVector + + A = [1 2; 3 4] + B = [5 6; 7 8] + @test krontrav(A,B) == KronTrav(A,B) + @test krontrav(A,B) isa BlockedMatrix + + n = 4 + Δ = BandedMatrix(1 => Ones(n-1), 0 => Fill(-2,n), -1 => Ones(n-1)) + @test krontrav(Δ,Eye(n)) == KronTrav(Δ, Eye(n)) + @test krontrav(Δ,Eye(n)) isa BandedBlockBandedMatrix + end end end # module