Stream: helpdesk (published)

Topic: ForwardDiff mutates the input variable?


view this post on Zulip reumle (Oct 16 2021 at 17:09):

Hi i am a beginner with autodiff packages. In a test function, one input variable is a Dict with an x and a y component. x type is changed by running the function through ForwardDiff or ReverseDiff.

is this expected? Is there documentation on this?

1) function / to be differentiated

function dfweight(dict,x_inp)
    dict[:x] = x_inp
    df1 =DataFrame(x = [1,2,3], y = 4:6, z = 9)
    aa= sum(df1.x .* dict[:x])
    return sum(aa)
end

2) REPL log.

julia> xloc = [2; 3; 7]
3-element Vector{Int64}:
 2
 3
 7

julia> dic=Dict(:x =>[6;2;3], :y=>0.5)
Dict{Symbol, Any} with 2 entries:
  :y => 0.5
  :x => [6, 2, 3]

julia> dfweight(dic,xloc) # --> 29
29

julia> ForwardDiff.gradient(x -> dfweight(dic, x),xloc)
3-element Vector{Int64}:
 1
 2
 3

julia> dic
Dict{Symbol, Any} with 2 entries:
  :y => 0.5
  :x => ForwardDiff.Dual{ForwardDiff.Tag{var"#165#166", Int64}, Int64, 3}[Dual{ForwardD…

view this post on Zulip Michael Abbott (Oct 16 2021 at 19:19):

Yes this is expected. Passing numbers of a weird type through your function is precisely how ForwardDiff works:

julia> id(x) = @show x;

julia> ForwardDiff.derivative(id, 5)
x = Dual{ForwardDiff.Tag{typeof(id), Int64}}(5,1)
1

julia> ForwardDiff.gradient(xs -> sum(abs2  id, xs), [7,11,13])
x = Dual{ForwardDiff.Tag{var"#9#10", Int64}}(7,1,0,0)
x = Dual{ForwardDiff.Tag{var"#9#10", Int64}}(11,0,1,0)
x = Dual{ForwardDiff.Tag{var"#9#10", Int64}}(13,0,0,1)
3-element Vector{Int64}:
 14
 22
 26

There's a bit of description here: https://juliadiff.org/ForwardDiff.jl/latest/dev/how_it_works.html . There's a longer description here: https://github.com/MikeInnes/diff-zoo

view this post on Zulip j-fu (Oct 16 2021 at 20:54):

see also this discussion on zulip: https://julialang.zulipchat.com/#narrow/stream/225542-helpdesk/topic/Comparing.20julia.20and.20numpy/near/209135246

view this post on Zulip reumle (Oct 17 2021 at 09:17):

Thank you Michael, j-fu!


Last updated: Oct 02 2023 at 04:34 UTC