in src/lighteval/metrics/utils/math_comparison.py [0:0]
def sympy_deep_compare_set_and_tuple(gold: FiniteSet | Tuple, pred: FiniteSet | Tuple, precision: int) -> bool:
"""Compare two finite sets by comparing each element with given precision.
Args:
a: First finite set
b: Second finite set
precision: Number of decimal places to compare
Returns:
True if sets contain equal elements within precision, False otherwise
Note: in order to fully support finite sets, we should ideally do kartesian product comparison
but this is not implemented yet. We kinda hope sympy will order the elements.
"""
from latex2sympy2_extended.sets import FiniteSet as L2SFiniteSet
def unwrap_eq(s):
if is_assignment_relation(s):
return take_last_relation(s).rhs
return s
def sort_key(x):
try:
return default_sort_key(unwrap_eq(x).evalf())
except TimeoutError:
raise
except Exception: # noqa: E722
return default_sort_key(unwrap_eq(x))
# This ensures it works for {1/3} and {0.333333}
if len(gold) == len(pred):
if isinstance(gold, FiniteSet):
gold_args = list(ordered(gold.args, keys=sort_key, default=False))
pred_args = list(ordered(pred.args, keys=sort_key, default=False))
elif isinstance(gold, Tuple) and isinstance(pred, L2SFiniteSet):
# We treat the pred as tuple too
pred_args = pred._unsorted_args
gold_args = gold.args
elif isinstance(pred, FiniteSet):
pred_args = list(ordered(pred.args, keys=sort_key, default=False))
gold_args = gold.args
else:
gold_args = gold.args
pred_args = pred.args
return all(sympy_expr_eq(a, b, precision) for a, b in zip(gold_args, pred_args))
return False