Skip to content

Commit ce427de

Browse files
Merge branch 'SciML:main' into dev
2 parents 36de150 + c3ca509 commit ce427de

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1632
-254
lines changed

Project.toml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "LinearSolve"
22
uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
33
authors = ["SciML"]
4-
version = "3.44.0"
4+
version = "3.46.1"
55

66
[deps]
77
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
@@ -23,9 +23,11 @@ Preferences = "21216c6a-2e73-6563-6e65-726566657250"
2323
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
2424
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
2525
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
26+
SciMLLogging = "a6db7da4-7206-11f0-1eab-35f2a5dbe1d1"
2627
SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
2728
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
2829
StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
30+
TriangularSolve = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf"
2931
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
3032

3133
[weakdeps]
@@ -85,11 +87,12 @@ ArrayInterface = "7.17"
8587
BandedMatrices = "1.8"
8688
BlockDiagonals = "0.2"
8789
CUDA = "5.5"
88-
CUDSS = "0.4"
90+
CUDSS = "0.4, 0.6.1"
8991
CUSOLVERRF = "0.2.6"
9092
ChainRulesCore = "1.25"
9193
CliqueTrees = "1.11.0"
9294
ConcreteStructs = "0.2.3"
95+
ComponentArrays = "0.15.29"
9396
DocStringExtensions = "0.9.3"
9497
EnumX = "1.0.4"
9598
EnzymeCore = "0.8.5"
@@ -123,18 +126,20 @@ PrecompileTools = "1.2"
123126
Preferences = "1.4"
124127
Random = "1.10"
125128
RecursiveArrayTools = "3.37"
126-
RecursiveFactorization = "0.2.23"
129+
RecursiveFactorization = "0.2.26"
127130
Reexport = "1.2.2"
128131
SafeTestsets = "0.1"
129132
SciMLBase = "2.70"
130133
SciMLOperators = "1.7.1"
134+
SciMLLogging = "1.3.1"
131135
Setfield = "1.1.1"
132136
SparseArrays = "1.10"
133137
Sparspak = "0.3.9"
134138
StableRNGs = "1.0"
135139
StaticArrays = "1.9"
136140
StaticArraysCore = "1.4.3"
137141
Test = "1.10"
142+
TriangularSolve = "0.2.1"
138143
UnPack = "1.0.2"
139144
Zygote = "0.7"
140145
blis_jll = "0.9.0"
@@ -146,6 +151,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
146151
BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
147152
BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0"
148153
CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8"
154+
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
149155
ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7"
150156
FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e"
151157
FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641"
@@ -174,4 +180,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
174180
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
175181

176182
[targets]
177-
test = ["Aqua", "Test", "IterativeSolvers", "InteractiveUtils", "KrylovKit", "KrylovPreconditioners", "Pkg", "Random", "SafeTestsets", "MultiFloats", "ForwardDiff", "HYPRE", "MPI", "BlockDiagonals", "FiniteDiff", "BandedMatrices", "FastAlmostBandedMatrices", "StaticArrays", "AllocCheck", "StableRNGs", "Zygote", "RecursiveFactorization", "Sparspak", "CliqueTrees", "FastLapackInterface", "SparseArrays", "ExplicitImports"]
183+
test = ["Aqua", "Test", "IterativeSolvers", "InteractiveUtils", "KrylovKit", "KrylovPreconditioners", "Pkg", "Random", "SafeTestsets", "MultiFloats", "ForwardDiff", "HYPRE", "MPI", "BlockDiagonals", "FiniteDiff", "BandedMatrices", "FastAlmostBandedMatrices", "StaticArrays", "AllocCheck", "StableRNGs", "Zygote", "RecursiveFactorization", "Sparspak", "CliqueTrees", "FastLapackInterface", "SparseArrays", "ExplicitImports", "ComponentArrays"]

benchmarks/lu.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
using BenchmarkTools, Random, VectorizationBase
22
using LinearAlgebra, LinearSolve, MKL_jll
3+
using RecursiveFactorization
4+
35
nc = min(Int(VectorizationBase.num_cores()), Threads.nthreads())
4-
BLAS.set_num_threads(nc)
56
BenchmarkTools.DEFAULT_PARAMETERS.seconds = 0.5
67

