# Derivative with Zygote/ForwardDiff of a function of multiple vectors wrt a subset of arguments

**URL:** https://discourse.julialang.org/t/derivative-with-zygote-forwarddiff-of-a-function-of-multiple-vectors-wrt-a-subset-of-arguments/59560
**Category:** Machine Learning
**Tags:** zygote
**Created:** [April 18, 2021, 7:52pm UTC](https://discourse.julialang.org/t/derivative-with-zygote-forwarddiff-of-a-function-of-multiple-vectors-wrt-a-subset-of-arguments/59560 "2021-04-18T19:52:59Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)
#### Post date: [April 18, 2021, 7:52pm UTC](https://discourse.julialang.org/t/derivative-with-zygote-forwarddiff-of-a-function-of-multiple-vectors-wrt-a-subset-of-arguments/59560/1 "2021-04-18T19:52:59Z")

</div>

I can differentiate a function of one vector, but not multiple vectors

```julia
using ForwardDiff, Zygote
f(x) = 3.0*x[1] + 5.0*x[2]^2.0
fpF(x) = ForwardDiff.gradient(f,x)
fpZ(x) = Zygote.forward_jacobian(f,x)[2] 
#
xx = 2.0*ones(2)
f(xx) # 26.0
fpF(xx) # [3.0;20.0]
fpZ(xx) # [3.0;20.0]

#Multiple vectors as args
g(x,y) = 3.0*x[1]*y[1] + 5.0*x[2]^2.0
gpF(x,y) = ForwardDiff.gradient(g,x)
gpZ(x,y) = Zygote.forward_jacobian(g,x)[2] 
#
xx = 2.0*ones(2)
yy = 2.0*ones(1)
g(xx,yy) #32.0

julia> gpF(xx,yy)
ERROR: MethodError: no method matching g(::Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2}})
Closest candidates are:
  g(::Any, ::Any) at REPL[251]:1
Stacktrace:
 [1] vector_mode_dual_eval(f::typeof(g), x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2}}})
   @ ForwardDiff ~\.julia\packages\ForwardDiff\QOqCN\src\apiutils.jl:37
 [2] vector_mode_gradient(f::typeof(g), x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2}}})
   @ ForwardDiff ~\.julia\packages\ForwardDiff\QOqCN\src\gradient.jl:106
 [3] gradient(f::Function, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2}}}, ::Val{true})
   @ ForwardDiff ~\.julia\packages\ForwardDiff\QOqCN\src\gradient.jl:19
 [4] gradient(f::Function, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2}}}) (repeats 2 times)
   @ ForwardDiff ~\.julia\packages\ForwardDiff\QOqCN\src\gradient.jl:17
 [5] gpF(x::Vector{Float64}, y::Vector{Float64})
   @ Main .\REPL[252]:1
 [6] top-level scope
   @ REPL[261]:1

julia> gpZ(xx,yy)
ERROR: MethodError: no method matching g(::Vector{ForwardDiff.Dual{Nothing, Float64, 2}})
Closest candidates are:
  g(::Any, ::Any) at REPL[251]:1
Stacktrace:
 [1] forward_jacobian(f::typeof(g), x::Vector{Float64}, #unused#::Val{2})
   @ Zygote ~\.julia\packages\Zygote\RxTZu\src\lib\forward.jl:23
 [2] forward_jacobian(f::Function, x::Vector{Float64})
   @ Zygote ~\.julia\packages\Zygote\RxTZu\src\lib\forward.jl:38
 [3] gpZ(x::Vector{Float64}, y::Vector{Float64})
   @ Main .\REPL[253]:1
 [4] top-level scope
   @ REPL[262]:1

```

---

<div class="post-metadata">

### Author: ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)
#### Post date: [April 21, 2021, 7:48pm UTC](https://discourse.julialang.org/t/derivative-with-zygote-forwarddiff-of-a-function-of-multiple-vectors-wrt-a-subset-of-arguments/59560/2 "2021-04-21T19:48:53Z")

</div>

@dhairyagandhi96 solved this:

```julia
Zygote.jacobian(g, xx, yy)

```
