@@ -2,9 +2,11 @@ module BlockArraysBandedMatricesExt
2
2
3
3
using BandedMatrices, BlockArrays
4
4
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
8
10
9
11
10
12
bandeddata (P:: BlockedMatrix ) = bandeddata (P. blocks)
25
27
# ambiguity
26
28
sub_materialize (:: AbstractBandedLayout , V, :: Tuple{AbstractBlockedUnitRange,Base.OneTo{Int}} ) = BandedMatrix (V)
27
29
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()
28
95
29
96
30
97
end
0 commit comments