Spaces:
Running
on
Zero
Running
on
Zero
import math | |
from typing import Any, Callable, Mapping | |
DEFAULT_INT = ("INT", {"default": 0}) | |
INT_UNARY_OPERATIONS: Mapping[str, Callable[[int], int]] = { | |
"Abs": lambda a: abs(a), | |
"Neg": lambda a: -a, | |
"Inc": lambda a: a + 1, | |
"Dec": lambda a: a - 1, | |
"Sqr": lambda a: a * a, | |
"Cube": lambda a: a * a * a, | |
"Not": lambda a: ~a, | |
"Factorial": lambda a: math.factorial(a), | |
} | |
INT_UNARY_CONDITIONS: Mapping[str, Callable[[int], bool]] = { | |
"IsZero": lambda a: a == 0, | |
"IsNonZero": lambda a: a != 0, | |
"IsPositive": lambda a: a > 0, | |
"IsNegative": lambda a: a < 0, | |
"IsEven": lambda a: a % 2 == 0, | |
"IsOdd": lambda a: a % 2 == 1, | |
} | |
INT_BINARY_OPERATIONS: Mapping[str, Callable[[int, int], int]] = { | |
"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, | |
"And": lambda a, b: a & b, | |
"Nand": lambda a, b: ~a & b, | |
"Or": lambda a, b: a | b, | |
"Nor": lambda a, b: ~a & b, | |
"Xor": lambda a, b: a ^ b, | |
"Xnor": lambda a, b: ~a ^ b, | |
"Shl": lambda a, b: a << b, | |
"Shr": lambda a, b: a >> b, | |
"Max": lambda a, b: max(a, b), | |
"Min": lambda a, b: min(a, b), | |
} | |
INT_BINARY_CONDITIONS: Mapping[str, Callable[[int, int], bool]] = { | |
"Eq": lambda a, b: a == b, | |
"Neq": lambda a, b: a != b, | |
"Gt": lambda a, b: a > b, | |
"Lt": lambda a, b: a < b, | |
"Geq": lambda a, b: a >= b, | |
"Leq": lambda a, b: a <= b, | |
} | |
class IntUnaryOperation: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": {"op": (list(INT_UNARY_OPERATIONS.keys()),), "a": DEFAULT_INT} | |
} | |
RETURN_TYPES = ("INT",) | |
FUNCTION = "op" | |
CATEGORY = "math/int" | |
def op(self, op: str, a: int) -> tuple[int]: | |
return (INT_UNARY_OPERATIONS[op](a),) | |
class IntUnaryCondition: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": {"op": (list(INT_UNARY_CONDITIONS.keys()),), "a": DEFAULT_INT} | |
} | |
RETURN_TYPES = ("BOOL",) | |
FUNCTION = "op" | |
CATEGORY = "math/int" | |
def op(self, op: str, a: int) -> tuple[bool]: | |
return (INT_UNARY_CONDITIONS[op](a),) | |
class IntBinaryOperation: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": { | |
"op": (list(INT_BINARY_OPERATIONS.keys()),), | |
"a": DEFAULT_INT, | |
"b": DEFAULT_INT, | |
} | |
} | |
RETURN_TYPES = ("INT",) | |
FUNCTION = "op" | |
CATEGORY = "math/int" | |
def op(self, op: str, a: int, b: int) -> tuple[int]: | |
return (INT_BINARY_OPERATIONS[op](a, b),) | |
class IntBinaryCondition: | |
def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
return { | |
"required": { | |
"op": (list(INT_BINARY_CONDITIONS.keys()),), | |
"a": DEFAULT_INT, | |
"b": DEFAULT_INT, | |
} | |
} | |
RETURN_TYPES = ("BOOL",) | |
FUNCTION = "op" | |
CATEGORY = "math/int" | |
def op(self, op: str, a: int, b: int) -> tuple[bool]: | |
return (INT_BINARY_CONDITIONS[op](a, b),) | |
NODE_CLASS_MAPPINGS = { | |
"CM_IntUnaryOperation": IntUnaryOperation, | |
"CM_IntUnaryCondition": IntUnaryCondition, | |
"CM_IntBinaryOperation": IntBinaryOperation, | |
"CM_IntBinaryCondition": IntBinaryCondition, | |
} | |