in src/lighteval/metrics/utils/math_comparison.py [0:0]
def sympy_compare_relational(gold: Relational | And, pred: Relational | And, precision: int) -> bool:
"""Compare two relational expressions.
Args:
gold: First relational expression
pred: Second relational expression
precision: Number of decimal places to compare
Returns:
True if relations are equivalent, False otherwise
"""
# Handle And expressions by comparing each relation
if isinstance(gold, And):
return all(sympy_compare_relational(g, p, precision) for g, p in zip(gold.args, pred.args))
# Helper to check if expressions are equivalent when flipped
def are_flipped_inequalities_equal(a: Relational, b: Relational) -> bool:
try:
return sympy_expr_eq(a.lhs - a.rhs, b.rhs - b.lhs, precision) # type: ignore
except TimeoutError:
raise
except Exception: # noqa: E722
pass
return False
# Same type of relation (e.g. both <= or both >=)
try:
if type(gold) is type(pred) and sympy_expr_eq(gold.lhs - gold.rhs, pred.lhs - pred.rhs, precision): # type: ignore
return True
except TimeoutError:
raise
except Exception: # noqa: E722
pass
# Check flipped inequalities (a <= b equals b >= a)
if (
isinstance(gold, GreaterThan)
and isinstance(pred, LessThan)
or isinstance(gold, LessThan)
and isinstance(pred, GreaterThan)
or isinstance(gold, StrictGreaterThan)
and isinstance(pred, StrictLessThan)
or isinstance(gold, StrictLessThan)
and isinstance(pred, StrictGreaterThan)
or isinstance(gold, Eq)
and isinstance(pred, Eq)
) and are_flipped_inequalities_equal(gold, pred):
return True
return False