@@ -11,11 +11,13 @@ _GetDeriv(ADmode::Val{:Zygote}; kwargs...) = throw("GetDeriv() not available for
11
11
_GetGrad (ADmode:: Val{:Zygote} ; order:: Int = - 1 , kwargs... ) = (Func:: Function ,p;Kwargs... ) -> Zygote. gradient (Func, p; kwargs... )[1 ]
12
12
_GetJac (ADmode:: Val{:Zygote} ; order:: Int = - 1 , kwargs... ) = (Func:: Function ,p;Kwargs... ) -> Zygote. jacobian (Func, p; kwargs... )[1 ]
13
13
_GetHess (ADmode:: Val{:Zygote} ; order:: Int = - 1 , kwargs... ) = (Func:: Function ,p;Kwargs... ) -> Zygote. hessian (Func, p; kwargs... )
14
+ _GetDoubleJac (ADmode:: Val{:Zygote} ; kwargs... ) = throw (" GetDoubleJac() not available for Zygote.jl" ) # Zygote does not support mutating arrays
14
15
15
16
_GetDeriv (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_derivative
16
17
_GetGrad (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_gradient
17
18
_GetJac (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_jacobian
18
19
_GetHess (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_hessian
20
+ _GetDoubleJac (ADmode:: Val{:FiniteDiff} ; kwargs... ) = throw (" GetDoubleJac() not available for FiniteDiff.jl" )
19
21
20
22
_GetDeriv (ADmode:: Val{:FiniteDifferences} ; kwargs... ) = throw (" GetDeriv() not available for FiniteDifferences.jl" )
21
23
_GetGrad (ADmode:: Val{:FiniteDifferences} ; order:: Int = 3 , kwargs... ) = (Func:: Function ,p;Kwargs... ) -> FiniteDifferences. grad (central_fdm (order,1 ), Func, p; kwargs... )[1 ]
@@ -33,7 +35,18 @@ _GetMatrixJac!(ADmode::Val{:ReverseDiff}; kwargs...) = _GetJac!(ADmode; kwargs..
33
35
34
36
# _GetDeriv!(ADmode::Val{:FiniteDiff}; kwargs...) = FiniteDiff.finite_difference_derivative!
35
37
_GetGrad! (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_gradient!
36
- _GetJac! (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_jacobian!
38
+ function _GetJac! (ADmode:: Val{:FiniteDiff} ; kwargs... )
39
+ function FiniteDiff__finite_difference_jacobian! (Y:: AbstractArray{<:Number} , F:: Function , X, args... ; kwargs... )
40
+ # in-place FiniteDiff operators assume that function itself is also in-place
41
+ if MaximalNumberOfArguments (F) > 1
42
+ FiniteDiff. finite_difference_jacobian! (Y, F, X, args... ; kwargs... )
43
+ else
44
+ # Use fake method
45
+ (Y[:] .= vec (_GetJac (ADmode; kwargs... )(F, X, args... )))
46
+ # FiniteDiff.finite_difference_jacobian!(Y, (Res,x)->copyto!(Res,F(x)), args...; kwargs...)
47
+ end
48
+ end
49
+ end
37
50
_GetHess! (ADmode:: Val{:FiniteDiff} ; kwargs... ) = FiniteDiff. finite_difference_hessian!
38
51
_GetMatrixJac! (ADmode:: Val{:FiniteDiff} ; kwargs... ) = _GetJac! (ADmode; kwargs... )
39
52
0 commit comments