Spaces:
Running
on
Zero
Running
on
Zero
import math | |
from typing import Any, Callable, Mapping | |
DEFAULT_FLOAT = ("FLOAT", {"default": 0.0}) | |
FLOAT_UNARY_OPERATIONS: Mapping[str, Callable[[float], float]] = { | |
"Neg": lambda a: -a, | |
"Inc": lambda a: a + 1, | |
"Dec": lambda a: a - 1, | |
"Abs": lambda a: abs(a), | |
"Sqr": lambda a: a * a, | |
"Cube": lambda a: a * a * a, | |
"Sqrt": lambda a: math.sqrt(a), | |
"Exp": lambda a: math.exp(a), | |
"Ln": lambda a: math.log(a), | |
"Log10": lambda a: math.log10(a), | |
"Log2": lambda a: math.log2(a), | |
"Sin": lambda a: math.sin(a), | |
"Cos": lambda a: math.cos(a), | |
"Tan": lambda a: math.tan(a), | |
"Asin": lambda a: math.asin(a), | |
"Acos": lambda a: math.acos(a), | |
"Atan": lambda a: math.atan(a), | |
"Sinh": lambda a: math.sinh(a), | |
"Cosh": lambda a: math.cosh(a), | |
"Tanh": lambda a: math.tanh(a), | |
"Asinh": lambda a: math.asinh(a), | |
"Acosh": lambda a: math.acosh(a), | |
"Atanh": lambda a: math.atanh(a), | |
"Round": lambda a: round(a), | |
"Floor": lambda a: math.floor(a), | |
"Ceil": lambda a: math.ceil(a), | |
"Trunc": lambda a: math.trunc(a), | |
"Erf": lambda a: math.erf(a), | |
"Erfc": lambda a: math.erfc(a), | |
"Gamma": lambda a: math.gamma(a), | |
"Radians": lambda a: math.radians(a), | |
"Degrees": lambda a: math.degrees(a), | |
} | |
FLOAT_UNARY_CONDITIONS: Mapping[str, Callable[[float], bool]] = { | |
"IsZero": lambda a: a == 0.0, | |
"IsPositive": lambda a: a > 0.0, | |
"IsNegative": lambda a: a < 0.0, | |
"IsNonZero": lambda a: a != 0.0, | |
"IsPositiveInfinity": lambda a: math.isinf(a) and a > 0.0, | |
"IsNegativeInfinity": lambda a: math.isinf(a) and a < 0.0, | |
"IsNaN": lambda a: math.isnan(a), | |
"IsFinite": lambda a: math.isfinite(a), | |
"IsInfinite": lambda a: math.isinf(a), | |
"IsEven": lambda a: a % 2 == 0.0, | |
"IsOdd": lambda a: a % 2 != 0.0, | |
} | |
FLOAT_BINARY_OPERATIONS: Mapping[str, Callable[[float, float], float]] = { | |
"Add": lambda a, b: a + b, | |
"Sub": lambda a, b: a - b, | |
"Mul": lambda a, b: a * b, | |
"Div": lambda a, b: a / b, | |
"Mod": lambda a, b: a % b, | |
"Pow": lambda a, b: a**b, | |
"FloorDiv": lambda a, b: a // b, | |
"Max": lambda a, b: max(a, b), | |
"Min": lambda a, b: min(a, b), | |
"Log": lambda a, b: math.log(a, b), | |
"Atan2": lambda a, b: math.atan2(a, b), | |
} | |
FLOAT_BINARY_CONDITIONS: Mapping[str, Callable[[float, float], bool]] = { | |
"Eq": lambda a, b: a == b, | |
"Neq": lambda a, b: a != b, | |
"Gt": lambda a, b: a > b, | |
"Gte": lambda a, b: a >= b, | |
"Lt": lambda a, b: a < b, | |
"Lte": lambda a, b: a <= b, | |
} | |
class FloatUnaryOperation: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": { | |
"op": (list(FLOAT_UNARY_OPERATIONS.keys()),), | |
"a": DEFAULT_FLOAT, | |
} | |
} | |
RETURN_TYPES = ("FLOAT",) | |
FUNCTION = "op" | |
CATEGORY = "math/float" | |
def op(self, op: str, a: float) -> tuple[float]: | |
return (FLOAT_UNARY_OPERATIONS[op](a),) | |
class FloatUnaryCondition: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": { | |
"op": (list(FLOAT_UNARY_CONDITIONS.keys()),), | |
"a": DEFAULT_FLOAT, | |
} | |
} | |
RETURN_TYPES = ("BOOL",) | |
FUNCTION = "op" | |
CATEGORY = "math/float" | |
def op(self, op: str, a: float) -> tuple[bool]: | |
return (FLOAT_UNARY_CONDITIONS[op](a),) | |
class FloatBinaryOperation: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": { | |
"op": (list(FLOAT_BINARY_OPERATIONS.keys()),), | |
"a": DEFAULT_FLOAT, | |
"b": DEFAULT_FLOAT, | |
} | |
} | |
RETURN_TYPES = ("FLOAT",) | |
FUNCTION = "op" | |
CATEGORY = "math/float" | |
def op(self, op: str, a: float, b: float) -> tuple[float]: | |
return (FLOAT_BINARY_OPERATIONS[op](a, b),) | |
class FloatBinaryCondition: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": { | |
"op": (list(FLOAT_BINARY_CONDITIONS.keys()),), | |
"a": DEFAULT_FLOAT, | |
"b": DEFAULT_FLOAT, | |
} | |
} | |
RETURN_TYPES = ("BOOL",) | |
FUNCTION = "op" | |
CATEGORY = "math/float" | |
def op(self, op: str, a: float, b: float) -> tuple[bool]: | |
return (FLOAT_BINARY_CONDITIONS[op](a, b),) | |
NODE_CLASS_MAPPINGS = { | |
"CM_FloatUnaryOperation": FloatUnaryOperation, | |
"CM_FloatUnaryCondition": FloatUnaryCondition, | |
"CM_FloatBinaryOperation": FloatBinaryOperation, | |
"CM_FloatBinaryCondition": FloatBinaryCondition, | |
} | |