11
22"""
3- ArrowheadMatrix
3+ BBBArrowheadMatrix
44
55 A B B
66 C D D D
77 … … … … …
88 C D D
99"""
10- struct ArrowheadMatrix {T, AA<: AbstractMatrix{T} , BB, CC, DD} <: AbstractBandedBlockBandedMatrix{T}
10+ struct BBBArrowheadMatrix {T, AA<: AbstractMatrix{T} , BB, CC, DD} <: AbstractBandedBlockBandedMatrix{T}
1111 A:: AA
1212 B:: BB # first row blocks
1313 C:: CC # first col blocks
1414 D:: DD # these are interlaces
1515
16- ArrowheadMatrix {T, AA, BB, CC, DD} (A, B, C, D) where {T,AA,BB,CC,DD} = new {T,AA,BB,CC,DD} (A, B, C, D)
16+ BBBArrowheadMatrix {T, AA, BB, CC, DD} (A, B, C, D) where {T,AA,BB,CC,DD} = new {T,AA,BB,CC,DD} (A, B, C, D)
1717end
1818
19- ArrowheadMatrix {T} (A:: AbstractMatrix{T} , B, C, D) where T = ArrowheadMatrix {T, typeof(A), typeof(B), typeof(C), typeof(D)} (A, B, C, D)
20- ArrowheadMatrix {T} (A, B, C, D) where T = ArrowheadMatrix (convert (AbstractMatrix{T}, A), B, C, D)
19+ BBBArrowheadMatrix {T} (A:: AbstractMatrix{T} , B, C, D) where T = BBBArrowheadMatrix {T, typeof(A), typeof(B), typeof(C), typeof(D)} (A, B, C, D)
20+ BBBArrowheadMatrix {T} (A, B, C, D) where T = BBBArrowheadMatrix (convert (AbstractMatrix{T}, A), B, C, D)
2121
22- const ArrowheadMatrices = Union{ArrowheadMatrix ,Symmetric{<: Any ,<: ArrowheadMatrix },Hermitian{<: Any ,<: ArrowheadMatrix },
23- UpperOrLowerTriangular{<: Any ,<: ArrowheadMatrix }}
22+ const ArrowheadMatrices = Union{BBBArrowheadMatrix ,Symmetric{<: Any ,<: BBBArrowheadMatrix },Hermitian{<: Any ,<: BBBArrowheadMatrix },
23+ UpperOrLowerTriangular{<: Any ,<: BBBArrowheadMatrix }}
2424
2525
2626
2727subblockbandwidths (A:: ArrowheadMatrices ) = (1 ,1 )
2828
29- BlockArrays. _show_typeof (io:: IO , B:: ArrowheadMatrix {T} ) where T = print (io, " ArrowheadMatrix {$T }" )
29+ BlockArrays. _show_typeof (io:: IO , B:: BBBArrowheadMatrix {T} ) where T = print (io, " BBBArrowheadMatrix {$T }" )
3030
31- function blockbandwidths (A:: ArrowheadMatrix )
31+ function blockbandwidths (A:: BBBArrowheadMatrix )
3232 l,u = bandwidths (A. D[1 ])
3333 max (l,length (A. C)),max (u,length (A. B))
3434end
3535
36- function axes (L:: ArrowheadMatrix )
36+ function axes (L:: BBBArrowheadMatrix )
3737 ξ,n = size (L. A)
3838 m = length (L. D)
3939 μ,ν = size (L. D[1 ])
4040 blockedrange (Vcat (ξ, Fill (m,μ))), blockedrange (Vcat (n, Fill (m,ν)))
4141end
4242
43- copy (A:: ArrowheadMatrix ) = ArrowheadMatrix (copy (A. A), map (copy, A. B), map (copy, A. C), map (copy, A. D))
43+ copy (A:: BBBArrowheadMatrix ) = BBBArrowheadMatrix (copy (A. A), map (copy, A. B), map (copy, A. C), map (copy, A. D))
4444
4545for adj in (:adjoint , :transpose )
46- @eval $ adj (A:: ArrowheadMatrix ) = ArrowheadMatrix ($ adj (A. A), map ($ adj, A. C), map ($ adj, A. B), map ($ adj, A. D))
46+ @eval $ adj (A:: BBBArrowheadMatrix ) = BBBArrowheadMatrix ($ adj (A. A), map ($ adj, A. C), map ($ adj, A. B), map ($ adj, A. D))
4747end
4848
49- function getindex (L:: ArrowheadMatrix {T} , Kk:: BlockIndex{1} , Jj:: BlockIndex{1} ):: T where T
49+ function getindex (L:: BBBArrowheadMatrix {T} , Kk:: BlockIndex{1} , Jj:: BlockIndex{1} ):: T where T
5050 K,k = block (Kk),blockindex (Kk)
5151 J,j = block (Jj),blockindex (Jj)
5252 J == K == Block (1 ) && return L. A[k,j]
@@ -60,12 +60,12 @@ function getindex(L::ArrowheadMatrix{T}, Kk::BlockIndex{1}, Jj::BlockIndex{1})::
6060 return L. D[k][Int (K)- 1 , Int (J)- 1 ]
6161end
6262
63- function getindex (L:: ArrowheadMatrix , k:: Int , j:: Int )
63+ function getindex (L:: BBBArrowheadMatrix , k:: Int , j:: Int )
6464 ax,bx = axes (L)
6565 L[findblockindex (ax, k), findblockindex (bx, j)]
6666end
6767
68- function ArrowheadMatrix (A, B, C, D)
68+ function BBBArrowheadMatrix (A, B, C, D)
6969 ξ,n = size (A)
7070 m = length (D)
7171 μ,ν = size (D[1 ])
@@ -95,7 +95,7 @@ function ArrowheadMatrix(A, B, C, D)
9595 end
9696 T = promote_type (eltype (A), mapreduce (eltype, promote_type, B; init= eltype (A)),
9797 mapreduce (eltype, promote_type, C; init= eltype (A)), mapreduce (eltype, promote_type, D; init= eltype (A)))
98- ArrowheadMatrix {T} (A, B, C, D)
98+ BBBArrowheadMatrix {T} (A, B, C, D)
9999end
100100
101101
@@ -113,24 +113,24 @@ arrowheadlayout(::BandedLazyLayouts) = LazyArrowheadLayout()
113113arrowheadlayout (:: DiagonalLayout{<:AbstractLazyLayout} ) = LazyArrowheadLayout ()
114114symmetriclayout (lay:: ArrowheadLayouts ) = SymmetricLayout {typeof(lay)} ()
115115
116- MemoryLayout (:: Type{<:ArrowheadMatrix {<:Any,<:Any,<:Any,<:Any,<:AbstractVector{D}}} ) where D = arrowheadlayout (MemoryLayout (D))
116+ MemoryLayout (:: Type{<:BBBArrowheadMatrix {<:Any,<:Any,<:Any,<:Any,<:AbstractVector{D}}} ) where D = arrowheadlayout (MemoryLayout (D))
117117# Hack since ∞ diagonal fill is only DiagonalLayout{FillLayout}
118- MemoryLayout (:: Type {<: ArrowheadMatrix {<: Any ,<: Any ,<: Any ,<: Any ,<: AbstractVector {<: Diagonal{<:Any,<:AbstractFill{<:Any,1,<:Tuple{OneToInf}}} }}}) = LazyArrowheadLayout ()
118+ MemoryLayout (:: Type {<: BBBArrowheadMatrix {<: Any ,<: Any ,<: Any ,<: Any ,<: AbstractVector {<: Diagonal{<:Any,<:AbstractFill{<:Any,1,<:Tuple{OneToInf}}} }}}) = LazyArrowheadLayout ()
119119
120120sublayout (:: ArrowheadLayouts ,
121121 :: Type {<: NTuple {2 ,BlockSlice{<: BlockRange{1, Tuple{OneTo{Int}}} }}}) = ArrowheadLayout ()
122122function sub_materialize (:: ArrowheadLayout , V:: AbstractMatrix )
123123 KR,JR = parentindices (V)
124124 P = parent (V)
125125 M,N = KR. block[end ],JR. block[end ]
126- ArrowheadMatrix (P. A, P. B, P. C,
126+ BBBArrowheadMatrix (P. A, P. B, P. C,
127127 layout_getindex .(P. D, Ref (oneto (Int (M)- 1 )), Ref (oneto (Int (N)- 1 ))))
128128end
129129
130130symmetric (A) = Symmetric (A)
131131symmetric (A:: Union{SymTridiagonal,Symmetric,Diagonal} ) = A
132132
133- function getproperty (F:: Symmetric{<:Any,<:ArrowheadMatrix } , d:: Symbol )
133+ function getproperty (F:: Symmetric{<:Any,<:BBBArrowheadMatrix } , d:: Symbol )
134134 P = getfield (F, :data )
135135 if d == :A
136136 return symmetric (P. A)
@@ -242,19 +242,19 @@ end
242242# Cholesky
243243# ###
244244
245- function reversecholcopy (S:: Symmetric{<:Any,<:ArrowheadMatrix } )
245+ function reversecholcopy (S:: Symmetric{<:Any,<:BBBArrowheadMatrix } )
246246 T = LinearAlgebra. choltype (S)
247247 A = parent (S)
248- Symmetric (ArrowheadMatrix (LinearAlgebra. copymutable_oftype (A. A, T),
248+ Symmetric (BBBArrowheadMatrix (LinearAlgebra. copymutable_oftype (A. A, T),
249249 LinearAlgebra. copymutable_oftype .(A. B, T), LinearAlgebra. copymutable_oftype .(A. C, T),
250250 LinearAlgebra. copymutable_oftype .(A. D, T)))
251251end
252252
253253
254254
255- function MatrixFactorizations. _reverse_chol! (A:: ArrowheadMatrix , :: Type{UpperTriangular} )
256-
257- for B in A. D
255+ function MatrixFactorizations. _reverse_chol! (A:: BBBArrowheadMatrix , :: Type{UpperTriangular} )
256+
257+ Threads . @threads for B in A. D
258258 reversecholesky! (Symmetric (B))
259259 end
260260
@@ -384,16 +384,16 @@ tupleop(op, A::Tuple, B::Tuple) = (op(first(A), first(B)), tupleop(op, tail(A),
384384
385385
386386for op in (:+ , :- )
387- @eval $ op (A:: ArrowheadMatrix , B:: ArrowheadMatrix ) = ArrowheadMatrix ($ op (A. A, B. A), tupleop ($ op, A. B, B. B), tupleop ($ op, A. C, B. C), $ op (A. D, B. D))
387+ @eval $ op (A:: BBBArrowheadMatrix , B:: BBBArrowheadMatrix ) = BBBArrowheadMatrix ($ op (A. A, B. A), tupleop ($ op, A. B, B. B), tupleop ($ op, A. C, B. C), $ op (A. D, B. D))
388388end
389- - (A:: ArrowheadMatrix ) = ArrowheadMatrix (- A. A, map (- , A. B), map (- , A. C), - A. D)
389+ - (A:: BBBArrowheadMatrix ) = BBBArrowheadMatrix (- A. A, map (- , A. B), map (- , A. C), - A. D)
390390
391391for op in (:* , :\ )
392- @eval $ op (c:: Number , A:: ArrowheadMatrix ) = ArrowheadMatrix ($ op (c, A. A), broadcast ($ op, c, A. B), broadcast ($ op, c, A. C), broadcast ($ op, c, A. D))
392+ @eval $ op (c:: Number , A:: BBBArrowheadMatrix ) = BBBArrowheadMatrix ($ op (c, A. A), broadcast ($ op, c, A. B), broadcast ($ op, c, A. C), broadcast ($ op, c, A. D))
393393end
394394
395395for op in (:* , :/ )
396- @eval $ op (A:: ArrowheadMatrix , c:: Number ) = ArrowheadMatrix ($ op (A. A, c), broadcast ($ op, A. B, c), broadcast ($ op, A. C, c), broadcast ($ op, A. D, c))
396+ @eval $ op (A:: BBBArrowheadMatrix , c:: Number ) = BBBArrowheadMatrix ($ op (A. A, c), broadcast ($ op, A. B, c), broadcast ($ op, A. C, c), broadcast ($ op, A. D, c))
397397end
398398
399399# ##
@@ -416,7 +416,7 @@ for (UNIT, Tri) in (('U',UnitUpperTriangular), ('N', UpperTriangular))
416416 A,B,D = P. A,P. B,P. D
417417 m = length (D)
418418
419- for k = 1 : m
419+ Threads . @threads for k = 1 : m
420420 ArrayLayouts. ldiv! ($ Tri (D[k]), view (dest, n+ k: m: length (dest)))
421421 end
422422
467467
468468
469469for Tri in (:UpperTriangular , :UnitUpperTriangular )
470- @eval function getproperty (F:: $Tri{<:Any,<:ArrowheadMatrix } , d:: Symbol )
470+ @eval function getproperty (F:: $Tri{<:Any,<:BBBArrowheadMatrix } , d:: Symbol )
471471 P = getfield (F, :data )
472472 if d == :A
473473 return $ Tri (P. A)
@@ -484,7 +484,7 @@ for Tri in (:UpperTriangular, :UnitUpperTriangular)
484484end
485485
486486for Tri in (:LowerTriangular , :UnitLowerTriangular )
487- @eval function getproperty (F:: $Tri{<:Any,<:ArrowheadMatrix } , d:: Symbol )
487+ @eval function getproperty (F:: $Tri{<:Any,<:BBBArrowheadMatrix } , d:: Symbol )
488488 P = getfield (F, :data )
489489 if d == :A
490490 return $ Tri (P. A)
0 commit comments