@@ -316,17 +316,53 @@ for pred in UNARY_PREDICATES
316316 @eval Base.$ (pred)(d:: Dual ) = $ (pred)(value (d))
317317end
318318
319- for pred in BINARY_PREDICATES
319+ # BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), :(>=)]
320+
321+ for pred in [:isequal , :(== )]
322+ @eval begin
323+ @define_binary_dual_op (
324+ Base.$ (pred),
325+ $ (pred)(value (x), value (y)) && $ (pred)(partials (x), partials (y)),
326+ $ (pred)(value (x), y) && $ (pred)(partials (x), zero (partials (x))),
327+ $ (pred)(x, value (y)) && $ (pred)(zero (partials (y)), partials (y)),
328+ )
329+ end
330+ end
331+
332+ @define_binary_dual_op (
333+ Base.:(!= ),
334+ (!= )(value (x), value (y)) || (!= )(partials (x), partials (y)),
335+ (!= )(value (x), y) || (!= )(partials (x), zero (partials (x))),
336+ (!= )(x, value (y)) || (!= )(zero (partials (y)), partials (y)),
337+ )
338+
339+ for pred in [:isless , :< , :> , :(<= ), :(>= )]
320340 @eval begin
321341 @define_binary_dual_op (
322342 Base.$ (pred),
323- $ (pred)(value (x), value (y)),
324- $ (pred)(value (x), y),
325- $ (pred)(x, value (y))
343+ if value (x) == value (y) # both Dual
344+ $ (pred)(partials (x), partials (y))
345+ else
346+ $ (pred)(value (x), value (y))
347+ end ,
348+ if value (x) == y # only x is Dual
349+ $ (pred)(partials (x), zero (partials (x)))
350+ else
351+ $ (pred)(value (x), value (y))
352+ end ,
353+ if x == value (y) # only y is Dual
354+ $ (pred)(zero (partials (y)), partials (y))
355+ else
356+ $ (pred)(value (x), value (y))
357+ end ,
326358 )
327359 end
328360end
329361
362+ # @define_binary_dual_op(Base.:(==), false, false, false)
363+ # @define_binary_dual_op(Base.isequal, false, false, false)
364+ # @define_binary_dual_op(Base.:(!=), true, true, true)
365+
330366# #######################
331367# Promotion/Conversion #
332368# #######################
0 commit comments