11needs_concrete_A (alg:: DefaultLinearSolver ) = true
22mutable struct DefaultLinearSolverInit{T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
3- T13, T14, T15, T16, T17, T18}
3+ T13, T14, T15, T16, T17, T18, T19 }
44 LUFactorization:: T1
55 QRFactorization:: T2
66 DiagonalFactorization:: T3
@@ -19,6 +19,7 @@ mutable struct DefaultLinearSolverInit{T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
1919 NormalCholeskyFactorization:: T16
2020 AppleAccelerateLUFactorization:: T17
2121 MKLLUFactorization:: T18
22+ QRFactorizationPivoted:: T19
2223end
2324
2425# Legacy fallback
@@ -168,8 +169,8 @@ function defaultalg(A, b, assump::OperatorAssumptions)
168169 (A === nothing ? eltype (b) <: Union{Float32, Float64} :
169170 eltype (A) <: Union{Float32, Float64} )
170171 DefaultAlgorithmChoice. RFLUFactorization
171- # elseif A === nothing || A isa Matrix
172- # alg = FastLUFactorization()
172+ # elseif A === nothing || A isa Matrix
173+ # alg = FastLUFactorization()
173174 elseif usemkl && (A === nothing ? eltype (b) <: Union{Float32, Float64} :
174175 eltype (A) <: Union{Float32, Float64} )
175176 DefaultAlgorithmChoice. MKLLUFactorization
@@ -199,9 +200,19 @@ function defaultalg(A, b, assump::OperatorAssumptions)
199200 elseif assump. condition === OperatorCondition. WellConditioned
200201 DefaultAlgorithmChoice. NormalCholeskyFactorization
201202 elseif assump. condition === OperatorCondition. IllConditioned
202- DefaultAlgorithmChoice. QRFactorization
203+ if is_underdetermined (A)
204+ # Underdetermined
205+ DefaultAlgorithmChoice. QRFactorizationPivoted
206+ else
207+ DefaultAlgorithmChoice. QRFactorization
208+ end
203209 elseif assump. condition === OperatorCondition. VeryIllConditioned
204- DefaultAlgorithmChoice. QRFactorization
210+ if is_underdetermined (A)
211+ # Underdetermined
212+ DefaultAlgorithmChoice. QRFactorizationPivoted
213+ else
214+ DefaultAlgorithmChoice. QRFactorization
215+ end
205216 elseif assump. condition === OperatorCondition. SuperIllConditioned
206217 DefaultAlgorithmChoice. SVDFactorization
207218 else
@@ -247,6 +258,12 @@ function algchoice_to_alg(alg::Symbol)
247258 NormalCholeskyFactorization ()
248259 elseif alg === :AppleAccelerateLUFactorization
249260 AppleAccelerateLUFactorization ()
261+ elseif alg === :QRFactorizationPivoted
262+ @static if VERSION ≥ v " 1.7beta"
263+ QRFactorization (ColumnNorm ())
264+ else
265+ QRFactorization (Val (true ))
266+ end
250267 else
251268 error (" Algorithm choice symbol $alg not allowed in the default" )
252269 end
@@ -310,6 +327,7 @@ function defaultalg_symbol(::Type{T}) where {T}
310327 Symbol (split (string (SciMLBase. parameterless_type (T)), " ." )[end ])
311328end
312329defaultalg_symbol (:: Type{<:GenericFactorization{typeof(ldlt!)}} ) = :LDLtFactorization
330+ defaultalg_symbol (:: Type{<:QRFactorization{ColumnNorm}} ) = :QRFactorizationPivoted
313331
314332"""
315333if alg.alg === DefaultAlgorithmChoice.LUFactorization
0 commit comments