ForwardDiff.jl icon indicating copy to clipboard operation
ForwardDiff.jl copied to clipboard

FieldVectors

Open zsunberg opened this issue 7 years ago • 1 comments

Hi all,

We have a big codebase that uses FieldVectors from static arrays. It would be extremely powerful for us (and I'm sure many others in the future) to be able to do the following:

using StaticArrays
using ForwardDiff

struct Point{R<:Real} <: FieldVector{2,R}
    x::R
    y::R
end

StaticArrays.similar_type(p::Type{P}, ::Type{R}, size::Size{(2,)}) where {P<:Point, R<:Real} = Point{R}

f(p) = p.x
ForwardDiff.gradient(f, Point(2.0,3.0))

Currently this fails with ERROR: LoadError: type MArray has no field x because it's trying to evaluate f with an MArray of Duals.

This seems pretty easy to fix - maybe just writing a new version of dualize and adding a little more code where you have specialized things for SArray to also handle FieldVector. Do you think it is that simple? Should we take a crack at it, or do you foresee massive difficulties?

cc: @kylejbrown17 @maximebouton

zsunberg avatar Feb 18 '18 03:02 zsunberg

This seems pretty easy to fix - maybe just writing a new version of dualize and adding a little more code where you have specialized things for SArray to also handle FieldVector. Do you think it is that simple? Should we take a crack at it, or do you foresee massive difficulties?

Seems like a good idea!

If FieldVectors have similar indexing behavior to SVectors, you might even be able to just tweak the current SArray-specialized methods in order to achieve this (instead of adding new methods just for FieldVector).

jrevels avatar Feb 20 '18 13:02 jrevels