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())' diff --git a/src/dual.jl b/src/dual.jl index 3b6e70a..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 @@ -264,7 +267,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) @@ -313,6 +316,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..92c1e0a 100644 --- a/test/automatic_differentiation_test.jl +++ b/test/automatic_differentiation_test.jl @@ -162,3 +162,12 @@ 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 + +@test value(3) == 3 +@test epsilon(44.0) ≈ 0.0