@@ -2,9 +2,11 @@ module BlockArraysBandedMatricesExt
22
33using BandedMatrices, BlockArrays
44using 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
1012bandeddata (P:: BlockedMatrix ) = bandeddata (P. blocks)
2527# ambiguity
2628sub_materialize (:: AbstractBandedLayout , V, :: Tuple{AbstractBlockedUnitRange,Base.OneTo{Int}} ) = BandedMatrix (V)
2729sub_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
3097end
0 commit comments