From fc42df1991126014b2fac710112e4049e4c0172d Mon Sep 17 00:00:00 2001 From: Miha Zgubic Date: Fri, 23 Jul 2021 12:33:57 +0200 Subject: [PATCH 1/6] add test for Float(::Dual) --- test/DualTest.jl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/DualTest.jl b/test/DualTest.jl index 285fe3ab..7bdcc94f 100644 --- a/test/DualTest.jl +++ b/test/DualTest.jl @@ -517,6 +517,13 @@ end @test length(UnitRange(Dual(1.5), Dual(3.5))) == 3 @test length(UnitRange(Dual(1.5,1), Dual(3.5,3))) == 3 end + +@testset "Float" begin + x = Dual(1.0, 0) + for F in (Float16, Float32, Float64) + @test F(1.0) == F(x) + end +end if VERSION >= v"1.6.0-rc1" @testset "@printf" begin From 3ff0b2d0e4376d4997fb3ce71e2d02436b00079c Mon Sep 17 00:00:00 2001 From: Miha Zgubic Date: Fri, 23 Jul 2021 12:34:08 +0200 Subject: [PATCH 2/6] implement Flaot(:Dual) --- src/dual.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dual.jl b/src/dual.jl index 81745f07..6ffc4001 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -314,6 +314,10 @@ end Integer(value(d)) end +for F in (:Float16, :Float32, :Float64) + @eval @inline Base.$F(d::Dual) = $F(value(d)) +end + @inline Random.rand(rng::AbstractRNG, d::Dual) = rand(rng, value(d)) @inline Random.rand(::Type{Dual{T,V,N}}) where {T,V,N} = Dual{T}(rand(V), zero(Partials{N,V})) @inline Random.rand(rng::AbstractRNG, ::Type{Dual{T,V,N}}) where {T,V,N} = Dual{T}(rand(rng, V), zero(Partials{N,V})) From ae94b0295178d8504ea07eb1bfef314c30ccfd80 Mon Sep 17 00:00:00 2001 From: Miha Zgubic Date: Fri, 23 Jul 2021 12:34:14 +0200 Subject: [PATCH 3/6] bump version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index edfb55d9..d2bc4d2a 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ForwardDiff" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.19" +version = "0.10.20" [deps] CommonSubexpressions = "bbf7d656-a473-5ed7-a52c-81e309532950" From 1f5e4fa558bef970139cdab8fdc6afa7355c6607 Mon Sep 17 00:00:00 2001 From: Lyndon White Date: Mon, 26 Jul 2021 19:53:29 +0100 Subject: [PATCH 4/6] Float(Dual(x,y)) == Dual(Float(x), Float(y)) --- src/dual.jl | 2 +- test/DualTest.jl | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/dual.jl b/src/dual.jl index 6ffc4001..9f5cc1e7 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -315,7 +315,7 @@ end end for F in (:Float16, :Float32, :Float64) - @eval @inline Base.$F(d::Dual) = $F(value(d)) + @eval @inline Base.$F(d::Dual{T,V,N}) where {T,V,N} = convert(Dual{T,promote_type(V, $F),N}, d) end @inline Random.rand(rng::AbstractRNG, d::Dual) = rand(rng, value(d)) diff --git a/test/DualTest.jl b/test/DualTest.jl index 7bdcc94f..365a399c 100644 --- a/test/DualTest.jl +++ b/test/DualTest.jl @@ -519,9 +519,8 @@ end end @testset "Float" begin - x = Dual(1.0, 0) for F in (Float16, Float32, Float64) - @test F(1.0) == F(x) + @test F(Dual(3, 5)) == Dual(F(3), F(5)) end end From 3ca3fc93f636060c7d16e576b12847c3db48ccfd Mon Sep 17 00:00:00 2001 From: Lyndon White Date: Mon, 26 Jul 2021 22:37:30 +0100 Subject: [PATCH 5/6] move to be with other floating operations --- src/dual.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dual.jl b/src/dual.jl index 9f5cc1e7..15499020 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -314,10 +314,6 @@ end Integer(value(d)) end -for F in (:Float16, :Float32, :Float64) - @eval @inline Base.$F(d::Dual{T,V,N}) where {T,V,N} = convert(Dual{T,promote_type(V, $F),N}, d) -end - @inline Random.rand(rng::AbstractRNG, d::Dual) = rand(rng, value(d)) @inline Random.rand(::Type{Dual{T,V,N}}) where {T,V,N} = Dual{T}(rand(V), zero(Partials{N,V})) @inline Random.rand(rng::AbstractRNG, ::Type{Dual{T,V,N}}) where {T,V,N} = Dual{T}(rand(rng, V), zero(Partials{N,V})) @@ -387,6 +383,10 @@ Base.convert(::Type{D}, d::D) where {D<:Dual} = d Base.float(d::Dual{T,V,N}) where {T,V,N} = convert(Dual{T,promote_type(V, Float16),N}, d) Base.AbstractFloat(d::Dual{T,V,N}) where {T,V,N} = convert(Dual{T,promote_type(V, Float16),N}, d) +for F in (:Float16, :Float32, :Float64) + @eval @inline Base.$F(d::Dual{T,V,N}) where {T,V,N} = convert(Dual{T,promote_type(V, $F),N}, d) +end + ################################### # General Mathematical Operations # ################################### From c5102fafe42b6b4c1bbf803c9ad00f94d691272c Mon Sep 17 00:00:00 2001 From: Lyndon White Date: Mon, 26 Jul 2021 22:37:45 +0100 Subject: [PATCH 6/6] Add Function that we could not take derivative of before but can now --- test/DerivativeTest.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/DerivativeTest.jl b/test/DerivativeTest.jl index f5645a7e..c309cded 100644 --- a/test/DerivativeTest.jl +++ b/test/DerivativeTest.jl @@ -100,4 +100,8 @@ end @test_throws DimensionMismatch ForwardDiff.derivative(sum, fill(2pi, 3)) end +@testset "function that calls a floating point constructor" begin + @test ForwardDiff.derivative(x->2*Float32(x), 3) === 2f0 +end + end # module