From 2e127531b61ae6677a83126e037d87aaac6a1d91 Mon Sep 17 00:00:00 2001 From: savaliyabhargav Date: Tue, 1 Apr 2025 17:03:18 +0530 Subject: [PATCH 1/6] Fix incorrect code generated for Symbolics.build_function(Symbolics.derivative(mod(x), x)) --- Project.toml | 7 +++++-- src/diff.jl | 3 +++ test/diff.jl | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 8dbf03446..20e78df71 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Symbolics" uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" authors = ["Shashi Gowda "] -version = "6.34" +version = "6.34.0" [deps] ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" @@ -68,6 +68,7 @@ Distributions = "0.25" DocStringExtensions = "0.9" DomainSets = "0.6, 0.7" DynamicPolynomials = "0.5, 0.6" +FiniteDiff = "2" ForwardDiff = "0.10.36" Groebner = "0.8.2, 0.9" LaTeXStrings = "1.3" @@ -96,10 +97,12 @@ SymbolicUtils = "3.24" TermInterface = "2" julia = "1.10" + [extras] 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 +116,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..b9b23cea6 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,24 @@ 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 + @test isnan(derivative(mod, (4, 2), Val(1))) + @test derivative(mod, (5, 2), Val(1)) == 1 + + @test isnan(derivative(mod, (4, 2), Val(2))) + @test derivative(mod, (5, 2), Val(2)) == -floor(5 / 2) +end + + + +@testset "Derivative of mod function" begin + f(x, y) = mod(x, y) + + @test isnan(derivative(mod, (4, 2), Val(1))) + @test derivative(mod, (5, 2), Val(1)) == FiniteDiff.finite_difference_derivative(x -> f(x, 2), 5) + + + @test isnan(derivative(mod, (4, 2), Val(2))) + @test derivative(mod, (5, 2), Val(2)) == FiniteDiff.finite_difference_derivative(y -> f(5, y), 2) +end \ No newline at end of file From 8bdfbede6f7219c8c6b145ec6b80d956d9341852 Mon Sep 17 00:00:00 2001 From: savaliyabhargav Date: Tue, 1 Apr 2025 17:12:05 +0530 Subject: [PATCH 2/6] Fix incorrect code generated for Symbolics.build_function(Symbolics.derivative(mod(x), x)) --- test/diff.jl | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/diff.jl b/test/diff.jl index b9b23cea6..1b7763941 100644 --- a/test/diff.jl +++ b/test/diff.jl @@ -606,16 +606,6 @@ let @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 - @test isnan(derivative(mod, (4, 2), Val(1))) - @test derivative(mod, (5, 2), Val(1)) == 1 - - @test isnan(derivative(mod, (4, 2), Val(2))) - @test derivative(mod, (5, 2), Val(2)) == -floor(5 / 2) -end - - - @testset "Derivative of mod function" begin f(x, y) = mod(x, y) From c75e804dff5783a49885e43042f963b81cc63a53 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Tue, 1 Apr 2025 17:21:37 +0530 Subject: [PATCH 3/6] Update Project.toml --- Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Project.toml b/Project.toml index 677014520..372985616 100644 --- a/Project.toml +++ b/Project.toml @@ -97,7 +97,6 @@ SymbolicUtils = "3.24" TermInterface = "2" julia = "1.10" - [extras] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" From fb019bc0e5be9fc93c71b74cd7211b9422e4d5ca Mon Sep 17 00:00:00 2001 From: savaliyabhargav Date: Tue, 1 Apr 2025 19:40:13 +0530 Subject: [PATCH 4/6] Fix incorrect code generated for Symbolics.build_function(Symbolics.derivative(mod(x), x)) --- test/diff.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/diff.jl b/test/diff.jl index 1b7763941..aeac2e95a 100644 --- a/test/diff.jl +++ b/test/diff.jl @@ -609,10 +609,10 @@ end @testset "Derivative of mod function" begin f(x, y) = mod(x, y) - @test isnan(derivative(mod, (4, 2), Val(1))) - @test derivative(mod, (5, 2), Val(1)) == FiniteDiff.finite_difference_derivative(x -> f(x, 2), 5) + @test isnan(Symbolics.derivative(mod, (4, 2), Val(1))) + @test Symbolics.derivative(mod, (5, 2), Val(1)) == FiniteDiff.finite_difference_derivative(x -> f(x, 2), 5) - @test isnan(derivative(mod, (4, 2), Val(2))) - @test derivative(mod, (5, 2), Val(2)) == FiniteDiff.finite_difference_derivative(y -> f(5, y), 2) + @test isnan(Symbolics.derivative(mod, (4, 2), Val(2))) + @test Symbolics.derivative(mod, (5, 2), Val(2)) == FiniteDiff.finite_difference_derivative(y -> f(5, y), 2) end \ No newline at end of file From d8c668fafa63d7e9eb1e5c18afb590e1df6266a2 Mon Sep 17 00:00:00 2001 From: bhargav mukeshbhai savaliya <73011177+savaliyabhargav@users.noreply.github.com> Date: Sat, 5 Apr 2025 12:18:58 +0530 Subject: [PATCH 5/6] Update diff.jl --- test/diff.jl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/diff.jl b/test/diff.jl index aeac2e95a..1288d106f 100644 --- a/test/diff.jl +++ b/test/diff.jl @@ -609,10 +609,9 @@ 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, 2), Val(1)) == FiniteDiff.finite_difference_derivative(x -> f(x, 2), 5) + @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, 2), Val(2)) == FiniteDiff.finite_difference_derivative(y -> f(5, y), 2) -end \ No newline at end of file + @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 From 358cfb61d1ad0099c4ade80536d000bea3daf372 Mon Sep 17 00:00:00 2001 From: bhargav mukeshbhai savaliya <73011177+savaliyabhargav@users.noreply.github.com> Date: Sat, 5 Apr 2025 12:28:07 +0530 Subject: [PATCH 6/6] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 372985616..4df6346eb 100644 --- a/Project.toml +++ b/Project.toml @@ -69,7 +69,7 @@ DocStringExtensions = "0.9" DomainSets = "0.6, 0.7" DynamicPolynomials = "0.5, 0.6" FiniteDiff = "2" -ForwardDiff = "0.10.36" +ForwardDiff = "0.10.36, 1" Groebner = "0.8.2, 0.9" LaTeXStrings = "1.3" LambertW = "1.0.0"