joeygambino commited on
Commit
da2e131
·
verified ·
1 Parent(s): c3014bb

prune failed churn-experiment hires modes (frozen/faint/converge); dropdown = subtle/medium/strong/spatial with tournament-informed tooltip

Browse files
Files changed (1) hide show
  1. nodes.py +17 -37
nodes.py CHANGED
@@ -1209,17 +1209,17 @@ class JoyEcho_Generate:
1209
  }),
1210
  "hires_denoise": (["subtle (1 step)", "medium (2 steps)",
1211
  "strong (tenstrip 4-step)",
1212
- "subtle (frozen noise, experimental)",
1213
- "faint (1 step from 0.30)",
1214
- "subtle-converge (3 shallow steps)",
1215
  "spatial (LTX latent upsampler, no churn)"], {
1216
  "default": "subtle (1 step)",
1217
- "tooltip": "How deep the refine re-noises. subtle = from sigma 0.42, one "
1218
- "denoise step: adds texture, very faithful to the base. medium "
1219
- "= from 0.725, two steps: more synthesis, more drift risk. "
1220
- "strong = tenstrip's published upscale ladder "
1221
- "(0.92/0.725/0.42, three steps): deepest synthesis - only "
1222
- "sensible now that all windows share one per-shot noise field.",
 
 
 
1223
  }),
1224
  },
1225
  }
@@ -1966,16 +1966,10 @@ class JoyEcho_Generate:
1966
  SIGMA_TAILS = {"subtle": [0.421875, 0.0], "medium": [0.725, 0.421875, 0.0],
1967
  # tenstrip's published UPSCALE ladder (HF, ~Jul 1) -
1968
  # purpose-built for a refine pass, unlike the generation
1969
- # tails above.
1970
- "strong": [0.92, 0.725, 0.421875, 0.0],
1971
- # churn experiments (2026-07-23): depth worsens per-frame
1972
- # detail churn monotonically, so these go SHALLOWER.
1973
- # faint = less noise in, less residue out.
1974
- # subtle-converge = extra steps confined to the shallow
1975
- # range, with re-corruption REUSING the initial noise
1976
- # field (randomness enters once; steps only converge).
1977
- "faint": [0.30, 0.0],
1978
- "subtle-converge": [0.421875, 0.28, 0.14, 0.0]}
1979
  sigmas = SIGMA_TAILS.get(str(mode).split()[0].lower(), SIGMA_TAILS["subtle"])
1980
  base_h, base_w = int(frames_list[0].shape[1]), int(frames_list[0].shape[2])
1981
  th = max(32, int(round(base_h * factor / 32.0)) * 32)
@@ -2097,17 +2091,7 @@ class JoyEcho_Generate:
2097
  # multiples of (WIN-OVL)=24 pixel frames = 3 latent frames,
2098
  # so overlapping windows land on the same global indices.
2099
  ls = min(int(round(s / 8.0)), shot_fields["v"][0].shape[1] - Fl)
2100
- # "frozen noise" (experimental): one spatial noise pattern
2101
- # repeated for every VIDEO latent frame, so the single-step
2102
- # residue becomes a static grain plate instead of per-frame
2103
- # detail churn. Audio noise stays per-frame (refined audio
2104
- # is discarded anyway).
2105
- _frozen = "frozen" in str(mode).lower()
2106
- if _frozen:
2107
- nv = shot_fields["v"][0][:, :1].repeat(1, Fl, 1, 1, 1).to(
2108
- device=device, dtype=_dt)
2109
- else:
2110
- nv = shot_fields["v"][0][:, ls:ls + Fl].to(device=device, dtype=_dt)
2111
  na = shot_fields["a"][0][:, a0:a0 + Fa_w].to(device=device, dtype=_dt)
2112
  s0 = torch.full((1, Fl), sigmas[0])
2113
  sa0 = torch.full((1, Fa_w), sigmas[0])
@@ -2126,14 +2110,10 @@ class JoyEcho_Generate:
2126
  if nxt > 0:
2127
  # re-corruption noise from the step's shared field,
