def sympy_compare_relational()

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