diff --git a/Project.toml b/Project.toml index 98cdb44..c351587 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "InfiniteLinearAlgebra" uuid = "cde9dba0-b1de-11e9-2c62-0bab9446c55c" -version = "0.6.9" +version = "0.6.10" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/InfiniteLinearAlgebra.jl b/src/InfiniteLinearAlgebra.jl index 61a3e8e..b3eb2ef 100644 --- a/src/InfiniteLinearAlgebra.jl +++ b/src/InfiniteLinearAlgebra.jl @@ -28,7 +28,8 @@ 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,AbstractLazyBandedLayout, OneToCumsum +import LazyBandedMatrices: ApplyBandedLayout, BroadcastBandedLayout, _krontrav_axes, _block_interlace_axes, LazyBandedLayout, AbstractLazyBandedBlockBandedLayout, + AbstractLazyBandedLayout, OneToCumsum, BlockSlice1, KronTravBandedBlockBandedLayout, krontravargs, _broadcast_sub_arguments 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 a362f76..455cc8e 100644 --- a/src/blockbanded/blockbanded.jl +++ b/src/blockbanded/blockbanded.jl @@ -74,3 +74,14 @@ BroadcastStyle(::Type{<:PseudoBlockArray{T,N,<:AbstractArray{T,N},<:NTuple{N,Blo ### _krontrav_axes(A::OneToInf{Int}, B::OneToInf{Int}) where N = blockedrange(oneto(length(A))) + + +struct InfKronTravBandedBlockBandedLayout <: AbstractLazyBandedBlockBandedLayout end +MemoryLayout(::Type{<:KronTrav{<:Any,2,<:Any,NTuple{2,BlockedUnitRange{OneToInfCumsum}}}}) = InfKronTravBandedBlockBandedLayout() + +sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice1}}) = BroadcastBandedLayout{typeof(*)}() +sublayout(::InfKronTravBandedBlockBandedLayout, ::Type{<:NTuple{2,BlockSlice{BlockRange{1,Tuple{OneTo{Int}}}}}}) = KronTravBandedBlockBandedLayout() + +copy(M::Mul{InfKronTravBandedBlockBandedLayout, InfKronTravBandedBlockBandedLayout}) = KronTrav((krontravargs(M.A) .* krontravargs(M.B))...) + +_broadcast_sub_arguments(::InfKronTravBandedBlockBandedLayout, M, V) = _broadcast_sub_arguments(KronTravBandedBlockBandedLayout(), M, V) \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 7120412..efe13d8 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -100,11 +100,18 @@ include("test_infbanded.jl") A = KronTrav(Δ - 2I, Eye(∞)) @test axes(A, 1) isa InfiniteLinearAlgebra.OneToInfBlocks V = view(A, Block.(Base.OneTo(3)), Block.(Base.OneTo(3))) + + @test MemoryLayout(A) isa InfiniteLinearAlgebra.InfKronTravBandedBlockBandedLayout @test MemoryLayout(V) isa LazyBandedMatrices.KronTravBandedBlockBandedLayout + @test A[Block.(Base.OneTo(3)), Block.(Base.OneTo(3))] isa KronTrav + u = A * [1; zeros(∞)] @test u[1:3] == A[1:3, 1] @test bandwidths(view(A, Block(1, 1))) == (1, 1) + + @test A*A 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)] end @testset "triangle recurrences" begin