diff --git a/Project.toml b/Project.toml index cb573d2..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" @@ -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..f1a329b 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, DiagTravLayout 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..6be8e00 100644 --- a/src/blockbanded/blockbanded.jl +++ b/src/blockbanded/blockbanded.jl @@ -81,7 +81,15 @@ 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))...) +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