78
function luflop(m, n = m; innerflop = 2)
@@ -24,10 +25,10 @@ algs = [
2425
RFLUFactorization(),
2526
MKLLUFactorization(),
2627
FastLUFactorization(),
27-
SimpleLUFactorization()
28+
SimpleLUFactorization(),
29+
ButterflyFactorization(Val(true))
2830
]
2931
res = [Float64[] for i in 1:length(algs)]
30-
3132
ns = 4:8:500
3233
for i in 1:length(ns)
3334
n = ns[i]
@@ -65,3 +66,4 @@ p
6566

6667
savefig("lubench.png")
6768
savefig("lubench.pdf")
69+

docs/src/basics/common_solver_opts.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,69 @@ solve completely. Error controls only apply to iterative solvers.
2626
- `maxiters`: The number of iterations allowed. Defaults to `length(prob.b)`
2727
- `Pl,Pr`: The left and right preconditioners, respectively. For more information,
2828
see [the Preconditioners page](@ref prec).
29+
30+
## Verbosity Controls
31+
32+
The verbosity system in LinearSolve.jl provides fine-grained control over the diagnostic messages, warnings, and errors that are displayed during the solution of linear systems. To use this system, a keyword argument `verbose` is provided to `solve`.
33+
34+
```@docs
35+
LinearVerbosity
36+
```
37+
38+
### Basic Usage
39+
40+
#### Global Verbosity Control
41+
42+
```julia
43+
using LinearSolve
44+
45+
# Suppress all messages
46+
verbose = LinearVerbosity(SciMLLogging.None())
47+
prob = LinearProblem(A, b)
48+
sol = solve(prob; verbose=verbose)
49+
50+
# Show only essential messages (critical errors and fatal issues)
51+
verbose = LinearVerbosity(SciMLLogging.Minimal())
52+
sol = solve(prob; verbose=verbose)
53+
54+
# Use default settings (balanced verbosity for typical usage)
55+
verbose = LinearVerbosity(SciMLLogging.Standard())
56+
sol = solve(prob; verbose=verbose)
57+
58+
# Show comprehensive debugging information
59+
verbose = LinearVerbosity(SciMLLogging.Detailed())
60+
sol = solve(prob; verbose=verbose)
61+
62+
# Show all messages (maximum verbosity)
63+
verbose = LinearVerbosity(SciMLLogging.All())
64+
sol = solve(prob; verbose=verbose)
65+
```
66+
67+
#### Group Level Control
68+
69+
```julia
70+
# Customize by category
71+
verbose = LinearVerbosity(
72+
error_control = SciMLLogging.Warn(), # Show warnings for error control related issues
73+
performance = SciMLLogging.Silent(), # Suppress performance messages
74+
numerical = SciMLLogging.Info() # Show all numerical related log messages at info level
75+
)
76+
77+
sol = solve(prob; verbose=verbose)
78+
```
79+
80+
#### Fine-grained Control
81+
The constructor for `LinearVerbosity` allows you to set verbosity for each specific message toggle, giving you fine-grained control.
82+
The verbosity settings for the toggles are automatically passed to the group objects.
83+
```julia
84+
# Set specific message types
85+
verbose = LinearVerbosity(
86+
default_lu_fallback = SciMLLogging.InfoLevel(), # Show info when LU fallback is used
87+
KrylovJL_verbosity = SciMLLogging.WarnLevel(), # Show warnings from KrylovJL
88+
no_right_preconditioning = SciMLLogging.Silent(), # Suppress right preconditioning messages
89+
KrylovKit_verbosity = SciMLLogging.Level(KrylovKit.WARN_LEVEL) # Set KrylovKit verbosity level using KrylovKit's own verbosity levels
90+
)
91+
92+
sol = solve(prob; verbose=verbose)
93+
94+
```

ext/LinearSolveAMDGPUExt.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module LinearSolveAMDGPUExt
22

33
using AMDGPU
44
using LinearSolve: LinearSolve, LinearCache, AMDGPUOffloadLUFactorization,
5-
AMDGPUOffloadQRFactorization, init_cacheval, OperatorAssumptions
5+
AMDGPUOffloadQRFactorization, init_cacheval, OperatorAssumptions, LinearVerbosity
66
using LinearSolve.LinearAlgebra, LinearSolve.SciMLBase
77

