@@ -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
5353BandedBlockBandedMatrix {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
408408const 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
425425function 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 ])
429429end
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
441437sub_materialize (:: AbstractBandedBlockBandedLayout , V, _) = BandedBlockBandedMatrix (V)
@@ -451,36 +447,25 @@ isbanded(A::SubArray{<:Any,2,<:BandedBlockBandedMatrix}) = MemoryLayout(A) isa A
451447isbandedblockbanded (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
472467end
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
485470const BandedBlockBandedBlock{T, BLOCKS, RAXIS} = SubArray{T,2 ,BandedBlockBandedMatrix{T, BLOCKS, RAXIS},<: Tuple{BlockSlice1,BlockSlice1} ,false }
486471
0 commit comments