114 lines
4.2 KiB
Python
114 lines
4.2 KiB
Python
# Advanced Sequence Seed Generator
|
|
# Created by AI Wiz Art (Stefano Flore)
|
|
# Version: 1.0
|
|
# https://stefanoflore.it
|
|
# https://ai-wiz.art
|
|
|
|
import random
|
|
import math
|
|
from server import PromptServer
|
|
|
|
class AdvancedSequenceSeedNode:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"sequence_type": (["Fibonacci", "Prime", "Padovan", "Triangular", "Catalan", "Pell", "Lucas"],),
|
|
"max_sequence_length": ("INT", {"default": 20, "min": 2, "max": 1000}),
|
|
"seed_range_start": ("INT", {"default": 0, "min": 0, "max": 999}),
|
|
"seed_range_end": ("INT", {"default": 19, "min": 1, "max": 1000}),
|
|
"force_recalculation": ("BOOLEAN", {"default": True}),
|
|
"current_seed": ("INT", {"default": 0, "min": 0, "max": 9999999999, "step": 1}),
|
|
},
|
|
"optional": {
|
|
"noise_factor": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("INT",)
|
|
FUNCTION = "generate_seed"
|
|
CATEGORY = "AI WizArt"
|
|
OUTPUT_NODE = True
|
|
|
|
def generate_sequence(self, sequence_type, length):
|
|
if sequence_type == "Fibonacci":
|
|
sequence = [0, 1]
|
|
while len(sequence) < length:
|
|
sequence.append(sequence[-1] + sequence[-2])
|
|
elif sequence_type == "Prime":
|
|
sequence = self.generate_primes(length)
|
|
elif sequence_type == "Padovan":
|
|
sequence = [1, 1, 1]
|
|
while len(sequence) < length:
|
|
sequence.append(sequence[-2] + sequence[-3])
|
|
elif sequence_type == "Triangular":
|
|
sequence = [n * (n + 1) // 2 for n in range(1, length + 1)]
|
|
elif sequence_type == "Catalan":
|
|
sequence = [1]
|
|
for n in range(1, length):
|
|
c = sequence[-1] * 2 * (2 * n - 1) // (n + 1)
|
|
sequence.append(c)
|
|
elif sequence_type == "Pell":
|
|
sequence = [0, 1]
|
|
while len(sequence) < length:
|
|
sequence.append(2 * sequence[-1] + sequence[-2])
|
|
elif sequence_type == "Lucas":
|
|
sequence = [2, 1]
|
|
while len(sequence) < length:
|
|
sequence.append(sequence[-1] + sequence[-2])
|
|
|
|
return sequence
|
|
|
|
def generate_primes(self, length):
|
|
primes = []
|
|
n = 2
|
|
while len(primes) < length:
|
|
if self.is_prime(n):
|
|
primes.append(n)
|
|
n += 1
|
|
return primes
|
|
|
|
def is_prime(self, n):
|
|
if n < 2:
|
|
return False
|
|
for i in range(2, int(math.sqrt(n)) + 1):
|
|
if n % i == 0:
|
|
return False
|
|
return True
|
|
|
|
def generate_seed(self, sequence_type, max_sequence_length, seed_range_start, seed_range_end, force_recalculation, current_seed, noise_factor=0.0):
|
|
if force_recalculation or current_seed == 0:
|
|
sequence = self.generate_sequence(sequence_type, max_sequence_length)
|
|
valid_range = sequence[seed_range_start:min(seed_range_end+1, len(sequence))]
|
|
|
|
if not valid_range:
|
|
raise ValueError("Invalid range specified for the sequence")
|
|
|
|
random_index = random.randint(0, len(valid_range) - 1)
|
|
seed = valid_range[random_index]
|
|
else:
|
|
seed = current_seed
|
|
|
|
if noise_factor > 0:
|
|
noise = random.uniform(-noise_factor, noise_factor) * seed
|
|
seed = int(seed + noise)
|
|
|
|
print(f"Generated seed from {sequence_type} sequence: {seed}")
|
|
print(f"Force recalculation: {'On' if force_recalculation else 'Off'}")
|
|
|
|
PromptServer.instance.send_sync("example.advanced_sequence_seed.update", {"seed": seed})
|
|
return (seed,)
|
|
|
|
@classmethod
|
|
def IS_CHANGED(cls, force_recalculation, current_seed, **kwargs):
|
|
if force_recalculation or current_seed == 0:
|
|
return float("NaN")
|
|
return ""
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
"AdvancedSequenceSeedNode": AdvancedSequenceSeedNode
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"AdvancedSequenceSeedNode": "Advanced Sequence Seed Generator"
|
|
} |