| import re
|
| import torch
|
|
|
| class TestIntConditions:
|
| def __init__(self):
|
| pass
|
|
|
| @classmethod
|
| def INPUT_TYPES(cls):
|
| return {
|
| "required": {
|
| "a": ("INT", {"default": 0, "min": -0xffffffffffffffff, "max": 0xffffffffffffffff, "step": 1}),
|
| "b": ("INT", {"default": 0, "min": -0xffffffffffffffff, "max": 0xffffffffffffffff, "step": 1}),
|
| "operation": (["==", "!=", "<", ">", "<=", ">="],),
|
| },
|
| }
|
|
|
| RETURN_TYPES = ("BOOLEAN",)
|
| FUNCTION = "int_condition"
|
|
|
| CATEGORY = "Testing/Logic"
|
|
|
| def int_condition(self, a, b, operation):
|
| if operation == "==":
|
| return (a == b,)
|
| elif operation == "!=":
|
| return (a != b,)
|
| elif operation == "<":
|
| return (a < b,)
|
| elif operation == ">":
|
| return (a > b,)
|
| elif operation == "<=":
|
| return (a <= b,)
|
| elif operation == ">=":
|
| return (a >= b,)
|
|
|
|
|
| class TestFloatConditions:
|
| def __init__(self):
|
| pass
|
|
|
| @classmethod
|
| def INPUT_TYPES(cls):
|
| return {
|
| "required": {
|
| "a": ("FLOAT", {"default": 0, "min": -999999999999.0, "max": 999999999999.0, "step": 1}),
|
| "b": ("FLOAT", {"default": 0, "min": -999999999999.0, "max": 999999999999.0, "step": 1}),
|
| "operation": (["==", "!=", "<", ">", "<=", ">="],),
|
| },
|
| }
|
|
|
| RETURN_TYPES = ("BOOLEAN",)
|
| FUNCTION = "float_condition"
|
|
|
| CATEGORY = "Testing/Logic"
|
|
|
| def float_condition(self, a, b, operation):
|
| if operation == "==":
|
| return (a == b,)
|
| elif operation == "!=":
|
| return (a != b,)
|
| elif operation == "<":
|
| return (a < b,)
|
| elif operation == ">":
|
| return (a > b,)
|
| elif operation == "<=":
|
| return (a <= b,)
|
| elif operation == ">=":
|
| return (a >= b,)
|
|
|
| class TestStringConditions:
|
| def __init__(self):
|
| pass
|
|
|
| @classmethod
|
| def INPUT_TYPES(cls):
|
| return {
|
| "required": {
|
| "a": ("STRING", {"multiline": False}),
|
| "b": ("STRING", {"multiline": False}),
|
| "operation": (["a == b", "a != b", "a IN b", "a MATCH REGEX(b)", "a BEGINSWITH b", "a ENDSWITH b"],),
|
| "case_sensitive": ("BOOLEAN", {"default": True}),
|
| },
|
| }
|
|
|
| RETURN_TYPES = ("BOOLEAN",)
|
| FUNCTION = "string_condition"
|
|
|
| CATEGORY = "Testing/Logic"
|
|
|
| def string_condition(self, a, b, operation, case_sensitive):
|
| if not case_sensitive:
|
| a = a.lower()
|
| b = b.lower()
|
|
|
| if operation == "a == b":
|
| return (a == b,)
|
| elif operation == "a != b":
|
| return (a != b,)
|
| elif operation == "a IN b":
|
| return (a in b,)
|
| elif operation == "a MATCH REGEX(b)":
|
| try:
|
| return (re.match(b, a) is not None,)
|
| except:
|
| return (False,)
|
| elif operation == "a BEGINSWITH b":
|
| return (a.startswith(b),)
|
| elif operation == "a ENDSWITH b":
|
| return (a.endswith(b),)
|
|
|
| class TestToBoolNode:
|
| def __init__(self):
|
| pass
|
|
|
| @classmethod
|
| def INPUT_TYPES(cls):
|
| return {
|
| "required": {
|
| "value": ("*",),
|
| },
|
| "optional": {
|
| "invert": ("BOOLEAN", {"default": False}),
|
| },
|
| }
|
|
|
| RETURN_TYPES = ("BOOLEAN",)
|
| FUNCTION = "to_bool"
|
|
|
| CATEGORY = "Testing/Logic"
|
|
|
| def to_bool(self, value, invert = False):
|
| if isinstance(value, torch.Tensor):
|
| if value.max().item() == 0 and value.min().item() == 0:
|
| result = False
|
| else:
|
| result = True
|
| else:
|
| try:
|
| result = bool(value)
|
| except:
|
|
|
| result = True
|
|
|
| if invert:
|
| result = not result
|
|
|
| return (result,)
|
|
|
| class TestBoolOperationNode:
|
| def __init__(self):
|
| pass
|
|
|
| @classmethod
|
| def INPUT_TYPES(cls):
|
| return {
|
| "required": {
|
| "a": ("BOOLEAN",),
|
| "b": ("BOOLEAN",),
|
| "op": (["a AND b", "a OR b", "a XOR b", "NOT a"],),
|
| },
|
| }
|
|
|
| RETURN_TYPES = ("BOOLEAN",)
|
| FUNCTION = "bool_operation"
|
|
|
| CATEGORY = "Testing/Logic"
|
|
|
| def bool_operation(self, a, b, op):
|
| if op == "a AND b":
|
| return (a and b,)
|
| elif op == "a OR b":
|
| return (a or b,)
|
| elif op == "a XOR b":
|
| return (a ^ b,)
|
| elif op == "NOT a":
|
| return (not a,)
|
|
|
|
|
| CONDITION_NODE_CLASS_MAPPINGS = {
|
| "TestIntConditions": TestIntConditions,
|
| "TestFloatConditions": TestFloatConditions,
|
| "TestStringConditions": TestStringConditions,
|
| "TestToBoolNode": TestToBoolNode,
|
| "TestBoolOperationNode": TestBoolOperationNode,
|
| }
|
|
|
| CONDITION_NODE_DISPLAY_NAME_MAPPINGS = {
|
| "TestIntConditions": "Int Condition",
|
| "TestFloatConditions": "Float Condition",
|
| "TestStringConditions": "String Condition",
|
| "TestToBoolNode": "To Bool",
|
| "TestBoolOperationNode": "Bool Operation",
|
| }
|
|
|