Skip to content

Commit 3dd06c5

Browse files
authored
Support views with BlockedUnitRange (#147)
* Support views with BlockedUnitRange * Update BandedBlockBandedMatrix.jl * v0.11.11 * FillArrays v1.0 * Update Project.toml * Update runtests.jl * FillArrays v1 required * Update Project.toml * Update BandedBlockBandedMatrix.jl * Update BandedBlockBandedMatrix.jl * Update Project.toml * Update Project.toml * simplify sublayout
1 parent effbaf3 commit 3dd06c5

File tree

6 files changed

+46
-56
lines changed

6 files changed

+46
-56
lines changed

Project.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BlockBandedMatrices"
22
uuid = "ffab5731-97b5-5995-9138-79e8c1846df0"
3-
version = "0.11.10"
3+
version = "0.12"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -13,12 +13,12 @@ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1313
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
1414

1515
[compat]
16-
Aqua = "0.5"
17-
ArrayLayouts = "0.8.7"
16+
Aqua = "0.6"
17+
ArrayLayouts = "1"
1818
BandedMatrices = "0.17.2"
19-
BlockArrays = "0.16.18"
20-
FillArrays = "0.13"
21-
MatrixFactorizations = "0.9"
19+
BlockArrays = "0.16.26"
20+
FillArrays = "1"
21+
MatrixFactorizations = "1"
2222
julia = "1.6"
2323

2424
[extras]

src/BandedBlockBandedMatrix.jl

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const DefaultBandedBlockBandedMatrix{T} = BandedBlockBandedMatrix{T, PseudoBlock
4747
@inline _BandedBlockBandedMatrix(data::AbstractMatrix,rblocksizes::AbstractVector{Int}, cblocksizes::AbstractVector{Int}, lu::NTuple{2,Int}, λμ::NTuple{2,Int}) =
4848
_BandedBlockBandedMatrix(data, (blockedrange(rblocksizes),blockedrange(cblocksizes)), lu, λμ)
4949

50-
_blocklengths2blocklasts(b::Fill) = iszero(FillArrays.getindex_value(b)) ? (1:1:0) : cumsum(b)
50+
_blocklengths2blocklasts(b::Fill) = cumsum(b)
5151
_bbb_data_axes(caxes, lu, λμ) = (blockedrange(Fill(max(0,sum(λμ)+1),max(0,sum(lu)+1))),caxes)
5252

5353
BandedBlockBandedMatrix{T,B,R}(::UndefInitializer, axes::NTuple{2,AbstractUnitRange{Int}}, lu::NTuple{2,Int}, λμ::NTuple{2,Int}) where {T,B,R<:AbstractUnitRange{Int}} =
@@ -408,34 +408,30 @@ end
408408
const SubBandedBlockBandedMatrix{T,R1,R2} =
409409
SubArray{T,2,<:BandedBlockBandedMatrix{T},<:Tuple{BlockSlice{R1},BlockSlice{R2}}}
410410

411+
const SingleBlockInd = Union{BlockSlice1, BlockSlice{<:BlockIndexRange1}}
412+
const BlockRangeInd = Union{BlockSlices, BlockedUnitRange}
411413

412-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice1,BlockSlice1}} = bandedcolumns(sublayout(ML(), II))
413-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice{<:BlockIndexRange1},BlockSlice{<:BlockIndexRange1}}} = bandedcolumns(sublayout(ML(), II))
414-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice{<:BlockIndexRange1},BlockSlice1}} = bandedcolumns(sublayout(ML(), II))
415-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice1,BlockSlice{<:BlockIndexRange1}}} = bandedcolumns(sublayout(ML(), II))
416-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice{<:BlockRange1},BlockSlice{<:BlockRange1}}} = bandedblockbandedcolumns(sublayout(ML(), II))
417-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice1,BlockSlice{<:BlockRange1}}} = bandedblockbandedcolumns(sublayout(ML(), II))
418-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice{<:BlockRange1},BlockSlice1}} = bandedblockbandedcolumns(sublayout(ML(), II))
419-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice{<:BlockIndexRange1},BlockSlice{<:BlockRange1}}} = bandedblockbandedcolumns(sublayout(ML(), II))
420-
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockSlice{<:BlockRange1},BlockSlice{<:BlockIndexRange1}}} = bandedblockbandedcolumns(sublayout(ML(), II))
414+
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{SingleBlockInd,SingleBlockInd}} = bandedcolumns(sublayout(ML(), II))
415+
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockRangeInd,BlockRangeInd}} = bandedblockbandedcolumns(sublayout(ML(), II))
416+
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{SingleBlockInd,BlockRangeInd}} = bandedblockbandedcolumns(sublayout(ML(), II))
417+
sublayout(::BandedBlockBandedColumns{ML}, ::Type{II}) where {ML,II<:Tuple{BlockRangeInd,SingleBlockInd}} = bandedblockbandedcolumns(sublayout(ML(), II))
421418

