diff --git a/Project.toml b/Project.toml index 277f12aeb..faf9a412c 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ChainRules" uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" -version = "1.74.12" +version = "1.74.13" [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 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..e3a9f1e1d 100644 --- a/test/rulesets/Base/mapreduce.jl +++ b/test/rulesets/Base/mapreduce.jl @@ -5,6 +5,18 @@ Base.sum(xs::AbstractArray, weights::AbstractArray) = dot(xs, weights) struct SumRuleConfig <: RuleConfig{Union{HasReverseMode}} end @testset "Reductions" begin + @testset "sum falls back to AD for unsupported inputs" begin + xs = (x + 1.0 for x in 1:3) + dxs = Tangent{typeof(xs)}(f=NoTangent(), iter=NoTangent()) + @test frule((NoTangent(), dxs), sum, xs) === nothing + + @test frule((NoTangent(), 1.0), sum, 2.0) === nothing + + nt = (a=1.0, b=2.0) + dnt = Tangent{typeof(nt)}(a=1.0, b=2.0) + @test frule((NoTangent(), dnt), sum, nt) === nothing + end + @testset "sum(::Tuple)" begin test_frule(sum, Tuple(rand(5))) test_frule(sum, (rand(2), rand(2)))