Skip to content

Commit ad93862

Browse files
committed
Add RequiresConcreteMatrixError struct for better error handling
Replace plain error() calls with a custom exception type when operators that don't support concretization are passed to factorization algorithms.
1 parent b8cfa09 commit ad93862

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

ext/LinearSolveSparseArraysExt.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ using LinearSolve: LinearSolve, BLASELTYPES, pattern_changed, ArrayInterface,
44
@get_cacheval, CHOLMODFactorization, GenericFactorization,
55
GenericLUFactorization,
66
KLUFactorization, LUFactorization, NormalCholeskyFactorization,
7-
OperatorAssumptions, LinearVerbosity,
7+
OperatorAssumptions, LinearVerbosity, RequiresConcreteMatrixError,
88
QRFactorization, RFLUFactorization, UMFPACKFactorization, solve, has_concretization
99
using SciMLOperators: AbstractSciMLOperator
1010
using ArrayInterface: ArrayInterface
@@ -284,7 +284,7 @@ function LinearSolve.init_cacheval(
284284
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
285285
maxiters, abstol, reltol, verbose, assumptions)
286286
else
287-
error("KLUFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
287+
throw(RequiresConcreteMatrixError("KLUFactorization"))
288288
end
289289
end
290290

@@ -296,7 +296,7 @@ function LinearSolve.init_cacheval(
296296
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
297297
maxiters, abstol, reltol, verbose, assumptions)
298298
else
299-
error("UMFPACKFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
299+
throw(RequiresConcreteMatrixError("UMFPACKFactorization"))
300300
end
301301
end
302302

@@ -308,7 +308,7 @@ function LinearSolve.init_cacheval(
308308
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
309309
maxiters, abstol, reltol, verbose, assumptions)
310310
else
311-
error("LUFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
311+
throw(RequiresConcreteMatrixError("LUFactorization"))
312312
end
313313
end
314314

@@ -320,7 +320,7 @@ function LinearSolve.init_cacheval(
320320
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
321321
maxiters, abstol, reltol, verbose, assumptions)
322322
else
323-
error("CHOLMODFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
323+
throw(RequiresConcreteMatrixError("CHOLMODFactorization"))
324324
end
325325
end
326326

@@ -332,7 +332,7 @@ function LinearSolve.init_cacheval(
332332
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
333333
maxiters, abstol, reltol, verbose, assumptions)
334334
else
335-
error("GenericFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
335+
throw(RequiresConcreteMatrixError("GenericFactorization"))
336336
end
337337
end
338338

@@ -344,7 +344,7 @@ function LinearSolve.init_cacheval(
344344
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
345345
maxiters, abstol, reltol, verbose, assumptions)
346346
else
347-
error("GenericLUFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
347+
throw(RequiresConcreteMatrixError("GenericLUFactorization"))
348348
end
349349
end
350350

@@ -356,7 +356,7 @@ function LinearSolve.init_cacheval(
356356
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
357357
maxiters, abstol, reltol, verbose, assumptions)
358358
else
359-
error("QRFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
359+
throw(RequiresConcreteMatrixError("QRFactorization"))
360360
end
361361
end
362362

@@ -368,7 +368,7 @@ function LinearSolve.init_cacheval(
368368
return LinearSolve.init_cacheval(alg, convert(AbstractMatrix, A), b, u, Pl, Pr,
369369
maxiters, abstol, reltol, verbose, assumptions)
370370
else
371-
error("NormalCholeskyFactorization requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
371+
throw(RequiresConcreteMatrixError("NormalCholeskyFactorization"))
372372
end
373373
end
374374

src/LinearSolve.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,30 @@ for integrating custom algorithms or simple solve strategies.
230230
"""
231231
abstract type AbstractSolveFunction <: SciMLLinearSolveAlgorithm end
232232

233+
# Errors
234+
235+
"""
236+
RequiresConcreteMatrixError(alg::String)
237+
238+
Error thrown when a factorization algorithm that requires a concrete matrix
239+
receives an operator that does not support concretization (i.e., `has_concretization(A)` returns `false`).
240+
241+
## Example
242+
243+
```julia
244+
throw(RequiresConcreteMatrixError("KLUFactorization"))
245+
```
246+
247+
This error suggests using a Krylov method instead, which can work with abstract operators.
248+
"""
249+
struct RequiresConcreteMatrixError <: Exception
250+
alg::String
251+
end
252+
253+
function Base.showerror(io::IO, e::RequiresConcreteMatrixError)
254+
print(io, "$(e.alg) requires a concrete matrix. The provided operator does not support concretization. Use a Krylov method instead.")
255+
end
256+
233257
# Traits
234258

235259
"""
@@ -519,6 +543,8 @@ export MetalOffload32MixedLUFactorization
519543

520544
export OperatorAssumptions, OperatorCondition
521545

546+
export RequiresConcreteMatrixError
547+
522548
export LinearSolveAdjoint
523549

524550
export LinearVerbosity

0 commit comments

Comments
 (0)