422-
blockbandshift(A::BlockSlice, B::BlockSlice) = BandedMatrices.bandshift(Int.(A.block), Int.(B.block))
423-
blockbandshift(S) = blockbandshift(parentindices(S)[1],parentindices(S)[2])
419+
_blockaxes1(A::BlockSlice) = A.block
420+
_blockaxes1(A::Slice) = _blockaxes1(A.indices)
421+
_blockaxes1(A::BlockedUnitRange) = blockaxes(A,1)
422+
blockbandshift(A, B) = BandedMatrices.bandshift(Int.(_blockaxes1(A)), Int.(_blockaxes1(B)))
423+
blockbandshift(S) = blockbandshift(parentindices(S)...)
424424

425425
function bandedblockbandeddata(V::SubArray)
426426
l,u = blockbandwidths(V)
427427
L,U = blockbandwidths(parent(V)) .+ (-1,1) .* blockbandshift(V)
428428
view(bandedblockbandeddata(parent(V)), Block.(U-u+1:U+l+1), parentindices(V)[2])
429429
end
430430

431-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice1,BlockSlice1}}) = BandedLayout()
432-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice{<:BlockIndexRange1},BlockSlice{<:BlockIndexRange1}}}) = BandedLayout()
433-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice{<:BlockIndexRange1},BlockSlice1}}) = BandedLayout()
434-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice1,BlockSlice{<:BlockIndexRange1}}}) = BandedLayout()
435-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice{<:BlockRange1},BlockSlice{<:BlockRange1}}}) = BandedBlockBandedLayout()
436-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice1,BlockSlice{<:BlockRange1}}}) = BandedBlockBandedLayout()
437-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice{<:BlockRange1},BlockSlice1}}) = BandedBlockBandedLayout()
438-
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockSlice{<:BlockRange1},BlockSlice{<:BlockIndexRange1}}}) = BandedBlockBandedLayout()
431+
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{SingleBlockInd,SingleBlockInd}}) = BandedLayout()
432+
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockRangeInd,BlockRangeInd}}) = BandedBlockBandedLayout()
433+
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{SingleBlockInd,BlockRangeInd}}) = BandedBlockBandedLayout()
434+
sublayout(::AbstractBandedBlockBandedLayout, ::Type{<:Tuple{BlockRangeInd,SingleBlockInd}}) = BandedBlockBandedLayout()
439435

440436

441437
sub_materialize(::AbstractBandedBlockBandedLayout, V, _) = BandedBlockBandedMatrix(V)
@@ -451,36 +447,25 @@ isbanded(A::SubArray{<:Any,2,<:BandedBlockBandedMatrix}) = MemoryLayout(A) isa A
451447
isbandedblockbanded(A::SubArray{<:Any,2,<:BandedBlockBandedMatrix}) = MemoryLayout(A) isa AbstractBandedBlockBandedLayout
452448

453449

454-
subblockbandwidths(V::SubArray{<:Any,2,<:Any,<:Tuple{<:BlockSlice{<:BlockRange1},<:BlockSlice{<:BlockRange1}}}) =
455-
subblockbandwidths(parent(V))
450+
subblockbandwidths(V::SubArray) = subblockbandwidths(parent(V))
456451

457-
function blockbandwidths(V::SubArray{<:Any,2,<:Any,<:Tuple{<:BlockSlice{<:BlockRange1},<:BlockSlice1}})
458-
A = parent(V)
459-
KR = parentindices(V)[1].block.indices[1]
460-
J = parentindices(V)[2].block
461-
shift = Int(KR[1])-Int(J)
462-
blockbandwidth(A,1) - shift, blockbandwidth(A,2) + shift
463-
end
464452

465-
function blockbandwidths(V::SubArray{<:Any,2,<:Any,<:Tuple{<:BlockSlice{<:Block1},<:BlockSlice{<:BlockRange1}}})
453+
_firstblock(B::BlockedUnitRange) = Int(blockaxes(B,1)[1])
454+
_firstblock(B::Block{1}) = Int(B)
455+
_firstblock(B::BlockIndexRange) = _firstblock(B.block)
456+
_firstblock(B::BlockRange) = B.indices[1][1]
457+
_firstblock(B::Base.Slice) = _firstblock(B.indices)
458+
_firstblock(B::BlockSlice) = _firstblock(B.block)
459+
460+
461+
function blockbandwidths(V::SubArray)
466462
A = parent(V)
467-
K = parentindices(V)[1].block
468-
JR = parentindices(V)[2].block.indices[1]
469-
shift = Int(K)-Int(JR[1])
463+
K1,J1 = map(_firstblock, parentindices(V))
464+
shift = K1-J1
470465
l,u = blockbandwidths(A)
471466
l - shift, u + shift
472467
end
473468

