diff --git a/lib/OrdinaryDiffEqCore/Project.toml b/lib/OrdinaryDiffEqCore/Project.toml index 870d14452b2..3e30d494135 100644 --- a/lib/OrdinaryDiffEqCore/Project.toml +++ b/lib/OrdinaryDiffEqCore/Project.toml @@ -1,7 +1,7 @@ name = "OrdinaryDiffEqCore" uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" authors = ["ParamThakkar123 "] -version = "3.4.0" +version = "3.4.1" [deps] SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" @@ -37,6 +37,7 @@ DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [extras] JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" @@ -98,12 +99,10 @@ Reexport = "1.2" [weakdeps] Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" -SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [targets] -test = ["DiffEqDevTools", "Random", "SafeTestsets", "SparseArrays", "Test", "Pkg"] +test = ["DiffEqDevTools", "Random", "SafeTestsets", "Test", "Pkg"] [extensions] OrdinaryDiffEqCoreEnzymeCoreExt = "EnzymeCore" OrdinaryDiffEqCoreMooncakeExt = "Mooncake" -OrdinaryDiffEqCoreSparseArraysExt = "SparseArrays" diff --git a/lib/OrdinaryDiffEqCore/ext/OrdinaryDiffEqCoreSparseArraysExt.jl b/lib/OrdinaryDiffEqCore/ext/OrdinaryDiffEqCoreSparseArraysExt.jl deleted file mode 100644 index 6b57562971f..00000000000 --- a/lib/OrdinaryDiffEqCore/ext/OrdinaryDiffEqCoreSparseArraysExt.jl +++ /dev/null @@ -1,25 +0,0 @@ -module OrdinaryDiffEqCoreSparseArraysExt - -using SparseArrays: SparseMatrixCSC -import OrdinaryDiffEqCore: _isdiag - -# Efficient O(nnz) isdiag check for sparse matrices. -# Standard isdiag is O(n²) which is prohibitively slow for large sparse matrices. -""" - _isdiag(A::SparseMatrixCSC) - -Check if a sparse matrix is diagonal in O(nnz) time by traversing the CSC structure directly. -Returns `true` if all non-zero elements are on the diagonal. -""" -function _isdiag(A::SparseMatrixCSC) - m, n = size(A) - m != n && return false - @inbounds for j in 1:n - for k in A.colptr[j]:(A.colptr[j + 1] - 1) - A.rowval[k] != j && return false - end - end - return true -end - -end diff --git a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl index e274231c5d0..989bfe9f06b 100644 --- a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl +++ b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl @@ -17,6 +17,8 @@ using MuladdMacro: @muladd using LinearAlgebra: opnorm, I, UniformScaling, diag, rank, isdiag +import SparseArrays + import PrecompileTools import FillArrays: Trues, Falses diff --git a/lib/OrdinaryDiffEqCore/src/misc_utils.jl b/lib/OrdinaryDiffEqCore/src/misc_utils.jl index 6698e14129c..5b0d576cf12 100644 --- a/lib/OrdinaryDiffEqCore/src/misc_utils.jl +++ b/lib/OrdinaryDiffEqCore/src/misc_utils.jl @@ -133,9 +133,27 @@ function get_differential_vars(f, u) end # Fallback for _isdiag - uses LinearAlgebra.isdiag which is O(n²) -# Sparse specialization is provided in OrdinaryDiffEqCoreSparseArraysExt _isdiag(A::AbstractMatrix) = isdiag(A) +# Efficient O(nnz) isdiag check for sparse matrices. +# Standard isdiag is O(n²) which is prohibitively slow for large sparse matrices. +""" + _isdiag(A::SparseMatrixCSC) + +Check if a sparse matrix is diagonal in O(nnz) time by traversing the CSC structure directly. +Returns `true` if all non-zero elements are on the diagonal. +""" +function _isdiag(A::SparseArrays.SparseMatrixCSC) + m, n = size(A) + m != n && return false + @inbounds for j in 1:n + for k in A.colptr[j]:(A.colptr[j + 1] - 1) + A.rowval[k] != j && return false + end + end + return true +end + isnewton(::Any) = false function _bool_to_ADType(::Val{true}, ::Val{CS}, _) where {CS} diff --git a/lib/OrdinaryDiffEqCore/test/sparse_isdiag_tests.jl b/lib/OrdinaryDiffEqCore/test/sparse_isdiag_tests.jl index e8780dfd068..708234b9fd6 100644 --- a/lib/OrdinaryDiffEqCore/test/sparse_isdiag_tests.jl +++ b/lib/OrdinaryDiffEqCore/test/sparse_isdiag_tests.jl @@ -1,5 +1,4 @@ using Test -# Load SparseArrays first to trigger the extension using SparseArrays using OrdinaryDiffEqCore: _isdiag