jacobian(f, x) silently returns zeros if f is complex-valued
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 75/100
Direção de pesquisa
Comece lendo extract_jacobian!, extract_jacobian_chunk!, extract_derivative e valtype, concentrando-se em como os valores Complex{Dual} são tratados. Exercite o modo vetorial, o modo chunk e jacobian! com o reproducer da issue. A tarefa estará concluída quando funções com valores complexos produzirem uma matriz Jacobiana ComplexF64 correta, enquanto os caminhos com valores reais permanecerem inalterados.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
jacobian returns zeros, with Duals leaked into the eltype, instead of the Jacobian or an error:
julia> g(x) = [cis(x[1])*x[2], x[1] + 2im*x[2]];
julia> J = ForwardDiff.jacobian(g, [0.5, 1.0]);
julia> eltype(J)
Complex{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g), Float64}, Float64, 2}}
julia> all(iszero, J)
true
extract_jacobian! extracts with partials(T, ydual, i), which for a Complex{Dual} hits the partials(x, i...) = zero(x) fallback. derivative(f, x) is fine since it goes through extract_derivative, which handles Complex{<:Dual}.
extract_derivative cannot be reused directly because it hardcodes the partial index, while the Jacobian needs index i. But generalising it to an index is enough, and keeps the knowledge of how a complex number carries derivative information in one place:
@inline extract_partial(::Type{T}, y::Real, i) where {T} = zero(y)
@inline extract_partial(::Type{T}, y::Complex, i) where {T} = zero(y)
@inline extract_partial(::Type{T}, y::Dual, i) where {T} = partials(T, y, i)
@inline extract_partial(::Type{T}, y::Complex{<:Dual}, i) where {T} =
complex(partials(T, real(y), i), partials(T, imag(y), i))
extract_jacobian!/extract_jacobian_chunk! then use extract_partial(T, ·, i) instead of partials(T, ·, i), and the scalar extract_derivative methods become the i = 1 case.
One more piece is needed for the result eltype, since jacobian allocates similar(ydual, valtype(T, eltype(ydual)), ...):
@inline valtype(::Type{T}, ::Type{Complex{D}}) where {T,D} = Complex{valtype(T, D)}
With those, vector mode, chunk mode and jacobian! all give the correct ComplexF64 Jacobian and the real paths are unchanged.
If we would rather not support complex-valued f here, it should at least throw rather than return zeros.
- Linguagem predominante
- Julia
- Estrelas
- 1k
- Forks
- 165
- Merge médio
- 8d 22h
- PRs com merge (30d)
- 3
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á 36 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
JuliaDiff/ForwardDiff.jl#852 · 6 comentários ·
Mantenedores costumam responder em até 1 dia
-
`min` does not return the minimum with respect to `isless` when values tieTalvez já em andamento @devmotion assumiu há 10 dias. Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 55/100
JuliaDiff/ForwardDiff.jl#868 ·
Mantenedores costumam responder em até 1 dia
-
Enable NaN-safe mode by defaultTalvez já em andamento @devmotion assumiu há 23 dias. Aberta
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
JuliaDiff/ForwardDiff.jl#857 · 1 reação ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 52/100
JuliaDiff/ForwardDiff.jl#854 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 75/100
JuliaDiff/ForwardDiff.jl#849 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de JuliaDiff/ForwardDiff.jl
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
JuliaDiff/TaylorSeries.jl#445 ·
-
🕷️ bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
CliMA/ClimaSeaIce.jl#203 ·
Mantenedores costumam responder em até 3 dias
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
JuliaPhysics/BeamletOptics.jl#221 ·
Mantenedores costumam responder em até 1 dia
-
release preparation spack
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 67/100
Mantenedores costumam responder em até 1 dia
-
30-minutes algorithm any-language codewars dart easy elixir hackerrank hacktoberfest haskell help wanted interview-prep julia leetcode lua open-source r scala students zig
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Huerte/algo-solutions-python#163 ·
Mantenedores costumam responder em até 1 dia