From 3a8bb57a7112b973618afaa55d741e937bcdf983 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Fri, 28 Apr 2023 16:50:34 +0100 Subject: [PATCH 1/2] Speed up views with KronTrav --- Project.toml | 2 +- src/InfiniteLinearAlgebra.jl | 4 ++-- src/blockbanded/blockbanded.jl | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index cb573d2..63652ad 100644 --- a/Project.toml +++ b/Project.toml @@ -26,7 +26,7 @@ DSP = "0.7" FillArrays = "0.13, 1" InfiniteArrays = "0.12" LazyArrays = "0.22, 1" -LazyBandedMatrices = "0.8.7" +LazyBandedMatrices = "0.8.10" MatrixFactorizations = "0.9.6, 1" SemiseparableMatrices = "0.3" julia = "1.6" diff --git a/src/InfiniteLinearAlgebra.jl b/src/InfiniteLinearAlgebra.jl index da53e83..1995354 100644 --- a/src/InfiniteLinearAlgebra.jl +++ b/src/InfiniteLinearAlgebra.jl @@ -30,11 +30,11 @@ import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUn import BandedMatrices: BandedMatrix, bandwidths, AbstractBandedLayout, _banded_qr!, _banded_qr, _BandedMatrix, banded_chol! import LazyBandedMatrices: ApplyBandedLayout, BroadcastBandedLayout, _krontrav_axes, _block_interlace_axes, LazyBandedLayout, AbstractLazyBandedBlockBandedLayout, - AbstractLazyBandedLayout, OneToCumsum, BlockSlice1, KronTravBandedBlockBandedLayout, krontravargs, _broadcast_sub_arguments, BlockVec + AbstractLazyBandedLayout, OneToCumsum, BlockSlice1, KronTravBandedBlockBandedLayout, SubKronTravBandedBlockBandedLayout, krontravargs, _broadcast_sub_arguments, BlockVec import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, _BlockSkylineMatrix, blockstart, blockstride, BlockSkylineSizes, BlockSkylineMatrix, BlockBandedMatrix, _BlockBandedMatrix, BlockTridiagonal, - AbstractBlockBandedLayout, _blockbanded_qr!, BlockBandedLayout + AbstractBlockBandedLayout, _blockbanded_qr!, BlockBandedLayout, BlockRangeInd import DSP: conv diff --git a/src/blockbanded/blockbanded.jl b/src/blockbanded/blockbanded.jl index 86434bd..8e04ae1 100644 --- a/src/blockbanded/blockbanded.jl +++ b/src/blockbanded/blockbanded.jl @@ -81,6 +81,7 @@ MemoryLayout(::Type{<:KronTrav{<:Any,2,<:Any,NTuple{2,BlockedUnitRange{OneToInfC sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice1}}) = BroadcastBandedLayout{typeof(*)}() sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice{BlockRange{1,Tuple{OneTo{Int}}}}}}) = KronTravBandedBlockBandedLayout() +sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:Tuple{BlockRangeInd, BlockRangeInd}}) = SubKronTravBandedBlockBandedLayout() copy(M::Mul{InfKronTravBandedBlockBandedLayout, InfKronTravBandedBlockBandedLayout}) = KronTrav((krontravargs(M.A) .* krontravargs(M.B))...) From 39e857fb38a3d0af490b49a332a9c347cc844400 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Tue, 2 May 2023 21:46:22 +0100 Subject: [PATCH 2/2] Improve DiagTrav algebra --- Project.toml | 2 +- src/InfiniteLinearAlgebra.jl | 2 +- src/blockbanded/blockbanded.jl | 7 +++++++ test/runtests.jl | 11 ++++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 63652ad..43dbf42 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "InfiniteLinearAlgebra" uuid = "cde9dba0-b1de-11e9-2c62-0bab9446c55c" -version = "0.6.17" +version = "0.6.18" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/InfiniteLinearAlgebra.jl b/src/InfiniteLinearAlgebra.jl index 1995354..f1a329b 100644 --- a/src/InfiniteLinearAlgebra.jl +++ b/src/InfiniteLinearAlgebra.jl @@ -30,7 +30,7 @@ import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUn import BandedMatrices: BandedMatrix, bandwidths, AbstractBandedLayout, _banded_qr!, _banded_qr, _BandedMatrix, banded_chol! import LazyBandedMatrices: ApplyBandedLayout, BroadcastBandedLayout, _krontrav_axes, _block_interlace_axes, LazyBandedLayout, AbstractLazyBandedBlockBandedLayout, - AbstractLazyBandedLayout, OneToCumsum, BlockSlice1, KronTravBandedBlockBandedLayout, SubKronTravBandedBlockBandedLayout, krontravargs, _broadcast_sub_arguments, BlockVec + AbstractLazyBandedLayout, OneToCumsum, BlockSlice1, KronTravBandedBlockBandedLayout, SubKronTravBandedBlockBandedLayout, krontravargs, _broadcast_sub_arguments, BlockVec, DiagTravLayout import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, _BlockSkylineMatrix, blockstart, blockstride, BlockSkylineSizes, BlockSkylineMatrix, BlockBandedMatrix, _BlockBandedMatrix, BlockTridiagonal, diff --git a/src/blockbanded/blockbanded.jl b/src/blockbanded/blockbanded.jl index 8e04ae1..6be8e00 100644 --- a/src/blockbanded/blockbanded.jl +++ b/src/blockbanded/blockbanded.jl @@ -84,5 +84,12 @@ sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice{Blo sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:Tuple{BlockRangeInd, BlockRangeInd}}) = SubKronTravBandedBlockBandedLayout() copy(M::Mul{InfKronTravBandedBlockBandedLayout, InfKronTravBandedBlockBandedLayout}) = KronTrav((krontravargs(M.A) .* krontravargs(M.B))...) +function copy(M::Mul{InfKronTravBandedBlockBandedLayout, <:DiagTravLayout}) + A,B = krontravargs(M.A) + X = M.B.array + DiagTrav(B*X*A') +end _broadcast_sub_arguments(::InfKronTravBandedBlockBandedLayout, M, V) = _broadcast_sub_arguments(KronTravBandedBlockBandedLayout(), M, V) + + diff --git a/test/runtests.jl b/test/runtests.jl index 4dae062..3735a77 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -11,7 +11,7 @@ import MatrixFactorizations: QLPackedQ import BandedMatrices: bandeddata, _BandedMatrix, BandedStyle import LazyArrays: colsupport, MemoryLayout, ApplyLayout, LazyArrayStyle, arguments, paddeddata, PaddedLayout import InfiniteArrays: OneToInf, oneto, RealInfinity -import LazyBandedMatrices: BroadcastBandedBlockBandedLayout, BroadcastBandedLayout, LazyBandedLayout, BlockVec +import LazyBandedMatrices: BroadcastBandedBlockBandedLayout, BroadcastBandedLayout, LazyBandedLayout, BlockVec, DiagTravLayout using Aqua @testset "Project quality" begin @@ -121,6 +121,10 @@ include("test_infbanded.jl") A = DiagTrav(C) @test blockcolsupport(A) == Block.(1:6) @test A[Block.(1:7)] == [1; 5; 2; 9; 6; 3; 0; 10; 7; 4; 0; 0; 11; 8; 0; 0; 0; 0; 12; zeros(9)] + dest = similar(Array{Float64}, axes(A)) + copyto!(dest, A) + @test dest == PseudoBlockArray(A) + @test A == PseudoBlockArray(A) C = zeros(∞,4); C[1:3,1:4] .= [1 2 3 4; 5 6 7 8; 9 10 11 12] @@ -149,7 +153,12 @@ include("test_infbanded.jl") @test bandwidths(view(A, Block(1, 1))) == (1, 1) @test A*A isa KronTrav + @test A^2 isa KronTrav @test (A*A)[Block.(Base.OneTo(3)), Block.(Base.OneTo(3))] ≈ A[Block.(1:3), Block.(1:4)]A[Block.(1:4), Block.(1:3)] + + F = zeros(∞,∞); F[1:5,1:5] = randn(5,5); + + @test MemoryLayout(A * DiagTrav(F)) isa DiagTravLayout{<:PaddedLayout} end @testset "triangle recurrences" begin