Skip to content

Commit 4319dcb

Browse files
committed
BandedBlockBandedMatrix can parameterize storage
But no tests for anything but PseudoBlockMatrix yet.
1 parent 988412d commit 4319dcb

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/BandedBlockBandedMatrix.jl

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,21 @@ function _BandedBlockBandedMatrix end
5555
# BandedMatrix
5656
#
5757

58-
struct BandedBlockBandedMatrix{T} <: AbstractBlockBandedMatrix{T}
59-
data::PseudoBlockMatrix{T, Matrix{T}}
58+
struct BandedBlockBandedMatrix{T, BLOCKS} <: AbstractBlockBandedMatrix{T}
59+
data::BLOCKS
6060
block_sizes::BandedBlockBandedSizes
6161

6262
l::Int # block lower bandwidth
6363
u::Int # block upper bandwidth
6464
λ::Int # sub lower bandwidth
6565
μ::Int # sub upper bandwidth
6666

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.μ)
7073
end
7174
end
7275

@@ -102,16 +105,14 @@ BandedBlockBandedMatrix{T}(::UndefInitializer, bs::BlockSizes,
102105
_BandedBlockBandedMatrix(data, BandedBlockBandedSizes(dims..., lu..., λμ...))
103106

104107

105-
function convert(::Type{BandedBlockBandedMatrix{T}}, B::BandedMatrix) where T
108+
function convert(::Type{<:BandedBlockBandedMatrix}, B::BandedMatrix)
106109
if isdiag(B)
107110
_BandedBlockBandedMatrix(copy(B.data), (fill(1,size(B,1)),fill(1,size(B,2))), (0,0), (0,0))
108111
else
109112
_BandedBlockBandedMatrix(copy(B.data), [size(B,1)], [size(B,2)], (0,0), (B.l,B.u))
110113
end
111114
end
112115

113-
convert(::Type{BandedBlockBandedMatrix}, B::BandedMatrix) = convert(BandedBlockBandedMatrix{eltype(B)}, B)
114-
115116
function BandedBlockBandedMatrix{T}(Z::Zeros, dims::NTuple{2,AbstractVector{Int}},
116117
lu::NTuple{2,Int}, λμ::NTuple{2,Int}) where T
117118
if size(Z)  sum.(dims)
@@ -120,7 +121,8 @@ function BandedBlockBandedMatrix{T}(Z::Zeros, dims::NTuple{2,AbstractVector{Int}
120121

121122
bs = BandedBlockBandedSizes(dims..., lu..., λμ...)
122123
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)
124126
end
125127

126128

@@ -206,10 +208,10 @@ similar(A::BandedBlockBandedMatrix, T::Type=eltype(A), bs::BandedBlockBandedSize
206208
BandedBlockBandedMatrix{T}(undef, bs)
207209

208210

209-
function sparse(A::BandedBlockBandedMatrix{T}) where T
211+
function sparse(A::BandedBlockBandedMatrix)
210212
i = Vector{Int}()
211213
j = Vector{Int}()
212-
z = Vector{T}()
214+
z = Vector{eltype(A)}()
213215
for J = Block.(1:nblocks(A,2)), K = blockcolrange(A, J)
214216
B = view(A, K, J)
215217
= _banded_rowval(B)
@@ -303,10 +305,11 @@ Base.size(arr::BandedBlockBandedMatrix) =
303305
return v
304306
end
305307

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)
307309
@boundscheck checkbounds(A, i, j)
308310
bi = global2blockindex(A.block_sizes, (i, j))
309311
V = view(A, Block(bi.I))
312+
T = eltype(A)
310313
@inbounds V[bi.α...] = convert(T, v)::T
311314
return v
312315
end
@@ -394,12 +397,12 @@ end
394397
# with BLASBandedMatrix.
395398
##################
396399

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}
398401

399402

400403
isbanded(::BandedBlockBandedBlock) = true
401404
MemoryLayout(::BandedBlockBandedBlock) = BandedColumnMajor()
402-
BroadcastStyle(::Type{BandedBlockBandedBlock{T}}) where T = BandedStyle()
405+
BroadcastStyle(::Type{<: BandedBlockBandedBlock}) = BandedStyle()
403406

404407
function inblockbands(V::BandedBlockBandedBlock)
405408
A = parent(V)

0 commit comments

Comments
 (0)