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