diff --git a/src/lib/broadcast.jl b/src/lib/broadcast.jl index bcd0cbc35..300be6f8b 100644 --- a/src/lib/broadcast.jl +++ b/src/lib/broadcast.jl @@ -175,7 +175,7 @@ _dual_safearg(x) = false # Avoid generic broadcasting in two easy cases: if T == Bool return (f.(args...), _ -> nothing) - elseif T <: Real && isconcretetype(T) && _dual_purefun(F) && all(_dual_safearg, args) + elseif T <: Real && isconcretetype(T) && _dual_purefun(F) && all(_dual_safearg, args) && !isderiving() return broadcast_forward(f, args...) end len = inclen(args) diff --git a/test/features.jl b/test/features.jl index f3931464d..111be3759 100644 --- a/test/features.jl +++ b/test/features.jl @@ -551,4 +551,9 @@ end @test gradient((x,p) -> sum(x .^ p), [1.0,2.0,4.0], -1)[1] ≈ [-1.0, -0.25, -0.0625] @test gradient((x,p) -> sum(z -> z^p, x), [1.0,2.0,4.0], -1)[1] ≈ [-1.0, -0.25, -0.0625] @test gradient((x,p) -> mapreduce(z -> z^p, +, x), [1.0,2.0,4.0], -1)[1] ≈ [-1.0, -0.25, -0.0625] + + # second order + @test gradient(x -> sum(gradient(y -> sum(y.^2), x)[1]), [1, 2])[1] ≈ [2, 2] + @test gradient(x -> sum(gradient(y -> sum(sin.(y)), x)[1]), [1, 2])[1] ≈ [-0.8414709848078965, -0.9092974268256817] + @test gradient(x -> sum(abs, gradient(y -> sum(log.(2 .* exp.(y)) .^ 2), x)[1]), [1, 2])[1] ≈ [2,2] end