From c57ee97a437ced36b5ea26d8fd974ce6b1ed6385 Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sat, 15 Jul 2023 21:39:02 -0400 Subject: [PATCH 1/4] Set a sparsity threshold for KLU Closes https://github.com/SciML/LinearSolve.jl/issues/340. While many results are very much based on more details about the sparsity pattern, it's at least clear that if the matrix is not very sparse then it should probably use UMFPACK, so this is a conservative bound. When mixed with the length bound, I find that this seems to work rather well, though is not always optimal, is at least better than always choosing UMFPACK --- src/default.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/default.jl b/src/default.jl index 3eb67627a..4bb267635 100644 --- a/src/default.jl +++ b/src/default.jl @@ -79,7 +79,7 @@ end function defaultalg(A::AbstractSparseMatrixCSC{<:Union{Float64, ComplexF64}, Ti}, b, assump::OperatorAssumptions) where {Ti} if assump.issq - if length(b) <= 10_000 + if length(b) <= 10_000 && length(nonzeros(A)) / length(A) < 1e-4 DefaultLinearSolver(DefaultAlgorithmChoice.KLUFactorization) else DefaultLinearSolver(DefaultAlgorithmChoice.UMFPACKFactorization) From 0b1fef094c1c50aca7751d5d2d2e0c669c80d059 Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sat, 15 Jul 2023 21:50:37 -0400 Subject: [PATCH 2/4] fix default alg test --- test/default_algs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/default_algs.jl b/test/default_algs.jl index d3ba54063..1fd016ff8 100644 --- a/test/default_algs.jl +++ b/test/default_algs.jl @@ -21,7 +21,7 @@ solve(prob) LinearSolve.OperatorAssumptions(false)).alg === LinearSolve.DefaultAlgorithmChoice.QRFactorization -@test LinearSolve.defaultalg(sprand(1000, 1000, 0.5), zeros(1000)).alg === +@test LinearSolve.defaultalg(sprand(1000, 1000, 1e-5) + I, zeros(1000)).alg === LinearSolve.DefaultAlgorithmChoice.KLUFactorization prob = LinearProblem(sprand(1000, 1000, 0.5), zeros(1000)) solve(prob) From a8def350e6aebe5eba63e1b2725dfb631d2116f3 Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sat, 15 Jul 2023 23:31:45 -0400 Subject: [PATCH 3/4] higher probability test pass --- test/default_algs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/default_algs.jl b/test/default_algs.jl index 1fd016ff8..38c24b0db 100644 --- a/test/default_algs.jl +++ b/test/default_algs.jl @@ -21,7 +21,7 @@ solve(prob) LinearSolve.OperatorAssumptions(false)).alg === LinearSolve.DefaultAlgorithmChoice.QRFactorization -@test LinearSolve.defaultalg(sprand(1000, 1000, 1e-5) + I, zeros(1000)).alg === +@test LinearSolve.defaultalg(sprand(1000, 1000, 1e-6) + I, zeros(1000)).alg === LinearSolve.DefaultAlgorithmChoice.KLUFactorization prob = LinearProblem(sprand(1000, 1000, 0.5), zeros(1000)) solve(prob) From ab17349afb5b2ea8c809522516b3bbc466961ace Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sun, 16 Jul 2023 07:05:25 -0400 Subject: [PATCH 4/4] slightly better with test --- src/default.jl | 4 +++- test/default_algs.jl | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/default.jl b/src/default.jl index 4bb267635..336699117 100644 --- a/src/default.jl +++ b/src/default.jl @@ -79,7 +79,9 @@ end function defaultalg(A::AbstractSparseMatrixCSC{<:Union{Float64, ComplexF64}, Ti}, b, assump::OperatorAssumptions) where {Ti} if assump.issq - if length(b) <= 10_000 && length(nonzeros(A)) / length(A) < 1e-4 + @show length(b) <= 10_000 + @show length(nonzeros(A)) / length(A) + if length(b) <= 10_000 && length(nonzeros(A)) / length(A) < 2e-4 DefaultLinearSolver(DefaultAlgorithmChoice.KLUFactorization) else DefaultLinearSolver(DefaultAlgorithmChoice.UMFPACKFactorization) diff --git a/test/default_algs.jl b/test/default_algs.jl index 38c24b0db..a0c89d0cd 100644 --- a/test/default_algs.jl +++ b/test/default_algs.jl @@ -21,7 +21,7 @@ solve(prob) LinearSolve.OperatorAssumptions(false)).alg === LinearSolve.DefaultAlgorithmChoice.QRFactorization -@test LinearSolve.defaultalg(sprand(1000, 1000, 1e-6) + I, zeros(1000)).alg === +@test LinearSolve.defaultalg(sprand(10^4, 10^4, 1e-5) + I, zeros(1000)).alg === LinearSolve.DefaultAlgorithmChoice.KLUFactorization prob = LinearProblem(sprand(1000, 1000, 0.5), zeros(1000)) solve(prob)