@@ -12,19 +12,17 @@ triangularlayout(::Type{Tri}, ::ML) where {Tri,ML<:ConjLayout{<:BandedRows}} = T
1212
1313sublayout (:: TriangularLayout{UPLO,UNIT,ML} , inds) where {UPLO,UNIT,ML} = sublayout (ML (), inds)
1414
15+ getuplo (:: Type{<:TriangularLayout{UPLO}} ) where {UPLO} = UPLO
16+ getunit (:: Type{<:TriangularLayout{<:Any,UNIT}} ) where {UNIT} = UNIT
17+ getbwdim (uplo:: Char ) = uplo == ' U' ? 2 : 1
1518
16- function bandeddata (:: TriangularLayout{'U'} , A)
17- B = triangulardata (A)
18- u = bandwidth (B,2 )
19- D = bandeddata (B)
20- view (D, 1 : u+ 1 , :)
21- end
22-
23- function bandeddata (:: TriangularLayout{'L'} , A)
19+ function bandeddata (:: TriLayout , A) where {TriLayout<: TriangularLayout }
2420 B = triangulardata (A)
2521 l,u = bandwidths (B)
2622 D = bandeddata (B)
27- view (D, u+ 1 : l+ u+ 1 , :)
23+ uplo = getuplo (TriLayout)
24+ rowinds = uplo == ' U' ? (1 : u+ 1 ) : (u+ 1 : l+ u+ 1 )
25+ view (D, rowinds, :)
2826end
2927
3028# function bandedrowsdata(::TriangularLayout{'U'}, A)
4644copy (M:: Lmul{<:TriangularLayout{uplo,trans,<:AbstractBandedLayout},<:AbstractBandedLayout} ) where {uplo,trans} =
4745 ArrayLayouts. lmul! (M. A, BandedMatrix (M. B, bandwidths (M)))
4846
49- @inline function materialize! (M:: BlasMatLmulVec {<: TriangularLayout{'U',UNIT,<:BandedColumnMajor} ,
50- <: AbstractStridedLayout }) where UNIT
51- A,x = M. A,M. B
52- tbmv! (' U' , ' N' , UNIT, size (A,1 ), bandwidth (A,2 ), bandeddata (A), x)
53- end
47+ @inline function materialize! (M:: BlasMatLmulVec {<: TriLayout ,
48+ <: AbstractStridedLayout }) where {UNIT, TriLayout<: TriangularLayout{<:Any,UNIT,<:BandedColumnMajor} }
5449
55- @inline function materialize! (M:: BlasMatLmulVec {<: TriangularLayout{'L',UNIT,<:BandedColumnMajor} ,
56- <: AbstractStridedLayout }) where UNIT
5750 A,x = M. A,M. B
58- tbmv! (' L' , ' N' , UNIT, size (A,1 ), bandwidth (A,1 ), bandeddata (A), x)
51+ uplo = getuplo (TriLayout)
52+ bwdim = getbwdim (uplo)
53+ tbmv! (uplo, ' N' , UNIT, size (A,1 ), bandwidth (A,bwdim), bandeddata (A), x)
5954end
6055
6156# @inline function materialize!(M::BlasMatLmulVec{<:TriangularLayout{'U',UNIT,<:BandedRowMajor},
7772# end
7873
7974# Ldiv
80- for UNIT in (' N' , ' U' )
81- @eval begin
82- @inline function materialize! (M:: BlasMatLdivVec{<:TriangularLayout{'U',$UNIT,<:BandedColumnMajor}, <:AbstractStridedLayout} )
83- A,x = M. A,M. B
84- tbsv! (' U' , ' N' , $ UNIT, size (A,1 ), bandwidth (A,2 ), bandeddata (A), x)
85- end
86-
87- @inline function materialize! (M:: BlasMatLdivVec{<:TriangularLayout{'L',$UNIT,<:BandedColumnMajor}, <:AbstractStridedLayout} )
88- A,x = M. A,M. B
89- tbsv! (' L' , ' N' , $ UNIT, size (A,1 ), bandwidth (A,1 ), bandeddata (A), x)
90- end
91-
92- @inline function materialize! (M:: BlasMatLdivVec{<:TriangularLayout{'U',$UNIT,<:BandedRowMajor}, <:AbstractStridedLayout} )
93- U,x = M. A,M. B
94- A = triangulardata (U)
95- tbsv! (' L' , ' T' , $ UNIT, size (A,1 ), bandwidth (A,2 ), bandeddata (LowerTriangular (A' )), x)
96- end
97-
98- @inline function materialize! (M:: BlasMatLdivVec{<:TriangularLayout{'L',$UNIT,<:BandedRowMajor}, <:AbstractStridedLayout} )
99- L,x = M. A,M. B
100- A = triangulardata (L)
101- tbsv! (' U' , ' T' , $ UNIT, size (A,1 ), bandwidth (A,1 ), bandeddata (UpperTriangular (A' )), x)
102- end
103- end
104- # for UPLO in ('U', 'L')
105- # @eval begin
106- # @inline function materialize!(M::BlasMatLdivVec{<:TriangularLayout{$UPLO,$UNIT,BandedRowMajor},
107- # <:AbstractStridedLayout})
108- # A,x = M.A,M.B
109- # tbsv!($UPLO, 'T', $UNIT, transpose(bandeddata(A)), x)
110- # end
111-
112- # @inline function materialize!(M::BlasMatLdivVec{<:TriangularLayout{$UPLO,$UNIT,ConjLayout{BandedRowMajor}},
113- # <:AbstractStridedLayout})
114- # A,x = M.A,M.B
115- # tbsv!($UPLO, 'C', $UNIT, bandeddata(A)', x)
116- # end
117- # end
118- # end
75+ @inline function materialize! (M:: BlasMatLdivVec {<: TriLayout ,
76+ <: AbstractStridedLayout }) where {TriLayout<: TriangularLayout{<:Any,<:Any,<:BandedColumnMajor} }
77+
78+ uplo = getuplo (TriLayout)
79+ unit = getunit (TriLayout)
80+ bwdim = getbwdim (uplo)
81+ A,x = M. A,M. B
82+ tbsv! (uplo, ' N' , unit, size (A,1 ), bandwidth (A,bwdim), bandeddata (A), x)
11983end
12084
85+ @inline function materialize! (M:: BlasMatLdivVec {<: TriLayout ,
86+ <: AbstractStridedLayout }) where {TriLayout<: TriangularLayout{<:Any,<:Any,<:BandedRowMajor} }
87+
88+ U,x = M. A,M. B
89+ A = triangulardata (U)
90+ uplo = getuplo (TriLayout)
91+ uploT = uplo == ' U' ? ' L' : ' U'
92+ unit = getunit (TriLayout)
93+ bwdim = getbwdim (uplo)
94+ LUT = uplo == ' U' ? LowerTriangular : UpperTriangular
95+ tbsv! (uploT, ' T' , unit, size (A,1 ), bandwidth (A,bwdim), bandeddata (LUT (A' )), x)
96+ end
0 commit comments