@@ -55,18 +55,21 @@ function _BandedBlockBandedMatrix end
55
55
# BandedMatrix
56
56
#
57
57
58
- struct BandedBlockBandedMatrix{T} <: AbstractBlockBandedMatrix{T}
59
- data:: PseudoBlockMatrix{T, Matrix{T}}
58
+ struct BandedBlockBandedMatrix{T, BLOCKS } <: AbstractBlockBandedMatrix{T}
59
+ data:: BLOCKS
60
60
block_sizes:: BandedBlockBandedSizes
61
61
62
62
l:: Int # block lower bandwidth
63
63
u:: Int # block upper bandwidth
64
64
λ:: Int # sub lower bandwidth
65
65
μ:: Int # sub upper bandwidth
66
66
67
- global function _BandedBlockBandedMatrix (data:: PseudoBlockMatrix{T} , block_sizes:: BandedBlockBandedSizes ) where T
68
- @boundscheck check_data_sizes (data, block_sizes)
69
- new {T} (data, block_sizes, block_sizes. l, block_sizes. u, block_sizes. λ, block_sizes. μ)
67
+ global function _BandedBlockBandedMatrix (data:: AbstractBlockMatrix ,
68
+ block_sizes:: BandedBlockBandedSizes )
69
+ @boundscheck check_data_sizes (data, block_sizes)
70
+ new {eltype(data), typeof(data)} (data, block_sizes, block_sizes. l,
71
+ block_sizes. u, block_sizes. λ,
72
+ block_sizes. μ)
70
73
end
71
74
end
72
75
@@ -102,16 +105,14 @@ BandedBlockBandedMatrix{T}(::UndefInitializer, bs::BlockSizes,
102
105
_BandedBlockBandedMatrix (data, BandedBlockBandedSizes (dims... , lu... , λμ... ))
103
106
104
107
105
- function convert (:: Type{BandedBlockBandedMatrix{T}} , B:: BandedMatrix ) where T
108
+ function convert (:: Type{<: BandedBlockBandedMatrix} , B:: BandedMatrix )
106
109
if isdiag (B)
107
110
_BandedBlockBandedMatrix (copy (B. data), (fill (1 ,size (B,1 )),fill (1 ,size (B,2 ))), (0 ,0 ), (0 ,0 ))
108
111
else
109
112
_BandedBlockBandedMatrix (copy (B. data), [size (B,1 )], [size (B,2 )], (0 ,0 ), (B. l,B. u))
110
113
end
111
114
end
112
115
113
- convert (:: Type{BandedBlockBandedMatrix} , B:: BandedMatrix ) = convert (BandedBlockBandedMatrix{eltype (B)}, B)
114
-
115
116
function BandedBlockBandedMatrix {T} (Z:: Zeros , dims:: NTuple{2,AbstractVector{Int}} ,
116
117
lu:: NTuple{2,Int} , λμ:: NTuple{2,Int} ) where T
117
118
if size (Z) ≠ sum .(dims)
@@ -120,7 +121,8 @@ function BandedBlockBandedMatrix{T}(Z::Zeros, dims::NTuple{2,AbstractVector{Int}
120
121
121
122
bs = BandedBlockBandedSizes (dims... , lu... , λμ... )
122
123
d_bs = bs. data_block_sizes
123
- _BandedBlockBandedMatrix (PseudoBlockArray (zeros (T, size (d_bs)), d_bs), bs)
124
+ blocks = PseudoBlockArray (zeros (T, size (d_bs)), d_bs)
125
+ _BandedBlockBandedMatrix (blocks, bs)
124
126
end
125
127
126
128
@@ -206,10 +208,10 @@ similar(A::BandedBlockBandedMatrix, T::Type=eltype(A), bs::BandedBlockBandedSize
206
208
BandedBlockBandedMatrix {T} (undef, bs)
207
209
208
210
209
- function sparse (A:: BandedBlockBandedMatrix{T} ) where T
211
+ function sparse (A:: BandedBlockBandedMatrix )
210
212
i = Vector {Int} ()
211
213
j = Vector {Int} ()
212
- z = Vector {T } ()
214
+ z = Vector {eltype(A) } ()
213
215
for J = Block .(1 : nblocks (A,2 )), K = blockcolrange (A, J)
214
216
B = view (A, K, J)
215
217
ĩ = _banded_rowval (B)
@@ -303,10 +305,11 @@ Base.size(arr::BandedBlockBandedMatrix) =
303
305
return v
304
306
end
305
307
306
- @inline function setindex! (A:: BandedBlockBandedMatrix{T} , v, i:: Int , j:: Int ) where T
308
+ @inline function setindex! (A:: BandedBlockBandedMatrix , v, i:: Int , j:: Int )
307
309
@boundscheck checkbounds (A, i, j)
308
310
bi = global2blockindex (A. block_sizes, (i, j))
309
311
V = view (A, Block (bi. I))
312
+ T = eltype (A)
310
313
@inbounds V[bi. α... ] = convert (T, v):: T
311
314
return v
312
315
end
@@ -394,12 +397,12 @@ end
394
397
# with BLASBandedMatrix.
395
398
# #################
396
399
397
- const BandedBlockBandedBlock{T} = SubArray{T,2 ,BandedBlockBandedMatrix{T},Tuple{BlockSlice1,BlockSlice1},false }
400
+ const BandedBlockBandedBlock{T, BLOCKS } = SubArray{T,2 ,BandedBlockBandedMatrix{T, BLOCKS },Tuple{BlockSlice1,BlockSlice1},false }
398
401
399
402
400
403
isbanded (:: BandedBlockBandedBlock ) = true
401
404
MemoryLayout (:: BandedBlockBandedBlock ) = BandedColumnMajor ()
402
- BroadcastStyle (:: Type{BandedBlockBandedBlock{T}} ) where T = BandedStyle ()
405
+ BroadcastStyle (:: Type{<: BandedBlockBandedBlock} ) = BandedStyle ()
403
406
404
407
function inblockbands (V:: BandedBlockBandedBlock )
405
408
A = parent (V)
0 commit comments