cache divisors / fix ruff
This commit is contained in:
parent
23c36f59b4
commit
601a7b4ce5
|
@ -6,7 +6,6 @@ Original author: @tfernd Github: https://github.com/tfernd/HyperTile
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import functools
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
|
@ -189,6 +188,19 @@ DEPTH_LAYERS_XL = {
|
||||||
|
|
||||||
RNG_INSTANCE = random.Random()
|
RNG_INSTANCE = random.Random()
|
||||||
|
|
||||||
|
@cache
|
||||||
|
def get_divisors(value: int, min_value: int, /, max_options: int = 1) -> list[int]:
|
||||||
|
"""
|
||||||
|
Returns divisors of value that
|
||||||
|
x * min_value <= value
|
||||||
|
in big -> small order, amount of divisors is limited by max_options
|
||||||
|
"""
|
||||||
|
max_options = max(1, max_options) # at least 1 option should be returned
|
||||||
|
min_value = min(min_value, value)
|
||||||
|
divisors = [i for i in range(min_value, value + 1) if value % i == 0] # divisors in small -> big order
|
||||||
|
ns = [value // i for i in divisors[:max_options]] # has at least 1 element # big -> small order
|
||||||
|
return ns
|
||||||
|
|
||||||
|
|
||||||
def random_divisor(value: int, min_value: int, /, max_options: int = 1) -> int:
|
def random_divisor(value: int, min_value: int, /, max_options: int = 1) -> int:
|
||||||
"""
|
"""
|
||||||
|
@ -196,13 +208,7 @@ def random_divisor(value: int, min_value: int, /, max_options: int = 1) -> int:
|
||||||
x * min_value <= value
|
x * min_value <= value
|
||||||
if max_options is 1, the behavior is deterministic
|
if max_options is 1, the behavior is deterministic
|
||||||
"""
|
"""
|
||||||
min_value = min(min_value, value)
|
ns = get_divisors(value, min_value, max_options=max_options) # get cached divisors
|
||||||
|
|
||||||
# All big divisors of value (inclusive)
|
|
||||||
divisors = [i for i in range(min_value, value + 1) if value % i == 0] # divisors in small -> big order
|
|
||||||
|
|
||||||
ns = [value // i for i in divisors[:max_options]] # has at least 1 element # big -> small order
|
|
||||||
|
|
||||||
idx = RNG_INSTANCE.randint(0, len(ns) - 1)
|
idx = RNG_INSTANCE.randint(0, len(ns) - 1)
|
||||||
|
|
||||||
return ns[idx]
|
return ns[idx]
|
||||||
|
@ -212,7 +218,7 @@ def set_hypertile_seed(seed: int) -> None:
|
||||||
RNG_INSTANCE.seed(seed)
|
RNG_INSTANCE.seed(seed)
|
||||||
|
|
||||||
|
|
||||||
@functools.cache
|
@cache
|
||||||
def largest_tile_size_available(width: int, height: int) -> int:
|
def largest_tile_size_available(width: int, height: int) -> int:
|
||||||
"""
|
"""
|
||||||
Calculates the largest tile size available for a given width and height
|
Calculates the largest tile size available for a given width and height
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
from modules import scripts
|
from modules import scripts
|
||||||
xyz_grid = [x for x in scripts.scripts_data if x.script_class.__module__ == "xyz_grid.py"][0].module
|
|
||||||
from modules.shared import opts
|
from modules.shared import opts
|
||||||
|
|
||||||
|
xyz_grid = [x for x in scripts.scripts_data if x.script_class.__module__ == "xyz_grid.py"][0].module
|
||||||
|
|
||||||
def int_applier(value_name:str, min_range:int = -1, max_range:int = -1):
|
def int_applier(value_name:str, min_range:int = -1, max_range:int = -1):
|
||||||
"""
|
"""
|
||||||
Returns a function that applies the given value to the given value_name in opts.data.
|
Returns a function that applies the given value to the given value_name in opts.data.
|
||||||
"""
|
"""
|
||||||
# convert to int
|
# convert to int
|
||||||
def validate(value_name:str, value:str):
|
def validate(value_name:str, value:str):
|
||||||
try:
|
if not value.isnumeric():
|
||||||
|
raise ValueError(f"Value {value} for {value_name} must be an integer")
|
||||||
value = int(value)
|
value = int(value)
|
||||||
except:
|
|
||||||
raise ValueError(f"Value {value} for {value_name} is not an integer")
|
|
||||||
# validate value
|
# validate value
|
||||||
if not min_range == -1:
|
if not min_range == -1:
|
||||||
assert value >= min_range, f"Value {value} for {value_name} must be greater than or equal to {min_range}"
|
assert value >= min_range, f"Value {value} for {value_name} must be greater than or equal to {min_range}"
|
||||||
|
@ -46,7 +46,9 @@ def add_axis_options():
|
||||||
xyz_grid.AxisOption("[Hypertile] VAE Max Tile Size", int, int_applier("hypertile_max_tile_vae", 0, 512)),
|
xyz_grid.AxisOption("[Hypertile] VAE Max Tile Size", int, int_applier("hypertile_max_tile_vae", 0, 512)),
|
||||||
xyz_grid.AxisOption("[Hypertile] VAE Swap Size", int, int_applier("hypertile_swap_size_vae", 0, 64)),
|
xyz_grid.AxisOption("[Hypertile] VAE Swap Size", int, int_applier("hypertile_swap_size_vae", 0, 64)),
|
||||||
]
|
]
|
||||||
# check if the axis options have already been added
|
set_a = set([opt.label for opt in xyz_grid.axis_options])
|
||||||
if any(set(opt.label for opt in extra_axis_options).intersection(set(opt.label for opt in xyz_grid.axis_options))):
|
set_b = set([opt.label for opt in extra_axis_options])
|
||||||
|
if set_a.intersection(set_b):
|
||||||
return
|
return
|
||||||
|
|
||||||
xyz_grid.axis_options.extend(extra_axis_options)
|
xyz_grid.axis_options.extend(extra_axis_options)
|
Loading…
Reference in New Issue