From 68300766107b80504527a388e674d368d38072f0 Mon Sep 17 00:00:00 2001 From: Alex Arslan Date: Mon, 15 Oct 2018 14:07:52 -0700 Subject: [PATCH 1/4] Extend Base.inv This fixes a MethodError observed in Nabla. It seems to have been an oversight. --- src/dual.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dual.jl b/src/dual.jl index 3b6e70a..ed9ab05 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -264,7 +264,7 @@ Base.:^(z::Dual, n::Number) = Dual(value(z)^n, epsilon(z)*n*value(z)^(n-1)) NaNMath.pow(z::Dual, n::Number) = Dual(NaNMath.pow(value(z),n), epsilon(z)*n*NaNMath.pow(value(z),n-1)) NaNMath.pow(z::Number, w::Dual) = Dual(NaNMath.pow(z,value(w)), epsilon(w)*NaNMath.pow(z,value(w))*log(z)) -inv(z::Dual) = dual(inv(value(z)),-epsilon(z)/value(z)^2) +Base.inv(z::Dual) = dual(inv(value(z)),-epsilon(z)/value(z)^2) # force use of NaNMath functions in derivative calculations function to_nanmath(x::Expr) From 542cfbed072964678f32be7c0adbe199b8e1711c Mon Sep 17 00:00:00 2001 From: Will Tebbutt Date: Mon, 15 Oct 2018 14:25:19 -0700 Subject: [PATCH 2/4] Implement exp10 for Dual Upstreamed from https://github.com/invenia/Nabla.jl/pull/102 --- src/dual.jl | 2 ++ test/automatic_differentiation_test.jl | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/dual.jl b/src/dual.jl index ed9ab05..b87f64c 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -313,6 +313,8 @@ end Base.exp(z::Dual) = (expval = exp(value(z)); Dual(expval, epsilon(z)*expval)) Base.cis(z::Dual) = (cisval = cis(value(z)); Dual(cisval, im*epsilon(z)*cisval)) +Base.exp10(x::Dual) = (y = exp10(value(x)); Dual(y, y * log(10) * epsilon(x))) + ## TODO: should be generated in Calculus Base.sinpi(z::Dual) = Dual(sinpi(value(z)),epsilon(z)*cospi(value(z))*π) Base.cospi(z::Dual) = Dual(cospi(value(z)),-epsilon(z)*sinpi(value(z))*π) diff --git a/test/automatic_differentiation_test.jl b/test/automatic_differentiation_test.jl index 8013891..e1f68c4 100644 --- a/test/automatic_differentiation_test.jl +++ b/test/automatic_differentiation_test.jl @@ -162,3 +162,9 @@ flipsign(-1.0,Dual(1.0,1.0)) == -1.0 # test SpecialFunctions @test erf(dual(1.0,1.0)) == dual(erf(1.0), 2exp(-1.0^2)/sqrt(π)) @test gamma(dual(1.,1)) == dual(gamma(1.0),polygamma(0,1.0)) + + +let x = exp10(Dual(2, 0.01)) + @test value(x) ≈ 100.0 + @test epsilon(x) ≈ log(10) +end From 89468057f7072873aa25cbcb2e17096ee3fc7e3b Mon Sep 17 00:00:00 2001 From: Will Tebbutt Date: Mon, 15 Oct 2018 14:30:06 -0700 Subject: [PATCH 3/4] Extend value and epsilon to work on non-Duals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ɛ component is 0 for all non-dual numbers, and the value is equal to itself. --- src/dual.jl | 3 +++ test/automatic_differentiation_test.jl | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/dual.jl b/src/dual.jl index b87f64c..653e559 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -31,6 +31,9 @@ Base.widen(::Type{Dual{T}}) where {T} = Dual{widen(T)} value(z::Dual) = z.value epsilon(z::Dual) = z.epsilon +value(x::Number) = x +epsilon(x::Number) = zero(typeof(x)) + dual(x::ReComp, y::ReComp) = Dual(x, y) dual(x::ReComp) = Dual(x) dual(z::Dual) = z diff --git a/test/automatic_differentiation_test.jl b/test/automatic_differentiation_test.jl index e1f68c4..92c1e0a 100644 --- a/test/automatic_differentiation_test.jl +++ b/test/automatic_differentiation_test.jl @@ -168,3 +168,6 @@ let x = exp10(Dual(2, 0.01)) @test value(x) ≈ 100.0 @test epsilon(x) ≈ log(10) end + +@test value(3) == 3 +@test epsilon(44.0) ≈ 0.0 From 36715a9c37f4483afc032b00111c50f92bf17e71 Mon Sep 17 00:00:00 2001 From: Alex Arslan Date: Mon, 15 Oct 2018 14:34:31 -0700 Subject: [PATCH 4/4] 0.7-compatible coverage submission from Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3dafe8c..c6d246d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,4 +16,4 @@ git: # - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi # - julia -e 'Pkg.clone(pwd()); Pkg.build("DualNumbers"); Pkg.test("DualNumbers"; coverage=true)' after_success: - - julia -e 'cd(Pkg.dir("DualNumbers")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' + - julia -e 'using Pkg; Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())'