Description
Hi @gdalle,
Awesome package, thanks for making it!
I am considering whether to use this as the backend interface of SymbolicRegression.jl to allow the user to pick an AD backend (current attempt). However, one thing I was wondering if you would consider is designating a mapping from Symbol
to the correct AbstractADType
? I could implement this within my package, but it seems like something that should live here for others as well.
Basically, I would prefer that my users do not need to install both Zygote.jl and DifferentiationInterface.jl (or ADTypes
) in their environment to set Zygote as the backend. I would rather they just pass, e.g., :Zygote
and then have my package, which depends on DifferentiationInterface.jl, be able to internally map to the right AbstractADType
.
Within DifferentiationInterface.jl this could look like:
function lookup_backend(key::Symbol)
return ADTYPE_MAP[key]
end
const ADTYPE_MAP = Dict{Symbol,AbstractADType}([
:Zygote => AutoZygote(),
:Enzyme => AutoEnzyme(),
:ForwardDiff => AutoForwardDiff(),
])
Then within my package, I can have my Options
constructor look like this:
using DifferentiationInterface: lookup_backend, AbstractADType
function Options(autodiff_backend::Union{AbstractADType,Symbol})
backend = autodiff_backend isa Symbol ? lookup_backend(autodiff_backend) : autodiff_backend
return Options{typeof(backend)}(backend)
end
which means the user has a more lightweight interface; they can just pass the symbol:
using SymbolicRegression, Zygote
options = Options(:Zygote)
And then I map to the right type internally.
I guess I could also re-export all the abstract types but it feels a bit overkill. That would also mean I would be unable to provide helpful error messages if they forget the name of the backend and pass in the wrong symbol.
What do you think?
Cheers,
Miles