From 51db511500e16bbccdc441d73ed7341f1307e0af Mon Sep 17 00:00:00 2001 From: Zerui Ge Date: Sat, 7 Nov 2026 22:06:24 +0800 Subject: [PATCH 1/2] Restrict the sum forward rule to AbstractArray --- src/rulesets/Base/mapreduce.jl | 2 +- test/rulesets/Base/mapreduce.jl | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rulesets/Base/mapreduce.jl b/src/rulesets/Base/mapreduce.jl index e8b82b32b..e95cb8576 100644 --- a/src/rulesets/Base/mapreduce.jl +++ b/src/rulesets/Base/mapreduce.jl @@ -6,7 +6,7 @@ function frule((_, ẋ), ::typeof(sum), x::Tuple) return sum(x), sum(ẋ) end -function frule((_, ẋ), ::typeof(sum), x; dims=:) +function frule((_, ẋ), ::typeof(sum), x::AbstractArray; dims=:) return sum(x; dims=dims), sum(ẋ; dims=dims) end diff --git a/test/rulesets/Base/mapreduce.jl b/test/rulesets/Base/mapreduce.jl index 4175fae2d..3e956f802 100644 --- a/test/rulesets/Base/mapreduce.jl +++ b/test/rulesets/Base/mapreduce.jl @@ -5,6 +5,11 @@ Base.sum(xs::AbstractArray, weights::AbstractArray) = dot(xs, weights) struct SumRuleConfig <: RuleConfig{Union{HasReverseMode}} end @testset "Reductions" begin + @testset "sum(::Generator) falls back to AD" begin + xs = (x + 1.0 for x in 1:3) + @test frule((NoTangent(), ZeroTangent()), sum, xs) === nothing + end + @testset "sum(::Tuple)" begin test_frule(sum, Tuple(rand(5))) test_frule(sum, (rand(2), rand(2))) From aa64f7ea439d55ed0e5bf6100f43c0854e68ed82 Mon Sep 17 00:00:00 2001 From: Zerui Ge Date: Sat, 7 Nov 2026 22:12:46 +0800 Subject: [PATCH 2/2] Bump patch version for the sum rule fix --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 65c7177b9..277f12aeb 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ChainRules" uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" -version = "1.74.11" +version = "1.74.12" [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"