`frule` for `sum` doesn't work for `Generator`
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Riproduci il MWE con DiffractorForwardBackend e ispeziona ChainRules/src/rulesets/Base/mapreduce.jl, in particolare il frule per sum su Base.Generator. Verifica come vengono gestiti la tangente del generatore e la parola chiave dims, quindi verifica che la derivata funzioni senza eliminare il metodo; la modifica completata deve includere una copertura di regressione per questo caso.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
I think this is a ChainRules.jl problem, not a Diffractor.jl problem but I'm not 100% sure. Here's a MWE:
julia> using Diffractor: DiffractorForwardBackend; using AbstractDifferentiation: derivative, jacobian
julia> derivative(DiffractorForwardBackend(), x -> sum(x+i for i ∈ 1:100), 1.0)
ERROR: MethodError: no method matching mapfoldl(::typeof(identity), ::typeof(Base.add_sum), ::Base.Generator{UnitRange{Int64}, var"#7#9"{Float64}}; dims::Colon)
Closest candidates are:
mapfoldl(::Any, ::Any, ::Any; init) got unsupported keyword argument "dims"
@ Base reduce.jl:175
mapfoldl(::F, ::R, ::StaticArraysCore.StaticArray; init) where {F, R} got unsupported keyword argument "dims"
@ StaticArrays ~/.julia/packages/StaticArrays/eGKzB/src/mapreduce.jl:255
Stacktrace:
[1] kwerr(::@NamedTuple{dims::Colon}, ::Function, ::Function, ::Function, ::Base.Generator{UnitRange{Int64}, var"#7#9"{Float64}})
@ Base ./error.jl:165
[2] mapreduce(f::Function, op::Function, itr::Base.Generator{UnitRange{Int64}, var"#7#9"{Float64}}; kw::@Kwargs{dims::Colon})
@ Base ./reduce.jl:307
[3] sum(f::Function, a::Base.Generator{UnitRange{Int64}, var"#7#9"{Float64}}; kw::@Kwargs{dims::Colon})
@ Base ./reduce.jl:535
[4] sum(a::Base.Generator{UnitRange{Int64}, var"#7#9"{Float64}}; kw::@Kwargs{dims::Colon})
@ Base ./reduce.jl:564
[5] frule(::Tuple{…}, ::typeof(sum), x::Base.Generator{…}; dims::Function)
@ ChainRules ~/.julia/packages/ChainRules/pEOSw/src/rulesets/Base/mapreduce.jl:10
[6] frule(::Tuple{ChainRulesCore.ZeroTangent, ChainRulesCore.Tangent{…}}, ::typeof(sum), x::Base.Generator{UnitRange{…}, var"#7#9"{…}})
@ ChainRules ~/.julia/packages/ChainRules/pEOSw/src/rulesets/Base/mapreduce.jl:9
[7] (::Diffractor.∂☆internal{1})(::ZeroBundle{1, typeof(sum)}, ::Vararg{Diffractor.AbstractTangentBundle{1}})
@ Diffractor ~/.julia/packages/Diffractor/QY5lC/src/stage1/forward.jl:110
[8] (::Diffractor.∂☆{1})(::ZeroBundle{1, typeof(sum)}, ::Vararg{Diffractor.AbstractTangentBundle{1}})
@ Diffractor ~/.julia/packages/Diffractor/QY5lC/src/stage1/forward.jl:151
[9] #6
@ ./REPL[5]:1 [inlined]
[10] (::Diffractor.∂☆recurse{1})(::ZeroBundle{1, var"#6#8"}, ::Diffractor.TangentBundle{1, Float64, Diffractor.TaylorTangent{Tuple{Float64}}})
@ Diffractor ~/.julia/packages/Diffractor/QY5lC/src/stage1/recurse_fwd.jl:0
[11] (::Diffractor.∂☆internal{1})(::ZeroBundle{1, var"#6#8"}, ::Vararg{Diffractor.AbstractTangentBundle{1}})
@ Diffractor ~/.julia/packages/Diffractor/QY5lC/src/stage1/forward.jl:112
[12] (::Diffractor.∂☆{1})(::ZeroBundle{1, var"#6#8"}, ::Vararg{Diffractor.AbstractTangentBundle{1}})
@ Diffractor ~/.julia/packages/Diffractor/QY5lC/src/stage1/forward.jl:151
[13] (::Diffractor.var"#pushforward#369"{var"#6#8", Tuple{Float64}})(vs::Tuple{Float64})
@ Diffractor ~/.julia/packages/Diffractor/QY5lC/src/AbstractDifferentiation.jl:17
[14] jacobian(b::DiffractorForwardBackend, f::Function, args::Float64)
@ Diffractor ~/.julia/packages/AbstractDifferentiation/1Cavg/src/AbstractDifferentiation.jl:537
[15] derivative(ab::DiffractorForwardBackend, f::Function, xs::Float64)
@ AbstractDifferentiation ~/.julia/packages/AbstractDifferentiation/1Cavg/src/AbstractDifferentiation.jl:34
[16] top-level scope
@ REPL[5]:1
Some type information was truncated. Use `show(err)` to see complete types.
This appears to be caused by the frule definition here: https://github.com/JuliaDiff/ChainRules.jl/blob/main/src/rulesets/Base/mapreduce.jl#L9 which I believe may be a junk method, not only because of it assuming you can do dims=:, but also because it assumes that sum(ẋ; dims=dims) makes sense, but that appears to be incorrect since ẋ is going to be a Tangent so this sum isn't actually summing the contents of the Tangent, but rather giving the outer thing (could be misunderstanding though).
I tried adding methods like
function frule((_, ẋ), ::typeof(sum), x::Generator;)
return sum(x), sum(ẋ)
end
but that gave incorrect answers I think because of the sum(ẋ).
Instead, I found that if I just did Base.delete_method on the frule(::Tuple{…}, ::typeof(sum), x::Base.Generator{…}; dims::Function) method, I got the right results.
- Lingua principale
- Julia
- Stelle
- 475
- Fork
- 98
- 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/ChainRules.jl
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
JuliaDiff/ChainRules.jl#844 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 55/100
JuliaDiff/ChainRules.jl#818 ·
-
refactoring
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
JuliaDiff/ChainRules.jl#815 ·
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
JuliaDiff/ChainRules.jl#810 ·
-
stack overflow issueAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
JuliaDiff/ChainRules.jl#809 ·
Tutte le issue di JuliaDiff/ChainRules.jl
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
SciML/OrdinaryDiffEq.jl#4875 ·
I maintainer di solito rispondono entro 3 giorni
-
documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
SciML/NonlinearSolve.jl#1372 ·
I maintainer di solito rispondono entro 1 giorno
-
Truncated discrete ccdf and logccdf return incorrect values at the lower atomForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
JuliaStats/Distributions.jl#2095 ·
-
documentation 📜 microphysics💧 ❄️
Difficoltà 2/5 1-3 ore Idoneità per principianti 63/100
NumericalEarth/Breeze.jl#1073 ·
I maintainer di solito rispondono entro 1 giorno