from __future__ import annotations from typing import Any MATH_OPERATIONS: dict[str, Any] = { 'ADD': lambda a, b, t: a + b, 'SUBTRACT': lambda a, b, t: a - b, 'MULTIPLY': lambda a, b, t: a * b, 'DIVIDE': lambda a, b, t: a / b if b != 0 else 0, 'ABS': lambda a, b, t: abs(a), 'NEGATE': lambda a, b, t: -a, 'POWER': lambda a, b, t: t(a ** b) if not (a == 0 and b < 0) else 0, 'MIN': lambda a, b, t: min(a, b), 'MAX': lambda a, b, t: max(a, b), 'SIGN': lambda a, b, t: (a > 0) - (a < 0), 'DIVIDE_ROUND': lambda a, b, t: t(round(a / b)) if b != 0 else 0, 'DIVIDE_FLOOR': lambda a, b, t: a // b if b != 0 else 0, 'DIVIDE_TRUNCATE': lambda a, b, t: t(a / b) if b != 0 else 0, 'MODULO_FLOORED': lambda a, b, t: a % b if b != 0 else 0, 'MODULO_TRUNCATED': lambda a, b, t: a - (b * t(a / b)) if b != 0 else 0, } def evaluate_math_operation(operation: str, val_a: Any, val_b: Any, math_type: type = float) -> Any: op_fn = MATH_OPERATIONS.get(operation) if not op_fn: return 0 try: a_num = math_type(val_a if val_a is not None else 0) b_num = math_type(val_b if val_b is not None else 0) return op_fn(a_num, b_num, math_type) except Exception: return 0