@@ -11,9 +11,14 @@ Base.iterate(S::QR, ::Val{:R}) = (S.R, Val(:p))
1111Base. iterate (S:: QR , :: Val{:p} ) = (S. p, Val (:done ))
1212Base. iterate (S:: QR , :: Val{:done} ) = nothing
1313
14- for pv in (:true , :false )
14+ pivot_options = if isdefined (LinearAlgebra, :PivotingStrategy ) # introduced in Julia v1.7
15+ (:(Val{true }), :(Val{false }), :NoPivot , :ColumnNorm )
16+ else
17+ (:(Val{true }), :(Val{false }))
18+ end
19+ for pv in pivot_options
1520 @eval begin
16- @inline function qr (A:: StaticMatrix , pivot:: Val{ $pv} )
21+ @inline function qr (A:: StaticMatrix , pivot:: $pv )
1722 QRp = _qr (Size (A), A, pivot)
1823 if length (QRp) === 2
1924 # create an identity permutation since that is cheap,
@@ -28,7 +33,8 @@ for pv in (:true, :false)
2833 end
2934end
3035"""
31- qr(A::StaticMatrix, pivot::Union{Val{true}, Val{false}} = Val(false))
36+ qr(A::StaticMatrix,
37+ pivot::Union{Val{true}, Val{false}, LinearAlgebra.PivotingStrategy} = Val(false))
3238
3339Compute the QR factorization of `A`. The factors can be obtained by iteration:
3440
5864
5965_qreltype (:: Type{T} ) where T = typeof (zero (T)/ sqrt (abs2 (one (T))))
6066
61-
62- @generated function _qr ( :: Size{sA} , A :: StaticMatrix{<:Any, <:Any, TA} , pivot :: Union{Val{false}, Val{true}} = Val (false )) where {sA, TA}
67+ @generated function _qr ( :: Size{sA} , A :: StaticMatrix{<:Any, <:Any, TA} ,
68+ pivot = Val (false )) where {sA, TA}
6369
6470 SizeQ = Size ( sA[1 ], diagsize (Size (A)) )
6571 SizeR = Size ( diagsize (Size (A)), sA[2 ] )
6672
67- if pivot === Val{true }
73+ if pivot === Val{true } || (isdefined (LinearAlgebra, :PivotingStrategy ) && pivot === ColumnNorm)
74+ _pivot = isdefined (LinearAlgebra, :PivotingStrategy ) ? ColumnNorm () : Val (true )
6875 return quote
6976 @_inline_meta
70- Q0, R0, p0 = qr (Matrix (A), pivot )
77+ Q0, R0, p0 = qr (Matrix (A), $ (_pivot) )
7178 T = _qreltype (TA)
7279 return similar_type (A, T, $ (SizeQ))(Matrix (Q0)),
7380 similar_type (A, T, $ (SizeR))(R0),
@@ -77,12 +84,13 @@ _qreltype(::Type{T}) where T = typeof(zero(T)/sqrt(abs2(one(T))))
7784 if (sA[1 ]* sA[1 ] + sA[1 ]* sA[2 ])÷ 2 * diagsize (Size (A)) < 17 * 17 * 17
7885 return quote
7986 @_inline_meta
80- return qr_unrolled (Size (A), A, pivot )
87+ return qr_unrolled (Size (A), A, Val ( false ) )
8188 end
8289 else
90+ _pivot = isdefined (LinearAlgebra, :PivotingStrategy ) ? NoPivot () : Val (false )
8391 return quote
8492 @_inline_meta
85- Q0R0 = qr (Matrix (A), pivot )
93+ Q0R0 = qr (Matrix (A), $ (_pivot) )
8694 Q0, R0 = Matrix (Q0R0. Q), Q0R0. R
8795 T = _qreltype (TA)
8896 return similar_type (A, T, $ (SizeQ))(Q0),
0 commit comments