Gradients
The supertype Gradient comprises different ways of taking gradients:
We first start by showing GradientAutodiff:
f(x::AbstractArray) = sum(x .^ 2)
x = rand(3)
grad = GradientAutodiff(f, x)GradientAutodiff{Float64, typeof(Main.f), ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}}(Main.f, ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}((Partials(1.0, 0.0, 0.0), Partials(0.0, 1.0, 0.0), Partials(0.0, 0.0, 1.0)), ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}[Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(6.9213122991648e-310,6.9213636645131e-310,6.9213122991656e-310,6.9213636645131e-310), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(6.9213122991664e-310,6.9213636645131e-310,6.9213122991672e-310,6.9213636645131e-310), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(6.9213518015701e-310,6.9213636645131e-310,6.9213518013045e-310,6.9213636645131e-310)]))Instead of calling GradientAutodiff(f, x) we can equivalently do:
grad = Gradient(f, x; mode = :autodiff)GradientAutodiff{Float64, typeof(Main.f), ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}}(Main.f, ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}((Partials(1.0, 0.0, 0.0), Partials(0.0, 1.0, 0.0), Partials(0.0, 0.0, 1.0)), ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}[Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(6.9213281431323e-310,6.92132814214495e-310,6.9213281412082e-310,6.92132814096947e-310), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(6.9213281407987e-310,6.92132814038212e-310,6.92132813995446e-310,6.92132813963273e-310), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(6.9213281394288e-310,6.9213281392027e-310,6.9213281371616e-310,6.9213281370051e-310)]))When calling an instance of Gradient we can use the functions gradient and gradient![1]:
gradient(x, grad)3-element Vector{Float64}:
1.042427591070766
1.1736135149066969
1.7817573961855622- 1Internally these functions call functors that are implemented for the individual
structs derived fromGradient, but for consistency (especially with regards toMultivariateObjectives) we recommend using the functionsgradientandgradient!.