88
# LU Factorization
@@ -25,7 +25,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::AMDGPUOffloadLUFa
2525
end
2626

2727
function LinearSolve.init_cacheval(alg::AMDGPUOffloadLUFactorization, A, b, u, Pl, Pr,
28-
maxiters::Int, abstol, reltol, verbose::Bool,
28+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
2929
assumptions::OperatorAssumptions)
3030
AMDGPU.rocSOLVER.getrf!(AMDGPU.ROCArray(A))
3131
end
@@ -57,7 +57,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::AMDGPUOffloadQRFa
5757
end
5858

5959
function LinearSolve.init_cacheval(alg::AMDGPUOffloadQRFactorization, A, b, u, Pl, Pr,
60-
maxiters::Int, abstol, reltol, verbose::Bool,
60+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
6161
assumptions::OperatorAssumptions)
6262
A_gpu = AMDGPU.ROCArray(A)
6363
tau = AMDGPU.ROCVector{eltype(A_gpu)}(undef, min(size(A_gpu)...))

ext/LinearSolveBLISExt.jl

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ using LinearSolve
99
using LinearAlgebra: BlasInt, LU
1010
using LinearAlgebra.LAPACK: require_one_based_indexing, chkfinite, chkstride1,
1111
@blasfunc, chkargsok
12-
using LinearSolve: ArrayInterface, BLISLUFactorization, @get_cacheval, LinearCache, SciMLBase
12+
using LinearSolve: ArrayInterface, BLISLUFactorization, @get_cacheval, LinearCache, SciMLBase, LinearVerbosity, get_blas_operation_info, blas_info_msg
13+
using SciMLLogging: SciMLLogging, @SciMLMessage
1314
using SciMLBase: ReturnCode
1415

1516
const global libblis = blis_jll.blis
@@ -206,13 +207,13 @@ const PREALLOCATED_BLIS_LU = begin
206207
end
207208

208209
function LinearSolve.init_cacheval(alg::BLISLUFactorization, A::Matrix{Float64}, b, u, Pl, Pr,
209-
maxiters::Int, abstol, reltol, verbose::Bool,
210+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
210211
assumptions::OperatorAssumptions)
211212
PREALLOCATED_BLIS_LU
212213
end
213214

214215
function LinearSolve.init_cacheval(alg::BLISLUFactorization, A::AbstractMatrix{<:Union{Float32,ComplexF32,ComplexF64}}, b, u, Pl, Pr,
215-
maxiters::Int, abstol, reltol, verbose::Bool,
216+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
216217
assumptions::OperatorAssumptions)
217218
A = rand(eltype(A), 0, 0)
218219
ArrayInterface.lu_instance(A), Ref{BlasInt}()
@@ -222,13 +223,47 @@ function SciMLBase.solve!(cache::LinearCache, alg::BLISLUFactorization;
222223
kwargs...)
223224
A = cache.A
224225
A = convert(AbstractMatrix, A)
226+
verbose = cache.verbose
225227
if cache.isfresh
226228
cacheval = @get_cacheval(cache, :BLISLUFactorization)
227229
res = getrf!(A; ipiv = cacheval[1].ipiv, info = cacheval[2])
228230
fact = LU(res[1:3]...), res[4]
229231
cache.cacheval = fact
230232

