Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

ChainRulesCore projection & ReverseDiff.TrackedArray

Aperta
#204 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
julia
Ambito
devtools

Direzione di ricerca

Inizia leggendo il dispatch di ProjectTo di ChainRulesCore e le definizioni di ReverseDiff.TrackedArray, quindi riproduci il comportamento mostrato di ProjectTo(ta) e ProjectTo(rand(3))(ta). Il lavoro è completato quando la proiezione di un TrackedArray ne preserva la forma di array tracciato invece di produrre un array di TrackedReal, mentre la proiezione degli array ordinari continua a funzionare.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

When using ReverseDiff over Zygote, its tracked arrays will often be turned into arrays of TrackedReal:

julia> using ReverseDiff, Zygote

julia> _, back = pullback(x -> cumsum(x .^ 3), rand(3))
([0.0417770851525806, 0.08898338554941161, 0.13448629430576223], Zygote.var"#52#53"{typeof(∂(#11))}(∂(#11)))

julia> ta = ReverseDiff.track([1,2,3.0]);

julia> back(ta)[1]
3-element Vector{ReverseDiff.TrackedReal{Float64, Float64, Nothing}}:
 TrackedReal<Ha5>(2.1671946936904316, 0.0, BcR, ---)
 TrackedReal<J2r>(1.9592562290038964, 0.0, BcR, ---)
 TrackedReal<5TB>(1.147101768209455, 0.0, BcR, ---)

The cause of this is that ChainRulesCore's projection mechanism looks at the eltype, and decides that it needs correcting:

julia> using ChainRulesCore

julia> pt = ProjectTo(ta)
ProjectTo{AbstractArray}(element = ProjectTo{Real}(), axes = (Base.OneTo(3),))

julia> pt(ta)  # this works fine, TrackedArray
3-element ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}:
 TrackedReal<EIm>(1.0, 0.0, BcR, 1, 96O)
 TrackedReal<I8K>(2.0, 0.0, BcR, 2, 96O)
 TrackedReal<9lo>(3.0, 0.0, BcR, 3, 96O)

julia> pr = ProjectTo(rand(3))
ProjectTo{AbstractArray}(element = ProjectTo{Float64}(), axes = (Base.OneTo(3),))

julia> pr(ta)  # makes a Vector{TrackedReal}
3-element Vector{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}}}:
 TrackedReal<KBA>(1.0, 0.0, BcR, 1, 96O)
 TrackedReal<29L>(2.0, 0.0, BcR, 2, 96O)
 TrackedReal<7oX>(3.0, 0.0, BcR, 3, 96O)

julia> map(pr.element, ta)  # this is what projection calls, as TrackedReal <: Float64 is false
3-element Vector{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}}}:
 TrackedReal<AQQ>(1.0, 0.0, BcR, 1, 96O)
 TrackedReal<5IS>(2.0, 0.0, BcR, 2, 96O)
 TrackedReal<2yC>(3.0, 0.0, BcR, 3, 96O)

I think this should probably be avoided, by adding methods to (::ProjectTo)(::TrackedArray) which bypass this behaviour. Since ReverseDiff already depends on CRC, no extra deps are required.

Lingua principale
Julia
Stelle
397
Fork
62
Merge medio
12h 50m
PR unite (30g)
8

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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di JuliaDiff/ReverseDiff.jl

Tutte le issue di JuliaDiff/ReverseDiff.jl

Issue simili

Altre issue su Julia

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.