diff --git a/test/DualTest.jl b/test/DualTest.jl index bd50c37c..b64094ea 100644 --- a/test/DualTest.jl +++ b/test/DualTest.jl @@ -25,8 +25,8 @@ dual_isapprox(a, b) = isapprox(a, b) dual_isapprox(a::Dual{T,T1,T2}, b::Dual{T,T3,T4}) where {T,T1,T2,T3,T4} = isapprox(value(a), value(b)) && isapprox(partials(a), partials(b)) dual_isapprox(a::Dual{T,T1,T2}, b::Dual{T3,T4,T5}) where {T,T1,T2,T3,T4,T5} = error("Tags don't match") -ForwardDiff.:≺(::Type{TestTag()}, ::Int) = true -ForwardDiff.:≺(::Int, ::Type{TestTag()}) = false +ForwardDiff.:≺(::Type{TestTag}, ::Int) = true +ForwardDiff.:≺(::Int, ::Type{TestTag}) = false ForwardDiff.:≺(::Type{TestTag}, ::Type{OuterTestTag}) = true ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @@ -34,15 +34,15 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false PARTIALS = Partials{N,V}(ntuple(n -> intrand(V), N)) PRIMAL = intrand(V) - FDNUM = Dual{TestTag()}(PRIMAL, PARTIALS) + FDNUM = Dual{TestTag}(PRIMAL, PARTIALS) PARTIALS2 = Partials{N,V}(ntuple(n -> intrand(V), N)) PRIMAL2 = intrand(V) - FDNUM2 = Dual{TestTag()}(PRIMAL2, PARTIALS2) + FDNUM2 = Dual{TestTag}(PRIMAL2, PARTIALS2) PARTIALS3 = Partials{N,V}(ntuple(n -> intrand(V), N)) PRIMAL3 = intrand(V) - FDNUM3 = Dual{TestTag()}(PRIMAL3, PARTIALS3) + FDNUM3 = Dual{TestTag}(PRIMAL3, PARTIALS3) if !allunique([PRIMAL, PRIMAL2, PRIMAL3]) @info "testing with non-unique primals" PRIMAL PRIMAL2 PRIMAL3 @@ -52,25 +52,25 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false end M_PARTIALS = Partials{M,V}(ntuple(m -> intrand(V), M)) - NESTED_PARTIALS = convert(Partials{N,Dual{TestTag(),V,M}}, PARTIALS) - NESTED_FDNUM = Dual{TestTag()}(Dual{TestTag()}(PRIMAL, M_PARTIALS), NESTED_PARTIALS) + NESTED_PARTIALS = convert(Partials{N,Dual{TestTag,V,M}}, PARTIALS) + NESTED_FDNUM = Dual{TestTag}(Dual{TestTag}(PRIMAL, M_PARTIALS), NESTED_PARTIALS) M_PARTIALS2 = Partials{M,V}(ntuple(m -> intrand(V), M)) - NESTED_PARTIALS2 = convert(Partials{N,Dual{TestTag(),V,M}}, PARTIALS2) - NESTED_FDNUM2 = Dual{TestTag()}(Dual{TestTag()}(PRIMAL2, M_PARTIALS2), NESTED_PARTIALS2) + NESTED_PARTIALS2 = convert(Partials{N,Dual{TestTag,V,M}}, PARTIALS2) + NESTED_FDNUM2 = Dual{TestTag}(Dual{TestTag}(PRIMAL2, M_PARTIALS2), NESTED_PARTIALS2) ################ # Constructors # ################ - @test Dual{TestTag()}(PRIMAL, PARTIALS...) === FDNUM + @test Dual{TestTag}(PRIMAL, PARTIALS...) === FDNUM @test Dual(PRIMAL, PARTIALS...) === Dual{Nothing}(PRIMAL, PARTIALS...) @test Dual(PRIMAL) === Dual{Nothing}(PRIMAL) - @test typeof(Dual{TestTag()}(widen(V)(PRIMAL), PARTIALS)) === Dual{TestTag(),widen(V),N} - @test typeof(Dual{TestTag()}(widen(V)(PRIMAL), PARTIALS.values)) === Dual{TestTag(),widen(V),N} - @test typeof(Dual{TestTag()}(widen(V)(PRIMAL), PARTIALS...)) === Dual{TestTag(),widen(V),N} - @test typeof(NESTED_FDNUM) == Dual{TestTag(),Dual{TestTag(),V,M},N} + @test typeof(Dual{TestTag}(widen(V)(PRIMAL), PARTIALS)) === Dual{TestTag,widen(V),N} + @test typeof(Dual{TestTag}(widen(V)(PRIMAL), PARTIALS.values)) === Dual{TestTag,widen(V),N} + @test typeof(Dual{TestTag}(widen(V)(PRIMAL), PARTIALS...)) === Dual{TestTag,widen(V),N} + @test typeof(NESTED_FDNUM) == Dual{TestTag,Dual{TestTag,V,M},N} ############# # Accessors # @@ -78,7 +78,7 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test value(PRIMAL) == PRIMAL @test value(FDNUM) == PRIMAL - @test value(NESTED_FDNUM) === Dual{TestTag()}(PRIMAL, M_PARTIALS) + @test value(NESTED_FDNUM) === Dual{TestTag}(PRIMAL, M_PARTIALS) @test partials(PRIMAL) == Partials{0,V}(tuple()) @test partials(FDNUM) == PARTIALS @@ -98,8 +98,8 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test ForwardDiff.valtype(FDNUM) == V @test ForwardDiff.valtype(typeof(FDNUM)) == V - @test ForwardDiff.valtype(NESTED_FDNUM) == Dual{TestTag(),V,M} - @test ForwardDiff.valtype(typeof(NESTED_FDNUM)) == Dual{TestTag(),V,M} + @test ForwardDiff.valtype(NESTED_FDNUM) == Dual{TestTag,V,M} + @test ForwardDiff.valtype(typeof(NESTED_FDNUM)) == Dual{TestTag,V,M} ##################### # Generic Functions # @@ -180,7 +180,7 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test div(NESTED_FDNUM, NESTED_FDNUM2, RoundUp) === div(PRIMAL, PRIMAL2, RoundUp) @test Base.rtoldefault(typeof(FDNUM)) ≡ Base.rtoldefault(typeof(PRIMAL)) - @test Dual{TestTag()}(PRIMAL-eps(V), PARTIALS) ≈ FDNUM + @test Dual{TestTag}(PRIMAL-eps(V), PARTIALS) ≈ FDNUM @test Base.rtoldefault(typeof(NESTED_FDNUM)) ≡ Base.rtoldefault(typeof(PRIMAL)) end @@ -203,28 +203,28 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test read(TMPIO, typeof(NESTED_FDNUM)) === NESTED_FDNUM close(TMPIO) - @test zero(FDNUM) === Dual{TestTag()}(zero(PRIMAL), zero(PARTIALS)) - @test zero(typeof(FDNUM)) === Dual{TestTag()}(zero(V), zero(Partials{N,V})) - @test zero(NESTED_FDNUM) === Dual{TestTag()}(Dual{TestTag()}(zero(PRIMAL), zero(M_PARTIALS)), zero(NESTED_PARTIALS)) - @test zero(typeof(NESTED_FDNUM)) === Dual{TestTag()}(Dual{TestTag()}(zero(V), zero(Partials{M,V})), zero(Partials{N,Dual{TestTag(),V,M}})) + @test zero(FDNUM) === Dual{TestTag}(zero(PRIMAL), zero(PARTIALS)) + @test zero(typeof(FDNUM)) === Dual{TestTag}(zero(V), zero(Partials{N,V})) + @test zero(NESTED_FDNUM) === Dual{TestTag}(Dual{TestTag}(zero(PRIMAL), zero(M_PARTIALS)), zero(NESTED_PARTIALS)) + @test zero(typeof(NESTED_FDNUM)) === Dual{TestTag}(Dual{TestTag}(zero(V), zero(Partials{M,V})), zero(Partials{N,Dual{TestTag,V,M}})) - @test one(FDNUM) === Dual{TestTag()}(one(PRIMAL), zero(PARTIALS)) - @test one(typeof(FDNUM)) === Dual{TestTag()}(one(V), zero(Partials{N,V})) - @test one(NESTED_FDNUM) === Dual{TestTag()}(Dual{TestTag()}(one(PRIMAL), zero(M_PARTIALS)), zero(NESTED_PARTIALS)) - @test one(typeof(NESTED_FDNUM)) === Dual{TestTag()}(Dual{TestTag()}(one(V), zero(Partials{M,V})), zero(Partials{N,Dual{TestTag(),V,M}})) + @test one(FDNUM) === Dual{TestTag}(one(PRIMAL), zero(PARTIALS)) + @test one(typeof(FDNUM)) === Dual{TestTag}(one(V), zero(Partials{N,V})) + @test one(NESTED_FDNUM) === Dual{TestTag}(Dual{TestTag}(one(PRIMAL), zero(M_PARTIALS)), zero(NESTED_PARTIALS)) + @test one(typeof(NESTED_FDNUM)) === Dual{TestTag}(Dual{TestTag}(one(V), zero(Partials{M,V})), zero(Partials{N,Dual{TestTag,V,M}})) if V <: Integer @test rand(samerng(), FDNUM) == rand(samerng(), value(FDNUM)) @test rand(samerng(), NESTED_FDNUM) == rand(samerng(), value(NESTED_FDNUM)) elseif V <: AbstractFloat - @test rand(samerng(), typeof(FDNUM)) === Dual{TestTag()}(rand(samerng(), V), zero(Partials{N,V})) - @test rand(samerng(), typeof(NESTED_FDNUM)) === Dual{TestTag()}(Dual{TestTag()}(rand(samerng(), V), zero(Partials{M,V})), zero(Partials{N,Dual{TestTag(),V,M}})) - @test randn(samerng(), typeof(FDNUM)) === Dual{TestTag()}(randn(samerng(), V), zero(Partials{N,V})) - @test randn(samerng(), typeof(NESTED_FDNUM)) === Dual{TestTag()}(Dual{TestTag()}(randn(samerng(), V), zero(Partials{M,V})), - zero(Partials{N,Dual{TestTag(),V,M}})) - @test randexp(samerng(), typeof(FDNUM)) === Dual{TestTag()}(randexp(samerng(), V), zero(Partials{N,V})) - @test randexp(samerng(), typeof(NESTED_FDNUM)) === Dual{TestTag()}(Dual{TestTag()}(randexp(samerng(), V), zero(Partials{M,V})), - zero(Partials{N,Dual{TestTag(),V,M}})) + @test rand(samerng(), typeof(FDNUM)) === Dual{TestTag}(rand(samerng(), V), zero(Partials{N,V})) + @test rand(samerng(), typeof(NESTED_FDNUM)) === Dual{TestTag}(Dual{TestTag}(rand(samerng(), V), zero(Partials{M,V})), zero(Partials{N,Dual{TestTag,V,M}})) + @test randn(samerng(), typeof(FDNUM)) === Dual{TestTag}(randn(samerng(), V), zero(Partials{N,V})) + @test randn(samerng(), typeof(NESTED_FDNUM)) === Dual{TestTag}(Dual{TestTag}(randn(samerng(), V), zero(Partials{M,V})), + zero(Partials{N,Dual{TestTag,V,M}})) + @test randexp(samerng(), typeof(FDNUM)) === Dual{TestTag}(randexp(samerng(), V), zero(Partials{N,V})) + @test randexp(samerng(), typeof(NESTED_FDNUM)) === Dual{TestTag}(Dual{TestTag}(randexp(samerng(), V), zero(Partials{M,V})), + zero(Partials{N,Dual{TestTag,V,M}})) end # Predicates # @@ -238,17 +238,17 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test ForwardDiff.isconstant(one(NESTED_FDNUM)) @test ForwardDiff.isconstant(NESTED_FDNUM) == (N == 0) - # Recall that FDNUM = Dual{TestTag()}(PRIMAL, PARTIALS) has N partials, + # Recall that FDNUM = Dual{TestTag}(PRIMAL, PARTIALS) has N partials, # and FDNUM2 has everything with a 2, and all random numbers nonzero. # M is the length of M_PARTIALS, which affects: - # NESTED_FDNUM = Dual{TestTag()}(Dual{TestTag()}(PRIMAL, M_PARTIALS), NESTED_PARTIALS) + # NESTED_FDNUM = Dual{TestTag}(Dual{TestTag}(PRIMAL, M_PARTIALS), NESTED_PARTIALS) - @test (FDNUM == Dual{TestTag()}(PRIMAL, PARTIALS2)) == (PARTIALS == PARTIALS2) - @test isequal(FDNUM, Dual{TestTag()}(PRIMAL, PARTIALS2)) == (PARTIALS == PARTIALS2) - @test isequal(NESTED_FDNUM, Dual{TestTag()}(Dual{TestTag()}(PRIMAL, M_PARTIALS2), NESTED_PARTIALS2)) == ((M_PARTIALS == M_PARTIALS2) && (NESTED_PARTIALS == NESTED_PARTIALS2)) + @test (FDNUM == Dual{TestTag}(PRIMAL, PARTIALS2)) == (PARTIALS == PARTIALS2) + @test isequal(FDNUM, Dual{TestTag}(PRIMAL, PARTIALS2)) == (PARTIALS == PARTIALS2) + @test isequal(NESTED_FDNUM, Dual{TestTag}(Dual{TestTag}(PRIMAL, M_PARTIALS2), NESTED_PARTIALS2)) == ((M_PARTIALS == M_PARTIALS2) && (NESTED_PARTIALS == NESTED_PARTIALS2)) if PRIMAL == PRIMAL2 - @test isequal(FDNUM, Dual{TestTag()}(PRIMAL, PARTIALS2)) == (PARTIALS == PARTIALS2) + @test isequal(FDNUM, Dual{TestTag}(PRIMAL, PARTIALS2)) == (PARTIALS == PARTIALS2) @test isequal(FDNUM, FDNUM2) == (PARTIALS == PARTIALS2) @test (FDNUM == FDNUM2) == (PARTIALS == PARTIALS2) @@ -260,94 +260,94 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test NESTED_FDNUM != NESTED_FDNUM2 end - @test isless(Dual{TestTag()}(1, PARTIALS), Dual{TestTag()}(2, PARTIALS2)) - @test isless(Dual{TestTag()}(1, PARTIALS), Dual{TestTag()}(1, PARTIALS2)) === isless(PARTIALS, PARTIALS2) - @test !(isless(Dual{TestTag()}(1, PARTIALS), Dual{TestTag()}(1, PARTIALS))) - @test !(isless(Dual{TestTag()}(2, PARTIALS), Dual{TestTag()}(1, PARTIALS2))) - - @test isless(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS2), NESTED_PARTIALS2)) - @test isless(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS2)) === isless(NESTED_PARTIALS, NESTED_PARTIALS2) - @test !(isless(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS))) - @test !(isless(Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS2), NESTED_PARTIALS2))) - - @test Dual{TestTag()}(1, PARTIALS) < Dual{TestTag()}(2, PARTIALS2) - @test (Dual{TestTag()}(1, PARTIALS) < Dual{TestTag()}(1, PARTIALS2)) === (PARTIALS < PARTIALS2) - @test !(Dual{TestTag()}(1, PARTIALS) < Dual{TestTag()}(1, PARTIALS)) - @test !(Dual{TestTag()}(2, PARTIALS) < Dual{TestTag()}(1, PARTIALS2)) - - @test Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS2), NESTED_PARTIALS2) - @test (Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS < NESTED_PARTIALS2) - @test !(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS)) - @test !(Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS2), NESTED_PARTIALS2)) - - @test Dual{TestTag()}(1, PARTIALS) <= Dual{TestTag()}(2, PARTIALS2) - @test (Dual{TestTag()}(1, PARTIALS) <= Dual{TestTag()}(1, PARTIALS2)) === (PARTIALS <= PARTIALS2) - @test Dual{TestTag()}(1, PARTIALS) <= Dual{TestTag()}(1, PARTIALS) - @test !(Dual{TestTag()}(2, PARTIALS) <= Dual{TestTag()}(1, PARTIALS2)) - - @test Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS2), NESTED_PARTIALS2) - @test (Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS <= NESTED_PARTIALS2) - @test Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) - @test !(Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS2), NESTED_PARTIALS2)) - - @test Dual{TestTag()}(2, PARTIALS) > Dual{TestTag()}(1, PARTIALS2) - @test (Dual{TestTag()}(1, PARTIALS) > Dual{TestTag()}(1, PARTIALS2)) === (PARTIALS > PARTIALS2) - @test !(Dual{TestTag()}(1, PARTIALS) > Dual{TestTag()}(1, PARTIALS)) - @test !(Dual{TestTag()}(1, PARTIALS) > Dual{TestTag()}(2, PARTIALS2)) - - @test Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS2), NESTED_PARTIALS2) - @test (Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS > NESTED_PARTIALS2) - @test !(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS)) - @test !(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS2), NESTED_PARTIALS2)) - - @test Dual{TestTag()}(2, PARTIALS) >= Dual{TestTag()}(1, PARTIALS2) - @test (Dual{TestTag()}(1, PARTIALS) >= Dual{TestTag()}(1, PARTIALS2)) === (PARTIALS >= PARTIALS2) - @test Dual{TestTag()}(1, PARTIALS) >= Dual{TestTag()}(1, PARTIALS) - @test !(Dual{TestTag()}(1, PARTIALS) >= Dual{TestTag()}(2, PARTIALS2)) - - @test Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS2), NESTED_PARTIALS2) - @test (Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS >= NESTED_PARTIALS2) - @test Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) - @test !(Dual{TestTag()}(Dual{TestTag()}(1, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag()}(Dual{TestTag()}(2, M_PARTIALS2), NESTED_PARTIALS2)) - - @test isnan(Dual{TestTag()}(NaN, PARTIALS)) + @test isless(Dual{TestTag}(1, PARTIALS), Dual{TestTag}(2, PARTIALS2)) + @test isless(Dual{TestTag}(1, PARTIALS), Dual{TestTag}(1, PARTIALS2)) === isless(PARTIALS, PARTIALS2) + @test !(isless(Dual{TestTag}(1, PARTIALS), Dual{TestTag}(1, PARTIALS))) + @test !(isless(Dual{TestTag}(2, PARTIALS), Dual{TestTag}(1, PARTIALS2))) + + @test isless(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS2), NESTED_PARTIALS2)) + @test isless(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS2)) === isless(NESTED_PARTIALS, NESTED_PARTIALS2) + @test !(isless(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS))) + @test !(isless(Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS), NESTED_PARTIALS), Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS2), NESTED_PARTIALS2))) + + @test Dual{TestTag}(1, PARTIALS) < Dual{TestTag}(2, PARTIALS2) + @test (Dual{TestTag}(1, PARTIALS) < Dual{TestTag}(1, PARTIALS2)) === (PARTIALS < PARTIALS2) + @test !(Dual{TestTag}(1, PARTIALS) < Dual{TestTag}(1, PARTIALS)) + @test !(Dual{TestTag}(2, PARTIALS) < Dual{TestTag}(1, PARTIALS2)) + + @test Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS2), NESTED_PARTIALS2) + @test (Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS < NESTED_PARTIALS2) + @test !(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS)) + @test !(Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS), NESTED_PARTIALS) < Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS2), NESTED_PARTIALS2)) + + @test Dual{TestTag}(1, PARTIALS) <= Dual{TestTag}(2, PARTIALS2) + @test (Dual{TestTag}(1, PARTIALS) <= Dual{TestTag}(1, PARTIALS2)) === (PARTIALS <= PARTIALS2) + @test Dual{TestTag}(1, PARTIALS) <= Dual{TestTag}(1, PARTIALS) + @test !(Dual{TestTag}(2, PARTIALS) <= Dual{TestTag}(1, PARTIALS2)) + + @test Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS2), NESTED_PARTIALS2) + @test (Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS <= NESTED_PARTIALS2) + @test Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) + @test !(Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS), NESTED_PARTIALS) <= Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS2), NESTED_PARTIALS2)) + + @test Dual{TestTag}(2, PARTIALS) > Dual{TestTag}(1, PARTIALS2) + @test (Dual{TestTag}(1, PARTIALS) > Dual{TestTag}(1, PARTIALS2)) === (PARTIALS > PARTIALS2) + @test !(Dual{TestTag}(1, PARTIALS) > Dual{TestTag}(1, PARTIALS)) + @test !(Dual{TestTag}(1, PARTIALS) > Dual{TestTag}(2, PARTIALS2)) + + @test Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS2), NESTED_PARTIALS2) + @test (Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS > NESTED_PARTIALS2) + @test !(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS)) + @test !(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) > Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS2), NESTED_PARTIALS2)) + + @test Dual{TestTag}(2, PARTIALS) >= Dual{TestTag}(1, PARTIALS2) + @test (Dual{TestTag}(1, PARTIALS) >= Dual{TestTag}(1, PARTIALS2)) === (PARTIALS >= PARTIALS2) + @test Dual{TestTag}(1, PARTIALS) >= Dual{TestTag}(1, PARTIALS) + @test !(Dual{TestTag}(1, PARTIALS) >= Dual{TestTag}(2, PARTIALS2)) + + @test Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS2), NESTED_PARTIALS2) + @test (Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS2)) === (NESTED_PARTIALS >= NESTED_PARTIALS2) + @test Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) + @test !(Dual{TestTag}(Dual{TestTag}(1, M_PARTIALS), NESTED_PARTIALS) >= Dual{TestTag}(Dual{TestTag}(2, M_PARTIALS2), NESTED_PARTIALS2)) + + @test isnan(Dual{TestTag}(NaN, PARTIALS)) @test !(isnan(FDNUM)) - @test isnan(Dual{TestTag()}(Dual{TestTag()}(NaN, M_PARTIALS), NESTED_PARTIALS)) + @test isnan(Dual{TestTag}(Dual{TestTag}(NaN, M_PARTIALS), NESTED_PARTIALS)) @test !(isnan(NESTED_FDNUM)) @test isfinite(FDNUM) - @test !(isfinite(Dual{TestTag()}(Inf, PARTIALS))) + @test !(isfinite(Dual{TestTag}(Inf, PARTIALS))) @test isfinite(NESTED_FDNUM) - @test !(isfinite(Dual{TestTag()}(Dual{TestTag()}(NaN, M_PARTIALS), NESTED_PARTIALS))) + @test !(isfinite(Dual{TestTag}(Dual{TestTag}(NaN, M_PARTIALS), NESTED_PARTIALS))) - @test isinf(Dual{TestTag()}(Inf, PARTIALS)) + @test isinf(Dual{TestTag}(Inf, PARTIALS)) @test !(isinf(FDNUM)) - @test isinf(Dual{TestTag()}(Dual{TestTag()}(Inf, M_PARTIALS), NESTED_PARTIALS)) + @test isinf(Dual{TestTag}(Dual{TestTag}(Inf, M_PARTIALS), NESTED_PARTIALS)) @test !(isinf(NESTED_FDNUM)) @test isreal(FDNUM) @test isreal(NESTED_FDNUM) - @test isinteger(Dual{TestTag()}(1.0, PARTIALS)) + @test isinteger(Dual{TestTag}(1.0, PARTIALS)) @test isinteger(FDNUM) == (V == Int) - @test isinteger(Dual{TestTag()}(Dual{TestTag()}(1.0, M_PARTIALS), NESTED_PARTIALS)) + @test isinteger(Dual{TestTag}(Dual{TestTag}(1.0, M_PARTIALS), NESTED_PARTIALS)) @test isinteger(NESTED_FDNUM) == (V == Int) - @test iseven(Dual{TestTag()}(2)) - @test !(iseven(Dual{TestTag()}(1))) + @test iseven(Dual{TestTag}(2)) + @test !(iseven(Dual{TestTag}(1))) - @test iseven(Dual{TestTag()}(Dual{TestTag()}(2))) - @test !(iseven(Dual{TestTag()}(Dual{TestTag()}(1)))) + @test iseven(Dual{TestTag}(Dual{TestTag}(2))) + @test !(iseven(Dual{TestTag}(Dual{TestTag}(1)))) - @test isodd(Dual{TestTag()}(1)) - @test !(isodd(Dual{TestTag()}(2))) + @test isodd(Dual{TestTag}(1)) + @test !(isodd(Dual{TestTag}(2))) - @test isodd(Dual{TestTag()}(Dual{TestTag()}(1))) - @test !(isodd(Dual{TestTag()}(Dual{TestTag()}(2)))) + @test isodd(Dual{TestTag}(Dual{TestTag}(1))) + @test !(isodd(Dual{TestTag}(Dual{TestTag}(2)))) ######################## # Promotion/Conversion # @@ -355,34 +355,34 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false WIDE_T = widen(V) - @test promote_type(Dual{TestTag(),V,N}, V) == Dual{TestTag(),V,N} - @test promote_type(Dual{TestTag(),V,N}, WIDE_T) == Dual{TestTag(),WIDE_T,N} - @test promote_type(Dual{TestTag(),WIDE_T,N}, V) == Dual{TestTag(),WIDE_T,N} - @test promote_type(Dual{TestTag(),V,N}, Dual{TestTag(),V,N}) == Dual{TestTag(),V,N} - @test promote_type(Dual{TestTag(),V,N}, Dual{TestTag(),WIDE_T,N}) == Dual{TestTag(),WIDE_T,N} - @test promote_type(Dual{TestTag(),WIDE_T,N}, Dual{TestTag(),Dual{TestTag(),V,M},N}) == Dual{TestTag(),Dual{TestTag(),WIDE_T,M},N} + @test promote_type(Dual{TestTag,V,N}, V) == Dual{TestTag,V,N} + @test promote_type(Dual{TestTag,V,N}, WIDE_T) == Dual{TestTag,WIDE_T,N} + @test promote_type(Dual{TestTag,WIDE_T,N}, V) == Dual{TestTag,WIDE_T,N} + @test promote_type(Dual{TestTag,V,N}, Dual{TestTag,V,N}) == Dual{TestTag,V,N} + @test promote_type(Dual{TestTag,V,N}, Dual{TestTag,WIDE_T,N}) == Dual{TestTag,WIDE_T,N} + @test promote_type(Dual{TestTag,WIDE_T,N}, Dual{TestTag,Dual{TestTag,V,M},N}) == Dual{TestTag,Dual{TestTag,WIDE_T,M},N} # issue #322 - @test promote_type(Bool, Dual{TestTag(),V,N}) == Dual{TestTag(),promote_type(Bool, V),N} - @test promote_type(BigFloat, Dual{TestTag(),V,N}) == Dual{TestTag(),promote_type(BigFloat, V),N} + @test promote_type(Bool, Dual{TestTag,V,N}) == Dual{TestTag,promote_type(Bool, V),N} + @test promote_type(BigFloat, Dual{TestTag,V,N}) == Dual{TestTag,promote_type(BigFloat, V),N} - WIDE_FDNUM = convert(Dual{TestTag(),WIDE_T,N}, FDNUM) - WIDE_NESTED_FDNUM = convert(Dual{TestTag(),Dual{TestTag(),WIDE_T,M},N}, NESTED_FDNUM) + WIDE_FDNUM = convert(Dual{TestTag,WIDE_T,N}, FDNUM) + WIDE_NESTED_FDNUM = convert(Dual{TestTag,Dual{TestTag,WIDE_T,M},N}, NESTED_FDNUM) - @test typeof(WIDE_FDNUM) === Dual{TestTag(),WIDE_T,N} - @test typeof(WIDE_NESTED_FDNUM) === Dual{TestTag(),Dual{TestTag(),WIDE_T,M},N} + @test typeof(WIDE_FDNUM) === Dual{TestTag,WIDE_T,N} + @test typeof(WIDE_NESTED_FDNUM) === Dual{TestTag,Dual{TestTag,WIDE_T,M},N} @test value(WIDE_FDNUM) == PRIMAL @test (value(WIDE_NESTED_FDNUM) == PRIMAL) == (M == 0) @test convert(Dual, FDNUM) === FDNUM @test convert(Dual, NESTED_FDNUM) === NESTED_FDNUM - @test convert(Dual{TestTag(),V,N}, FDNUM) === FDNUM - @test convert(Dual{TestTag(),Dual{TestTag(),V,M},N}, NESTED_FDNUM) === NESTED_FDNUM - @test convert(Dual{TestTag(),WIDE_T,N}, PRIMAL) === Dual{TestTag()}(WIDE_T(PRIMAL), zero(Partials{N,WIDE_T})) - @test convert(Dual{TestTag(),Dual{TestTag(),WIDE_T,M},N}, PRIMAL) === Dual{TestTag()}(Dual{TestTag()}(WIDE_T(PRIMAL), zero(Partials{M,WIDE_T})), zero(Partials{N,Dual{TestTag(),V,M}})) - @test convert(Dual{TestTag(),Dual{TestTag(),V,M},N}, FDNUM) === Dual{TestTag()}(convert(Dual{TestTag(),V,M}, PRIMAL), convert(Partials{N,Dual{TestTag(),V,M}}, PARTIALS)) - @test convert(Dual{TestTag(),Dual{TestTag(),WIDE_T,M},N}, FDNUM) === Dual{TestTag()}(convert(Dual{TestTag(),WIDE_T,M}, PRIMAL), convert(Partials{N,Dual{TestTag(),WIDE_T,M}}, PARTIALS)) + @test convert(Dual{TestTag,V,N}, FDNUM) === FDNUM + @test convert(Dual{TestTag,Dual{TestTag,V,M},N}, NESTED_FDNUM) === NESTED_FDNUM + @test convert(Dual{TestTag,WIDE_T,N}, PRIMAL) === Dual{TestTag}(WIDE_T(PRIMAL), zero(Partials{N,WIDE_T})) + @test convert(Dual{TestTag,Dual{TestTag,WIDE_T,M},N}, PRIMAL) === Dual{TestTag}(Dual{TestTag}(WIDE_T(PRIMAL), zero(Partials{M,WIDE_T})), zero(Partials{N,Dual{TestTag,V,M}})) + @test convert(Dual{TestTag,Dual{TestTag,V,M},N}, FDNUM) === Dual{TestTag}(convert(Dual{TestTag,V,M}, PRIMAL), convert(Partials{N,Dual{TestTag,V,M}}, PARTIALS)) + @test convert(Dual{TestTag,Dual{TestTag,WIDE_T,M},N}, FDNUM) === Dual{TestTag}(convert(Dual{TestTag,WIDE_T,M}, PRIMAL), convert(Partials{N,Dual{TestTag,WIDE_T,M}}, PARTIALS)) ############## # Arithmetic # @@ -391,56 +391,56 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false # Addition/Subtraction # #----------------------# - @test FDNUM + FDNUM2 === Dual{TestTag()}(value(FDNUM) + value(FDNUM2), partials(FDNUM) + partials(FDNUM2)) - @test FDNUM + PRIMAL === Dual{TestTag()}(value(FDNUM) + PRIMAL, partials(FDNUM)) - @test PRIMAL + FDNUM === Dual{TestTag()}(value(FDNUM) + PRIMAL, partials(FDNUM)) + @test FDNUM + FDNUM2 === Dual{TestTag}(value(FDNUM) + value(FDNUM2), partials(FDNUM) + partials(FDNUM2)) + @test FDNUM + PRIMAL === Dual{TestTag}(value(FDNUM) + PRIMAL, partials(FDNUM)) + @test PRIMAL + FDNUM === Dual{TestTag}(value(FDNUM) + PRIMAL, partials(FDNUM)) - @test NESTED_FDNUM + NESTED_FDNUM2 === Dual{TestTag()}(value(NESTED_FDNUM) + value(NESTED_FDNUM2), partials(NESTED_FDNUM) + partials(NESTED_FDNUM2)) - @test NESTED_FDNUM + PRIMAL === Dual{TestTag()}(value(NESTED_FDNUM) + PRIMAL, partials(NESTED_FDNUM)) - @test PRIMAL + NESTED_FDNUM === Dual{TestTag()}(value(NESTED_FDNUM) + PRIMAL, partials(NESTED_FDNUM)) + @test NESTED_FDNUM + NESTED_FDNUM2 === Dual{TestTag}(value(NESTED_FDNUM) + value(NESTED_FDNUM2), partials(NESTED_FDNUM) + partials(NESTED_FDNUM2)) + @test NESTED_FDNUM + PRIMAL === Dual{TestTag}(value(NESTED_FDNUM) + PRIMAL, partials(NESTED_FDNUM)) + @test PRIMAL + NESTED_FDNUM === Dual{TestTag}(value(NESTED_FDNUM) + PRIMAL, partials(NESTED_FDNUM)) - @test FDNUM - FDNUM2 === Dual{TestTag()}(value(FDNUM) - value(FDNUM2), partials(FDNUM) - partials(FDNUM2)) - @test FDNUM - PRIMAL === Dual{TestTag()}(value(FDNUM) - PRIMAL, partials(FDNUM)) - @test PRIMAL - FDNUM === Dual{TestTag()}(PRIMAL - value(FDNUM), -(partials(FDNUM))) - @test -(FDNUM) === Dual{TestTag()}(-(value(FDNUM)), -(partials(FDNUM))) + @test FDNUM - FDNUM2 === Dual{TestTag}(value(FDNUM) - value(FDNUM2), partials(FDNUM) - partials(FDNUM2)) + @test FDNUM - PRIMAL === Dual{TestTag}(value(FDNUM) - PRIMAL, partials(FDNUM)) + @test PRIMAL - FDNUM === Dual{TestTag}(PRIMAL - value(FDNUM), -(partials(FDNUM))) + @test -(FDNUM) === Dual{TestTag}(-(value(FDNUM)), -(partials(FDNUM))) - @test NESTED_FDNUM - NESTED_FDNUM2 === Dual{TestTag()}(value(NESTED_FDNUM) - value(NESTED_FDNUM2), partials(NESTED_FDNUM) - partials(NESTED_FDNUM2)) - @test NESTED_FDNUM - PRIMAL === Dual{TestTag()}(value(NESTED_FDNUM) - PRIMAL, partials(NESTED_FDNUM)) - @test PRIMAL - NESTED_FDNUM === Dual{TestTag()}(PRIMAL - value(NESTED_FDNUM), -(partials(NESTED_FDNUM))) - @test -(NESTED_FDNUM) === Dual{TestTag()}(-(value(NESTED_FDNUM)), -(partials(NESTED_FDNUM))) + @test NESTED_FDNUM - NESTED_FDNUM2 === Dual{TestTag}(value(NESTED_FDNUM) - value(NESTED_FDNUM2), partials(NESTED_FDNUM) - partials(NESTED_FDNUM2)) + @test NESTED_FDNUM - PRIMAL === Dual{TestTag}(value(NESTED_FDNUM) - PRIMAL, partials(NESTED_FDNUM)) + @test PRIMAL - NESTED_FDNUM === Dual{TestTag}(PRIMAL - value(NESTED_FDNUM), -(partials(NESTED_FDNUM))) + @test -(NESTED_FDNUM) === Dual{TestTag}(-(value(NESTED_FDNUM)), -(partials(NESTED_FDNUM))) # Multiplication # #----------------# - @test FDNUM * FDNUM2 === Dual{TestTag()}(value(FDNUM) * value(FDNUM2), ForwardDiff._mul_partials(partials(FDNUM), partials(FDNUM2), value(FDNUM2), value(FDNUM))) - @test FDNUM * PRIMAL === Dual{TestTag()}(value(FDNUM) * PRIMAL, partials(FDNUM) * PRIMAL) - @test PRIMAL * FDNUM === Dual{TestTag()}(value(FDNUM) * PRIMAL, partials(FDNUM) * PRIMAL) + @test FDNUM * FDNUM2 === Dual{TestTag}(value(FDNUM) * value(FDNUM2), ForwardDiff._mul_partials(partials(FDNUM), partials(FDNUM2), value(FDNUM2), value(FDNUM))) + @test FDNUM * PRIMAL === Dual{TestTag}(value(FDNUM) * PRIMAL, partials(FDNUM) * PRIMAL) + @test PRIMAL * FDNUM === Dual{TestTag}(value(FDNUM) * PRIMAL, partials(FDNUM) * PRIMAL) - @test NESTED_FDNUM * NESTED_FDNUM2 === Dual{TestTag()}(value(NESTED_FDNUM) * value(NESTED_FDNUM2), ForwardDiff._mul_partials(partials(NESTED_FDNUM), partials(NESTED_FDNUM2), value(NESTED_FDNUM2), value(NESTED_FDNUM))) - @test NESTED_FDNUM * PRIMAL === Dual{TestTag()}(value(NESTED_FDNUM) * PRIMAL, partials(NESTED_FDNUM) * PRIMAL) - @test PRIMAL * NESTED_FDNUM === Dual{TestTag()}(value(NESTED_FDNUM) * PRIMAL, partials(NESTED_FDNUM) * PRIMAL) + @test NESTED_FDNUM * NESTED_FDNUM2 === Dual{TestTag}(value(NESTED_FDNUM) * value(NESTED_FDNUM2), ForwardDiff._mul_partials(partials(NESTED_FDNUM), partials(NESTED_FDNUM2), value(NESTED_FDNUM2), value(NESTED_FDNUM))) + @test NESTED_FDNUM * PRIMAL === Dual{TestTag}(value(NESTED_FDNUM) * PRIMAL, partials(NESTED_FDNUM) * PRIMAL) + @test PRIMAL * NESTED_FDNUM === Dual{TestTag}(value(NESTED_FDNUM) * PRIMAL, partials(NESTED_FDNUM) * PRIMAL) # Division # #----------# if M > 0 && N > 0 - # Recall that FDNUM = Dual{TestTag()}(PRIMAL, PARTIALS) has N partials, + # Recall that FDNUM = Dual{TestTag}(PRIMAL, PARTIALS) has N partials, # all random numbers nonzero, and FDNUM2 another draw. M only affects NESTED_FDNUM. @test Dual{1}(FDNUM) / Dual{1}(PRIMAL) === Dual{1}(FDNUM / PRIMAL) @test Dual{1}(PRIMAL) / Dual{1}(FDNUM) === Dual{1}(PRIMAL / FDNUM) - @test_broken Dual{1}(FDNUM) / FDNUM2 === Dual{1}(FDNUM / FDNUM2) - @test_broken FDNUM / Dual{1}(FDNUM2) === Dual{1}(FDNUM / FDNUM2) + @test Dual{1}(FDNUM) / FDNUM2 === Dual{1}(FDNUM / FDNUM2) + @test FDNUM / Dual{1}(FDNUM2) === Dual{1}(FDNUM / FDNUM2) # following may not be exact, see #264 @test Dual{1}(FDNUM / PRIMAL, FDNUM2 / PRIMAL) ≈ Dual{1}(FDNUM, FDNUM2) / PRIMAL end - @test dual_isapprox(FDNUM / FDNUM2, Dual{TestTag()}(value(FDNUM) / value(FDNUM2), ForwardDiff._div_partials(partials(FDNUM), partials(FDNUM2), value(FDNUM), value(FDNUM2)))) - @test dual_isapprox(FDNUM / PRIMAL, Dual{TestTag()}(value(FDNUM) / PRIMAL, partials(FDNUM) / PRIMAL)) - @test dual_isapprox(PRIMAL / FDNUM, Dual{TestTag()}(PRIMAL / value(FDNUM), (-(PRIMAL) / value(FDNUM)^2) * partials(FDNUM))) + @test dual_isapprox(FDNUM / FDNUM2, Dual{TestTag}(value(FDNUM) / value(FDNUM2), ForwardDiff._div_partials(partials(FDNUM), partials(FDNUM2), value(FDNUM), value(FDNUM2)))) + @test dual_isapprox(FDNUM / PRIMAL, Dual{TestTag}(value(FDNUM) / PRIMAL, partials(FDNUM) / PRIMAL)) + @test dual_isapprox(PRIMAL / FDNUM, Dual{TestTag}(PRIMAL / value(FDNUM), (-(PRIMAL) / value(FDNUM)^2) * partials(FDNUM))) - @test dual_isapprox(NESTED_FDNUM / NESTED_FDNUM2, Dual{TestTag()}(value(NESTED_FDNUM) / value(NESTED_FDNUM2), ForwardDiff._div_partials(partials(NESTED_FDNUM), partials(NESTED_FDNUM2), value(NESTED_FDNUM), value(NESTED_FDNUM2)))) - @test dual_isapprox(NESTED_FDNUM / PRIMAL, Dual{TestTag()}(value(NESTED_FDNUM) / PRIMAL, partials(NESTED_FDNUM) / PRIMAL)) - @test dual_isapprox(PRIMAL / NESTED_FDNUM, Dual{TestTag()}(PRIMAL / value(NESTED_FDNUM), (-(PRIMAL) / value(NESTED_FDNUM)^2) * partials(NESTED_FDNUM))) + @test dual_isapprox(NESTED_FDNUM / NESTED_FDNUM2, Dual{TestTag}(value(NESTED_FDNUM) / value(NESTED_FDNUM2), ForwardDiff._div_partials(partials(NESTED_FDNUM), partials(NESTED_FDNUM2), value(NESTED_FDNUM), value(NESTED_FDNUM2)))) + @test dual_isapprox(NESTED_FDNUM / PRIMAL, Dual{TestTag}(value(NESTED_FDNUM) / PRIMAL, partials(NESTED_FDNUM) / PRIMAL)) + @test dual_isapprox(PRIMAL / NESTED_FDNUM, Dual{TestTag}(PRIMAL / value(NESTED_FDNUM), (-(PRIMAL) / value(NESTED_FDNUM)^2) * partials(NESTED_FDNUM))) # Exponentiation # #----------------# @@ -456,7 +456,7 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test dual_isapprox(1.0 * NESTED_FDNUM^PRIMAL, exp(PRIMAL * log(NESTED_FDNUM))) @test dual_isapprox(1.0 * PRIMAL^NESTED_FDNUM, exp(NESTED_FDNUM * log(PRIMAL))) - @test partials(NaNMath.pow(Dual{TestTag()}(-2.0, 1.0), Dual{TestTag()}(2.0, 0.0)), 1) == -4.0 + @test partials(NaNMath.pow(Dual{TestTag}(-2.0, 1.0), Dual{TestTag}(2.0, 0.0)), 1) == -4.0 ################################### # General Mathematical Operations # @@ -491,15 +491,15 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false end @eval begin x = rand() + $modifier - dx = @inferred $M.$f(Dual{TestTag()}(x, one(x))) + dx = @inferred $M.$f(Dual{TestTag}(x, one(x))) actualval = $M.$f(x) @assert actualval isa Real || actualval isa Complex if actualval isa Real - @test dx isa Dual{TestTag()} + @test dx isa Dual{TestTag} @test value(dx) == actualval @test partials(dx, 1) == $deriv else - @test dx isa Complex{<:Dual{TestTag()}} + @test dx isa Complex{<:Dual{TestTag}} @test value(real(dx)) == real(actualval) @test value(imag(dx)) == imag(actualval) @test partials(real(dx), 1) == real($deriv) @@ -517,22 +517,22 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false end @eval begin x, y = $x, $y - dx = @inferred $M.$f(Dual{TestTag()}(x, one(x)), y) - dy = @inferred $M.$f(x, Dual{TestTag()}(y, one(y))) + dx = @inferred $M.$f(Dual{TestTag}(x, one(x)), y) + dy = @inferred $M.$f(x, Dual{TestTag}(y, one(y))) actualdx = $(derivs[1]) actualdy = $(derivs[2]) actualval = $M.$f(x, y) @assert actualval isa Real || actualval isa Complex if actualval isa Real - @test dx isa Dual{TestTag()} - @test dy isa Dual{TestTag()} + @test dx isa Dual{TestTag} + @test dy isa Dual{TestTag} @test value(dx) == actualval @test value(dy) == actualval @test partials(dx, 1) ≈ actualdx nans=true @test partials(dy, 1) ≈ actualdy nans=true else - @test dx isa Complex{<:Dual{TestTag()}} - @test dy isa Complex{<:Dual{TestTag()}} + @test dx isa Complex{<:Dual{TestTag}} + @test dy isa Complex{<:Dual{TestTag}} # @test real(value(dx)) == real(actualval) # @test real(value(dy)) == real(actualval) # @test imag(value(dx)) == imag(actualval) @@ -554,8 +554,8 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false # Special Cases # #---------------# - @test_broken dual_isapprox(hypot(FDNUM, FDNUM2, FDNUM), sqrt(2*(FDNUM^2) + FDNUM2^2)) - @test_broken dual_isapprox(hypot(FDNUM, FDNUM2, FDNUM3), sqrt(FDNUM^2 + FDNUM2^2 + FDNUM3^2)) + @test dual_isapprox(hypot(FDNUM, FDNUM2, FDNUM), sqrt(2*(FDNUM^2) + FDNUM2^2)) + @test dual_isapprox(hypot(FDNUM, FDNUM2, FDNUM3), sqrt(FDNUM^2 + FDNUM2^2 + FDNUM3^2)) @test all(map(dual_isapprox, ForwardDiff.sincos(FDNUM), (sin(FDNUM), cos(FDNUM)))) @@ -567,13 +567,13 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false end for f in (fma, muladd) - @test dual_isapprox(f(FDNUM, FDNUM2, FDNUM3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2 + PRIMAL2*PARTIALS + PARTIALS3)) - @test dual_isapprox(f(FDNUM, FDNUM2, PRIMAL3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2 + PRIMAL2*PARTIALS)) - @test dual_isapprox(f(PRIMAL, FDNUM2, FDNUM3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2 + PARTIALS3)) - @test dual_isapprox(f(PRIMAL, FDNUM2, PRIMAL3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2)) - @test dual_isapprox(f(FDNUM, PRIMAL2, FDNUM3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL2*PARTIALS + PARTIALS3)) - @test dual_isapprox(f(FDNUM, PRIMAL2, PRIMAL3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL2*PARTIALS)) - @test dual_isapprox(f(PRIMAL, PRIMAL2, FDNUM3), Dual{TestTag()}(f(PRIMAL, PRIMAL2, PRIMAL3), PARTIALS3)) + @test dual_isapprox(f(FDNUM, FDNUM2, FDNUM3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2 + PRIMAL2*PARTIALS + PARTIALS3)) + @test dual_isapprox(f(FDNUM, FDNUM2, PRIMAL3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2 + PRIMAL2*PARTIALS)) + @test dual_isapprox(f(PRIMAL, FDNUM2, FDNUM3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2 + PARTIALS3)) + @test dual_isapprox(f(PRIMAL, FDNUM2, PRIMAL3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL*PARTIALS2)) + @test dual_isapprox(f(FDNUM, PRIMAL2, FDNUM3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL2*PARTIALS + PARTIALS3)) + @test dual_isapprox(f(FDNUM, PRIMAL2, PRIMAL3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PRIMAL2*PARTIALS)) + @test dual_isapprox(f(PRIMAL, PRIMAL2, FDNUM3), Dual{TestTag}(f(PRIMAL, PRIMAL2, PRIMAL3), PARTIALS3)) end # Functions in Specialfunctions that return tuples and @@ -582,14 +582,14 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test dual_isapprox(logabsgamma(FDNUM)[2], sign(gamma(FDNUM))) a = rand(float(V)) - fdnum = Dual{TestTag()}(1 + PRIMAL, PARTIALS) # 1 + PRIMAL avoids issues with finite differencing close to 0 + fdnum = Dual{TestTag}(1 + PRIMAL, PARTIALS) # 1 + PRIMAL avoids issues with finite differencing close to 0 for ind in ((), (0,), (1,), (2,)) # Only test if primal method exists # (e.g., older versions of SpecialFunctions don't define `gamma_inc(a, x)` but only `gamma_inc(a, x, ind)` hasmethod(gamma_inc, typeof((a, 1 + PRIMAL, ind...))) || continue pq = gamma_inc(a, fdnum, ind...) - @test pq isa Tuple{Dual{TestTag()},Dual{TestTag()}} + @test pq isa Tuple{Dual{TestTag},Dual{TestTag}} # We have to adjust tolerances if lower accuracy is requested # Therefore we don't use `dual_isapprox` tol = V === Float32 ? 5f-4 : 1e-5 @@ -614,8 +614,8 @@ end @test pow(x3, 2) === x3^2 === x3 * x3 @test pow(x2, 1) === x2^1 === x2 @test pow(x1, 0) === x1^0 === Dual{:t1}(1.0, 0.0) - y = Dual{typeof(TestTag())}(1.0, 0.0, 1.0); - x = Dual{typeof(OuterTestTag())}(0*y, 0*y); + y = Dual{TestTag}(1.0, 0.0, 1.0); + x = Dual{OuterTestTag}(0*y, 0*y); @test iszero(ForwardDiff.partials(ForwardDiff.partials(x^y)[1])) end diff --git a/test/MiscTest.jl b/test/MiscTest.jl index e7e0d91a..53e8ede3 100644 --- a/test/MiscTest.jl +++ b/test/MiscTest.jl @@ -152,7 +152,7 @@ intrand(V) = V == Int ? rand(2:10) : rand(V) for N in (0,3), V in (Int, Float32), I in (Irrational, AbstractIrrational) PARTIALS = ForwardDiff.Partials{N,V}(ntuple(n -> intrand(V), N)) PRIMAL = intrand(V) - FDNUM = ForwardDiff.Dual{TestTag()}(PRIMAL, PARTIALS) + FDNUM = ForwardDiff.Dual{TestTag}(PRIMAL, PARTIALS) @test promote_rule(typeof(FDNUM), I) == promote_rule(I, typeof(FDNUM)) # π::Irrational, twoπ::AbstractIrrational