Skip to content

Commit ffe8e71

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

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

src/BandedBlockBandedMatrix.jl

Lines changed: 18 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,9 @@ 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+
println(typeof(blocks))
126+
_BandedBlockBandedMatrix(blocks, bs)
124127
end
125128

126129

@@ -206,10 +209,10 @@ similar(A::BandedBlockBandedMatrix, T::Type=eltype(A), bs::BandedBlockBandedSize
206209
BandedBlockBandedMatrix{T}(undef, bs)
207210

208211

209-
function sparse(A::BandedBlockBandedMatrix{T}) where T
212+
function sparse(A::BandedBlockBandedMatrix)
210213
i = Vector{Int}()
211214
j = Vector{Int}()
212-
z = Vector{T}()
215+
z = Vector{eltype(A)}()
213216
for J = Block.(1:nblocks(A,2)), K = blockcolrange(A, J)
214217
B = view(A, K, J)
215218
= _banded_rowval(B)
@@ -303,10 +306,11 @@ Base.size(arr::BandedBlockBandedMatrix) =
303306
return v
304307
end
305308

306-
@inline function setindex!(A::BandedBlockBandedMatrix{T}, v, i::Int, j::Int) where T
309+
@inline function setindex!(A::BandedBlockBandedMatrix, v, i::Int, j::Int)
307310
@boundscheck checkbounds(A, i, j)
308311
bi = global2blockindex(A.block_sizes, (i, j))
309312
V = view(A, Block(bi.I))
313+
T = eltype(A)
310314
@inbounds V[bi.α...] = convert(T, v)::T
311315
return v
312316
end
@@ -394,12 +398,12 @@ end
394398
# with BLASBandedMatrix.
395399
##################
396400

397-
const BandedBlockBandedBlock{T} = SubArray{T,2,BandedBlockBandedMatrix{T},Tuple{BlockSlice1,BlockSlice1},false}
401+
const BandedBlockBandedBlock{T, BLOCKS} = SubArray{T,2,BandedBlockBandedMatrix{T, BLOCKS},Tuple{BlockSlice1,BlockSlice1},false}
398402

399403

400404
isbanded(::BandedBlockBandedBlock) = true
401405
MemoryLayout(::BandedBlockBandedBlock) = BandedColumnMajor()
402-
BroadcastStyle(::Type{BandedBlockBandedBlock{T}}) where T = BandedStyle()
406+
BroadcastStyle(::Type{<: BandedBlockBandedBlock}) = BandedStyle()
403407

404408
function inblockbands(V::BandedBlockBandedBlock)
405409
A = parent(V)

0 commit comments

Comments
 (0)