Skip to content

Commit 54d26a4

Browse files
authored
Adjustments to AdjointQ in LinearAlgebra.jl (#114)
1 parent 1d0a09f commit 54d26a4

File tree

5 files changed

+47
-17
lines changed

5 files changed

+47
-17
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ArrayLayouts"
22
uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.8.14"
4+
version = "0.8.15"
55

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"

src/ArrayLayouts.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ using LinearAlgebra: AbstractTriangular, AbstractQ, QRCompactWYQ, QRPackedQ, che
2323

2424
using LinearAlgebra.BLAS: BlasFloat, BlasReal, BlasComplex
2525

26+
AdjointQtype{T} = isdefined(LinearAlgebra, :AdjointQ) ? LinearAlgebra.AdjointQ{T} : Adjoint{T,<:AbstractQ}
27+
2628
using FillArrays: AbstractFill, getindex_value, axes_print_matrix_row, _copy_oftype
2729

2830
using Base: require_one_based_indexing

src/factorizations.jl

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -196,14 +196,14 @@ end
196196

197197

198198
### QcB
199-
materialize!(M::Lmul{<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AbstractMatrix{T},<:AbstractVecOrMat{T}}) where T<:BlasFloat =
200-
(A = M.A.parent; LAPACK.ormqr!('L','T',A.factors,A.τ,M.B))
201-
materialize!(M::Lmul{<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AbstractMatrix{T},<:AbstractVecOrMat{T}}) where T<:BlasComplex =
202-
(A = M.A.parent; LAPACK.ormqr!('L','C',A.factors,A.τ,M.B))
203-
materialize!(M::Lmul{<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AbstractMatrix{T},<:AbstractVecOrMat{T}}) where T<:BlasFloat =
204-
(A = M.A.parent; LAPACK.gemqrt!('L','T',A.factors,A.T,M.B))
205-
materialize!(M::Lmul{<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AbstractMatrix{T},<:AbstractVecOrMat{T}}) where T<:BlasComplex =
206-
(A = M.A.parent; LAPACK.gemqrt!('L','C',A.factors,A.T,M.B))
199+
materialize!(M::Lmul{<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AdjointQtype{T},<:AbstractVecOrMat{T}}) where T<:BlasFloat =
200+
(A = parent(M.A); LAPACK.ormqr!('L','T',A.factors,A.τ,M.B))
201+
materialize!(M::Lmul{<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AdjointQtype{T},<:AbstractVecOrMat{T}}) where T<:BlasComplex =
202+
(A = parent(M.A); LAPACK.ormqr!('L','C',A.factors,A.τ,M.B))
203+
materialize!(M::Lmul{<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AdjointQtype{T},<:AbstractVecOrMat{T}}) where T<:BlasFloat =
204+
(A = parent(M.A); LAPACK.gemqrt!('L','T',A.factors,A.T,M.B))
205+
materialize!(M::Lmul{<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractStridedLayout,<:AdjointQtype{T},<:AbstractVecOrMat{T}}) where T<:BlasComplex =
206+
(A = parent(M.A); LAPACK.gemqrt!('L','C',A.factors,A.T,M.B))
207207
function materialize!(M::Lmul{<:AdjQRPackedQLayout})
208208
adjA,B = M.A, M.B
209209
require_one_based_indexing(B)
@@ -264,14 +264,14 @@ function materialize!(M::Rmul{<:Any,<:QRPackedQLayout})
264264
end
265265

266266
### AQc
267-
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AbstractMatrix{T}}) where T<:BlasReal =
268-
(B = M.B.parent; LAPACK.ormqr!('R','T',B.factors,B.τ,M.A))
269-
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AbstractMatrix{T}}) where T<:BlasComplex =
270-
(B = M.B.parent; LAPACK.ormqr!('R','C',B.factors,B.τ,M.A))
271-
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AbstractMatrix{T}}) where T<:BlasReal =
272-
(B = M.B.parent; LAPACK.gemqrt!('R','T',B.factors,B.T,M.A))
273-
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AbstractMatrix{T}}) where T<:BlasComplex =
274-
(B = M.B.parent; LAPACK.gemqrt!('R','C',B.factors,B.T,M.A))
267+
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AdjointQtype{T}}) where T<:BlasReal =
268+
(B = parent(M.B); LAPACK.ormqr!('R','T',B.factors,B.τ,M.A))
269+
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRPackedQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AdjointQtype{T}}) where T<:BlasComplex =
270+
(B = parent(M.B); LAPACK.ormqr!('R','C',B.factors,B.τ,M.A))
271+
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AdjointQtype{T}}) where T<:BlasReal =
272+
(B = parent(M.B); LAPACK.gemqrt!('R','T',B.factors,B.T,M.A))
273+
materialize!(M::Rmul{<:AbstractStridedLayout,<:AdjQRCompactWYQLayout{<:AbstractStridedLayout,<:AbstractStridedLayout},<:AbstractVecOrMat{T},<:AdjointQtype{T}}) where T<:BlasComplex =
274+
(B = parent(M.B); LAPACK.gemqrt!('R','C',B.factors,B.T,M.A))
275275
function materialize!(M::Rmul{<:Any,<:AdjQRPackedQLayout})
276276
A,adjQ = M.A,M.B
277277
Q = parent(adjQ)
@@ -379,6 +379,8 @@ function _cholesky!(::SymmetricLayout{<:AbstractColumnMajor}, axes, A::AbstractM
379379
::CRowMaximum; tol = 0.0, check::Bool = true)
380380
AA, piv, rank, info = LAPACK.pstrf!(A.uplo, A.data, tol)
381381
C = CholeskyPivoted{eltype(AA),typeof(AA)}(AA, A.uplo, piv, rank, tol, info)
382+
# TODO: when lower bound on julia is above v1.8, replace the above line by the following
383+
# C = CholeskyPivoted{eltype(AA),typeof(AA),typeof(piv)}(AA, A.uplo, piv, rank, tol, info)
382384
check && chkfullrank(C)
383385
return C
384386
end

