diff --git a/Project.toml b/Project.toml index 30a618092..5df2a56ea 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ChainRulesCore" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.26.7" +version = "1.26.8" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" diff --git a/src/projection.jl b/src/projection.jl index ddc797bd5..2577dfa7b 100644 --- a/src/projection.jl +++ b/src/projection.jl @@ -339,7 +339,7 @@ function (project::ProjectTo{<:Tangent{<:Tuple}})(dx::Tuple) end # Here map will fail if the lengths don't match, but gives a much less helpful error: dy = map((f, x) -> f(x), project.elements, dx) - if all(d -> d isa AbstractZero, dy) + if dy isa Tuple{Vararg{AbstractZero}} return NoTangent() else return project_type(project)(dy...) @@ -392,7 +392,7 @@ function (project::ProjectTo{<:Tangent{<:Tuple}})(dx::AbstractArray) end dy = reshape(dx, axes(project.elements)) # allows for dx::OffsetArray dz = ntuple(i -> project.elements[i](dy[i]), length(project.elements)) - if all(d -> d isa AbstractZero, dy) + if dz isa Tuple{Vararg{AbstractZero}} return NoTangent() else return project_type(project)(dz...) diff --git a/test/projection.jl b/test/projection.jl index dee6ef146..e05541cae 100644 --- a/test/projection.jl +++ b/test/projection.jl @@ -173,6 +173,18 @@ struct NoSuperType end pt3 = ProjectTo(([1, 2, 3], false, :gamma)) # partly non-differentiable @test pt3((1:3, 4, 5)) == Tangent{Tuple{Vector{Int}, Bool, Symbol}}([1.0, 2.0, 3.0], NoTangent(), NoTangent()) @test ProjectTo((true, [false])) isa ProjectTo{NoTangent} + + pt2 = ProjectTo((1.0, 2.0)) + @test @inferred(pt2([3, 4])) == Tangent{Tuple{Float64,Float64}}(3.0, 4.0) + @test @inferred(pt2((ZeroTangent(), 1))) == + Tangent{Tuple{Float64,Float64}}(ZeroTangent(), 1.0) + @test @inferred(pt2((ZeroTangent(), NoTangent()))) === NoTangent() + @test pt2([ZeroTangent(), NoTangent()]) === NoTangent() + + ptb = ProjectTo((true, 1.0)) + @test @inferred(ptb((2.0, ZeroTangent()))) === NoTangent() + @test ptb(Any[2.0, ZeroTangent()]) === NoTangent() # collapse all-zero after projection + @test ptb([2.0, 3.0]) == Tangent{Tuple{Bool,Float64}}(NoTangent(), 3.0) end @testset "Base: NamedTuple" begin