@@ -336,17 +336,53 @@ for pred in UNARY_PREDICATES
336336 @eval Base.$ (pred)(d:: Dual ) = $ (pred)(value (d))
337337end
338338
339- for pred in BINARY_PREDICATES
339+ # BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), :(>=)]
340+
341+ for pred in [:isequal , :(== )]
342+ @eval begin
343+ @define_binary_dual_op (
344+ Base.$ (pred),
345+ $ (pred)(value (x), value (y)) && $ (pred)(partials (x), partials (y)),
346+ $ (pred)(value (x), y) && $ (pred)(partials (x), zero (partials (x))),
347+ $ (pred)(x, value (y)) && $ (pred)(zero (partials (y)), partials (y)),
348+ )
349+ end
350+ end
351+
352+ @define_binary_dual_op (
353+ Base.:(!= ),
354+ (!= )(value (x), value (y)) || (!= )(partials (x), partials (y)),
355+ (!= )(value (x), y) || (!= )(partials (x), zero (partials (x))),
356+ (!= )(x, value (y)) || (!= )(zero (partials (y)), partials (y)),
357+ )
358+
359+ for pred in [:isless , :< , :> , :(<= ), :(>= )]
340360 @eval begin
341361 @define_binary_dual_op (
342362 Base.$ (pred),
343- $ (pred)(value (x), value (y)),
344- $ (pred)(value (x), y),
345- $ (pred)(x, value (y))
363+ if value (x) == value (y) # both Dual
364+ $ (pred)(partials (x), partials (y))
365+ else
366+ $ (pred)(value (x), value (y))
367+ end ,
368+ if value (x) == y # only x is Dual
369+ $ (pred)(partials (x), zero (partials (x)))
370+ else
371+ $ (pred)(value (x), value (y))
372+ end ,
373+ if x == value (y) # only y is Dual
374+ $ (pred)(zero (partials (y)), partials (y))
375+ else
376+ $ (pred)(value (x), value (y))
377+ end ,
346378 )
347379 end
348380end
349381
382+ # @define_binary_dual_op(Base.:(==), false, false, false)
383+ # @define_binary_dual_op(Base.isequal, false, false, false)
384+ # @define_binary_dual_op(Base.:(!=), true, true, true)
385+
350386# #######################
351387# Promotion/Conversion #
352388# #######################
0 commit comments