|
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", |
|
} |
|
|