dikdimon commited on
Commit
1e9f860
·
verified ·
1 Parent(s): acae818

Update !1-custom-hires-fix-mod-for-automatic1111-2.9.5/scripts/!!custom_hires_fix.py

Browse files
!1-custom-hires-fix-mod-for-automatic1111-2.9.5/scripts/!!custom_hires_fix.py CHANGED
@@ -2376,17 +2376,22 @@ class CustomHiresFix(scripts.Script):
2376
  """
2377
  Вешает временный колбэк на on_cfg_denoiser и снимает его по выходу из контекста.
2378
  На/после limit_steps:
2379
- - выставляет shared.state.interrupt = True (мягко)
2380
  - кидает sd_samplers_common.InterruptedException() (жёстко, как Anti-Burn)
 
 
 
 
2381
  """
2382
  cb_ref = None
2383
  limit_steps = int(max(1, limit_steps))
2384
 
2385
- # Save interrupt state so we can reliably restore it even if we set it ourselves.
 
2386
  try:
2387
- prev_interrupt = bool(getattr(shared.state, "interrupt", False))
2388
  except Exception:
2389
- prev_interrupt = False
2390
 
2391
  try:
2392
  def _cb(params):
@@ -2397,7 +2402,7 @@ class CustomHiresFix(scripts.Script):
2397
  # params.sampling_step обычно 0-based → останавливаем на «человеческом» шаге
2398
  if (int(step) + 1) >= limit_steps:
2399
  try:
2400
- shared.state.interrupt = True # на всякий случай — мягкий флаг
2401
  except Exception:
2402
  pass
2403
  # жёсткий способ, как в Anti-Burn:
@@ -2434,9 +2439,9 @@ class CustomHiresFix(scripts.Script):
2434
  pass
2435
  except Exception as e:
2436
  logger.warning(f"stop-hook remove warning: {e}")
2437
- # Restore interrupt flag to avoid leaking into subsequent generations
2438
  try:
2439
- shared.state.interrupt = prev_interrupt
2440
  except Exception:
2441
  pass
2442
 
@@ -2510,11 +2515,15 @@ class CustomHiresFix(scripts.Script):
2510
  sample = F.interpolate(sample, size=(sh, sw), mode="bicubic", align_corners=False, antialias=True)
2511
  sample = F.interpolate(sample, size=(h, w), mode="bicubic", align_corners=False, antialias=True)
2512
  except TypeError:
2513
- sample = self._interp(sample, size=(sh, sw), _default_mode="bicubic", _config_mode_key="latent_resample_mode_first")
2514
- sample = self._interp(sample, size=(h, w), _default_mode="bicubic", _config_mode_key="latent_resample_mode_first")
 
 
 
 
2515
 
2516
  first_latent = float(self.config.get("first_latent", 0.3))
2517
- if 0.0 <= first_latent <= 1.0:
2518
  invert = bool(self.config.get("first_latent_invert", False)) # NEW
2519
  if invert:
2520
  # Новая семантика: слайдер = вес исходного латента, как на 2-м проходе
 
2376
  """
2377
  Вешает временный колбэк на on_cfg_denoiser и снимает его по выходу из контекста.
2378
  На/после limit_steps:
2379
+ - выставляет shared.state.interrupted = True (мягко)
2380
  - кидает sd_samplers_common.InterruptedException() (жёстко, как Anti-Burn)
2381
+
2382
+ ВАЖНО: используем shared.state.interrupted (bool-флаг), а НЕ
2383
+ shared.state.interrupt (это метод в A1111). Перезапись метода булем
2384
+ ломает кнопку Interrupt в UI с TypeError: 'bool' object is not callable.
2385
  """
2386
  cb_ref = None
2387
  limit_steps = int(max(1, limit_steps))
2388
 
2389
+ # Save interrupted flag so we can reliably restore it even if we set it ourselves.
2390
+ # NB: getattr with bool default — interrupt is a method, interrupted is the flag.
2391
  try:
2392
+ prev_interrupted = bool(getattr(shared.state, "interrupted", False))
2393
  except Exception:
2394
+ prev_interrupted = False
2395
 
2396
  try:
2397
  def _cb(params):
 
2402
  # params.sampling_step обычно 0-based → останавливаем на «человеческом» шаге
2403
  if (int(step) + 1) >= limit_steps:
2404
  try:
2405
+ shared.state.interrupted = True # мягкий флаг
2406
  except Exception:
2407
  pass
2408
  # жёсткий способ, как в Anti-Burn:
 
2439
  pass
2440
  except Exception as e:
2441
  logger.warning(f"stop-hook remove warning: {e}")
2442
+ # Restore interrupted flag to avoid leaking into subsequent generations
2443
  try:
2444
+ shared.state.interrupted = prev_interrupted
2445
  except Exception:
2446
  pass
2447
 
 
2515
  sample = F.interpolate(sample, size=(sh, sw), mode="bicubic", align_corners=False, antialias=True)
2516
  sample = F.interpolate(sample, size=(h, w), mode="bicubic", align_corners=False, antialias=True)
2517
  except TypeError:
2518
+ _s1 = self._interp(sample, size=(sh, sw), _default_mode="bicubic", _config_mode_key="latent_resample_mode_first")
2519
+ if _s1 is not None:
2520
+ sample = _s1
2521
+ _s2 = self._interp(sample, size=(h, w), _default_mode="bicubic", _config_mode_key="latent_resample_mode_first")
2522
+ if _s2 is not None:
2523
+ sample = _s2
2524
 
2525
  first_latent = float(self.config.get("first_latent", 0.3))
2526
+ if x_latent is not None and 0.0 <= first_latent <= 1.0:
2527
  invert = bool(self.config.get("first_latent_invert", False)) # NEW
2528
  if invert:
2529
  # Новая семантика: слайдер = вес исходного латента, как на 2-м проходе