51 return std::fabs(
static_cast<double>(
value) -
static_cast<double>(other.
value)) < 1e-9 &&
52 std::fabs(
static_cast<double>(
grad) -
static_cast<double>(other.
grad)) < 1e-9;
78 static_assert(std::is_floating_point_v<T>,
"DualSemiring<T> requires a floating-point T (double or float)");
82 [[nodiscard]]
static constexpr Value zero() {
return Value{
static_cast<T
>(0),
static_cast<T
>(0)}; }
83 [[nodiscard]]
static constexpr Value one() {
return Value{
static_cast<T
>(1),
static_cast<T
>(0)}; }
Definition datalog_atom.hpp:14
A dual number (value, grad): value is the ordinary real-valued semiring result, grad is its derivativ...
Definition datalog_dual_semiring.hpp:35
bool operator==(const DualNumber &other) const
Epsilon-tolerant equality, mirroring RealSemiring<T>'s own reason for needing one (see datalog_weight...
Definition datalog_dual_semiring.hpp:50
bool operator!=(const DualNumber &other) const
Definition datalog_dual_semiring.hpp:54
T value
Definition datalog_dual_semiring.hpp:36
T grad
Definition datalog_dual_semiring.hpp:37
The dual-number semiring: ⊕/⊗ are ordinary dual-number addition/multiplication (sum rule / product ru...
Definition datalog_dual_semiring.hpp:77
static constexpr Value add(Value a, Value b)
Definition datalog_dual_semiring.hpp:84
static constexpr Value zero()
Definition datalog_dual_semiring.hpp:82
static constexpr Value mul(Value a, Value b)
Definition datalog_dual_semiring.hpp:85
static constexpr Value one()
Definition datalog_dual_semiring.hpp:83