diff --git a/Project.toml b/Project.toml index 5772a980..8dacd88c 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ForwardDiff" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "1.3.0" +version = "1.3.1" [deps] CommonSubexpressions = "bbf7d656-a473-5ed7-a52c-81e309532950" diff --git a/src/partials.jl b/src/partials.jl index be55c1b3..49f8364b 100644 --- a/src/partials.jl +++ b/src/partials.jl @@ -49,6 +49,8 @@ Base.mightalias(x::AbstractArray, y::Partials) = false Base.isequal(a::Partials{N}, b::Partials{N}) where {N} = isequal(a.values, b.values) Base.:(==)(a::Partials{N}, b::Partials{N}) where {N} = a.values == b.values +Base.:(<)(a::Partials{N}, b::Partials{N}) where {N} = a.values < b.values +Base.isless(a::Partials{N}, b::Partials{N}) where {N} = isless(a.values, b.values) const PARTIALS_HASH = hash(Partials) diff --git a/test/DualTest.jl b/test/DualTest.jl index 35d3116b..df9f9dcb 100644 --- a/test/DualTest.jl +++ b/test/DualTest.jl @@ -259,6 +259,8 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false # M is the length of M_PARTIALS, which affects: # NESTED_FDNUM = Dual{TestTag}(Dual{TestTag}(PRIMAL, M_PARTIALS), NESTED_PARTIALS) + NAN_PARTIALS = Partials{N,float(V)}(map(x -> oftype(float(x), NaN), PARTIALS.values)) + @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)) @@ -276,10 +278,17 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test NESTED_FDNUM != NESTED_FDNUM2 end + @test (Dual{TestTag}(PRIMAL, NAN_PARTIALS) == Dual{TestTag}(PRIMAL, NAN_PARTIALS)) === (N == 0) + @test isequal(Dual{TestTag}(PRIMAL, NAN_PARTIALS), Dual{TestTag}(PRIMAL, 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}(1, PARTIALS), Dual{TestTag}(2, NAN_PARTIALS)) + @test isless(Dual{TestTag}(1, PARTIALS), Dual{TestTag}(1, NAN_PARTIALS)) === (N > 0) + @test !isless(Dual{TestTag}(1, NAN_PARTIALS), Dual{TestTag}(1, PARTIALS)) + @test !(isless(Dual{TestTag}(2, PARTIALS), Dual{TestTag}(1, NAN_PARTIALS))) @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) @@ -290,6 +299,10 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @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}(1, PARTIALS) < Dual{TestTag}(2, NAN_PARTIALS) + @test !(Dual{TestTag}(1, PARTIALS) < Dual{TestTag}(1, NAN_PARTIALS)) + @test !(Dual{TestTag}(1, NAN_PARTIALS) < Dual{TestTag}(1, PARTIALS)) + @test !(Dual{TestTag}(2, PARTIALS) < Dual{TestTag}(1, NAN_PARTIALS)) @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) @@ -300,6 +313,10 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @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}(1, PARTIALS) <= Dual{TestTag}(2, NAN_PARTIALS) + @test (Dual{TestTag}(1, PARTIALS) <= Dual{TestTag}(1, NAN_PARTIALS)) === (N == 0) + @test (Dual{TestTag}(1, NAN_PARTIALS) <= Dual{TestTag}(1, PARTIALS)) === (N == 0) + @test !(Dual{TestTag}(2, PARTIALS) <= Dual{TestTag}(1, NAN_PARTIALS)) @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) @@ -310,6 +327,10 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @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}(1, PARTIALS) > Dual{TestTag}(2, NAN_PARTIALS)) + @test !(Dual{TestTag}(1, PARTIALS) > Dual{TestTag}(1, NAN_PARTIALS)) + @test !(Dual{TestTag}(1, NAN_PARTIALS) > Dual{TestTag}(1, PARTIALS)) + @test Dual{TestTag}(2, PARTIALS) > Dual{TestTag}(1, NAN_PARTIALS) @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) @@ -320,6 +341,10 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @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}(1, PARTIALS) >= Dual{TestTag}(2, NAN_PARTIALS)) + @test ((Dual{TestTag}(1, PARTIALS) >= Dual{TestTag}(1, NAN_PARTIALS))) === (N == 0) + @test ((Dual{TestTag}(1, NAN_PARTIALS) >= Dual{TestTag}(1, PARTIALS))) === (N == 0) + @test Dual{TestTag}(2, PARTIALS) >= Dual{TestTag}(1, NAN_PARTIALS) @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) diff --git a/test/PartialsTest.jl b/test/PartialsTest.jl index 23ebff3b..0e73160b 100644 --- a/test/PartialsTest.jl +++ b/test/PartialsTest.jl @@ -60,6 +60,19 @@ samerng() = MersenneTwister(1) @test (PARTIALS == PARTIALS2) == (N == 0) @test isequal(PARTIALS, copy(PARTIALS)) @test isequal(PARTIALS, PARTIALS2) == (N == 0) + @test !(PARTIALS < copy(PARTIALS)) + @test PARTIALS <= copy(PARTIALS) + @test !(PARTIALS > copy(PARTIALS)) + @test !isless(PARTIALS, copy(PARTIALS)) + for f in (<, <=, >, isless) + @test f(PARTIALS, PARTIALS2) === f(VALUES, VALUES2) + end + NAN_PARTIALS = Partials{N,float(T)}(map(x -> oftype(float(x), NaN), VALUES)) + @test !(PARTIALS < NAN_PARTIALS) + @test (PARTIALS <= NAN_PARTIALS) === (N == 0) + @test !(PARTIALS > NAN_PARTIALS) + @test isless(PARTIALS, NAN_PARTIALS) === (N > 0) + @test !isless(NAN_PARTIALS, PARTIALS) @test hash(PARTIALS) == hash(copy(PARTIALS)) @test hash(PARTIALS, hash(1)) == hash(copy(PARTIALS), hash(1))