Skip to content

Commit fd96cb5

Browse files
authored
Add missing banded overloads (#402)
* Add missing banded sub_materailize * Move over _copyto! and BroadcastStyle overloads * add test, disable unneeded(?) code
1 parent bb3bf1b commit fd96cb5

File tree

3 files changed

+89
-5
lines changed

3 files changed

+89
-5
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BlockArrays"
22
uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
3-
version = "1.0.0"
3+
version = "1.0.1"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

ext/BlockArraysBandedMatricesExt.jl

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ module BlockArraysBandedMatricesExt
22

33
using BandedMatrices, BlockArrays
44
using BlockArrays.ArrayLayouts
5-
import BandedMatrices: isbanded, AbstractBandedLayout, bandeddata, bandwidths
6-
import BlockArrays: blockcolsupport, blockrowsupport, AbstractBlockedUnitRange
7-
import ArrayLayouts: sub_materialize
5+
using BlockArrays.LinearAlgebra
6+
import BandedMatrices: isbanded, AbstractBandedLayout, BandedColumns, bandeddata, bandwidths
7+
import BlockArrays: blockcolsupport, blockrowsupport, AbstractBlockedUnitRange, BlockLayout, BlockSlice1
8+
import ArrayLayouts: sub_materialize, _copyto!
9+
import Base: BroadcastStyle
810

911

1012
bandeddata(P::BlockedMatrix) = bandeddata(P.blocks)
@@ -25,6 +27,71 @@ end
2527
# ambiguity
2628
sub_materialize(::AbstractBandedLayout, V, ::Tuple{AbstractBlockedUnitRange,Base.OneTo{Int}}) = BandedMatrix(V)
2729
sub_materialize(::AbstractBandedLayout, V, ::Tuple{Base.OneTo{Int},AbstractBlockedUnitRange}) = BandedMatrix(V)
30+
sub_materialize(::AbstractBandedLayout, V, ::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange}) = BandedMatrix(V)
31+
32+
33+
# _copyto!
34+
# disabled as not clear its needed and used undefined colblockbandwidths
35+
36+
# function _copyto!(_, ::BlockLayout{<:BandedColumns}, dest::AbstractMatrix, src::AbstractMatrix)
37+
# if !blockisequal(axes(dest), axes(src))
38+
# copyto!(BlockedArray(dest, axes(src)), src)
39+
# return dest
40+
# end
41+
42+
# srcB = blocks(src)
43+
# srcD = bandeddata(srcB)
44+
45+
# dl, du = colblockbandwidths(dest)
46+
# sl, su = bandwidths(srcB)
47+
# M,N = size(srcB)
48+
# # Source matrix must fit within bands of destination matrix
49+
# all(dl .≥ min(sl,M-1)) && all(du .≥ min(su,N-1)) || throw(BandError(dest))
50+
51+
# for J = 1:N
52+
# for K = max(1,J-du[J]):min(J-su-1,M)
53+
# zero!(view(dest,Block(K),Block(J)))
54+
# end
55+
# for K = max(1,J-su):min(J+sl,M)
56+
# copyto!(view(dest,Block(K),Block(J)), srcD[K-J+su+1,J])
57+
# end
58+
# for K = max(1,J+sl+1):min(J+dl[J],M)
59+
# zero!(view(dest,Block(K),Block(J)))
60+
# end
61+
# end
62+
# dest
63+
# end
64+
65+
# function _copyto!(_, ::BlockLayout{<:AbstractBandedLayout}, dest::AbstractMatrix, src::AbstractMatrix)
66+
# if !blockisequal(axes(dest), axes(src))
67+
# copyto!(BlockedArray(dest, axes(src)), src)
68+
# return dest
69+
# end
70+
71+
# srcB = blocks(src)
72+
73+
# dl, du = colblockbandwidths(dest)
74+
# sl, su = bandwidths(srcB)
75+
# M,N = size(srcB)
76+
# # Source matrix must fit within bands of destination matrix
77+
# all(dl .≥ min(sl,M-1)) && all(du .≥ min(su,N-1)) || throw(BandError(dest))
78+
79+
# for J = 1:N
80+
# for K = max(1,J-du[J]):min(J-su-1,M)
81+
# zero!(view(dest,Block(K),Block(J)))
82+
# end
83+
# for K = max(1,J-su):min(J+sl,M)
84+
# copyto!(view(dest,Block(K),Block(J)), inbands_getindex(srcB, K, J))
85+
# end
86+
# for K = max(1,J+sl+1):min(J+dl[J],M)
87+
# zero!(view(dest,Block(K),Block(J)))
88+
# end
89+
# end
90+
# dest
91+
# end
92+
93+
## WARNING: type piracy
94+
# BroadcastStyle(::Type{<:SubArray{<:Any,2,<:BlockedMatrix{<:Any,<:Diagonal}, <:Tuple{<:BlockSlice1,<:BlockSlice1}}}) = BandedStyle()
2895

2996

3097
end

test/test_blockbanded.jl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module TestBlockArraysBandedMatrices
22

33
using BlockArrays, LinearAlgebra, BandedMatrices, Test
4-
using BlockArrays: BlockDiagonal, BlockBidiagonal, BlockTridiagonal, blockcolsupport, blockrowsupport
4+
using BlockArrays: BlockDiagonal, BlockBidiagonal, BlockTridiagonal, blockcolsupport, blockrowsupport, BlockLayout
55
using BandedMatrices: _BandedMatrix
66

77

@@ -70,6 +70,23 @@ using BandedMatrices: _BandedMatrix
7070
A = BlockedArray(brand(5,4,1,2), [3,2], [2,2])
7171
@test bandwidths(A) == (1,2)
7272
@test BandedMatrix(A) == A
73+
@test copyto!(similar(A), A) == A
74+
end
75+
76+
@testset "block banded" begin
77+
B = BandedMatrix{Matrix{Float64}}(undef, (3, 4), (1,2))
78+
for k = axes(B,1), j = max(1,k-1):min(4,k+2)
79+
B[k,j] = randn(2,2)
80+
end
81+
A = BlockArrays._BlockArray(B, (blockedrange(fill(2,3)), blockedrange(fill(2,4))))
82+
@test copyto!(zeros(size(A)), A) == Matrix(A)
83+
end
84+
85+
@testset "Blocked Diagonal" begin
86+
A = BlockedMatrix(Diagonal(1:5), [2,3], [2,2,1])
87+
@test A[Block(2,2)] isa BandedMatrix
88+
@test bandwidths(A[Block(2,2)]) == (0,0)
89+
@test A[Block.(1:2), Block.(2:3)] isa BandedMatrix
7390
end
7491
end
7592

0 commit comments

Comments
 (0)