2128
  # same global slice - never randn_like (that was
2129
- # fresh unseeded noise per window per step in v1).
2130
- # converge mode reuses the INITIAL field every step:
2131
- # randomness enters once, further steps only pull
2132
- # structure toward a consistent answer.
2133
- _ev = 0 if "converge" in str(mode).lower() else i_s + 1
2134
- fnv = shot_fields["v"][_ev][:, ls:ls + Fl].to(
2135
  device=device, dtype=_dt)
2136
- fna = shot_fields["a"][_ev][:, a0:a0 + Fa_w].to(
2137
  device=device, dtype=_dt)
2138
  nvs = nxt * torch.ones((1, Fl), device=device)
2139
  nas = nxt * torch.ones((1, Fa_w), device=device)
 
1209
  }),
1210
  "hires_denoise": (["subtle (1 step)", "medium (2 steps)",
1211
  "strong (tenstrip 4-step)",
 
 
 
1212
  "spatial (LTX latent upsampler, no churn)"], {
1213
  "default": "subtle (1 step)",
1214
+ "tooltip": "How the hires pass works. The three refine modes re-noise and "
1215
+ "re-denoise at target res - they SYNTHESIZE real detail but "
1216
+ "reshuffle fine texture slightly per frame (subtle = sigma 0.42 "
1217
+ "one step, most faithful; medium = 0.725 two steps; strong = "
1218
+ "tenstrip's 0.92/0.725/0.42 ladder, deepest). spatial = the LTX "
1219
+ "latent upsampler on the shot's own latents: deterministic, "
1220
+ "zero temporal churn, fixed 1.5x (hires_factor just enables "
1221
+ "it) - use heights whose /32 is EVEN (768, not 736) or it "
1222
+ "smears one edge.",
1223
  }),
1224
  },
1225
  }
 
1966
  SIGMA_TAILS = {"subtle": [0.421875, 0.0], "medium": [0.725, 0.421875, 0.0],
1967
  # tenstrip's published UPSCALE ladder (HF, ~Jul 1) -
1968
  # purpose-built for a refine pass, unlike the generation
1969
+ # tails above. (Shallower/frozen/reused-noise variants
1970
+ # were tested 2026-07-23 and removed: none reduced the
1971
+ # per-frame detail churn - see project notes.)
1972
+ "strong": [0.92, 0.725, 0.421875, 0.0]}
 
 
 
 
 
 
1973
  sigmas = SIGMA_TAILS.get(str(mode).split()[0].lower(), SIGMA_TAILS["subtle"])
1974
  base_h, base_w = int(frames_list[0].shape[1]), int(frames_list[0].shape[2])
1975
  th = max(32, int(round(base_h * factor / 32.0)) * 32)
 
2091
  # multiples of (WIN-OVL)=24 pixel frames = 3 latent frames,
2092
  # so overlapping windows land on the same global indices.
2093
  ls = min(int(round(s / 8.0)), shot_fields["v"][0].shape[1] - Fl)
2094
+ nv = shot_fields["v"][0][:, ls:ls + Fl].to(device=device, dtype=_dt)
 
 
 
 
 
 
 
 
 
 
2095
  na = shot_fields["a"][0][:, a0:a0 + Fa_w].to(device=device, dtype=_dt)
2096
  s0 = torch.full((1, Fl), sigmas[0])
2097
  sa0 = torch.full((1, Fa_w), sigmas[0])
 
2110
  if nxt > 0:
2111
  # re-corruption noise from the step's shared field,
2112
  # same global slice - never randn_like (that was
2113
+ # fresh unseeded noise per window per step in v1)
2114
+ fnv = shot_fields["v"][i_s + 1][:, ls:ls + Fl].to(
 
 
 
 
2115
  device=device, dtype=_dt)
2116
+ fna = shot_fields["a"][i_s + 1][:, a0:a0 + Fa_w].to(
2117
  device=device, dtype=_dt)
2118
  nvs = nxt * torch.ones((1, Fl), device=device)
2119
  nas = nxt * torch.ones((1, Fa_w), device=device)