in src/sal/utils/math.py [0:0]
def memoized_canonical_form(expression: str, timeout_seconds: int = 3) -> str:
"""
Compute a canonical form for a mathematical expression using sympy.
Uses a shared cache across processes for memoization.
Args:
expression (str): A LaTeX-formatted mathematical expression.
timeout_seconds (int): Timeout duration in seconds.
Returns:
str: The canonical form of the expression or the original expression as fallback.
"""
# Check if the result is already cached
if expression in shared_cache:
return shared_cache[expression]
try:
# Set up the timeout handler
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(timeout_seconds)
# Parse and simplify the mathematical expression
parsed_expr = latex2sympy(expression)
simplified_expr = simplify(parsed_expr)
# Reset the alarm
signal.alarm(0)
canonical_form = latex(simplified_expr) # Convert back to a string
shared_cache[expression] = canonical_form # Cache the result
return canonical_form
except TimeoutException:
# Fallback: Use a stripped version of the input on timeout
fallback = strip_string(expression)
shared_cache[expression] = fallback # Cache the fallback result
return fallback
except Exception:
# Fallback: Use a stripped version of the input on other errors
fallback = strip_string(expression)
shared_cache[expression] = fallback # Cache the fallback result
return fallback
finally:
# Ensure the alarm is turned off
signal.alarm(0)