src/memorylayout.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ MemoryLayout(::Type{Transpose{T,P}}) where {T,P} = transposelayout(MemoryLayout(
283283
MemoryLayout(::Type{Adjoint{T,P}}) where {T,P} = adjointlayout(T, MemoryLayout(P))
284284
MemoryLayout(::Type{AdjointAbsVec{T,P}}) where {T,P<:AbstractVector} = DualLayout{typeof(adjointlayout(T,MemoryLayout(P)))}()
285285
MemoryLayout(::Type{TransposeAbsVec{T,P}}) where {T,P<:AbstractVector} = DualLayout{typeof(transposelayout(MemoryLayout(P)))}()
286+
if isdefined(LinearAlgebra, :AdjointQ)
287+
MemoryLayout(::Type{LinearAlgebra.AdjointQ{T,P}}) where {T,P} = adjointlayout(T, MemoryLayout(P))
288+
end
286289

287290
transposelayout(_) = UnknownLayout()
288291
transposelayout(::StridedLayout) = StridedLayout()

src/mul.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ mul!(dest::AbstractArray, A::AbstractArray, B::AbstractArray, α::Number, β::Nu
118118

119119
broadcastable(M::Mul) = M
120120

121+
const FlexibleLeftQs = Union{LinearAlgebra.HessenbergQ, LinearAlgebra.QRCompactWYQ, LinearAlgebra.QRPackedQ}
121122

122123
macro veclayoutmul(Typ)
123124
ret = quote
@@ -134,6 +135,16 @@ macro veclayoutmul(Typ)
134135
(*)(A::LinearAlgebra.AbstractQ, B::$Typ) = ArrayLayouts.mul(A,B)
135136
(*)(A::$Typ, B::LinearAlgebra.LQPackedQ) = ArrayLayouts.mul(A,B)
136137
end
138+
if isdefined(LinearAlgebra, :AdjointQ)
139+
ret = quote
140+
$ret
141+
142+
# disambiguation for flexible left-mul Qs
143+
(*)(A::FlexibleLeftQs, B::$Typ) = ArrayLayouts.mul(A,B)
144+
# flexible right-mul/adjoint left-mul Qs
145+
(*)(A::LinearAlgebra.AdjointQ{<:Any,<:LinearAlgebra.LQPackedQ}, B::$Typ) = ArrayLayouts.mul(A,B)
146+
end
147+
end
137148
for Struc in (:AbstractTriangular, :Diagonal)
138149
ret = quote
139150
$ret
@@ -198,6 +209,18 @@ macro layoutmul(Typ)
198209
(*)(A::LinearAlgebra.AbstractQ, B::$Typ) = ArrayLayouts.mul(A,B)
199210
(*)(A::$Typ, B::LinearAlgebra.AbstractQ) = ArrayLayouts.mul(A,B)
200211
end
212+
if isdefined(LinearAlgebra, :AdjointQ)
213+
ret = quote
214+
$ret
215+
216+
# disambiguation for flexible left-mul/adjoint right-mul Qs
217+
(*)(A::FlexibleLeftQs, B::$Typ) = ArrayLayouts.mul(A,B)
218+
(*)(A::$Typ, B::LinearAlgebra.AdjointQ{<:Any,<:FlexibleLeftQs}) = ArrayLayouts.mul(A,B)
219+
# disambiguation for flexible right-mul/adjoint left-mul Qs
220+
(*)(A::$Typ, B::LinearAlgebra.LQPackedQ) = ArrayLayouts.mul(A,B)
221+
(*)(A::LinearAlgebra.AdjointQ{<:Any,<:LinearAlgebra.LQPackedQ}, B::$Typ) = ArrayLayouts.mul(A,B)
222+
end
223+
end
201224
for Struc in (:AbstractTriangular, :Diagonal)
202225
ret = quote
203226
$ret

0 commit comments

Comments
 (0)