Sfoglia il codice sorgente

cache divisors / fix ruff

aria1th 1 anno fa
parent
commit
601a7b4ce5

+ 15 - 9
extensions-builtin/hypertile/hypertile.py

@@ -6,7 +6,6 @@ Original author: @tfernd Github: https://github.com/tfernd/HyperTile
 
 from __future__ import annotations
 
-import functools
 from dataclasses import dataclass
 from typing import Callable
 
@@ -189,20 +188,27 @@ DEPTH_LAYERS_XL = {
 
 RNG_INSTANCE = random.Random()
 
-
-def random_divisor(value: int, min_value: int, /, max_options: int = 1) -> int:
+@cache
+def get_divisors(value: int, min_value: int, /, max_options: int = 1) -> list[int]:
     """
-    Returns a random divisor of value that
+    Returns divisors of value that
         x * min_value <= value
-    if max_options is 1, the behavior is deterministic
+    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)
-
-    # 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
+    return ns
+
 
+def random_divisor(value: int, min_value: int, /, max_options: int = 1) -> int:
+    """
+    Returns a random divisor of value that
+        x * min_value <= value
+    if max_options is 1, the behavior is deterministic
+    """
+    ns = get_divisors(value, min_value, max_options=max_options) # get cached divisors
     idx = RNG_INSTANCE.randint(0, len(ns) - 1)
 
     return ns[idx]
@@ -212,7 +218,7 @@ def set_hypertile_seed(seed: int) -> None:
     RNG_INSTANCE.seed(seed)
 
 
-@functools.cache
+@cache
 def largest_tile_size_available(width: int, height: int) -> int:
     """
     Calculates the largest tile size available for a given width and height

+ 1 - 1
extensions-builtin/hypertile/scripts/hypertile_script.py

@@ -75,4 +75,4 @@ def on_ui_settings():
 
 
 script_callbacks.on_ui_settings(on_ui_settings)
-script_callbacks.on_before_ui(add_axis_options)
+script_callbacks.on_before_ui(add_axis_options)

+ 10 - 8
extensions-builtin/hypertile/scripts/hypertile_xyz.py

@@ -1,17 +1,17 @@
 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
 
+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):
     """
     Returns a function that applies the given value to the given value_name in opts.data.
     """
     # convert to int
     def validate(value_name:str, value:str):
-        try:
-            value = int(value)
-        except:
-            raise ValueError(f"Value {value} for {value_name} is not an integer")
+        if not value.isnumeric():
+            raise ValueError(f"Value {value} for {value_name} must be an integer")
+        value = int(value)
         # validate value
         if not min_range == -1:
             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 Swap Size", int, int_applier("hypertile_swap_size_vae", 0, 64)),
     ]
-    # check if the axis options have already been added
-    if any(set(opt.label for opt in extra_axis_options).intersection(set(opt.label for opt in xyz_grid.axis_options))):
+    set_a = 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
-    xyz_grid.axis_options.extend(extra_axis_options)
+
+    xyz_grid.axis_options.extend(extra_axis_options)