233+
info_value = res[3]
234+
235+
if info_value != 0
236+
if !isa(verbose.blas_info, SciMLLogging.Silent) || !isa(verbose.blas_errors, SciMLLogging.Silent) ||
237+
!isa(verbose.blas_invalid_args, SciMLLogging.Silent)
238+
op_info = get_blas_operation_info(:dgetrf, A, cache.b, condition = !isa(verbose.condition_number, SciMLLogging.Silent))
239+
@SciMLMessage(cache.verbose, :condition_number) do
240+
if op_info[:condition_number] === nothing
241+
return "Matrix condition number calculation failed."
242+
else
243+
return "Matrix condition number: $(round(op_info[:condition_number], sigdigits=4)) for $(size(A, 1))×$(size(A, 2)) matrix in dgetrf"
244+
end
245+
end
246+
verb_option, message = blas_info_msg(
247+
:dgetrf, info_value; extra_context = op_info)
248+
@SciMLMessage(message, verbose, verb_option)
249+
end
250+
else
251+
@SciMLMessage(cache.verbose, :blas_success) do
252+
op_info = get_blas_operation_info(:dgetrf, A, cache.b,
253+
condition = !isa(verbose.condition_number, SciMLLogging.Silent))
254+
@SciMLMessage(cache.verbose, :condition_number) do
255+
if op_info[:condition_number] === nothing
256+
return "Matrix condition number calculation failed."
257+
else
258+
return "Matrix condition number: $(round(op_info[:condition_number], sigdigits=4)) for $(size(A, 1))×$(size(A, 2)) matrix in dgetrf"
259+
end
260+
end
261+
return "BLAS LU factorization (dgetrf) completed successfully for $(op_info[:matrix_size]) matrix"
262+
end
263+
end
264+
231265
if !LinearAlgebra.issuccess(fact[1])
266+
@SciMLMessage("Solver failed", cache.verbose, :solver_failure)
232267
return SciMLBase.build_linear_solution(
233268
alg, cache.u, nothing, cache; retcode = ReturnCode.Failure)
234269
end

ext/LinearSolveBandedMatricesExt.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module LinearSolveBandedMatricesExt
33
using BandedMatrices, LinearAlgebra, LinearSolve
44
import LinearSolve: defaultalg,
55
do_factorization, init_cacheval, DefaultLinearSolver,
6-
DefaultAlgorithmChoice
6+
DefaultAlgorithmChoice, LinearVerbosity
77

88
# Defaults for BandedMatrices
99
function defaultalg(A::BandedMatrix, b, oa::OperatorAssumptions{Bool})
@@ -41,14 +41,14 @@ for alg in (:SVDFactorization, :MKLLUFactorization, :DiagonalFactorization,
4141
:AppleAccelerateLUFactorization, :CholeskyFactorization)
4242
@eval begin
4343
function init_cacheval(::$(alg), ::BandedMatrix, b, u, Pl, Pr, maxiters::Int,
44-
abstol, reltol, verbose::Bool, assumptions::OperatorAssumptions)
44+
abstol, reltol, verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
4545
return nothing
4646
end
4747
end
4848
end
4949

5050
function init_cacheval(::LUFactorization, A::BandedMatrix{T}, b, u, Pl, Pr, maxiters::Int,
51-
abstol, reltol, verbose::Bool, assumptions::OperatorAssumptions) where {T}
51+
abstol, reltol, verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions) where {T}
5252
(T <: BigFloat) && return qr(similar(A, 0, 0))
5353
return lu(similar(A, 0, 0))
5454
end
@@ -61,7 +61,7 @@ for alg in (:SVDFactorization, :MKLLUFactorization, :DiagonalFactorization,
6161
:AppleAccelerateLUFactorization, :QRFactorization, :LUFactorization)
6262
@eval begin
6363
function init_cacheval(::$(alg), ::Symmetric{<:Number, <:BandedMatrix}, b, u, Pl,
64-
Pr, maxiters::Int, abstol, reltol, verbose::Bool,
64+
Pr, maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
6565
assumptions::OperatorAssumptions)
6666
return nothing
6767
end

ext/LinearSolveCUDAExt.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ using LinearSolve: LinearSolve, is_cusparse, defaultalg, cudss_loaded, DefaultLi
77
error_no_cudss_lu, init_cacheval, OperatorAssumptions,
88
CudaOffloadFactorization, CudaOffloadLUFactorization, CudaOffloadQRFactorization,
99
CUDAOffload32MixedLUFactorization,
10-
SparspakFactorization, KLUFactorization, UMFPACKFactorization
10+
SparspakFactorization, KLUFactorization, UMFPACKFactorization, LinearVerbosity
1111
using LinearSolve.LinearAlgebra, LinearSolve.SciMLBase, LinearSolve.ArrayInterface
1212
using SciMLBase: AbstractSciMLOperator
1313

@@ -53,7 +53,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::CudaOffloadLUFact
5353
end
5454

5555
function LinearSolve.init_cacheval(alg::CudaOffloadLUFactorization, A::AbstractArray, b, u, Pl, Pr,
56-
maxiters::Int, abstol, reltol, verbose::Bool,
56+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
5757
assumptions::OperatorAssumptions)
5858
# Check if CUDA is functional before creating CUDA arrays
5959
if !CUDA.functional()
@@ -81,7 +81,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::CudaOffloadQRFact
8181
end
8282