474-
function blockbandwidths(V::SubArray{<:Any,2,<:Any,<:Tuple{<:BlockSlice{<:BlockRange1},<:BlockSlice{<:BlockRange1}}})
475-
A = parent(V)
476-
477-
KR = parentindices(V)[1].block.indices[1]
478-
JR = parentindices(V)[2].block.indices[1]
479-
shift = Int(first(KR))-Int(first(JR))
480-
481-
blockbandwidth(A,1) - shift, blockbandwidth(A,2) + shift
482-
end
483-
484469

485470
const BandedBlockBandedBlock{T, BLOCKS, RAXIS} = SubArray{T,2,BandedBlockBandedMatrix{T, BLOCKS, RAXIS},<:Tuple{BlockSlice1,BlockSlice1},false}
486471

src/BlockBandedMatrices.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Base: getindex, setindex!, checkbounds, @propagate_inbounds, convert,
77
unsafe_convert, fill!, length, first, last,
88
eltype, getindex, to_indices, to_index,
99
reindex, tail, @_propagate_inbounds_meta,
10-
==, axes, copy, copyto!, similar, OneTo
10+
==, axes, copy, copyto!, similar, OneTo, Slice
1111

1212
import Base.Broadcast: BroadcastStyle, AbstractArrayStyle, DefaultArrayStyle, Broadcasted, broadcasted,
1313
materialize, materialize!

src/linalg.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,11 @@ end
9090
####
9191
# BlockIndexRange subblocks
9292
####
93-
sublayout(::AbstractBlockBandedLayout, ::Type{<:Tuple{<:BlockSlices, <:BlockSlices}}) = BlockBandedLayout()
93+
sublayout(::AbstractBlockBandedLayout, ::Type{<:Tuple{BlockRangeInd, BlockRangeInd}}) = BlockBandedLayout()
9494

95-
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{<:BlockSlices, <:BlockSlices}}) = BlockBandedColumnMajor()
96-
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{<:BlockSlices, <:BlockSlice{Block1}}}) = ColumnMajor()
97-
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{<:BlockSlices, <:BlockSlice{<:BlockIndexRange1}}}) = ColumnMajor()
98-
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{<:BlockSlice{<:BlockIndexRange1}, <:BlockSlice{<:BlockIndexRange1}}}) = ColumnMajor()
95+
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{BlockRangeInd, BlockRangeInd}}) = BlockBandedColumnMajor()
96+
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{BlockRangeInd, SingleBlockInd}}) = ColumnMajor()
97+
sublayout(::BlockBandedColumnMajor, ::Type{<:Tuple{SingleBlockInd, SingleBlockInd}}) = ColumnMajor()
9998

10099
isblockbanded(V::SubArray{<:Any,2,<:Any,<:Tuple{<:BlockSlices, <:BlockSlices}}) =
101100
isblockbanded(parent(V))

test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ using BlockBandedMatrices, Test, LinearAlgebra
22

33
using Aqua
44
@testset "Project quality" begin
5-
Aqua.test_all(BlockBandedMatrices, ambiguities=false)
5+
Aqua.test_all(BlockBandedMatrices, ambiguities=false, piracy=false)
66
end
77

88
include("test_blockbanded.jl")

test/test_bandedblockbanded.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,12 @@ import ArrayLayouts: RangeCumsum
303303
@test B == V == A[Block.(2:3), Block.(3:4)]
304304

305305
@test A[Block.(2:3), Block.(3:4)] isa BandedBlockBandedMatrix
306+
@test A[axes(A)...] isa BandedBlockBandedMatrix
307+
@test A[axes(A,1), Block.(3:4)] isa BandedBlockBandedMatrix
308+
@test A[Block.(3:4), axes(A,1)] isa BandedBlockBandedMatrix
309+
@test A[:, Block.(3:4)] isa BandedBlockBandedMatrix
310+
@test A[Block.(3:4), :] isa BandedBlockBandedMatrix
311+
@test A[:, :] isa BandedBlockBandedMatrix
306312

307313
x = randn(size(B,2))
308314
y = similar(x, size(B,1))

0 commit comments

Comments
 (0)