6
6
# in addition to the banded matrix interface
7
7
# ###
8
8
9
- abstract type AbstractBlockBandedLayout <: MemoryLayout end
9
+ abstract type AbstractBlockBandedLayout <: AbstractBlockLayout end
10
+ abstract type AbstractBandedBlockBandedLayout <: AbstractBlockBandedLayout end
10
11
11
- struct BandedBlockBandedColumns{LAY} <: AbstractBlockBandedLayout end
12
- struct BandedBlockBandedRows{LAY} <: AbstractBlockBandedLayout end
12
+ struct BandedBlockBandedColumns{LAY} <: AbstractBandedBlockBandedLayout end
13
+ struct BandedBlockBandedRows{LAY} <: AbstractBandedBlockBandedLayout end
13
14
struct BlockBandedColumns{LAY} <: AbstractBlockBandedLayout end
14
15
struct BlockBandedRows{LAY} <: AbstractBlockBandedLayout end
15
16
@@ -22,7 +23,6 @@ transposelayout(::BandedBlockBandedColumnMajor) = BandedBlockBandedRowMajor()
22
23
transposelayout (:: BandedBlockBandedRowMajor ) = BandedBlockBandedColumnMajor ()
23
24
transposelayout (:: BlockBandedColumnMajor ) = BlockBandedRowMajor ()
24
25
transposelayout (:: BlockBandedRowMajor ) = BlockBandedColumnMajor ()
25
- conjlayout (:: Type{<:Complex} , M:: AbstractBlockBandedLayout ) = ConjLayout (M)
26
26
27
27
28
28
@@ -56,22 +56,21 @@ blockbandrange(A::AbstractMatrix) = -blockbandwidth(A,1):blockbandwidth(A,2)
56
56
57
57
58
58
# start/stop indices of the i-th column/row, bounded by actual matrix size
59
- @inline blockcolstart (A:: AbstractVecOrMat , i:: Integer ) = Block (max (i- colblockbandwidth (A,2 )[i], 1 ))
60
- @inline blockcolstop (A:: AbstractVecOrMat , i:: Integer ) = Block (max (min (i+ colblockbandwidth (A,1 )[i], blocksize (A, 1 )), 0 ))
61
- @inline blockrowstart (A:: AbstractVecOrMat , i:: Integer ) = Block (max (i- rowblockbandwidth (A,1 )[i], 1 ))
62
- @inline blockrowstop (A:: AbstractVecOrMat , i:: Integer ) = Block (max (min (i+ rowblockbandwidth (A,2 )[i], blocksize (A, 2 )), 0 ))
63
-
64
- for Func in (:blockcolstart , :blockcolstop , :blockrowstart , :blockrowstop )
59
+ @inline blockbanded_blockcolstart (A, i:: Integer ) = Block (max (i- colblockbandwidth (A,2 )[i], 1 ))
60
+ @inline blockbanded_blockcolstop (A, i:: Integer ) = Block (max (min (i+ colblockbandwidth (A,1 )[i], blocksize (A, 1 )), 0 ))
61
+ @inline blockbanded_blockrowstart (A, i:: Integer ) = Block (max (i- rowblockbandwidth (A,1 )[i], 1 ))
62
+ @inline blockbanded_blockrowstop (A, i:: Integer ) = Block (max (min (i+ rowblockbandwidth (A,2 )[i], blocksize (A, 2 )), 0 ))
63
+ for Func in (:blockbanded_blockcolstart , :blockbanded_blockcolstop , :blockbanded_blockrowstart , :blockbanded_blockrowstop )
65
64
@eval $ Func (A, i:: Block{1} ) = $ Func (A, Int (i))
66
65
end
67
66
68
- @inline blockcolrange (A :: AbstractVecOrMat , i) = blockcolstart (A,i): blockcolstop (A,i)
69
- @inline blockrowrange (A :: AbstractVecOrMat , i) = blockrowstart (A,i): blockrowstop (A,i)
67
+ @inline blockcolsupport ( :: AbstractBlockBandedLayout , A, i) = blockbanded_blockcolstart (A,i): blockbanded_blockcolstop (A,i)
68
+ @inline blockrowsupport ( :: AbstractBlockBandedLayout , A, i) = blockbanded_blockrowstart (A,i): blockbanded_blockrowstop (A,i)
70
69
71
70
72
71
# length of i-the column/row
73
- @inline blockcollength (A:: AbstractVecOrMat , i) = max (Int (blockcolstop (A, i)) - Int (blockcolstart (A, i)) + 1 , 0 )
74
- @inline blockrowlength (A:: AbstractVecOrMat , i) = max (Int (blockrowstop (A, i)) - Int (blockrowstart (A, i)) + 1 , 0 )
72
+ @inline blockcollength (A, i) = max (Int (blockcolstop (A, i)) - Int (blockcolstart (A, i)) + 1 , 0 )
73
+ @inline blockrowlength (A, i) = max (Int (blockrowstop (A, i)) - Int (blockrowstart (A, i)) + 1 , 0 )
75
74
76
75
# this gives the block bandwidth in each block column/row
77
76
@inline colblockbandwidths (A:: AbstractMatrix ) = Fill .(blockbandwidths (A), blocksize (A,2 ))
@@ -107,17 +106,22 @@ function _firstblockdiagcol(A::AbstractMatrix, j::Int)
107
106
end
108
107
109
108
110
- # # BlockSlice1 is a conveneience for views
111
-
112
- const BlockSlice1 = BlockSlice{Block{1 ,Int}}
113
109
114
110
115
111
# #####################################
116
112
# RaggedMatrix interface
117
113
# #####################################
118
114
119
- @inline colstart (A:: AbstractBlockBandedMatrix , i:: Integer ) =
120
- isempty (axes (A,1 )) ? 1 : first (axes (A,1 )[blockcolstart (A,findblock (axes (A,2 ),i))])
115
+ @inline function colstart (A:: AbstractBlockBandedMatrix , i:: Integer )
116
+ bs = blockcolstart (A,findblock (axes (A,2 ),i))
117
+ if isempty (axes (A,1 ))
118
+ 1
119
+ elseif Int (bs) ≤ blocksize (A, 2 )
120
+ first (axes (A,1 )[bs])
121
+ else
122
+ size (A,1 )+ 1
123
+ end
124
+ end
121
125
122
126
@inline function colstop (A:: AbstractBlockBandedMatrix , i:: Integer )
123
127
CS = blockcolstop (A,findblock (axes (A,2 ),i))
0 commit comments