Skip to content

Commit f0a432f

Browse files
authored
avoid ambiguity error in lmul! with Q and layout vectors/matrices (#484)
* avoid ambiguity error * increase coverage
1 parent cfc39e4 commit f0a432f

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BandedMatrices"
22
uuid = "aae01518-5342-5314-be14-df237901396f"
3-
version = "1.9.4"
3+
version = "1.9.5"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/BandedMatrices.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import LinearAlgebra: _apply_inverse_ipiv_rows!, _apply_ipiv_rows!, _chol!, axpy
1919
logabsdet, lu, lu!, mul!, qr, qr!, rmul!, svdvals, svdvals!, tril!, triu!
2020

2121
using LinearAlgebra: AbstractTriangular, AdjOrTrans, BlasComplex, BlasFloat, BlasInt, BlasReal, Givens, HermOrSym,
22-
QRPackedQ, RealHermSymComplexHerm, StructuredMatrixStyle, checksquare, chkstride1, ipiv2perm
22+
QRPackedQ, RealHermSymComplexHerm, StructuredMatrixStyle, checksquare, chkstride1, ipiv2perm, AdjointQ
2323

2424
using LinearAlgebra.LAPACK
2525

@@ -32,7 +32,7 @@ import ArrayLayouts: AbstractTridiagonalLayout, BidiagonalLayout, BlasMatLdivVec
3232
hermitianlayout, materialize, materialize!, reflector!, reflectorApply!, rowsupport,
3333
sub_materialize, subdiagonaldata, sublayout, supdiagonaldata, symmetricdata, symmetriclayout,
3434
symmetricuplo, transposelayout, triangulardata, triangularlayout, zero!,
35-
QRPackedQLayout, AdjQRPackedQLayout
35+
QRPackedQLayout, AdjQRPackedQLayout, LayoutVecOrMats
3636

3737
import FillArrays: AbstractFill, getindex_value, _broadcasted_zeros, unique_value, OneElement, RectDiagonal, OneElementMatrix, OneElementVector, ZerosMatrix, ZerosVector
3838

src/banded/bandedqr.jl

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
AdjointQType = isdefined(LinearAlgebra, :AdjointQ) ? LinearAlgebra.AdjointQ : Adjoint
2-
31
_qr(::AbstractBandedLayout, ax, A) = _banded_qr(ax, A)
42
_banded_qr(_, A) = qr!(BandedMatrix{float(eltype(A))}(A, (bandwidth(A,1),bandwidth(A,1)+bandwidth(A,2))))
53

@@ -65,7 +63,7 @@ function banded_qr_lmul!(A, B)
6563
B
6664
end
6765

68-
function banded_qr_lmul!(adjA::AdjointQType, B)
66+
function banded_qr_lmul!(adjA::AdjointQ, B)
6967
require_one_based_indexing(B)
7068
A = parent(adjA)
7169
mA, nA = size(A.factors)
@@ -121,7 +119,7 @@ function banded_qr_rmul!(A, Q)
121119
end
122120
A
123121
end
124-
function banded_qr_rmul!(A, adjQ::AdjointQType)
122+
function banded_qr_rmul!(A, adjQ::AdjointQ)
125123
Q = parent(adjQ)
126124
mQ, nQ = size(Q.factors)
127125
mA, nA = size(A,1), size(A,2)
@@ -150,27 +148,28 @@ function banded_qr_rmul!(A, adjQ::AdjointQType)
150148
end
151149

152150
banded_lmul!(A::QRPackedQ, B::AbstractVecOrMat) = banded_qr_lmul!(A, B)
153-
banded_lmul!(adjA::AdjointQType{<:Any,<:QRPackedQ}, B::AbstractVecOrMat) = banded_qr_lmul!(adjA, B)
151+
banded_lmul!(adjA::AdjointQ{<:Any,<:QRPackedQ}, B::AbstractVecOrMat) = banded_qr_lmul!(adjA, B)
154152
banded_rmul!(A::AbstractMatrix, Q::QRPackedQ) = banded_qr_rmul!(A, Q)
155-
banded_rmul!(A::AbstractMatrix, adjQ::AdjointQType{<:Any,<:QRPackedQ}) = banded_qr_rmul!(A, adjQ)
153+
banded_rmul!(A::AbstractMatrix, adjQ::AdjointQ{<:Any,<:QRPackedQ}) = banded_qr_rmul!(A, adjQ)
156154

157155
lmul!(A::QRPackedQ{<:Any,<:AbstractBandedMatrix}, B::AbstractVector) = banded_lmul!(A,B)
158156
lmul!(A::QRPackedQ{<:Any,<:AbstractBandedMatrix}, B::AbstractMatrix) = banded_lmul!(A,B)
159-
lmul!(adjA::AdjointQType{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}, B::AbstractVector) = banded_lmul!(adjA,B)
160-
lmul!(adjA::AdjointQType{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}, B::AbstractMatrix) = banded_lmul!(adjA,B)
161-
lmul!(A::QRPackedQ{<:Any,BandedSubBandedMatrix{T,C,R,I1,I2}}, B::AbstractVector) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange} =
157+
lmul!(adjA::AdjointQ{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}, B::AbstractVector) = banded_lmul!(adjA,B)
158+
lmul!(adjA::AdjointQ{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}, B::AbstractMatrix) = banded_lmul!(adjA,B)
159+
lmul!(adjA::AdjointQ{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}, B::LayoutVecOrMats) = banded_lmul!(adjA,B)
160+
lmul!(A::QRPackedQ{<:Any,<:BandedSubBandedMatrix{T,C,R,I1,I2}}, B::AbstractVector) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange} =
162161
banded_lmul!(A,B)
163-
lmul!(A::QRPackedQ{<:Any,BandedSubBandedMatrix{T,C,R,I1,I2}}, B::AbstractMatrix) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange} =
162+
lmul!(A::QRPackedQ{<:Any,<:BandedSubBandedMatrix{T,C,R,I1,I2}}, B::AbstractMatrix) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange} =
164163
banded_lmul!(A,B)
165-
lmul!(adjA::AdjointQType{T,<:QRPackedQ{T,<:BandedSubBandedMatrix{T,C,R,I1,I2,t}}}, B::AbstractVector) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange,t} =
164+
lmul!(adjA::AdjointQ{T,<:QRPackedQ{T,<:BandedSubBandedMatrix{T,C,R,I1,I2,t}}}, B::AbstractVector) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange,t} =
166165
banded_lmul!(adjA,B)
167-
lmul!(adjA::AdjointQType{T,<:QRPackedQ{T,<:BandedSubBandedMatrix{T,C,R,I1,I2,t}}}, B::AbstractMatrix) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange,t} =
166+
lmul!(adjA::AdjointQ{T,<:QRPackedQ{T,<:BandedSubBandedMatrix{T,C,R,I1,I2,t}}}, B::AbstractMatrix) where {T,C,R,I1<:AbstractUnitRange,I2<:AbstractUnitRange,t} =
168167
banded_lmul!(adjA,B)
169-
# rmul!(A::AbstractMatrix, adjQ::AdjointQType{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}) = banded_rmul!(A, adjA)
170-
# rmul!(A::StridedMatrix, adjQ::AdjointQType{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}) = banded_rmul!(A, adjA)
168+
# rmul!(A::AbstractMatrix, adjQ::AdjointQ{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}) = banded_rmul!(A, adjA)
169+
# rmul!(A::StridedMatrix, adjQ::AdjointQ{<:Any,<:QRPackedQ{<:Any,<:AbstractBandedMatrix}}) = banded_rmul!(A, adjA)
171170
rmul!(A::StridedVecOrMat{T}, Q::QRPackedQ{T,B}) where {T<:BlasFloat,B<:AbstractBandedMatrix{T}} = banded_rmul!(A, Q)
172-
rmul!(A::StridedVecOrMat{T}, adjQ::AdjointQType{<:Any,<:QRPackedQ{T,B}}) where {T<:BlasComplex,B<:AbstractBandedMatrix{T}} = banded_rmul!(A, adjQ)
173-
rmul!(A::StridedVecOrMat{T}, adjQ::AdjointQType{<:Any,<:QRPackedQ{T,B}}) where {T<:BlasReal,B<:AbstractBandedMatrix{T}} = banded_rmul!(A, adjQ)
171+
rmul!(A::StridedVecOrMat{T}, adjQ::AdjointQ{<:Any,<:QRPackedQ{T,B}}) where {T<:BlasComplex,B<:AbstractBandedMatrix{T}} = banded_rmul!(A, adjQ)
172+
rmul!(A::StridedVecOrMat{T}, adjQ::AdjointQ{<:Any,<:QRPackedQ{T,B}}) where {T<:BlasReal,B<:AbstractBandedMatrix{T}} = banded_rmul!(A, adjQ)
174173

175174

176175
function _banded_widerect_ldiv!(A::QR{T}, B) where T

test/test_bandedqr.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,17 @@ Random.seed!(0)
150150
Q = BandedMatrices.QRPackedQ(BandedMatrix(-2 => -(s ./ (c .+ 1))), c .+ 1)
151151
@test Q'Q Matrix(Q)'Matrix(Q) I
152152
end
153+
154+
@testset "bandedsubbanded qr " begin
155+
A = brand(100,100,1,1)
156+
B = BandedMatrix(A,(1,2)) # pad
157+
b = randn(5)
158+
c = randn(5,3)
159+
@test lmul!(qr!(view(copy(B),1:5,1:6)).Q, copy(b)) qr(A[1:5,1:6]).Q * b
160+
@test lmul!(qr!(view(copy(B),1:5,1:6)).Q, copy(c)) qr(A[1:5,1:6]).Q * c
161+
@test lmul!(qr!(view(copy(B),1:5,1:6)).Q', copy(b)) qr(A[1:5,1:6]).Q' * b
162+
@test lmul!(qr!(view(copy(B),1:5,1:6)).Q', copy(c)) qr(A[1:5,1:6]).Q' * c
163+
end
153164
end
154165

155166
end # module

0 commit comments

Comments
 (0)