@@ -384,17 +384,53 @@ for pred in UNARY_PREDICATES
384384 @eval Base.$ (pred)(d:: Dual ) = $ (pred)(value (d))
385385end
386386
387- for pred in BINARY_PREDICATES
387+ # BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), :(>=)]
388+
389+ for pred in [:isequal , :(== )]
390+ @eval begin
391+ @define_binary_dual_op (
392+ Base.$ (pred),
393+ $ (pred)(value (x), value (y)) && $ (pred)(partials (x), partials (y)),
394+ $ (pred)(value (x), y) && $ (pred)(partials (x), zero (partials (x))),
395+ $ (pred)(x, value (y)) && $ (pred)(zero (partials (y)), partials (y)),
396+ )
397+ end
398+ end
399+
400+ @define_binary_dual_op (
401+ Base.:(!= ),
402+ (!= )(value (x), value (y)) || (!= )(partials (x), partials (y)),
403+ (!= )(value (x), y) || (!= )(partials (x), zero (partials (x))),
404+ (!= )(x, value (y)) || (!= )(zero (partials (y)), partials (y)),
405+ )
406+
407+ for pred in [:isless , :< , :> , :(<= ), :(>= )]
388408 @eval begin
389409 @define_binary_dual_op (
390410 Base.$ (pred),
391- $ (pred)(value (x), value (y)),
392- $ (pred)(value (x), y),
393- $ (pred)(x, value (y))
411+ if value (x) == value (y) # both Dual
412+ $ (pred)(partials (x), partials (y))
413+ else
414+ $ (pred)(value (x), value (y))
415+ end ,
416+ if value (x) == y # only x is Dual
417+ $ (pred)(partials (x), zero (partials (x)))
418+ else
419+ $ (pred)(value (x), value (y))
420+ end ,
421+ if x == value (y) # only y is Dual
422+ $ (pred)(zero (partials (y)), partials (y))
423+ else
424+ $ (pred)(value (x), value (y))
425+ end ,
394426 )
395427 end
396428end
397429
430+ # @define_binary_dual_op(Base.:(==), false, false, false)
431+ # @define_binary_dual_op(Base.isequal, false, false, false)
432+ # @define_binary_dual_op(Base.:(!=), true, true, true)
433+
398434# #######################
399435# Promotion/Conversion #
400436# #######################
0 commit comments