@@ -331,17 +331,53 @@ for pred in UNARY_PREDICATES
331331 @eval Base.$ (pred)(d:: Dual ) = $ (pred)(value (d))
332332end
333333
334- for pred in BINARY_PREDICATES
334+ # BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), :(>=)]
335+
336+ for pred in [:isequal , :(== )]
337+ @eval begin
338+ @define_binary_dual_op (
339+ Base.$ (pred),
340+ $ (pred)(value (x), value (y)) && $ (pred)(partials (x), partials (y)),
341+ $ (pred)(value (x), y) && $ (pred)(partials (x), zero (partials (x))),
342+ $ (pred)(x, value (y)) && $ (pred)(zero (partials (y)), partials (y)),
343+ )
344+ end
345+ end
346+
347+ @define_binary_dual_op (
348+ Base.:(!= ),
349+ (!= )(value (x), value (y)) || (!= )(partials (x), partials (y)),
350+ (!= )(value (x), y) || (!= )(partials (x), zero (partials (x))),
351+ (!= )(x, value (y)) || (!= )(zero (partials (y)), partials (y)),
352+ )
353+
354+ for pred in [:isless , :< , :> , :(<= ), :(>= )]
335355 @eval begin
336356 @define_binary_dual_op (
337357 Base.$ (pred),
338- $ (pred)(value (x), value (y)),
339- $ (pred)(value (x), y),
340- $ (pred)(x, value (y))
358+ if value (x) == value (y) # both Dual
359+ $ (pred)(partials (x), partials (y))
360+ else
361+ $ (pred)(value (x), value (y))
362+ end ,
363+ if value (x) == y # only x is Dual
364+ $ (pred)(partials (x), zero (partials (x)))
365+ else
366+ $ (pred)(value (x), value (y))
367+ end ,
368+ if x == value (y) # only y is Dual
369+ $ (pred)(zero (partials (y)), partials (y))
370+ else
371+ $ (pred)(value (x), value (y))
372+ end ,
341373 )
342374 end
343375end
344376
377+ # @define_binary_dual_op(Base.:(==), false, false, false)
378+ # @define_binary_dual_op(Base.isequal, false, false, false)
379+ # @define_binary_dual_op(Base.:(!=), true, true, true)
380+
345381# #######################
346382# Promotion/Conversion #
347383# #######################
0 commit comments