Skip to content

Commit 85f439e

Browse files
authored
check for iszero(partials(x)) in pow (#592)
1 parent 61a7c5b commit 85f439e

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/dual.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ for f in (:(Base.:^), :(NaNMath.pow))
534534
begin
535535
v = value(x)
536536
expv = ($f)(v, y)
537-
if y == zero(y)
537+
if y == zero(y) || iszero(partials(x))
538538
new_partials = zero(partials(x))
539539
else
540540
new_partials = partials(x) * y * ($f)(v, y - 1)

test/DualTest.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ using DiffRules
1212
import Calculus
1313

1414
struct TestTag end
15+
struct OuterTestTag end
1516

1617
samerng() = MersenneTwister(1)
1718

@@ -26,6 +27,8 @@ dual_isapprox(a::Dual{T,T1,T2}, b::Dual{T3,T4,T5}) where {T,T1,T2,T3,T4,T5} = er
2627

2728
ForwardDiff.:(::Type{TestTag()}, ::Int) = true
2829
ForwardDiff.:(::Int, ::Type{TestTag()}) = false
30+
ForwardDiff.:(::Type{TestTag}, ::Type{OuterTestTag}) = true
31+
ForwardDiff.:(::Type{OuterTestTag}, ::Type{TestTag}) = false
2932

3033
for N in (0,3), M in (0,4), V in (Int, Float32)
3134
println(" ...testing Dual{TestTag(),$V,$N} and Dual{TestTag(),Dual{TestTag(),$V,$M},$N}")
@@ -574,6 +577,9 @@ end
574577
@test pow(x3, 2) === x3^2 === x3 * x3
575578
@test pow(x2, 1) === x2^1 === x2
576579
@test pow(x1, 0) === x1^0 === Dual{:t1}(1.0, 0.0)
580+
y = Dual{typeof(TestTag())}(1.0, 0.0, 1.0);
581+
x = Dual{typeof(OuterTestTag())}(0*y, 0*y);
582+
@test iszero(ForwardDiff.partials(ForwardDiff.partials(x^y)[1]))
577583
end
578584

579585
@testset "Type min/max" begin

0 commit comments

Comments
 (0)