diff --git a/Project.toml b/Project.toml index cd2612f3c..4df6346eb 100644 --- a/Project.toml +++ b/Project.toml @@ -68,7 +68,8 @@ Distributions = "0.25" DocStringExtensions = "0.9" DomainSets = "0.6, 0.7" DynamicPolynomials = "0.5, 0.6" -ForwardDiff = "0.10.36" +FiniteDiff = "2" +ForwardDiff = "0.10.36, 1" Groebner = "0.8.2, 0.9" LaTeXStrings = "1.3" LambertW = "1.0.0" @@ -100,6 +101,7 @@ julia = "1.10" BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" +FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" Groebner = "0b43b601-686d-58a3-8a1c-6623616c7cd4" LambertW = "984bce1d-4616-540c-a9ee-88d1112d94c9" @@ -113,4 +115,4 @@ SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "SafeTestsets", "Pkg", "PkgBenchmark", "PreallocationTools", "ForwardDiff", "Groebner", "BenchmarkTools", "ReferenceTests", "Random", "LambertW", "Lux", "ComponentArrays", "Nemo", "DynamicQuantities"] +test = ["Test", "SafeTestsets", "Pkg", "PkgBenchmark", "PreallocationTools", "ForwardDiff", "Groebner", "BenchmarkTools", "ReferenceTests", "Random", "LambertW", "Lux", "ComponentArrays", "Nemo", "DynamicQuantities","FiniteDiff"] diff --git a/src/diff.jl b/src/diff.jl index e72465c63..68cf26ca9 100644 --- a/src/diff.jl +++ b/src/diff.jl @@ -480,6 +480,9 @@ for (modu, fun, arity) ∈ DiffRules.diffrules(; filter_modules=(:Base, :Special end end +derivative(::typeof(mod), args::NTuple{2, Any}, ::Val{1}) = ifelse(mod(args...) == 0, NaN, 1) +derivative(::typeof(mod), args::NTuple{2, Any}, ::Val{2}) = ifelse(mod(args...) == 0, NaN, -floor(args[1] / args[2])) + derivative(::typeof(+), args::NTuple{N,Any}, ::Val) where {N} = 1 derivative(::typeof(*), args::NTuple{N,Any}, ::Val{i}) where {N,i} = *(deleteat!(collect(args), i)...) derivative(::typeof(one), args::Tuple{<:Any}, ::Val) = 0 diff --git a/test/diff.jl b/test/diff.jl index fb75e648d..1288d106f 100644 --- a/test/diff.jl +++ b/test/diff.jl @@ -1,6 +1,7 @@ using Symbolics using Test using Symbolics: value +using FiniteDiff # Derivatives @variables t σ ρ β @@ -604,3 +605,13 @@ let @test isequal(expand_derivatives(Dt(y[1])), Dt(x) * Dx(y[1])) # same for vector var @test isequal(expand_derivatives(Dt(Y[1,1])), Dt(x) * Dx(Y[1,1])) # same for matrix arr end + +@testset "Derivative of mod function" begin + f(x, y) = mod(x, y) + + @test isnan(Symbolics.derivative(mod, (4, 2), Val(1))) + @test Symbolics.derivative(mod, (5.0, 2.0), Val(1)) == FiniteDiff.finite_difference_derivative(x -> f(x, 2.0), 5.0) + + @test isnan(Symbolics.derivative(mod, (4, 2), Val(2))) + @test Symbolics.derivative(mod, (5.0, 2.0), Val(2)) == FiniteDiff.finite_difference_derivative(y -> f(5.0, y), 2.0) +end