Skip to content

Commit 98a956f

Browse files
committed
add convergence_failure toggle
1 parent 0aaaa93 commit 98a956f

File tree

9 files changed

+48
-22
lines changed

9 files changed

+48
-22
lines changed

ext/LinearSolveBLISExt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::BLISLUFactorization;
263263
end
264264

265265
if !LinearAlgebra.issuccess(fact[1])
266+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
266267
return SciMLBase.build_linear_solution(
267268
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
268269
end

ext/LinearSolveKrylovKitExt.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ function SciMLBase.solve!(cache::LinearCache, alg::KrylovKitJL; kwargs...)
3636

3737
copy!(cache.u, x)
3838
resid = info.normres
39-
retcode = info.converged == 1 ? ReturnCode.Default : ReturnCode.ConvergenceFailure
39+
retcode = if info.converged == 1
40+
ReturnCode.Default
41+
else
42+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
43+
ReturnCode.ConvergenceFailure
44+
end
45+
4046
iters = info.numiter
4147
return SciMLBase.build_linear_solution(alg, cache.u, resid, cache; retcode = retcode,
4248
iters = iters)

ext/LinearSolveRecursiveFactorizationExt.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::RFLUFactorization
2121
cache.cacheval = (fact, ipiv)
2222

2323
if !LinearAlgebra.issuccess(fact)
24+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
2425
return SciMLBase.build_linear_solution(
2526
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
2627
end

ext/LinearSolveSparseArraysExt.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ end
226226
SciMLBase.build_linear_solution(
227227
alg, y, nothing, cache; retcode = ReturnCode.Success)
228228
else
229+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
229230
SciMLBase.build_linear_solution(
230231
alg, cache.u, nothing, cache; retcode = ReturnCode.Infeasible)
231232
end
@@ -303,6 +304,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::KLUFactorization;
303304
SciMLBase.build_linear_solution(
304305
alg, y, nothing, cache; retcode = ReturnCode.Success)
305306
else
307+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
306308
SciMLBase.build_linear_solution(
307309
alg, cache.u, nothing, cache; retcode = ReturnCode.Infeasible)
308310
end

src/appleaccelerate.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::AppleAccelerateLUFactorizatio
293293
end
294294

295295
if !LinearAlgebra.issuccess(fact[1])
296+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
296297
return SciMLBase.build_linear_solution(
297298
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
298299
end
@@ -357,6 +358,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::AppleAccelerate32MixedLUFacto
357358
cache.cacheval = fact
358359

359360
if !LinearAlgebra.issuccess(fact[1])
361+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
360362
return SciMLBase.build_linear_solution(
361363
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
362364
end

src/factorization.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
# If factorization was not successful, return failure. Don't reset `isfresh`
99
if _notsuccessful(fact)
10+
@SciMLMessage("Solver failed to converge", cache.verbose,
11+
:convergence_failure)
1012
return SciMLBase.build_linear_solution(
1113
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
1214
end
@@ -143,6 +145,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::LUFactorization; kwargs...)
143145

144146
if hasmethod(LinearAlgebra.issuccess, Tuple{typeof(fact)}) &&
145147
!LinearAlgebra.issuccess(fact)
148+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
146149
return SciMLBase.build_linear_solution(
147150
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
148151
end
@@ -1027,6 +1030,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::NormalCholeskyFactorization;
10271030

10281031
if hasmethod(LinearAlgebra.issuccess, Tuple{typeof(fact)}) &&
10291032
!LinearAlgebra.issuccess(fact)
1033+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
10301034
return SciMLBase.build_linear_solution(
10311035
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
10321036
end

src/mkl.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::MKLLUFactorization;
282282
end
283283

284284
if !LinearAlgebra.issuccess(fact[1])
285+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
285286
return SciMLBase.build_linear_solution(
286287
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
287288
end
@@ -345,6 +346,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::MKL32MixedLUFactorization;
345346
cache.cacheval = fact
346347

347348
if !LinearAlgebra.issuccess(fact[1])
349+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
348350
return SciMLBase.build_linear_solution(
349351
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
350352
end

src/openblas.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::OpenBLASLUFactorization;
304304
end
305305

306306
if !LinearAlgebra.issuccess(fact[1])
307+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
307308
return SciMLBase.build_linear_solution(
308309
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
309310
end
@@ -367,6 +368,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::OpenBLAS32MixedLUFactorizatio
367368
cache.cacheval = fact
368369

369370
if !LinearAlgebra.issuccess(fact[1])
371+
@SciMLMessage("Solver failed to converge", cache.verbose, :convergence_failure)
370372
return SciMLBase.build_linear_solution(
371373
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
372374
end

src/verbosity.jl

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ LinearSolve.@concrete struct LinearVerbosity <:
1616
blas_info
1717
blas_success
1818
condition_number
19+
convergence_failure
1920
end
2021

2122
function LinearVerbosity(;
@@ -56,7 +57,8 @@ function LinearVerbosity(;
5657
blas_invalid_args = ErrorLevel(),
5758
blas_info = Silent(),
5859
blas_success = Silent(),
59-
condition_number=Silent()
60+
condition_number=Silent(),
61+
convergence_failure=WarnLevel()
6062
)
6163

6264
# Apply group-level settings
@@ -94,31 +96,33 @@ function LinearVerbosity(verbose::AbstractVerbosityPreset)
9496
KrylovJL_verbosity = Silent(),
9597
HYPRE_verbosity = Silent(),
9698
pardiso_verbosity = Silent(),
97-
blas_errors = ErrorLevel(),
98-
blas_invalid_args = ErrorLevel(),
99+
blas_errors = ErrorLevel(),
100+
blas_invalid_args = ErrorLevel(),
99101
blas_info = Silent(),
100102
blas_success = Silent(),
101-
condition_number = Silent()
103+
condition_number = Silent(),
104+
convergence_failure = Silent()
102105
)
103106
elseif verbose isa Standard
104107
# Standard: Everything from Minimal + non-fatal warnings
105108
LinearVerbosity()
106109
elseif verbose isa Detailed
107110
# Detailed: Everything from Standard + debugging/solver behavior
108111
LinearVerbosity(
109-
default_lu_fallback = WarnLevel(),
110-
no_right_preconditioning = InfoLevel(),
111-
using_IterativeSolvers = InfoLevel(),
112-
IterativeSolvers_iterations = Silent(),
112+
default_lu_fallback = WarnLevel(),
113+
no_right_preconditioning = InfoLevel(),
114+
using_IterativeSolvers = InfoLevel(),
115+
IterativeSolvers_iterations = Silent(),
113116
KrylovKit_verbosity = CustomLevel(2), # STARTSTOP_LEVEL in KrylovKit.jl
114-
KrylovJL_verbosity = CustomLevel(1), # verbose = true in Krylov.jl
117+
KrylovJL_verbosity = CustomLevel(1), # verbose = true in Krylov.jl
115118
HYPRE_verbosity = InfoLevel(),
116-
pardiso_verbosity = CustomLevel(1), # verbose = true in Pardiso.jl
117-
blas_errors = ErrorLevel(),
118-
blas_invalid_args = ErrorLevel(),
119-
blas_info = InfoLevel(),
120-
blas_success = InfoLevel(),
121-
condition_number = Silent()
119+
pardiso_verbosity = CustomLevel(1), # verbose = true in Pardiso.jl
120+
blas_errors = ErrorLevel(),
121+
blas_invalid_args = ErrorLevel(),
122+
blas_info = InfoLevel(),
123+
blas_success = InfoLevel(),
124+
condition_number = Silent(),
125+
convergence_failure = WarnLevel()
122126
)
123127
elseif verbose isa All
124128
# All: Maximum verbosity - every possible logging message at InfoLevel
@@ -128,19 +132,20 @@ function LinearVerbosity(verbose::AbstractVerbosityPreset)
128132
using_IterativeSolvers = InfoLevel(),
129133
IterativeSolvers_iterations = InfoLevel(),
130134
KrylovKit_verbosity = CustomLevel(3), # EACHITERATION_LEVEL in KrylovKit.jl
131-
KrylovJL_verbosity = CustomLevel(1),
135+
KrylovJL_verbosity = CustomLevel(1),
132136
HYPRE_verbosity = InfoLevel(),
133-
pardiso_verbosity = CustomLevel(1), # verbsoe = true in Pardiso.jl
134-
blas_errors = ErrorLevel(),
137+
pardiso_verbosity = CustomLevel(1), # verbsoe = true in Pardiso.jl
138+
blas_errors = ErrorLevel(),
135139
blas_invalid_args = ErrorLevel(),
136140
blas_info = InfoLevel(),
137141
blas_success = InfoLevel(),
138-
condition_number = InfoLevel()
142+
condition_number = InfoLevel(),
143+
convergence_failure = WarnLevel()
139144
)
140145
end
141146
end
142147

143-
@inline function LinearVerbosity(verbose::None)
148+
@inline function LinearVerbosity(verbose::None)
144149
LinearVerbosity(
145150
Silent(),
146151
Silent(),
@@ -154,6 +159,7 @@ end
154159
Silent(),
155160
Silent(),
156161
Silent(),
162+
Silent(),
157163
Silent())
158164
end
159165

@@ -175,7 +181,7 @@ const error_control_options = (:default_lu_fallback, :blas_errors, :blas_invalid
175181
const performance_options = (:no_right_preconditioning,)
176182
const numerical_options = (:using_IterativeSolvers, :IterativeSolvers_iterations,
177183
:KrylovKit_verbosity, :KrylovJL_verbosity, :HYPRE_verbosity, :pardiso_verbosity,
178-
:blas_info, :blas_success, :condition_number)
184+
:blas_info, :blas_success, :condition_number, :convergence_failure)
179185

180186
function option_group(option::Symbol)
181187
if option in error_control_options

0 commit comments

Comments
 (0)