Error for Jacobian of in-place function that internally creates complex numbers
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
Direção de pesquisa
Reproduza o MWE de test/dynsys_types.jl e, em seguida, inspecione ForwardDiff/src/apiutils.jl e src/jacobian.jl nas proximidades da avaliação do Jacobiano em modo vetorial. Compare isso com a falha de conversão para números complexos mostrada no stack trace do Julia e determine o comportamento esperado para funções in-place que criam valores complexos. O trabalho estará concluído quando o comportamento estiver coberto por um regression test ou quando a limitação estiver claramente documentada.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Hi there,
MWE
newton_f(x, p) = x^p[1] - 1.0
newton_df(x, p)= p[1]*x^(p[1] - 1.0)
function newton_map(dz, z, p, n)
z1 = z[1] + im*z[2]
dz1 = newton_f(z1, p)/newton_df(z1, p)
z1 = z1 - dz1
dz[1] = real(z1)
dz[2] = imag(z1)
return
end
import ForwardDiff
s = [0.1, 0.2]
p = [3.0]
dum = deepcopy(s)
inplace_f_2args = (y, x) -> newton_map(y, x, p, 0)
cfg = ForwardDiff.JacobianConfig(inplace_f_2args, dum, s)
jac! = (J, u, p, t) -> ForwardDiff.jacobian!(
J, inplace_f_2args, dum, u, cfg, Val{false}()
)
jac!(zeros(2, 2), s, p, 0)
ERROR: LoadError: MethodError: no method matching Int64(::ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2})
Closest candidates are:
(::Type{T})(::T) where T<:Number at boot.jl:760
(::Type{T})(::AbstractChar) where T<:Union{AbstractChar, Number} at char.jl:50
(::Type{T})(::BigInt) where T<:Union{Int128, Int16, Int32, Int64, Int8} at gmp.jl:356
...
Stacktrace:
[1] convert(#unused#::Type{Int64}, x::ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2})
@ Base .\number.jl:7
[2] _cpow(z::Complex{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}, p::ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2})
@ Base .\complex.jl:740
[3] ^
@ .\complex.jl:809 [inlined]
[4] ^
@ .\complex.jl:824 [inlined]
[5] newton_f
@ c:\Users\datse\.julia\dev\DynamicalSystemsBase\test\dynsys_types.jl:111 [inlined]
[6] newton_map(dz::Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}, z::Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}, p::Vector{Float64},
n::Int64)
@ Main c:\Users\datse\.julia\dev\DynamicalSystemsBase\test\dynsys_types.jl:115
[7] (::var"#7#8")(y::Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}, x::Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}})
@ Main c:\Users\datse\.julia\dev\DynamicalSystemsBase\test\dynsys_types.jl:135
[8] vector_mode_dual_eval
@ C:\Users\datse\.julia\packages\ForwardDiff\QOqCN\src\apiutils.jl:44 [inlined]
[9] vector_mode_jacobian!(result::Matrix{Float64}, f!::var"#7#8", y::Vector{Float64}, x::Vector{Float64}, cfg::ForwardDiff.JacobianConfig{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}}})
@ ForwardDiff C:\Users\datse\.julia\packages\ForwardDiff\QOqCN\src\jacobian.jl:172
[10] jacobian!(result::Matrix{Float64}, f!::Function, y::Vector{Float64}, x::Vector{Float64}, cfg::ForwardDiff.JacobianConfig{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{var"#7#8", Float64}, Float64, 2}}}}, ::Val{false})
@ ForwardDiff C:\Users\datse\.julia\packages\ForwardDiff\QOqCN\src\jacobian.jl:78
I need to create the Jacobian in this format of (J, x, p, t), which is why all these anonymous functions got there. Making a function that does not internally make complex numbers works with the exact same syntax as above.
- Linguagem predominante
- Julia
- Estrelas
- 1k
- Forks
- 162
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de JuliaDiff/ForwardDiff.jl
-
missing floatmin, floatmax, and issubnormal for DualTalvez já em andamento @devmotion assumiu há 15 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
JuliaDiff/ForwardDiff.jl#852 · 6 comentários ·
-
`fma` and `muladd` ignore NaN-safe modeTalvez já em andamento @devmotion assumiu hoje. Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 55/100
JuliaDiff/ForwardDiff.jl#860 ·
-
Enable NaN-safe mode by defaultTalvez já em andamento @devmotion assumiu há 2 dias. Aberta
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
JuliaDiff/ForwardDiff.jl#857 · 1 reação ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 52/100
JuliaDiff/ForwardDiff.jl#854 · 1 comentário ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 75/100
JuliaDiff/ForwardDiff.jl#849 ·
Todas as issues de JuliaDiff/ForwardDiff.jl
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
SciML/OrdinaryDiffEq.jl#4875 ·
Mantenedores costumam responder em até 3 dias
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
SciML/NonlinearSolve.jl#1372 ·
Mantenedores costumam responder em até 1 dia
-
Truncated discrete ccdf and logccdf return incorrect values at the lower atomTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
JuliaStats/Distributions.jl#2095 ·
-
documentation 📜 microphysics💧 ❄️
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 63/100
NumericalEarth/Breeze.jl#1073 ·
Mantenedores costumam responder em até 1 dia