@@ -201,7 +201,7 @@ function SciMLBase.solve!(
201201 cacheval = LinearSolve. @get_cacheval (cache, :UMFPACKFactorization )
202202 if alg. reuse_symbolic
203203 # Caches the symbolic factorization: https://github.com/JuliaLang/julia/pull/33738
204- if alg. check_pattern && pattern_changed (cacheval, A)
204+ if length (cacheval . nzval) != length (A . nzval) || alg. check_pattern && pattern_changed (cacheval, A)
205205 fact = lu (
206206 SparseMatrixCSC (size (A)... , getcolptr (A), rowvals (A),
207207 nonzeros (A)),
@@ -331,7 +331,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::KLUFactorization;
331331 if cache. isfresh
332332 cacheval = LinearSolve. @get_cacheval (cache, :KLUFactorization )
333333 if alg. reuse_symbolic
334- if alg. check_pattern && pattern_changed (cacheval, A)
334+ if length (cacheval . nzval) != length (A . nzval) || alg. check_pattern && pattern_changed (cacheval, A)
335335 fact = KLU. klu (
336336 SparseMatrixCSC (size (A)... , getcolptr (A), rowvals (A),
337337 nonzeros (A)),
@@ -455,9 +455,19 @@ function LinearSolve.pattern_changed(fact::Nothing, A::SparseArrays.SparseMatrix
455455end
456456
457457function LinearSolve. pattern_changed (fact, A:: SparseArrays.SparseMatrixCSC )
458- ! (SparseArrays. decrement (SparseArrays. getcolptr (A)) ==
459- fact. colptr && SparseArrays. decrement (SparseArrays. getrowval (A)) ==
460- fact. rowval)
458+ colptr0 = fact. colptr # has 0-based indices
459+ colptr1 = SparseArrays. getcolptr (A) # has 1-based indices
460+ length (colptr0) == length (colptr1) || return true
461+ @inbounds for i in eachindex (colptr0)
462+ colptr0[i] + 1 == colptr1[i] || return true
463+ end
464+ rowval0 = fact. rowval
465+ rowval1 = SparseArrays. getrowval (A)
466+ length (rowval0) == length (rowval1) || return true
467+ @inbounds for i in eachindex (rowval0)
468+ rowval0[i] + 1 == rowval1[i] || return true
469+ end
470+ return false
461471end
462472
463473@static if Base. USE_GPL_LIBS
0 commit comments