nodeslicer/core/functions/math_functions.py
2026-10-15 14:13:39 +03:00

32 lines
1.2 KiB
Python

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