Skip to content

Commit 20aada1

Browse files
authored
Orthogonalize materialize for tribanded (#393)
1 parent 787a42f commit 20aada1

File tree

1 file changed

+32
-56
lines changed

1 file changed

+32
-56
lines changed

src/tribanded.jl

Lines changed: 32 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,17 @@ triangularlayout(::Type{Tri}, ::ML) where {Tri,ML<:ConjLayout{<:BandedRows}} = T
1212

1313
sublayout(::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, :)
2826
end
2927

3028
# function bandedrowsdata(::TriangularLayout{'U'}, A)
@@ -46,16 +44,13 @@ end
4644
copy(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)
5954
end
6055

6156
# @inline function materialize!(M::BlasMatLmulVec{<:TriangularLayout{'U',UNIT,<:BandedRowMajor},
@@ -77,44 +72,25 @@ end
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)
11983
end
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

Comments
 (0)