8383
function LinearSolve.init_cacheval(alg::CudaOffloadQRFactorization, A, b, u, Pl, Pr,
84-
maxiters::Int, abstol, reltol, verbose::Bool,
84+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
8585
assumptions::OperatorAssumptions)
8686
# Check if CUDA is functional before creating CUDA arrays
8787
if !CUDA.functional()
@@ -105,26 +105,26 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::CudaOffloadFactor
105105
end
106106

107107
function LinearSolve.init_cacheval(alg::CudaOffloadFactorization, A::AbstractArray, b, u, Pl, Pr,
108-
maxiters::Int, abstol, reltol, verbose::Bool,
108+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
109109
assumptions::OperatorAssumptions)
110110
qr(CUDA.CuArray(A))
111111
end
112112

113113
function LinearSolve.init_cacheval(
114114
::SparspakFactorization, A::CUDA.CUSPARSE.CuSparseMatrixCSR, b, u,
115-
Pl, Pr, maxiters::Int, abstol, reltol, verbose::Bool, assumptions::OperatorAssumptions)
115+
Pl, Pr, maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
116116
nothing
117117
end
118118

119119
function LinearSolve.init_cacheval(
120120
::KLUFactorization, A::CUDA.CUSPARSE.CuSparseMatrixCSR, b, u,
121-
Pl, Pr, maxiters::Int, abstol, reltol, verbose::Bool, assumptions::OperatorAssumptions)
121+
Pl, Pr, maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
122122
nothing
123123
end
124124

125125
function LinearSolve.init_cacheval(
126126
::UMFPACKFactorization, A::CUDA.CUSPARSE.CuSparseMatrixCSR, b, u,
127-
Pl, Pr, maxiters::Int, abstol, reltol, verbose::Bool, assumptions::OperatorAssumptions)
127+
Pl, Pr, maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
128128
nothing
129129
end
130130

@@ -158,7 +158,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::CUDAOffload32Mixe
158158
end
159159

160160
function LinearSolve.init_cacheval(alg::CUDAOffload32MixedLUFactorization, A, b, u, Pl, Pr,
161-
maxiters::Int, abstol, reltol, verbose::Bool,
161+
maxiters::Int, abstol, reltol, verbose::Union{LinearVerbosity, Bool},
162162
assumptions::OperatorAssumptions)
163163
# Pre-allocate with Float32 arrays
164164
m, n = size(A)

ext/LinearSolveCUSOLVERRFExt.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ using SciMLBase: SciMLBase, LinearProblem, ReturnCode
1010
function LinearSolve.init_cacheval(alg::LinearSolve.CUSOLVERRFFactorization,
1111
A, b, u, Pl, Pr,
1212
maxiters::Int, abstol, reltol,
13-
verbose::Bool, assumptions::OperatorAssumptions)
13+
verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
1414
nothing
1515
end
1616

1717
function LinearSolve.init_cacheval(alg::LinearSolve.CUSOLVERRFFactorization,
1818
A::Union{CuSparseMatrixCSR{Float64, Int32}, SparseMatrixCSC{Float64, <:Integer}},
1919
b, u, Pl, Pr,
2020
maxiters::Int, abstol, reltol,
21-
verbose::Bool, assumptions::OperatorAssumptions)
21+
verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
2222
# Create initial factorization with appropriate options
2323
nrhs = b isa AbstractMatrix ? size(b, 2) : 1
2424
symbolic = alg.symbolic

ext/LinearSolveCliqueTreesExt.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ end
2222

2323
function LinearSolve.init_cacheval(
2424
alg::CliqueTreesFactorization, A::AbstractMatrix, b, u, Pl, Pr, maxiters::Int, abstol,
25-
reltol, verbose::Bool, assumptions::OperatorAssumptions)
25+
reltol, verbose::Union{LinearVerbosity, Bool}, assumptions::OperatorAssumptions)
2626
symbfact = _symbolic(A, alg)
2727
cholfact, cholwork = cholinit(A, symbfact)
2828
linwork = lininit(1, cholfact)

0 commit comments

Comments
 (0)