ForwardDiff problem: Cannot `convert` an object of type ForwardDiff.Dual{

question

#1

Hi,

I am really stuck for a while now, I cannot seem to use ForwardDiff to calculate second derivatives of a function. It works for the first derivative, but the same approach applied to the first derivative crashes with the error.

I am trying to pre-allocate storage, because this will be called millions of times. The non ! version of the jacobian on the non ! version of the function does work, but rather slow with 80GB of allocations overall.

I have also looked into TaylorSeries: the second derivative has to be function, i.e., the derivative needs to be calculated not just at a single point but anywhere, so I found this not applicable.

ERROR: LoadError: MethodError: Cannot `convert` an object of type ForwardDiff.Dual{ForwardDiff.Tag{dummy.##3#4{dummy.rhsConfig,Int64},Float64},Float64,4} to an object of type Float64
This may have arisen from a call to the constructor Float64(...),
since type constructors fall back to convert methods.

My code is

module dummy

using ForwardDiff

function rhs!(y, x, p)
    y[1] = x[2] 
    y[2] = -3*(1*x[1] + 2*x[3])^3 - 6*x[2] - x[1]*12
    y[3] = x[4]
    y[4] = -4*(1*x[1] + 2*x[3])^3 - 8*x[4] - x[3]*16
    return nothing
end

mutable struct rhsConfig
  y
  jac
  hess
  rhsConfig(n) = new(zeros(n), zeros(n,n), zeros(n*n, n))
end

function rhsJac!(res, z, conf::rhsConfig, p)
  ForwardDiff.jacobian!(res, (dy, z1) -> rhs!(dy, z1, p), conf.y, z)
  return nothing
end

function rhsHess!(res, z1, z2, conf::rhsConfig, p)
    ForwardDiff.jacobian!(res, (j, z) -> rhsJac!(j, z, conf, p), conf.jac, z1)
    return nothing
end

function testJac()
    p=0
    cf=rhsConfig(4)
    x=0.2*ones(4)
    jac=zeros(4,4)
    @time rhsJac!(jac, x, cf, p)
end

function testHess()
    p=0
    cf=rhsConfig(4)
    z1=0.2*ones(4)
    z2=0.2*ones(4)
    res=zeros(4*4,4)
    @time rhsHess!(res, z1, z2, cf, p)
end

testJac()
testJac()
testHess()
testHess()

end

Thanks…


#2

A solution to this is in the DiffEq FAQ:

http://docs.juliadiffeq.org/latest/basics/faq.html#I-get-Dual-number-errors-when-I-solve-my-ODE-with-Rosenbrock-or-SDIRK-methods…?-1

The real solution will be Capstan.jl.


#3

Hi Chris, this has been very helpful, looking forward to Capstan.jl and Casette.jl, both are very promising.