Julia 与::getfield()相关的ForwardDiff.jl和ReverseDiff.jl错误消息

Julia 与::getfield()相关的ForwardDiff.jl和ReverseDiff.jl错误消息,julia,mathematical-optimization,gradient-descent,automatic-differentiation,Julia,Mathematical Optimization,Gradient Descent,Automatic Differentiation,我试图使用ForwardDiff.jl和/或ReverseDiff.jl库来计算优化问题中的梯度 这两个包都给了我一条与::getfield()相关的错误消息 ReverseDiff给了我一个LoadError: MethodError: no method matching (::getfield(CalibrationModule, Symbol("#f#4")) {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}})

我试图使用ForwardDiff.jl和/或ReverseDiff.jl库来计算优化问题中的梯度

这两个包都给了我一条与::getfield()相关的错误消息

ReverseDiff给了我一个LoadError:

 MethodError: no method matching (::getfield(CalibrationModule, Symbol("#f#4"))
 {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}})
 (::ReverseDiff.TrackedArray{Float64,Float64,1,Array{Float64,1},Array{Float64,1}})
 MethodError: no method matching (::getfield(CalibrationModule, Symbol("#f#10"))
 {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}})
 (::Array{ForwardDiff.Dual{ForwardDiff.Tag{getfield(CalibrationModule,
 Symbol("#f#10"))     
 {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}},Float64},Float64,6},1})
ForwardDiff给了我一个LoadError:

 MethodError: no method matching (::getfield(CalibrationModule, Symbol("#f#4"))
 {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}})
 (::ReverseDiff.TrackedArray{Float64,Float64,1,Array{Float64,1},Array{Float64,1}})
 MethodError: no method matching (::getfield(CalibrationModule, Symbol("#f#10"))
 {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}})
 (::Array{ForwardDiff.Dual{ForwardDiff.Tag{getfield(CalibrationModule,
 Symbol("#f#10"))     
 {AlgorithmParameters,ModelParameters,Guess,Array{Float64,1}},Float64},Float64,6},1})

我不知道如何理解这个错误消息。我的代码太复杂,无法在这里发布,但据我所知,我没有使用任何不是用Julia编写的库。我确实在整个过程中广泛使用自定义数据类型(可变结构),但我不明白为什么这会导致问题…

从Julia,MethodError:no method matching在没有与您调用的方法具有匹配类型签名的方法时抛出。Julia有一个动态类型系统,但允许在值不是预期类型时引发异常的类型注释。由于您广泛使用自定义数据类型,因此可能会将自定义数据类型的值传递给ForwardDiff/ReverseDiff中的一个方法,该方法需要一个不同的类型-如果没有看到代码,很难确认,但这就是我要开始查找的地方。

MethodError:如果没有与您正在调用的方法具有匹配类型签名的方法,则不会抛出与之匹配的方法。Julia有一个动态类型系统,但允许在值不是预期类型时引发异常的类型注释。由于您广泛使用自定义数据类型,因此可能会将自定义数据类型的值传递给ForwardDiff/ReverseDiff中的一个方法,该方法需要一个不同的类型-如果没有代码,很难确认,但这就是我要开始查找的地方。

如果没有代码,确实很难说,但是:

类似于
(::getfield(CalibrationModule,Symbol(…){…}(…)的打印输出
是Julia显示匿名函数和闭包的方式。您会收到一个方法错误,即此匿名函数或闭包不支持使用带有
跟踪
数字的
数组
的签名。您可能有以下函数:

function main()
    ...
    f(A::Array{Float64}) = # ... some closure
    ...
    f(...)
end
但是ForwardDiff和ReverseDiff都需要使用双编号或跟踪编号运行程序,而这些编号不是
Float64
。因此,您得到了一个方法错误,即名为
f
的闭包不接受这些双编号或跟踪编号的数组


f
闭包的特殊性降低到它所能支持的最广泛的东西,可能类似于
f(A::AbstractArray{没有代码很难说,但是:

类似于
(::getfield(CalibrationModule,Symbol(…){…}(…)的打印输出
是Julia显示匿名函数和闭包的方式。您会收到一个方法错误,即此匿名函数或闭包不支持使用带有
跟踪
数字的
数组
的签名。您可能有以下函数:

function main()
    ...
    f(A::Array{Float64}) = # ... some closure
    ...
    f(...)
end
但是ForwardDiff和ReverseDiff都需要使用双编号或跟踪编号运行程序,而这些编号不是
Float64
。因此,您得到了一个方法错误,即名为
f
的闭包不接受这些双编号或跟踪编号的数组

f
闭包的特殊性降低到它所能支持的最广泛的东西,可能类似于
f(A::AbstractArray){