Error differentiating through complex power due to isinteger
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 38/100
Direzione di ricerca
Inizia riproducendo la MWE fornita con valori ForwardDiff.Dual e leggi l’implementazione di _cpow nel complex.jl di Julia, in particolare il controllo isinteger e la successiva conversione in Int. Determina il trattamento atteso delle parziali di Dual e verifica che la differenziazione delle potenze complesse venga completata senza il segnalato InexactError.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
I have a weird case where a complex power is giving me an inexact error because the _cpow helper function determines my object to be an integer.
Truncated error message:
julia> ForwardDiff.gradient(test_func, ptest)
ERROR: InexactError: Int(Int64, Dual{ForwardDiff.Tag{typeof(test_func), Float64}}(1.0,-0.0,-0.8333333333333333,-0.0,-0.0,-0.17599538919114094))
Stacktrace:
[1] Int64
@ ~/.julia/packages/ForwardDiff/QdStj/src/dual.jl:364 [inlined]
[2] convert(#unused#::Type{Int64}, x::ForwardDiff.Dual{ForwardDiff.Tag{typeof(test_func), Float64}, Float64, 5})
@ Base ./number.jl:7
[3] _cpow(z::Complex{ForwardDiff.Dual{ForwardDiff.Tag{typeof(test_func), Float64}, Float64, 5}}, p::ForwardDiff.Dual{ForwardDiff.Tag{typeof(test_func), Float64}, Float64, 5})
@ Base ./complex.jl:782
[4] ^
@ ./complex.jl:851 [inlined]
[5] ^
@ ./complex.jl:866 [inlined]
So given that
julia> typeof(test_func)
typeof(test_func) (singleton type of function test_func, subtype of Function)
It seems that we can get the following MWE:
julia> isinteger(Dual{ForwardDiff.Tag{Function, Float64}}(1.0,-0.0,-0.8333333333333333,-0.0,-0.0,-0.17599538919114094))
true
This is the associated culprit line in complex.jl that tries to do this conversion to Int (only the relevant part is shown):
# _cpow helper function to avoid method ambiguity with ^(::Complex,::Real)
function _cpow(z::Union{T,Complex{T}}, p::Union{T,Complex{T}}) where T
z = float(z)
p = float(p)
Tf = float(T)
if isreal(p)
pᵣ = real(p)
if isinteger(pᵣ) && abs(pᵣ) < typemax(Int32)
# |p| < typemax(Int32) serves two purposes: it prevents overflow
# when converting p to Int, and it also turns out to be roughly
# the crossover point for exp(p*log(z)) or similar to be faster.
if iszero(pᵣ) # fix signs of imaginary part for z^0
zer = flipsign(copysign(zero(Tf),pᵣ), imag(z))
return Complex(one(Tf), zer)
end
ip = convert(Int, pᵣ) # <--- HERE!
Admittedly, I am not sure if the partials should be considered for determining if it's an integer or not.
- Lingua principale
- Julia
- Stelle
- 1k
- Fork
- 162
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di JuliaDiff/ForwardDiff.jl
-
missing floatmin, floatmax, and issubnormal for DualForse già presa @devmotion l’ha presa 17 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
JuliaDiff/ForwardDiff.jl#852 · 6 commenti ·
-
`fma` and `muladd` ignore NaN-safe modeForse già presa @devmotion l’ha presa 3 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
JuliaDiff/ForwardDiff.jl#860 ·
-
Enable NaN-safe mode by defaultForse già presa @devmotion l’ha presa 5 giorni fa. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
JuliaDiff/ForwardDiff.jl#857 · 1 reazione ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
JuliaDiff/ForwardDiff.jl#854 · 1 commento ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 75/100
JuliaDiff/ForwardDiff.jl#849 ·
Tutte le issue di JuliaDiff/ForwardDiff.jl
Issue simili
-
R_to_gamma and R_to_v are wrong for |Z| != 1 (e.g. heavy ions)Forse già presa @DavidSagan l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
bmad-sim/BeamTracking.jl#366 ·
I maintainer di solito rispondono entro 1 giorno
-
TSDAE's docstring implies a theta argument it does not takeForse già presa @singhharsh1708 l’ha presa oggi. Apertadocumentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 74/100
SciML/PETScDiffEq.jl#282 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement good first issue help wanted
Difficoltà 2/5 Mezza giornata Idoneità per principianti 82/100
-
SavedSubsystem with an integer save_idxs maps the index the wrong way roundForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
SciML/SciMLBase.jl#1643 ·
I maintainer di solito rispondono entro 2 giorni
-
authority-vechtstromen ready-for-agent
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
Deltares/Ribasim-NL#890 ·
I maintainer di solito rispondono entro 1 giorno