From a461ecaad88c36f0a2db4b6a1dde52c31e780dd6 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Wed, 17 Dec 2025 15:45:03 +0530 Subject: [PATCH 1/2] feat: allow non-numeric arguments with `AutoSymbolics` --- .../DifferentiationInterfaceSymbolicsExt.jl | 1 + .../test/Back/Symbolics/test.jl | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/DifferentiationInterface/ext/DifferentiationInterfaceSymbolicsExt/DifferentiationInterfaceSymbolicsExt.jl b/DifferentiationInterface/ext/DifferentiationInterfaceSymbolicsExt/DifferentiationInterfaceSymbolicsExt.jl index e34424d25..392f9ab05 100644 --- a/DifferentiationInterface/ext/DifferentiationInterfaceSymbolicsExt/DifferentiationInterfaceSymbolicsExt.jl +++ b/DifferentiationInterface/ext/DifferentiationInterfaceSymbolicsExt/DifferentiationInterfaceSymbolicsExt.jl @@ -26,6 +26,7 @@ dense_ad(backend::AutoSparse{<:AutoSymbolics}) = ADTypes.dense_ad(backend) variablize(::Number, name::Symbol) = variable(name) variablize(x::AbstractArray, name::Symbol) = variables(name, axes(x)...) +variablize(::T, name::Symbol) where {T} = variable(name; T) function variablize(contexts::NTuple{C, DI.Context}) where {C} return ntuple(Val(C)) do k diff --git a/DifferentiationInterface/test/Back/Symbolics/test.jl b/DifferentiationInterface/test/Back/Symbolics/test.jl index 076d113e8..414d6334c 100644 --- a/DifferentiationInterface/test/Back/Symbolics/test.jl +++ b/DifferentiationInterface/test/Back/Symbolics/test.jl @@ -41,3 +41,23 @@ test_differentiation( @test sparsity_pattern(jac!_prep) == Diagonal(trues(10)) @test sparsity_pattern(hess_prep) == Diagonal(trues(10)) end + +@testset "Non-numeric arguments" begin + function differentiate_me!(out, x, dummy) + @assert dummy isa Any # Just to use it somewhere + return copyto!(out, x) + end + function differentiate_me(x, dummy) + tmp = similar(x) + differentiate_me!(tmp, x, dummy) + return tmp + end + x = rand(10) + xbuffer = copy(x) + dummy = "DUMMY" + backend = AutoSymbolics() + jac_prep = prepare_jacobian(differentiate_me, backend, x, Constant(dummy)) + jac!_prep = prepare_jacobian(differentiate_me!, xbuffer, backend, x, Constant(dummy)) + @test jacobian(differentiate_me, jac_prep, backend, x, Constant(dummy)) ≈ I + @test jacobian(differentiate_me!, xbuffer, jac!_prep, backend, x, Constant(dummy)) ≈ I +end From d93a08e610582cc5589f68d730d51f42b9a1e685 Mon Sep 17 00:00:00 2001 From: Guillaume Dalle <22795598+gdalle@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:46:54 +0100 Subject: [PATCH 2/2] Replace dummy --- .../test/Back/Symbolics/test.jl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/DifferentiationInterface/test/Back/Symbolics/test.jl b/DifferentiationInterface/test/Back/Symbolics/test.jl index 414d6334c..5bcf9830a 100644 --- a/DifferentiationInterface/test/Back/Symbolics/test.jl +++ b/DifferentiationInterface/test/Back/Symbolics/test.jl @@ -43,21 +43,21 @@ test_differentiation( end @testset "Non-numeric arguments" begin - function differentiate_me!(out, x, dummy) - @assert dummy isa Any # Just to use it somewhere + function differentiate_me!(out, x, c) + @assert c isa Any # Just to use it somewhere return copyto!(out, x) end - function differentiate_me(x, dummy) + function differentiate_me(x, c) tmp = similar(x) - differentiate_me!(tmp, x, dummy) + differentiate_me!(tmp, x, c) return tmp end x = rand(10) xbuffer = copy(x) - dummy = "DUMMY" + c = "I am a string" backend = AutoSymbolics() - jac_prep = prepare_jacobian(differentiate_me, backend, x, Constant(dummy)) - jac!_prep = prepare_jacobian(differentiate_me!, xbuffer, backend, x, Constant(dummy)) - @test jacobian(differentiate_me, jac_prep, backend, x, Constant(dummy)) ≈ I - @test jacobian(differentiate_me!, xbuffer, jac!_prep, backend, x, Constant(dummy)) ≈ I + jac_prep = prepare_jacobian(differentiate_me, backend, x, Constant(c)) + jac!_prep = prepare_jacobian(differentiate_me!, xbuffer, backend, x, Constant(c)) + @test jacobian(differentiate_me, jac_prep, backend, x, Constant(c)) ≈ I + @test jacobian(differentiate_me!, xbuffer, jac!_prep, backend, x, Constant(c)) ≈ I end