wuff-mann commited on
Commit
c6d30f0
·
1 Parent(s): 40bf83b

Delete WaveSemanticHybridCodec

Browse files
Files changed (38) hide show
  1. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/WaveSemanticHybridCodec_Exp2B.py +0 -414
  2. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/WaveSemanticHybridCodec_Exp2B_best.pt +0 -3
  3. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/CACHEDIR.TAG +0 -4
  4. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/blobs/9c4623c05be35b459d1790ec4e93fa447c7a0dc5 +0 -348
  5. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/refs/main +0 -1
  6. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/snapshots/a91a365a49141913cfeeeb18d1be8074730e06c9/CNN.py +0 -348
  7. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/snapshots/a91a365a49141913cfeeeb18d1be8074730e06c9/__pycache__/CNN.cpython-312.pyc +0 -0
  8. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c12_causal.pt +0 -3
  9. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c4_causal.pt +0 -3
  10. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c8_causal.pt +0 -3
  11. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_semantic_decoder_exp2b_base.pt +0 -3
  12. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/cache/cache_meta_exp2b.json +0 -12
  13. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/cache/front.u8 +0 -3
  14. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/cache/parts.u8 +0 -3
  15. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_capacity_summary.csv +0 -4
  16. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_casewise_summary.csv +0 -36
  17. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_code_audit_bars.png +0 -0
  18. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_condition_full_prior_summary.csv +0 -8
  19. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_condition_part_summary.csv +0 -16
  20. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_training_history.csv +0 -21
  21. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c4_causal.pt +0 -3
  22. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c8_causal.pt +0 -3
  23. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_semantic_decoder_exp2b_base.pt +0 -3
  24. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c12_causal_manual.pt +0 -3
  25. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c4_causal_manual.pt +0 -3
  26. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c8_causal_manual.pt +0 -3
  27. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_semantic_decoder.pt +0 -3
  28. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/experiment2b_decision.json +0 -28
  29. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latent_utilization_diagnostics.csv +0 -4
  30. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c12_causal.pt +0 -3
  31. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c12_causal_manual.pt +0 -3
  32. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c4_causal.pt +0 -3
  33. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c4_causal_manual.pt +0 -3
  34. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c8_causal.pt +0 -3
  35. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c8_causal_manual.pt +0 -3
  36. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_semantic_decoder.pt +0 -3
  37. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/model_summary_exp2b.json +0 -87
  38. WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/pca_oracle_capacity.png +0 -0
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/WaveSemanticHybridCodec_Exp2B.py DELETED
@@ -1,414 +0,0 @@
1
- """
2
- ICWDS WaveSemanticHybridCodec — Experiment 2
3
- =============================================
4
- Semantic Backbone + Learned Shape Residual Code capacity/rate probe.
5
-
6
- This experiment deliberately uses deterministic semantic extraction only.
7
- It compares three learned residual-shape bottlenecks under the same semantic
8
- backbone and the same shape-refiner architecture:
9
-
10
- 1) continuous4 : 4-D continuous shape code (capacity reference)
11
- 2) vq64 : one learned 64-entry vector codebook (6 bit / wave)
12
- 3) rvq2x32 : two learned 32-entry residual codebooks (10 bit / wave)
13
-
14
- There is no background residual codec, 30-byte packet allocator, LDM, or
15
- ControlNet in Experiment 2. The purpose is to isolate the extra information
16
- needed beyond the deterministic physical semantic backbone.
17
- """
18
-
19
- import math
20
- from dataclasses import dataclass, asdict
21
- from typing import Dict, Optional
22
-
23
- import torch
24
- import torch.nn as nn
25
- import torch.nn.functional as F
26
-
27
-
28
- @dataclass
29
- class SemanticShapeExp2Config:
30
- n_freqs: int = 47
31
- n_dirs: int = 72
32
- semantic_dim: int = 9
33
- width: int = 48
34
- shape_feature_dim: int = 32
35
- continuous_dim: int = 4
36
- vq_size: int = 64
37
- rvq_stages: int = 2
38
- rvq_size: int = 32
39
- vq_commitment: float = 0.25
40
- code_width: int = 32
41
- max_residual_log: float = 0.75
42
-
43
- def to_dict(self):
44
- return asdict(self)
45
-
46
-
47
- class ResBlock(nn.Module):
48
- def __init__(self, ch: int):
49
- super().__init__()
50
- self.net = nn.Sequential(
51
- nn.Conv2d(ch, ch, 3, padding=1, bias=False),
52
- nn.GroupNorm(min(8, ch), ch),
53
- nn.GELU(),
54
- nn.Conv2d(ch, ch, 3, padding=1, bias=False),
55
- nn.GroupNorm(min(8, ch), ch),
56
- )
57
- self.act = nn.GELU()
58
-
59
- def forward(self, x):
60
- return self.act(x + self.net(x))
61
-
62
-
63
- class CircularConv2d(nn.Module):
64
- """3x3 conv: circular padding in direction, replicate in frequency."""
65
- def __init__(self, ci: int, co: int, stride: int = 1, bias: bool = False):
66
- super().__init__()
67
- self.conv = nn.Conv2d(ci, co, 3, stride=stride, padding=0, bias=bias)
68
-
69
- def forward(self, x):
70
- x = torch.cat([x[..., -1:], x, x[..., :1]], dim=-1)
71
- x = F.pad(x, (0, 0, 1, 1), mode="replicate")
72
- return self.conv(x)
73
-
74
-
75
- def coordinate_channels(batch: int, nf: int, nd: int, device, dtype):
76
- f = torch.linspace(0, 1, nf, device=device, dtype=dtype).view(1, 1, nf, 1)
77
- f = f.expand(batch, 1, nf, nd)
78
- th = torch.linspace(0, 2 * math.pi, nd + 1, device=device, dtype=dtype)[:nd]
79
- th = th.view(1, 1, 1, nd).expand(batch, 1, nf, nd)
80
- return torch.cat([f, torch.sin(th), torch.cos(th)], dim=1)
81
-
82
-
83
- @torch.no_grad()
84
- def deterministic_semantics(parts: torch.Tensor) -> torch.Tensor:
85
- """Compute 9-D internal semantic code from wave-system parts.
86
-
87
- Logical packet fields remain eight:
88
- energy, peak frequency, peak direction, frequency spread,
89
- direction spread, f-theta correlation, frequency skew, direction skew.
90
- Peak direction is represented internally by sin/cos.
91
- """
92
- leading = parts.shape[:-2]
93
- H, W = parts.shape[-2:]
94
- E = parts.reshape(-1, H, W).clamp_min(0)
95
- N = E.shape[0]
96
- eps = 1e-8
97
-
98
- mass = E.sum(dim=(1, 2)).clamp_min(eps)
99
- log_energy = torch.log1p(mass) / math.log1p(float(H * W))
100
-
101
- flat = E.reshape(N, -1)
102
- peak_idx = flat.argmax(dim=-1)
103
- peak_f = (peak_idx // W).float() / max(H - 1, 1)
104
- peak_theta = (peak_idx % W).float() / W * 2 * math.pi
105
- sin_p = torch.sin(peak_theta)
106
- cos_p = torch.cos(peak_theta)
107
-
108
- f = torch.linspace(0, 1, H, device=E.device, dtype=E.dtype).view(1, H, 1)
109
- theta = torch.linspace(0, 2 * math.pi, W + 1, device=E.device, dtype=E.dtype)[:W]
110
- theta = theta.view(1, 1, W)
111
-
112
- df = f - peak_f[:, None, None]
113
- dt = torch.atan2(
114
- torch.sin(theta - peak_theta[:, None, None]),
115
- torch.cos(theta - peak_theta[:, None, None]),
116
- ) / math.pi
117
-
118
- var_f = (E * df.square()).sum(dim=(1, 2)) / mass
119
- var_t = (E * dt.square()).sum(dim=(1, 2)) / mass
120
- sigma_f = torch.sqrt(var_f.clamp_min(0)).clamp(0.008, 0.35)
121
- sigma_t = torch.sqrt(var_t.clamp_min(0)).clamp(0.015, 0.65)
122
-
123
- cov = (E * df * dt).sum(dim=(1, 2)) / mass
124
- rho = (cov / (sigma_f * sigma_t + eps)).clamp(-0.95, 0.95)
125
-
126
- m3f = (E * df.pow(3)).sum(dim=(1, 2)) / mass
127
- m3t = (E * dt.pow(3)).sum(dim=(1, 2)) / mass
128
- skew_f = torch.tanh(m3f / (3.0 * sigma_f.pow(3) + eps))
129
- skew_t = torch.tanh(m3t / (3.0 * sigma_t.pow(3) + eps))
130
-
131
- sem = torch.stack(
132
- [log_energy, peak_f, sin_p, cos_p, sigma_f, sigma_t, rho, skew_f, skew_t],
133
- dim=-1,
134
- )
135
- return sem.view(*leading, 9)
136
-
137
-
138
- class AnalyticSkewRenderer(nn.Module):
139
- def __init__(self, cfg: Optional[SemanticShapeExp2Config] = None):
140
- super().__init__()
141
- self.cfg = cfg or SemanticShapeExp2Config()
142
- nf, nd = self.cfg.n_freqs, self.cfg.n_dirs
143
- self.register_buffer("fcoord", torch.linspace(0, 1, nf).view(1, nf, 1))
144
- th = torch.linspace(0, 2 * math.pi, nd + 1)[:nd].view(1, 1, nd)
145
- self.register_buffer("theta", th)
146
-
147
- def forward(self, sem: torch.Tensor) -> torch.Tensor:
148
- leading = sem.shape[:-1]
149
- s = sem.reshape(-1, 9)
150
- log_e = s[:, 0]
151
- f0 = s[:, 1]
152
- th0 = torch.atan2(s[:, 2], s[:, 3])
153
- sf = s[:, 4].clamp(0.008, 0.35)
154
- st = s[:, 5].clamp(0.015, 0.65)
155
- rho = s[:, 6].clamp(-0.95, 0.95)
156
- skew_f = s[:, 7]
157
- skew_t = s[:, 8]
158
-
159
- df = (self.fcoord - f0[:, None, None]) / sf[:, None, None]
160
- dth = torch.atan2(
161
- torch.sin(self.theta - th0[:, None, None]),
162
- torch.cos(self.theta - th0[:, None, None]),
163
- ) / math.pi
164
- dt = dth / st[:, None, None]
165
-
166
- omr2 = (1.0 - rho.square()).clamp_min(0.08)[:, None, None]
167
- quad = (df.square() - 2 * rho[:, None, None] * df * dt + dt.square()) / omr2
168
- base = torch.exp(-0.5 * quad.clamp_max(80.0))
169
- skew_arg = 1.6 * (skew_f[:, None, None] * df + skew_t[:, None, None] * dt)
170
- base = base * (2.0 * torch.sigmoid(skew_arg))
171
-
172
- mass = torch.expm1(
173
- log_e.clamp(0, 1)
174
- * math.log1p(float(self.cfg.n_freqs * self.cfg.n_dirs))
175
- )
176
- base = base * (
177
- mass[:, None, None]
178
- / base.sum(dim=(1, 2), keepdim=True).clamp_min(1e-8)
179
- )
180
- return base.clamp(0, 1).view(
181
- *leading, self.cfg.n_freqs, self.cfg.n_dirs
182
- )
183
-
184
-
185
- class FiLMResBlock(nn.Module):
186
- def __init__(self, ch: int, cond_dim: int):
187
- super().__init__()
188
- self.norm1 = nn.GroupNorm(min(8, ch), ch)
189
- self.norm2 = nn.GroupNorm(min(8, ch), ch)
190
- self.conv1 = nn.Conv2d(ch, ch, 3, padding=1)
191
- self.conv2 = nn.Conv2d(ch, ch, 3, padding=1)
192
- self.cond = nn.Linear(cond_dim, 4 * ch)
193
-
194
- def forward(self, x, c):
195
- g1, b1, g2, b2 = self.cond(c).chunk(4, dim=-1)
196
- h = self.norm1(x) * (1 + 0.15 * g1[:, :, None, None]) + 0.15 * b1[:, :, None, None]
197
- h = self.conv1(F.gelu(h))
198
- h = self.norm2(h) * (1 + 0.15 * g2[:, :, None, None]) + 0.15 * b2[:, :, None, None]
199
- h = self.conv2(F.gelu(h))
200
- return x + h
201
-
202
-
203
- class SemanticConditionalDecoder(nn.Module):
204
- """Experiment-1 semantic-only learned decoder, retained as the fixed baseline."""
205
- def __init__(self, cfg: Optional[SemanticShapeExp2Config] = None):
206
- super().__init__()
207
- self.cfg = cfg or SemanticShapeExp2Config()
208
- w = self.cfg.width
209
- self.fc = nn.Sequential(nn.Linear(9, 4 * w * 6 * 9), nn.GELU())
210
- self.b0 = FiLMResBlock(4 * w, 9)
211
- self.up1 = nn.Conv2d(4 * w, 4 * w, 3, padding=1)
212
- self.b1 = FiLMResBlock(w, 9)
213
- self.up2 = nn.Conv2d(w, 4 * w, 3, padding=1)
214
- self.b2 = FiLMResBlock(w, 9)
215
- self.up3 = nn.Conv2d(w, 4 * w, 3, padding=1)
216
- self.b3 = FiLMResBlock(w, 9)
217
-
218
- self.prior_stem = nn.Sequential(
219
- nn.Conv2d(4, w, 3, padding=1),
220
- nn.GroupNorm(min(8, w), w),
221
- nn.GELU(),
222
- ResBlock(w),
223
- )
224
- self.fuse = nn.Sequential(
225
- nn.Conv2d(2 * w, w, 3, padding=1),
226
- nn.GroupNorm(min(8, w), w),
227
- nn.GELU(),
228
- ResBlock(w),
229
- ResBlock(w),
230
- nn.Conv2d(w, 1, 1),
231
- )
232
-
233
- def forward(self, sem: torch.Tensor, analytic_prior: torch.Tensor) -> torch.Tensor:
234
- N = sem.shape[0]
235
- w = self.cfg.width
236
- h = self.fc(sem).view(N, 4 * w, 6, 9)
237
- h = self.b0(h, sem)
238
- h = F.pixel_shuffle(self.up1(h), 2)
239
- h = self.b1(h, sem)
240
- h = F.pixel_shuffle(self.up2(h), 2)
241
- h = self.b2(h, sem)
242
- h = F.pixel_shuffle(self.up3(h), 2)
243
- h = self.b3(h, sem)
244
- h = h[:, :, : self.cfg.n_freqs, :]
245
-
246
- coords = coordinate_channels(
247
- N, self.cfg.n_freqs, self.cfg.n_dirs, sem.device, sem.dtype
248
- )
249
- p = self.prior_stem(torch.cat([analytic_prior[:, None], coords], dim=1))
250
- logits = self.fuse(torch.cat([h, p], dim=1)).squeeze(1)
251
- return torch.sigmoid(logits)
252
-
253
-
254
-
255
- class ShapeResidualEncoder(nn.Module):
256
- """Encode sample-specific residual information missed by the frozen semantic backbone."""
257
- def __init__(self, cfg):
258
- super().__init__()
259
- self.cfg = cfg
260
- w = cfg.width
261
- self.stem = nn.Sequential(
262
- CircularConv2d(8, w, stride=2),
263
- nn.GroupNorm(min(8, w), w), nn.GELU(), ResBlock(w),
264
- CircularConv2d(w, 2*w, stride=2),
265
- nn.GroupNorm(min(8, 2*w), 2*w), nn.GELU(), ResBlock(2*w),
266
- CircularConv2d(2*w, 4*w, stride=2),
267
- nn.GroupNorm(min(8, 4*w), 4*w), nn.GELU(), ResBlock(4*w),
268
- )
269
- ch = 4*w
270
- self.attn = nn.Conv2d(ch, 1, 1)
271
- self.fuse = nn.Sequential(
272
- nn.Linear(3*ch, 2*ch), nn.GELU(),
273
- nn.Linear(2*ch, cfg.shape_feature_dim),
274
- nn.LayerNorm(cfg.shape_feature_dim),
275
- )
276
-
277
- @staticmethod
278
- def _log_map(x):
279
- return torch.log1p(100.0*x.clamp_min(0))/math.log1p(100.0)
280
-
281
- def forward(self, part, semantic_base, analytic_prior):
282
- N,H,W = part.shape
283
- r = self._log_map(part) - self._log_map(semantic_base)
284
- coords = coordinate_channels(N,H,W,part.device,part.dtype)
285
- x = torch.cat([
286
- part[:,None], semantic_base[:,None], analytic_prior[:,None],
287
- F.relu(r)[:,None], F.relu(-r)[:,None], coords,
288
- ], dim=1)
289
- h = self.stem(x)
290
- flat = h.flatten(2)
291
- a = torch.softmax(self.attn(h).flatten(2), dim=-1)
292
- pa = (flat*a).sum(-1)
293
- pmax = F.adaptive_max_pool2d(h,1).flatten(1)
294
- pavg = F.adaptive_avg_pool2d(h,1).flatten(1)
295
- return self.fuse(torch.cat([pa,pmax,pavg],dim=-1))
296
-
297
-
298
- class ContinuousBottleneck(nn.Module):
299
- """d-dimensional continuous code with a zero-preserving expansion to fixed code width."""
300
- def __init__(self, cfg, latent_dim):
301
- super().__init__()
302
- self.latent_dim = int(latent_dim)
303
- self.to_latent = nn.Sequential(
304
- nn.Linear(cfg.shape_feature_dim, 32), nn.GELU(),
305
- nn.Linear(32, self.latent_dim), nn.Tanh(),
306
- )
307
- # Bias-free: z=0 maps exactly to code=0.
308
- self.expand1 = nn.Linear(self.latent_dim, cfg.code_width, bias=False)
309
- self.expand2 = nn.Linear(cfg.code_width, cfg.code_width, bias=False)
310
-
311
- def encode(self, h):
312
- return self.to_latent(h)
313
-
314
- def expand(self, z):
315
- return self.expand2(F.gelu(self.expand1(z)))
316
-
317
-
318
- class ResidualFieldDecoder(nn.Module):
319
- """Decode a bounded log-domain correction field.
320
-
321
- Causal construction:
322
- Delta(z,s) = F(z,s) - F(0,s)
323
- Therefore Delta(0,s)=0 by construction and zero code returns the semantic base.
324
- """
325
- def __init__(self, cfg):
326
- super().__init__()
327
- self.cfg = cfg
328
- w = cfg.width
329
- cond_dim = cfg.semantic_dim + cfg.code_width
330
- self.code_fc = nn.Sequential(nn.Linear(cond_dim, 4*w*6*9), nn.GELU())
331
- self.b0 = FiLMResBlock(4*w, cond_dim)
332
- self.up1 = nn.Conv2d(4*w, 4*w, 3, padding=1)
333
- self.b1 = FiLMResBlock(w, cond_dim)
334
- self.up2 = nn.Conv2d(w, 4*w, 3, padding=1)
335
- self.b2 = FiLMResBlock(w, cond_dim)
336
- self.up3 = nn.Conv2d(w, 4*w, 3, padding=1)
337
- self.b3 = FiLMResBlock(w, cond_dim)
338
- self.context = nn.Sequential(
339
- nn.Conv2d(5, w, 3, padding=1),
340
- nn.GroupNorm(min(8,w),w), nn.GELU(),
341
- ResBlock(w), ResBlock(w),
342
- )
343
- self.fuse = nn.Sequential(
344
- nn.Conv2d(2*w, w, 3, padding=1),
345
- nn.GroupNorm(min(8,w),w), nn.GELU(),
346
- ResBlock(w), ResBlock(w),
347
- nn.Conv2d(w,1,1),
348
- )
349
-
350
- @staticmethod
351
- def log_map(x):
352
- return torch.log1p(100.0*x.clamp_min(0))/math.log1p(100.0)
353
-
354
- @staticmethod
355
- def inv_log(y):
356
- return torch.expm1(y.clamp(0,1)*math.log1p(100.0))/100.0
357
-
358
- def field(self, sem, analytic_prior, semantic_base, code):
359
- N = sem.shape[0]; w = self.cfg.width
360
- cond = torch.cat([sem,code],dim=-1)
361
- h = self.code_fc(cond).view(N,4*w,6,9)
362
- h = self.b0(h,cond)
363
- h = F.pixel_shuffle(self.up1(h),2); h = self.b1(h,cond)
364
- h = F.pixel_shuffle(self.up2(h),2); h = self.b2(h,cond)
365
- h = F.pixel_shuffle(self.up3(h),2); h = self.b3(h,cond)
366
- h = h[:,:,:self.cfg.n_freqs,:]
367
- coords = coordinate_channels(N,self.cfg.n_freqs,self.cfg.n_dirs,sem.device,sem.dtype)
368
- c = self.context(torch.cat([analytic_prior[:,None],semantic_base[:,None],coords],dim=1))
369
- return self.fuse(torch.cat([h,c],dim=1)).squeeze(1)
370
-
371
- def forward(self, sem, analytic_prior, semantic_base, code, raw0=None):
372
- raw = self.field(sem,analytic_prior,semantic_base,code)
373
- if raw0 is None:
374
- zero = torch.zeros_like(code)
375
- raw0 = self.field(sem,analytic_prior,semantic_base,zero)
376
- delta = raw - raw0
377
- corr = self.cfg.max_residual_log * torch.tanh(delta)
378
- pred_log = (self.log_map(semantic_base)+corr).clamp(0,1)
379
- return self.inv_log(pred_log), corr, raw0
380
-
381
-
382
- class CausalResidualCodec(nn.Module):
383
- def __init__(self, cfg, latent_dim):
384
- super().__init__()
385
- self.cfg = cfg
386
- self.latent_dim = int(latent_dim)
387
- self.encoder = ShapeResidualEncoder(cfg)
388
- self.bottleneck = ContinuousBottleneck(cfg, latent_dim)
389
- self.decoder = ResidualFieldDecoder(cfg)
390
-
391
- def encode(self, part, semantic_base, analytic_prior):
392
- h = self.encoder(part,semantic_base,analytic_prior)
393
- z = self.bottleneck.encode(h)
394
- return h,z
395
-
396
- def decode_latent(self, z, sem, analytic_prior, semantic_base, raw0=None):
397
- code = self.bottleneck.expand(z)
398
- pred,corr,raw0 = self.decoder(sem,analytic_prior,semantic_base,code,raw0=raw0)
399
- return {'pred':pred,'corr':corr,'code':code,'latent':z,'raw0':raw0}
400
-
401
- def forward(self, part, sem, analytic_prior, semantic_base, latent_override=None):
402
- h,z = self.encode(part,semantic_base,analytic_prior)
403
- use_z = z if latent_override is None else latent_override
404
- out = self.decode_latent(use_z,sem,analytic_prior,semantic_base)
405
- out['encoder_feature'] = h
406
- out['encoded_latent'] = z
407
- return out
408
-
409
- def num_params(self):
410
- return sum(p.numel() for p in self.parameters())
411
-
412
-
413
- Config = SemanticShapeExp2Config
414
- Model = CausalResidualCodec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/WaveSemanticHybridCodec_Exp2B_best.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:9f6156d298baf2762d1a3a53f7b510d64da4e80256506021b95ac942396ed391
3
- size 46202454
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/CACHEDIR.TAG DELETED
@@ -1,4 +0,0 @@
1
- Signature: 8a477f597d28d172789f06886806bc55
2
- # This file is a cache directory tag created by huggingface_hub.
3
- # For information about cache directory tags, see:
4
- # https://bford.info/cachedir/
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/blobs/9c4623c05be35b459d1790ec4e93fa447c7a0dc5 DELETED
@@ -1,348 +0,0 @@
1
- """
2
- WaveSystemGraphParser v4.7b protected real+synthetic core-locked: core-attached support topology graph parser for ICWDS
3
- ===================================================================
4
- Purpose
5
- -------
6
- This model is the next-stage frontend after WaveSystemParser v3.x.
7
- It does not ask a CNN to draw wave-system masks from scratch. Instead:
8
-
9
- E(f,theta)
10
- -> physical peak/basin proposals generated outside the model
11
- -> node/edge graph reasoning over proposals
12
- -> learned merge / keep / slot assembly
13
- -> light CNN boundary refinement
14
-
15
- This treats watershed-like basins as over-segmentation proposals, not labels.
16
- The learnable part decides which candidates are physical wave systems, which
17
- should be merged, and which should be sent to the downstream self-pruning VAE.
18
-
19
- v4.5 is designed for a double-layer physical teacher: peak-core proposals define
20
- system identity/count, while valley-constrained support proposals recover the full
21
- energetic wave-system footprint. Stripe-like bands can be attached as tails but
22
- are not allowed to become independent systems without a peak core.
23
-
24
- All operations are lightweight and Colab-friendly. No Transformer blocks.
25
- """
26
- import math
27
- from dataclasses import dataclass, asdict
28
- from typing import Optional, Dict
29
-
30
- import torch
31
- import torch.nn as nn
32
- import torch.nn.functional as F
33
-
34
-
35
- @dataclass
36
- class GraphParserV47Config:
37
- n_freqs: int = 47
38
- n_dirs: int = 72
39
- n_slots: int = 6
40
- bg_index: int = 6
41
- p_max: int = 18
42
- prop_feat_dim: int = 22
43
- width: int = 32
44
- depth: int = 4
45
- node_dim: int = 48
46
- edge_dim: int = 64
47
- pair_feat_dim: int = 8
48
- use_coord: bool = True
49
- use_physics: bool = True
50
- rank_temp: float = 0.12
51
- count_min: float = 1.0
52
- count_max: float = 6.0
53
- bg_prior_bias: float = 0.38
54
- bg_energy_suppress: float = 14.5
55
- bg_energy_gamma: float = 0.70
56
- proposal_logit_gain: float = 5.25
57
-
58
- def to_dict(self):
59
- return asdict(self)
60
-
61
-
62
- class DepthwiseSeparable(nn.Module):
63
- def __init__(self, ci: int, co: int):
64
- super().__init__()
65
- self.dw = nn.Conv2d(ci, ci, 3, padding=1, groups=ci, bias=False)
66
- self.pw = nn.Conv2d(ci, co, 1, bias=False)
67
- self.norm = nn.GroupNorm(min(8, co), co)
68
- self.act = nn.GELU()
69
-
70
- def forward(self, x):
71
- return self.act(self.norm(self.pw(self.dw(x))))
72
-
73
-
74
- class PhysicsAwareModule(nn.Module):
75
- def __init__(self, ch: int, n_dirs: int):
76
- super().__init__()
77
- self.n_dirs = n_dirs
78
- dirs = torch.linspace(0, 2 * math.pi, n_dirs + 1)[:n_dirs]
79
- self.register_buffer("cos_d", torch.cos(dirs).view(1, 1, 1, n_dirs))
80
- self.register_buffer("sin_d", torch.sin(dirs).view(1, 1, 1, n_dirs))
81
- self.fuse = nn.Conv2d(ch + 3, ch, 1, bias=False)
82
- self.norm = nn.GroupNorm(min(8, ch), ch)
83
- self.act = nn.GELU()
84
-
85
- def _phys_features(self, E):
86
- eps = 1e-8
87
- En = torch.nan_to_num(E, nan=0.0, posinf=1.0, neginf=0.0).clamp_min(0)
88
- En = En / (En.amax(dim=(2, 3), keepdim=True) + eps)
89
- nf = En.shape[2]
90
- rev_cumsum = torch.flip(torch.cumsum(torch.flip(En, dims=[2]), dim=2), dims=[2])
91
- col_sum = En.sum(dim=2, keepdim=True) + eps
92
- hf_tail = rev_cumsum / col_sum
93
- cx = (En * self.cos_d).sum(dim=3, keepdim=True)
94
- cy = (En * self.sin_d).sum(dim=3, keepdim=True)
95
- row_sum = En.sum(dim=3, keepdim=True) + eps
96
- dir_conc = torch.sqrt(cx ** 2 + cy ** 2) / row_sum
97
- dir_conc = dir_conc.expand(-1, -1, -1, self.n_dirs)
98
- fcoord = torch.linspace(0, 1, nf, device=E.device, dtype=E.dtype).view(1, 1, nf, 1)
99
- fc = (En * fcoord).sum(dim=2, keepdim=True) / col_sum
100
- spread = torch.sqrt(((En * (fcoord - fc) ** 2).sum(dim=2, keepdim=True)) / col_sum)
101
- spread = spread.expand(-1, -1, nf, -1)
102
- return torch.cat([hf_tail, dir_conc, spread], dim=1)
103
-
104
- def forward(self, h, E):
105
- return self.act(self.norm(self.fuse(torch.cat([h, self._phys_features(E)], dim=1))))
106
-
107
-
108
- class WaveSystemGraphParserV47(nn.Module):
109
- """Proposal graph parser.
110
-
111
- forward inputs
112
- --------------
113
- x: [B,1,47,72], normalized to [-1,1]
114
- prop_masks: [B,P,47,72], binary/soft physical basin proposals
115
- prop_feats: [B,P,F], proposal features produced by the training script
116
- prop_valid: [B,P], 1 if proposal exists
117
-
118
- outputs include final probability masks, node slot assignments, edge logits,
119
- count prediction, and diagnostics.
120
- """
121
- def __init__(self, cfg: Optional[GraphParserV47Config] = None):
122
- super().__init__()
123
- self.cfg = cfg or GraphParserV47Config()
124
- c = self.cfg
125
- in_ch = 1 + (3 if c.use_coord else 0)
126
- self.stem = nn.Conv2d(in_ch, c.width, 3, padding=1)
127
- self.stem_norm = nn.GroupNorm(min(8, c.width), c.width)
128
- self.physics = PhysicsAwareModule(c.width, c.n_dirs) if c.use_physics else None
129
- self.blocks = nn.ModuleList([DepthwiseSeparable(c.width, c.width) for _ in range(c.depth)])
130
- self.global_pool = nn.AdaptiveAvgPool2d(1)
131
- self.residual_head = nn.Conv2d(c.width, c.n_slots + 1, 1)
132
- nn.init.zeros_(self.residual_head.weight)
133
- nn.init.zeros_(self.residual_head.bias)
134
-
135
- self.node_mlp = nn.Sequential(
136
- nn.Linear(c.width + c.prop_feat_dim, c.node_dim), nn.GELU(),
137
- nn.Linear(c.node_dim, c.node_dim), nn.GELU(),
138
- )
139
- self.node_keep = nn.Linear(c.node_dim, 1)
140
- self.node_slot = nn.Linear(c.node_dim, c.n_slots)
141
- self.count_head = nn.Sequential(
142
- nn.Linear(c.width + c.node_dim, c.width), nn.GELU(), nn.Linear(c.width, c.n_slots)
143
- )
144
- # Edge head uses node_i, node_j, absolute difference, product, plus handcrafted physical pair features.
145
- self.edge_head = nn.Sequential(
146
- nn.Linear(4 * c.node_dim + c.pair_feat_dim, c.edge_dim), nn.GELU(),
147
- nn.Linear(c.edge_dim, c.edge_dim), nn.GELU(), nn.Linear(c.edge_dim, 1)
148
- )
149
- self._coord_cache = None
150
-
151
-
152
- @staticmethod
153
- def _clean_tensor(x, fill=0.0, lo=-30.0, hi=30.0):
154
- return torch.nan_to_num(x, nan=fill, posinf=hi, neginf=lo).clamp(lo, hi)
155
-
156
- @staticmethod
157
- def _safe_softmax(logits, dim):
158
- logits = torch.nan_to_num(logits, nan=0.0, posinf=30.0, neginf=-30.0).clamp(-30.0, 30.0)
159
- logits = logits - logits.max(dim=dim, keepdim=True).values.detach()
160
- p = torch.softmax(logits, dim=dim)
161
- return torch.nan_to_num(p, nan=0.0, posinf=1.0, neginf=0.0)
162
-
163
- def _coord_channels(self, B, device, dtype):
164
- c = self.cfg
165
- if self._coord_cache is None:
166
- nf, nd = c.n_freqs, c.n_dirs
167
- fcoord = torch.linspace(0, 1, nf).view(1, 1, nf, 1).expand(1, 1, nf, nd)
168
- ang = torch.linspace(0, 2 * math.pi, nd + 1)[:nd].view(1, 1, 1, nd).expand(1, 1, nf, nd)
169
- self._coord_cache = torch.cat([fcoord, torch.sin(ang), torch.cos(ang)], dim=1)
170
- return self._coord_cache.to(device=device, dtype=dtype).expand(B, -1, -1, -1)
171
-
172
- def _rank_prune_presence(self, slot_mass, count_soft):
173
- c = self.cfg
174
- B, K = slot_mass.shape
175
- _, order = torch.sort(slot_mass, dim=1, descending=True)
176
- rank_pos = torch.arange(1, K + 1, device=slot_mass.device, dtype=slot_mass.dtype).view(1, K)
177
- cs = count_soft.clamp(c.count_min, c.count_max).view(B, 1)
178
- gate_sorted = torch.sigmoid((cs + 0.5 - rank_pos) / c.rank_temp)
179
- gate = torch.zeros_like(gate_sorted).scatter(1, order, gate_sorted)
180
- return gate.clamp(0, 1)
181
-
182
- def _node_pool(self, h, prop_masks, prop_valid):
183
- # h: [B,C,H,W], prop_masks [B,P,H,W]
184
- B, C, H, W = h.shape
185
- P = prop_masks.shape[1]
186
- denom = prop_masks.flatten(2).sum(dim=2).clamp_min(1.0) # [B,P]
187
- pooled = torch.einsum("bchw,bphw->bpc", h, prop_masks) / denom[:, :, None]
188
- pooled = pooled * prop_valid[:, :, None]
189
- return pooled
190
-
191
- def _edge_logits(self, node, prop_feats, prop_valid):
192
- B, P, D = node.shape
193
- ni = node[:, :, None, :].expand(B, P, P, D)
194
- nj = node[:, None, :, :].expand(B, P, P, D)
195
- # Pair physical features from proposal features: distance in f/theta and mass contrast.
196
- # feat layout is defined in training script: mass, peak, area, mu_f, sin_t, cos_t, ...
197
- fi = prop_feats[:, :, 3][:, :, None]
198
- fj = prop_feats[:, :, 3][:, None, :]
199
- d_f = (fi - fj).abs()
200
- si = prop_feats[:, :, 4][:, :, None]; ci = prop_feats[:, :, 5][:, :, None]
201
- sj = prop_feats[:, :, 4][:, None, :]; cj = prop_feats[:, :, 5][:, None, :]
202
- dot = (si * sj + ci * cj).clamp(-1.0 + 1e-5, 1.0 - 1e-5)
203
- d_t = torch.acos(dot) / math.pi
204
- mi = prop_feats[:, :, 0][:, :, None]
205
- mj = prop_feats[:, :, 0][:, None, :]
206
- d_m = (mi - mj).abs()
207
- sf_i = prop_feats[:, :, 6][:, :, None]; sf_j = prop_feats[:, :, 6][:, None, :]
208
- st_i = prop_feats[:, :, 7][:, :, None]; st_j = prop_feats[:, :, 7][:, None, :]
209
- d_sf = (sf_i - sf_j).abs()
210
- d_st = (st_i - st_j).abs()
211
- prom_i = prop_feats[:, :, 12][:, :, None]; prom_j = prop_feats[:, :, 12][:, None, :]
212
- prom_min = torch.minimum(prom_i, prom_j)
213
- stripe_i = prop_feats[:, :, 13][:, :, None]; stripe_j = prop_feats[:, :, 13][:, None, :]
214
- stripe_max = torch.maximum(stripe_i, stripe_j)
215
- qual_i = prop_feats[:, :, 11][:, :, None]; qual_j = prop_feats[:, :, 11][:, None, :]
216
- qual_min = torch.minimum(qual_i, qual_j)
217
- pair_phys = torch.stack([d_f, d_t, d_m, d_sf, d_st, prom_min, stripe_max, qual_min], dim=-1)
218
- inp = torch.cat([ni, nj, (ni - nj).abs(), ni * nj, pair_phys], dim=-1)
219
- e = self.edge_head(inp).squeeze(-1)
220
- valid_pair = (prop_valid[:, :, None] * prop_valid[:, None, :]).bool()
221
- eye = torch.eye(P, device=node.device, dtype=torch.bool).view(1, P, P)
222
- e = e.masked_fill(~valid_pair | eye, 0.0)
223
- return e, valid_pair & (~eye)
224
-
225
- def forward(self, x, prop_masks, prop_feats, prop_valid, prior_w=2.5, residual_w=0.0):
226
- c = self.cfg
227
- B, _, H, W = x.shape
228
- prop_masks = torch.nan_to_num(prop_masks.float(), nan=0.0, posinf=0.0, neginf=0.0).clamp(0, 1)
229
- prop_feats = torch.nan_to_num(prop_feats.float(), nan=0.0, posinf=5.0, neginf=-5.0).clamp(-5.0, 5.0)
230
- prop_valid = prop_valid.float().clamp(0, 1)
231
- h_in = torch.cat([x, self._coord_channels(B, x.device, x.dtype)], dim=1) if c.use_coord else x
232
- h = self._clean_tensor(F.gelu(self.stem_norm(self.stem(h_in))), lo=-20.0, hi=20.0)
233
- E01 = torch.nan_to_num((x + 1.0) * 0.5, nan=0.0, posinf=1.0, neginf=0.0).clamp(0, 1)
234
- if self.physics is not None:
235
- h = self._clean_tensor(h + self.physics(h, E01), lo=-20.0, hi=20.0)
236
- for blk in self.blocks:
237
- h = self._clean_tensor(h + blk(h), lo=-20.0, hi=20.0)
238
- global_feat = self.global_pool(h).flatten(1)
239
- node_pool = self._node_pool(h, prop_masks, prop_valid)
240
- node_in = torch.cat([node_pool, prop_feats], dim=-1)
241
- node = self._clean_tensor(self.node_mlp(node_in), lo=-20.0, hi=20.0) * prop_valid[:, :, None]
242
- node_keep_logit = self._clean_tensor(self.node_keep(node).squeeze(-1), lo=-20.0, hi=20.0).masked_fill(prop_valid <= 0, -20.0)
243
- node_keep = torch.sigmoid(node_keep_logit) * prop_valid
244
- node_slot_logits = self._clean_tensor(self.node_slot(node), lo=-20.0, hi=20.0).masked_fill(prop_valid[:, :, None] <= 0, -20.0)
245
- node_slot = self._safe_softmax(node_slot_logits, dim=-1) * prop_valid[:, :, None]
246
- node_context = (node * node_keep[:, :, None]).sum(dim=1) / node_keep.sum(dim=1, keepdim=True).clamp_min(1.0)
247
- count_logits = self._clean_tensor(self.count_head(torch.cat([global_feat, node_context], dim=-1)), lo=-20.0, hi=20.0)
248
- count_probs = torch.sigmoid(count_logits)
249
- count_soft = count_probs.sum(dim=1).clamp(c.count_min, c.count_max)
250
-
251
- # Proposal graph edge logits.
252
- edge_logits, edge_valid = self._edge_logits(node, prop_feats, prop_valid)
253
- edge_logits = self._clean_tensor(edge_logits, lo=-20.0, hi=20.0)
254
- # Slot priors from proposal assembly.
255
- assign = node_slot * node_keep[:, :, None]
256
- prior_signal = torch.einsum("bpk,bphw->bkhw", assign, prop_masks)
257
- # Normalize each slot prior but preserve zero slots.
258
- prior_signal = prior_signal / prior_signal.amax(dim=(2, 3), keepdim=True).clamp_min(1e-6)
259
- prior_signal = torch.nan_to_num(prior_signal, nan=0.0, posinf=1.0, neginf=0.0).clamp(0.0, 1.0)
260
- denom = E01.sum(dim=(2, 3)).clamp_min(1e-6)
261
- slot_mass = (prior_signal * E01).sum(dim=(2, 3)) / denom
262
- presence = self._rank_prune_presence(slot_mass, count_soft)
263
- prior_signal = prior_signal * presence[:, :, None, None]
264
-
265
- En = E01 / E01.amax(dim=(2, 3), keepdim=True).clamp_min(1e-6)
266
- bg_prior_logit = c.bg_prior_bias - c.bg_energy_suppress * En.pow(c.bg_energy_gamma)
267
- residual_logits = self.residual_head(h)
268
- signal_logits = prior_w * (c.proposal_logit_gain * torch.log(prior_signal.clamp_min(1e-6))) + residual_w * residual_logits[:, :c.n_slots]
269
- bg_logits = prior_w * bg_prior_logit + residual_w * residual_logits[:, c.n_slots:c.n_slots + 1]
270
- logits = self._clean_tensor(torch.cat([signal_logits, bg_logits], dim=1), lo=-60.0, hi=60.0)
271
- prob_raw = self._safe_softmax(logits, dim=1)
272
- prob = prob_raw / prob_raw.sum(dim=1, keepdim=True).clamp_min(1e-6)
273
-
274
- prior_logits = self._clean_tensor(torch.cat([c.proposal_logit_gain * torch.log(prior_signal.clamp_min(1e-6)), bg_prior_logit], dim=1), lo=-60.0, hi=60.0)
275
- prior_prob = self._safe_softmax(prior_logits, dim=1)
276
- return {
277
- "logits": logits, "prob": prob, "prob_raw": prob_raw,
278
- "prior_signal": prior_signal, "prior_logits": prior_logits, "prior_prob": prior_prob,
279
- "residual_logits": residual_logits,
280
- "node": node, "node_keep_logit": node_keep_logit, "node_keep": node_keep,
281
- "node_slot_logits": node_slot_logits, "node_slot": node_slot,
282
- "edge_logits": edge_logits, "edge_valid": edge_valid,
283
- "count_logits": count_logits, "count_probs": count_probs, "count_soft": count_soft,
284
- "slot_mass": slot_mass, "presence": presence,
285
- }
286
-
287
- @torch.no_grad()
288
- def prior_foreground_metrics(self, out, E01, high_quantile=0.80):
289
- E = E01[:, 0] if E01.dim() == 4 else E01
290
- flat = E.flatten(1)
291
- thr = torch.quantile(flat, high_quantile, dim=1).view(-1, 1, 1)
292
- mask_hi = E >= thr
293
- denom = mask_hi.float().sum().clamp_min(1.0)
294
- prior_prob = out.get("prior_prob", torch.softmax(out["prior_logits"], dim=1))
295
- fg_prior = prior_prob[:, :self.cfg.n_slots].sum(dim=1)
296
- bg_prior = prior_prob[:, self.cfg.bg_index]
297
- return {"prior_fg_hi": (fg_prior * mask_hi).sum() / denom,
298
- "prior_bg_hi": (bg_prior * mask_hi).sum() / denom}
299
-
300
- @torch.no_grad()
301
- def dominance_metrics(self, out, E01, high_quantile=0.80):
302
- final = out["prob"].argmax(dim=1)
303
- prior = out["prior_logits"].argmax(dim=1)
304
- resid = out["residual_logits"].argmax(dim=1)
305
- E = E01[:, 0] if E01.dim() == 4 else E01
306
- flat = E.flatten(1)
307
- thr = torch.quantile(flat, high_quantile, dim=1).view(-1, 1, 1)
308
- mask = E >= thr
309
- denom = mask.float().sum().clamp_min(1.0)
310
- return {"prior_agree": ((final == prior) & mask).float().sum() / denom,
311
- "residual_agree": ((final == resid) & mask).float().sum() / denom}
312
-
313
- def graph_regularizers(self, out, prop_masks, prop_valid, E01):
314
- # Slot compactness and smoothness proxies for final masks.
315
- c = self.cfg
316
- prob = out["prob"][:, :c.n_slots]
317
- E = E01[:, 0] if E01.dim() == 4 else E01
318
- nf, nd = c.n_freqs, c.n_dirs
319
- f = torch.linspace(0, 1, nf, device=E.device, dtype=E.dtype).view(1, 1, nf, 1)
320
- theta = torch.linspace(0, 2 * math.pi, nd + 1, device=E.device, dtype=E.dtype)[:nd].view(1, 1, 1, nd)
321
- w = prob * E[:, None]
322
- mass = w.sum(dim=(2, 3)).clamp_min(1e-8)
323
- mu_f = (w * f).sum(dim=(2, 3)) / mass
324
- cx = (w * torch.cos(theta)).sum(dim=(2, 3)) / mass
325
- cy = (w * torch.sin(theta)).sum(dim=(2, 3)) / mass
326
- mu_t = torch.atan2(cy, cx)
327
- df2 = (f - mu_f[:, :, None, None]) ** 2
328
- dt = torch.atan2(torch.sin(theta - mu_t[:, :, None, None]), torch.cos(theta - mu_t[:, :, None, None])) / math.pi
329
- radius = ((w * (df2 + dt ** 2)).sum(dim=(2, 3)) / mass).mean()
330
- tv = (prob[:, :, 1:, :] - prob[:, :, :-1, :]).abs().mean() + (prob[:, :, :, 1:] - prob[:, :, :, :-1]).abs().mean()
331
- # Encourage node slot assignments to be confident only for valid proposals.
332
- ns = out["node_slot"].clamp_min(1e-8)
333
- ent = -(ns * ns.log()).sum(dim=-1)
334
- ent = (ent * prop_valid).sum() / prop_valid.sum().clamp_min(1.0)
335
- return {"slot_radius": radius, "slot_tv": tv, "node_slot_entropy": ent}
336
-
337
- def num_params(self):
338
- return sum(p.numel() for p in self.parameters())
339
-
340
-
341
- # Backward-compatible alias
342
- WaveSystemGraphParserV4 = WaveSystemGraphParserV47
343
-
344
- # v4.8 stable aliases: keep the proven v47b architecture/checkpoint compatibility.
345
- # The v4.8 fixes are implemented in the training objective and deterministic
346
- # energy/noise-aware post-processing, not by changing tensor shapes.
347
- GraphParserV48Config = GraphParserV47Config
348
- WaveSystemGraphParserV48 = WaveSystemGraphParserV47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/refs/main DELETED
@@ -1 +0,0 @@
1
- a91a365a49141913cfeeeb18d1be8074730e06c9
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/snapshots/a91a365a49141913cfeeeb18d1be8074730e06c9/CNN.py DELETED
@@ -1,348 +0,0 @@
1
- """
2
- WaveSystemGraphParser v4.7b protected real+synthetic core-locked: core-attached support topology graph parser for ICWDS
3
- ===================================================================
4
- Purpose
5
- -------
6
- This model is the next-stage frontend after WaveSystemParser v3.x.
7
- It does not ask a CNN to draw wave-system masks from scratch. Instead:
8
-
9
- E(f,theta)
10
- -> physical peak/basin proposals generated outside the model
11
- -> node/edge graph reasoning over proposals
12
- -> learned merge / keep / slot assembly
13
- -> light CNN boundary refinement
14
-
15
- This treats watershed-like basins as over-segmentation proposals, not labels.
16
- The learnable part decides which candidates are physical wave systems, which
17
- should be merged, and which should be sent to the downstream self-pruning VAE.
18
-
19
- v4.5 is designed for a double-layer physical teacher: peak-core proposals define
20
- system identity/count, while valley-constrained support proposals recover the full
21
- energetic wave-system footprint. Stripe-like bands can be attached as tails but
22
- are not allowed to become independent systems without a peak core.
23
-
24
- All operations are lightweight and Colab-friendly. No Transformer blocks.
25
- """
26
- import math
27
- from dataclasses import dataclass, asdict
28
- from typing import Optional, Dict
29
-
30
- import torch
31
- import torch.nn as nn
32
- import torch.nn.functional as F
33
-
34
-
35
- @dataclass
36
- class GraphParserV47Config:
37
- n_freqs: int = 47
38
- n_dirs: int = 72
39
- n_slots: int = 6
40
- bg_index: int = 6
41
- p_max: int = 18
42
- prop_feat_dim: int = 22
43
- width: int = 32
44
- depth: int = 4
45
- node_dim: int = 48
46
- edge_dim: int = 64
47
- pair_feat_dim: int = 8
48
- use_coord: bool = True
49
- use_physics: bool = True
50
- rank_temp: float = 0.12
51
- count_min: float = 1.0
52
- count_max: float = 6.0
53
- bg_prior_bias: float = 0.38
54
- bg_energy_suppress: float = 14.5
55
- bg_energy_gamma: float = 0.70
56
- proposal_logit_gain: float = 5.25
57
-
58
- def to_dict(self):
59
- return asdict(self)
60
-
61
-
62
- class DepthwiseSeparable(nn.Module):
63
- def __init__(self, ci: int, co: int):
64
- super().__init__()
65
- self.dw = nn.Conv2d(ci, ci, 3, padding=1, groups=ci, bias=False)
66
- self.pw = nn.Conv2d(ci, co, 1, bias=False)
67
- self.norm = nn.GroupNorm(min(8, co), co)
68
- self.act = nn.GELU()
69
-
70
- def forward(self, x):
71
- return self.act(self.norm(self.pw(self.dw(x))))
72
-
73
-
74
- class PhysicsAwareModule(nn.Module):
75
- def __init__(self, ch: int, n_dirs: int):
76
- super().__init__()
77
- self.n_dirs = n_dirs
78
- dirs = torch.linspace(0, 2 * math.pi, n_dirs + 1)[:n_dirs]
79
- self.register_buffer("cos_d", torch.cos(dirs).view(1, 1, 1, n_dirs))
80
- self.register_buffer("sin_d", torch.sin(dirs).view(1, 1, 1, n_dirs))
81
- self.fuse = nn.Conv2d(ch + 3, ch, 1, bias=False)
82
- self.norm = nn.GroupNorm(min(8, ch), ch)
83
- self.act = nn.GELU()
84
-
85
- def _phys_features(self, E):
86
- eps = 1e-8
87
- En = torch.nan_to_num(E, nan=0.0, posinf=1.0, neginf=0.0).clamp_min(0)
88
- En = En / (En.amax(dim=(2, 3), keepdim=True) + eps)
89
- nf = En.shape[2]
90
- rev_cumsum = torch.flip(torch.cumsum(torch.flip(En, dims=[2]), dim=2), dims=[2])
91
- col_sum = En.sum(dim=2, keepdim=True) + eps
92
- hf_tail = rev_cumsum / col_sum
93
- cx = (En * self.cos_d).sum(dim=3, keepdim=True)
94
- cy = (En * self.sin_d).sum(dim=3, keepdim=True)
95
- row_sum = En.sum(dim=3, keepdim=True) + eps
96
- dir_conc = torch.sqrt(cx ** 2 + cy ** 2) / row_sum
97
- dir_conc = dir_conc.expand(-1, -1, -1, self.n_dirs)
98
- fcoord = torch.linspace(0, 1, nf, device=E.device, dtype=E.dtype).view(1, 1, nf, 1)
99
- fc = (En * fcoord).sum(dim=2, keepdim=True) / col_sum
100
- spread = torch.sqrt(((En * (fcoord - fc) ** 2).sum(dim=2, keepdim=True)) / col_sum)
101
- spread = spread.expand(-1, -1, nf, -1)
102
- return torch.cat([hf_tail, dir_conc, spread], dim=1)
103
-
104
- def forward(self, h, E):
105
- return self.act(self.norm(self.fuse(torch.cat([h, self._phys_features(E)], dim=1))))
106
-
107
-
108
- class WaveSystemGraphParserV47(nn.Module):
109
- """Proposal graph parser.
110
-
111
- forward inputs
112
- --------------
113
- x: [B,1,47,72], normalized to [-1,1]
114
- prop_masks: [B,P,47,72], binary/soft physical basin proposals
115
- prop_feats: [B,P,F], proposal features produced by the training script
116
- prop_valid: [B,P], 1 if proposal exists
117
-
118
- outputs include final probability masks, node slot assignments, edge logits,
119
- count prediction, and diagnostics.
120
- """
121
- def __init__(self, cfg: Optional[GraphParserV47Config] = None):
122
- super().__init__()
123
- self.cfg = cfg or GraphParserV47Config()
124
- c = self.cfg
125
- in_ch = 1 + (3 if c.use_coord else 0)
126
- self.stem = nn.Conv2d(in_ch, c.width, 3, padding=1)
127
- self.stem_norm = nn.GroupNorm(min(8, c.width), c.width)
128
- self.physics = PhysicsAwareModule(c.width, c.n_dirs) if c.use_physics else None
129
- self.blocks = nn.ModuleList([DepthwiseSeparable(c.width, c.width) for _ in range(c.depth)])
130
- self.global_pool = nn.AdaptiveAvgPool2d(1)
131
- self.residual_head = nn.Conv2d(c.width, c.n_slots + 1, 1)
132
- nn.init.zeros_(self.residual_head.weight)
133
- nn.init.zeros_(self.residual_head.bias)
134
-
135
- self.node_mlp = nn.Sequential(
136
- nn.Linear(c.width + c.prop_feat_dim, c.node_dim), nn.GELU(),
137
- nn.Linear(c.node_dim, c.node_dim), nn.GELU(),
138
- )
139
- self.node_keep = nn.Linear(c.node_dim, 1)
140
- self.node_slot = nn.Linear(c.node_dim, c.n_slots)
141
- self.count_head = nn.Sequential(
142
- nn.Linear(c.width + c.node_dim, c.width), nn.GELU(), nn.Linear(c.width, c.n_slots)
143
- )
144
- # Edge head uses node_i, node_j, absolute difference, product, plus handcrafted physical pair features.
145
- self.edge_head = nn.Sequential(
146
- nn.Linear(4 * c.node_dim + c.pair_feat_dim, c.edge_dim), nn.GELU(),
147
- nn.Linear(c.edge_dim, c.edge_dim), nn.GELU(), nn.Linear(c.edge_dim, 1)
148
- )
149
- self._coord_cache = None
150
-
151
-
152
- @staticmethod
153
- def _clean_tensor(x, fill=0.0, lo=-30.0, hi=30.0):
154
- return torch.nan_to_num(x, nan=fill, posinf=hi, neginf=lo).clamp(lo, hi)
155
-
156
- @staticmethod
157
- def _safe_softmax(logits, dim):
158
- logits = torch.nan_to_num(logits, nan=0.0, posinf=30.0, neginf=-30.0).clamp(-30.0, 30.0)
159
- logits = logits - logits.max(dim=dim, keepdim=True).values.detach()
160
- p = torch.softmax(logits, dim=dim)
161
- return torch.nan_to_num(p, nan=0.0, posinf=1.0, neginf=0.0)
162
-
163
- def _coord_channels(self, B, device, dtype):
164
- c = self.cfg
165
- if self._coord_cache is None:
166
- nf, nd = c.n_freqs, c.n_dirs
167
- fcoord = torch.linspace(0, 1, nf).view(1, 1, nf, 1).expand(1, 1, nf, nd)
168
- ang = torch.linspace(0, 2 * math.pi, nd + 1)[:nd].view(1, 1, 1, nd).expand(1, 1, nf, nd)
169
- self._coord_cache = torch.cat([fcoord, torch.sin(ang), torch.cos(ang)], dim=1)
170
- return self._coord_cache.to(device=device, dtype=dtype).expand(B, -1, -1, -1)
171
-
172
- def _rank_prune_presence(self, slot_mass, count_soft):
173
- c = self.cfg
174
- B, K = slot_mass.shape
175
- _, order = torch.sort(slot_mass, dim=1, descending=True)
176
- rank_pos = torch.arange(1, K + 1, device=slot_mass.device, dtype=slot_mass.dtype).view(1, K)
177
- cs = count_soft.clamp(c.count_min, c.count_max).view(B, 1)
178
- gate_sorted = torch.sigmoid((cs + 0.5 - rank_pos) / c.rank_temp)
179
- gate = torch.zeros_like(gate_sorted).scatter(1, order, gate_sorted)
180
- return gate.clamp(0, 1)
181
-
182
- def _node_pool(self, h, prop_masks, prop_valid):
183
- # h: [B,C,H,W], prop_masks [B,P,H,W]
184
- B, C, H, W = h.shape
185
- P = prop_masks.shape[1]
186
- denom = prop_masks.flatten(2).sum(dim=2).clamp_min(1.0) # [B,P]
187
- pooled = torch.einsum("bchw,bphw->bpc", h, prop_masks) / denom[:, :, None]
188
- pooled = pooled * prop_valid[:, :, None]
189
- return pooled
190
-
191
- def _edge_logits(self, node, prop_feats, prop_valid):
192
- B, P, D = node.shape
193
- ni = node[:, :, None, :].expand(B, P, P, D)
194
- nj = node[:, None, :, :].expand(B, P, P, D)
195
- # Pair physical features from proposal features: distance in f/theta and mass contrast.
196
- # feat layout is defined in training script: mass, peak, area, mu_f, sin_t, cos_t, ...
197
- fi = prop_feats[:, :, 3][:, :, None]
198
- fj = prop_feats[:, :, 3][:, None, :]
199
- d_f = (fi - fj).abs()
200
- si = prop_feats[:, :, 4][:, :, None]; ci = prop_feats[:, :, 5][:, :, None]
201
- sj = prop_feats[:, :, 4][:, None, :]; cj = prop_feats[:, :, 5][:, None, :]
202
- dot = (si * sj + ci * cj).clamp(-1.0 + 1e-5, 1.0 - 1e-5)
203
- d_t = torch.acos(dot) / math.pi
204
- mi = prop_feats[:, :, 0][:, :, None]
205
- mj = prop_feats[:, :, 0][:, None, :]
206
- d_m = (mi - mj).abs()
207
- sf_i = prop_feats[:, :, 6][:, :, None]; sf_j = prop_feats[:, :, 6][:, None, :]
208
- st_i = prop_feats[:, :, 7][:, :, None]; st_j = prop_feats[:, :, 7][:, None, :]
209
- d_sf = (sf_i - sf_j).abs()
210
- d_st = (st_i - st_j).abs()
211
- prom_i = prop_feats[:, :, 12][:, :, None]; prom_j = prop_feats[:, :, 12][:, None, :]
212
- prom_min = torch.minimum(prom_i, prom_j)
213
- stripe_i = prop_feats[:, :, 13][:, :, None]; stripe_j = prop_feats[:, :, 13][:, None, :]
214
- stripe_max = torch.maximum(stripe_i, stripe_j)
215
- qual_i = prop_feats[:, :, 11][:, :, None]; qual_j = prop_feats[:, :, 11][:, None, :]
216
- qual_min = torch.minimum(qual_i, qual_j)
217
- pair_phys = torch.stack([d_f, d_t, d_m, d_sf, d_st, prom_min, stripe_max, qual_min], dim=-1)
218
- inp = torch.cat([ni, nj, (ni - nj).abs(), ni * nj, pair_phys], dim=-1)
219
- e = self.edge_head(inp).squeeze(-1)
220
- valid_pair = (prop_valid[:, :, None] * prop_valid[:, None, :]).bool()
221
- eye = torch.eye(P, device=node.device, dtype=torch.bool).view(1, P, P)
222
- e = e.masked_fill(~valid_pair | eye, 0.0)
223
- return e, valid_pair & (~eye)
224
-
225
- def forward(self, x, prop_masks, prop_feats, prop_valid, prior_w=2.5, residual_w=0.0):
226
- c = self.cfg
227
- B, _, H, W = x.shape
228
- prop_masks = torch.nan_to_num(prop_masks.float(), nan=0.0, posinf=0.0, neginf=0.0).clamp(0, 1)
229
- prop_feats = torch.nan_to_num(prop_feats.float(), nan=0.0, posinf=5.0, neginf=-5.0).clamp(-5.0, 5.0)
230
- prop_valid = prop_valid.float().clamp(0, 1)
231
- h_in = torch.cat([x, self._coord_channels(B, x.device, x.dtype)], dim=1) if c.use_coord else x
232
- h = self._clean_tensor(F.gelu(self.stem_norm(self.stem(h_in))), lo=-20.0, hi=20.0)
233
- E01 = torch.nan_to_num((x + 1.0) * 0.5, nan=0.0, posinf=1.0, neginf=0.0).clamp(0, 1)
234
- if self.physics is not None:
235
- h = self._clean_tensor(h + self.physics(h, E01), lo=-20.0, hi=20.0)
236
- for blk in self.blocks:
237
- h = self._clean_tensor(h + blk(h), lo=-20.0, hi=20.0)
238
- global_feat = self.global_pool(h).flatten(1)
239
- node_pool = self._node_pool(h, prop_masks, prop_valid)
240
- node_in = torch.cat([node_pool, prop_feats], dim=-1)
241
- node = self._clean_tensor(self.node_mlp(node_in), lo=-20.0, hi=20.0) * prop_valid[:, :, None]
242
- node_keep_logit = self._clean_tensor(self.node_keep(node).squeeze(-1), lo=-20.0, hi=20.0).masked_fill(prop_valid <= 0, -20.0)
243
- node_keep = torch.sigmoid(node_keep_logit) * prop_valid
244
- node_slot_logits = self._clean_tensor(self.node_slot(node), lo=-20.0, hi=20.0).masked_fill(prop_valid[:, :, None] <= 0, -20.0)
245
- node_slot = self._safe_softmax(node_slot_logits, dim=-1) * prop_valid[:, :, None]
246
- node_context = (node * node_keep[:, :, None]).sum(dim=1) / node_keep.sum(dim=1, keepdim=True).clamp_min(1.0)
247
- count_logits = self._clean_tensor(self.count_head(torch.cat([global_feat, node_context], dim=-1)), lo=-20.0, hi=20.0)
248
- count_probs = torch.sigmoid(count_logits)
249
- count_soft = count_probs.sum(dim=1).clamp(c.count_min, c.count_max)
250
-
251
- # Proposal graph edge logits.
252
- edge_logits, edge_valid = self._edge_logits(node, prop_feats, prop_valid)
253
- edge_logits = self._clean_tensor(edge_logits, lo=-20.0, hi=20.0)
254
- # Slot priors from proposal assembly.
255
- assign = node_slot * node_keep[:, :, None]
256
- prior_signal = torch.einsum("bpk,bphw->bkhw", assign, prop_masks)
257
- # Normalize each slot prior but preserve zero slots.
258
- prior_signal = prior_signal / prior_signal.amax(dim=(2, 3), keepdim=True).clamp_min(1e-6)
259
- prior_signal = torch.nan_to_num(prior_signal, nan=0.0, posinf=1.0, neginf=0.0).clamp(0.0, 1.0)
260
- denom = E01.sum(dim=(2, 3)).clamp_min(1e-6)
261
- slot_mass = (prior_signal * E01).sum(dim=(2, 3)) / denom
262
- presence = self._rank_prune_presence(slot_mass, count_soft)
263
- prior_signal = prior_signal * presence[:, :, None, None]
264
-
265
- En = E01 / E01.amax(dim=(2, 3), keepdim=True).clamp_min(1e-6)
266
- bg_prior_logit = c.bg_prior_bias - c.bg_energy_suppress * En.pow(c.bg_energy_gamma)
267
- residual_logits = self.residual_head(h)
268
- signal_logits = prior_w * (c.proposal_logit_gain * torch.log(prior_signal.clamp_min(1e-6))) + residual_w * residual_logits[:, :c.n_slots]
269
- bg_logits = prior_w * bg_prior_logit + residual_w * residual_logits[:, c.n_slots:c.n_slots + 1]
270
- logits = self._clean_tensor(torch.cat([signal_logits, bg_logits], dim=1), lo=-60.0, hi=60.0)
271
- prob_raw = self._safe_softmax(logits, dim=1)
272
- prob = prob_raw / prob_raw.sum(dim=1, keepdim=True).clamp_min(1e-6)
273
-
274
- prior_logits = self._clean_tensor(torch.cat([c.proposal_logit_gain * torch.log(prior_signal.clamp_min(1e-6)), bg_prior_logit], dim=1), lo=-60.0, hi=60.0)
275
- prior_prob = self._safe_softmax(prior_logits, dim=1)
276
- return {
277
- "logits": logits, "prob": prob, "prob_raw": prob_raw,
278
- "prior_signal": prior_signal, "prior_logits": prior_logits, "prior_prob": prior_prob,
279
- "residual_logits": residual_logits,
280
- "node": node, "node_keep_logit": node_keep_logit, "node_keep": node_keep,
281
- "node_slot_logits": node_slot_logits, "node_slot": node_slot,
282
- "edge_logits": edge_logits, "edge_valid": edge_valid,
283
- "count_logits": count_logits, "count_probs": count_probs, "count_soft": count_soft,
284
- "slot_mass": slot_mass, "presence": presence,
285
- }
286
-
287
- @torch.no_grad()
288
- def prior_foreground_metrics(self, out, E01, high_quantile=0.80):
289
- E = E01[:, 0] if E01.dim() == 4 else E01
290
- flat = E.flatten(1)
291
- thr = torch.quantile(flat, high_quantile, dim=1).view(-1, 1, 1)
292
- mask_hi = E >= thr
293
- denom = mask_hi.float().sum().clamp_min(1.0)
294
- prior_prob = out.get("prior_prob", torch.softmax(out["prior_logits"], dim=1))
295
- fg_prior = prior_prob[:, :self.cfg.n_slots].sum(dim=1)
296
- bg_prior = prior_prob[:, self.cfg.bg_index]
297
- return {"prior_fg_hi": (fg_prior * mask_hi).sum() / denom,
298
- "prior_bg_hi": (bg_prior * mask_hi).sum() / denom}
299
-
300
- @torch.no_grad()
301
- def dominance_metrics(self, out, E01, high_quantile=0.80):
302
- final = out["prob"].argmax(dim=1)
303
- prior = out["prior_logits"].argmax(dim=1)
304
- resid = out["residual_logits"].argmax(dim=1)
305
- E = E01[:, 0] if E01.dim() == 4 else E01
306
- flat = E.flatten(1)
307
- thr = torch.quantile(flat, high_quantile, dim=1).view(-1, 1, 1)
308
- mask = E >= thr
309
- denom = mask.float().sum().clamp_min(1.0)
310
- return {"prior_agree": ((final == prior) & mask).float().sum() / denom,
311
- "residual_agree": ((final == resid) & mask).float().sum() / denom}
312
-
313
- def graph_regularizers(self, out, prop_masks, prop_valid, E01):
314
- # Slot compactness and smoothness proxies for final masks.
315
- c = self.cfg
316
- prob = out["prob"][:, :c.n_slots]
317
- E = E01[:, 0] if E01.dim() == 4 else E01
318
- nf, nd = c.n_freqs, c.n_dirs
319
- f = torch.linspace(0, 1, nf, device=E.device, dtype=E.dtype).view(1, 1, nf, 1)
320
- theta = torch.linspace(0, 2 * math.pi, nd + 1, device=E.device, dtype=E.dtype)[:nd].view(1, 1, 1, nd)
321
- w = prob * E[:, None]
322
- mass = w.sum(dim=(2, 3)).clamp_min(1e-8)
323
- mu_f = (w * f).sum(dim=(2, 3)) / mass
324
- cx = (w * torch.cos(theta)).sum(dim=(2, 3)) / mass
325
- cy = (w * torch.sin(theta)).sum(dim=(2, 3)) / mass
326
- mu_t = torch.atan2(cy, cx)
327
- df2 = (f - mu_f[:, :, None, None]) ** 2
328
- dt = torch.atan2(torch.sin(theta - mu_t[:, :, None, None]), torch.cos(theta - mu_t[:, :, None, None])) / math.pi
329
- radius = ((w * (df2 + dt ** 2)).sum(dim=(2, 3)) / mass).mean()
330
- tv = (prob[:, :, 1:, :] - prob[:, :, :-1, :]).abs().mean() + (prob[:, :, :, 1:] - prob[:, :, :, :-1]).abs().mean()
331
- # Encourage node slot assignments to be confident only for valid proposals.
332
- ns = out["node_slot"].clamp_min(1e-8)
333
- ent = -(ns * ns.log()).sum(dim=-1)
334
- ent = (ent * prop_valid).sum() / prop_valid.sum().clamp_min(1.0)
335
- return {"slot_radius": radius, "slot_tv": tv, "node_slot_entropy": ent}
336
-
337
- def num_params(self):
338
- return sum(p.numel() for p in self.parameters())
339
-
340
-
341
- # Backward-compatible alias
342
- WaveSystemGraphParserV4 = WaveSystemGraphParserV47
343
-
344
- # v4.8 stable aliases: keep the proven v47b architecture/checkpoint compatibility.
345
- # The v4.8 fixes are implemented in the training objective and deterministic
346
- # energy/noise-aware post-processing, not by changing tensor shapes.
347
- GraphParserV48Config = GraphParserV47Config
348
- WaveSystemGraphParserV48 = WaveSystemGraphParserV47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/assets/hf_cache/models--wuff-mann--Wave_compress_system/snapshots/a91a365a49141913cfeeeb18d1be8074730e06c9/__pycache__/CNN.cpython-312.pyc DELETED
Binary file (31.8 kB)
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c12_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:8591a3879819dac70d660f53b05c135974fdb542a59251e62bce92094552ec97
3
- size 39890231
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c4_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:024d01d13b522add7a9757dd5aeef7dfe936de9ae96daa43eed65edd19cef3e9
3
- size 13289488
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c8_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:66fe62dd6e7cb32d3d03e27504c097851dce6d4e115584fdca939890ce7c5413
3
- size 13290512
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_semantic_decoder_exp2b_base.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:d474e5e6502778b2a146521058112407943cfe6ec2d0029d00bdef6e6ee4a864
3
- size 6323841
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/cache/cache_meta_exp2b.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "version": "wshc_exp2b_core_halo_v1",
3
- "n": 30000,
4
- "shape": [
5
- 47,
6
- 72
7
- ],
8
- "n_slots": 6,
9
- "field_name": "energy_mem",
10
- "repo_id": "wuff-mann/ATLAS-WDS-v4",
11
- "split": "train"
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/cache/front.u8 DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:1f60df2def1febdd0615779f2916dea2f3a0ef1289bc3b52f8474e453c21f5d4
3
- size 101520000
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/cache/parts.u8 DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:fb6990f74e5b2aa1b0acc30ba9742f55ecba5dbcd950b63942acf7ba6b32fb47
3
- size 609120000
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_capacity_summary.csv DELETED
@@ -1,4 +0,0 @@
1
- variant,latent_dim,shape_gain_vs_base,mse_gain_vs_base,shuffle_shape_gap,shuffle_mse_gap,zero_shape_gap_vs_base,zero_mse_gap_vs_base
2
- c4,4,0.2537815677837153,0.22087005516541391,0.27262253749678855,0.47455963659128275,0.0,-2.604918269977219e-08
3
- c8,8,0.14433410851609063,-0.0049219193897158675,0.006015519547725834,-0.00016044933192560507,0.0,-2.604918269977219e-08
4
- c12,12,0.29158126897241854,0.2674344565019864,0.2304482413348694,0.7248006418954676,0.0,-2.604918269977219e-08
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_casewise_summary.csv DELETED
@@ -1,36 +0,0 @@
1
- method,stratum,mse,weighted_l1,log_l1,shape,energy,peak,freq,direction
2
- semantic_only,regular,0.0025985943881558283,0.049606920471267094,0.026079945887128513,0.22269727360634578,0.02182799932502565,0.00676602456628138,0.006005940389715963,0.002636576725524806
3
- semantic_only,multi_peak,0.0052225425846815585,0.07157631922099325,0.03562389175215411,0.41304284381488016,0.030963076101172538,0.03756319140158002,0.010309769468943752,0.006200826719462398
4
- semantic_only,broad,0.005967187388460078,0.0732877662494069,0.04054862813698867,0.5285314406667437,0.04144094473431035,0.050494555413486464,0.014814348019186466,0.008019177287462213
5
- semantic_only,low_energy,0.007458592617204265,0.08546718517466197,0.052213846986729,0.5709580727039821,0.044259964473663815,0.05502338334918022,0.01608007274095028,0.008485170184738107
6
- semantic_only,noisy_difficult,0.004599826683896402,0.06178122551904784,0.03243726577668909,0.48062052187465487,0.038659057520803,0.052955839088157056,0.011591229484313063,0.007511320087822184
7
- c4_true,regular,0.001750548277327436,0.04007956719705983,0.023038747483893993,0.17779369167392217,0.016502398391446425,0.0026166237759522146,0.004245755377240361,0.0021689352015816857
8
- c4_true,multi_peak,0.004081219124297301,0.06198727848037841,0.03169976461619612,0.35173807778055705,0.03046174031046648,0.03110295378913482,0.007916059345006943,0.005695161904903158
9
- c4_true,broad,0.004727477928446163,0.06392098407423685,0.03588335650662581,0.4529443936688559,0.035936880324568064,0.04058106789099319,0.011470764801497496,0.0074207594854727625
10
- c4_true,low_energy,0.006122347045068939,0.07614568467178041,0.0470732469111681,0.5024659652558584,0.03675104362801427,0.04575067540512435,0.013130194211881312,0.008015709821992213
11
- c4_true,noisy_difficult,0.003783163998926443,0.05475908275397997,0.029419519421127107,0.4205187119188763,0.03527400230190584,0.044168417151677346,0.009245761921481481,0.007020233147260215
12
- c8_true,regular,0.0026256225897841865,0.04970992930115215,0.026170017286425547,0.2224973395230278,0.013927855854114842,0.006588597680323772,0.006015481427311897,0.0026532862047176984
13
- c8_true,multi_peak,0.0052493104326819615,0.07181503369458138,0.03630018278601624,0.4143843272375682,0.021518668056362204,0.03765641602258834,0.010344928825303676,0.006229172726827008
14
- c8_true,broad,0.006000325316563249,0.07347727933573345,0.04248820147698834,0.530890692321081,0.027416478295529647,0.05074360558674449,0.014841591998461693,0.008007965087594967
15
- c8_true,low_energy,0.007509229823000847,0.0855845505046466,0.054763086258418976,0.5727473350744399,0.02971231725273861,0.055676237325228396,0.016101611364218924,0.008445201345556786
16
- c8_true,noisy_difficult,0.004604692456297695,0.061930165049575624,0.03347800967712251,0.48357690847109236,0.027170604375738,0.05338449917718886,0.01166673292893739,0.0075303328718753565
17
- c8_shuffle,regular,0.002609182470699861,0.049567257098498796,0.02647353516566375,0.22322304499527765,0.018273240073569237,0.0067471988505632095,0.0060226513767644525,0.0026523105463840896
18
- c8_shuffle,multi_peak,0.005240352809547432,0.07156146542420463,0.03688254804601745,0.4147334330611759,0.026365205956002075,0.03830126913944407,0.010339886807496585,0.0062021478522746335
19
- c8_shuffle,broad,0.006002817095981704,0.07324482423682062,0.04290783015035447,0.5312260166993217,0.031095231957142314,0.05071559226110814,0.014844341632274409,0.007992197160742112
20
- c8_shuffle,low_energy,0.007522675275270428,0.08548698698480924,0.05535642400620475,0.5733929962392837,0.0344994580373168,0.05549505715154939,0.016105178447942885,0.008424719666234322
21
- c8_shuffle,noisy_difficult,0.004631232174616012,0.06179454473275987,0.03418547278713612,0.48386859988409375,0.03384054836536211,0.05319602736863234,0.011662909827594246,0.0074958969572825095
22
- c8_zero,regular,0.002598594369677206,0.04960692126954359,0.02607994553233896,0.2226972747889776,0.021828014566193498,0.006766025436624501,0.006005940441456106,0.002636576758786326
23
- c8_zero,multi_peak,0.0052225425255499665,0.07157631916186166,0.035623891486061945,0.41304285091067117,0.030963075746382986,0.037563192939001414,0.010309769387637812,0.0062008267120709495
24
- c8_zero,broad,0.005967187214761026,0.07328776577635417,0.040548627811764916,0.5285314435050601,0.041440949346574524,0.05049455434911781,0.014814348019186466,0.008019177265287865
25
- c8_zero,low_energy,0.00745859239176507,0.08546718623903063,0.052213846277149895,0.5709580750692458,0.04425996707545386,0.0550233857587926,0.01608007290356216,0.008485170203216728
26
- c8_zero,noisy_difficult,0.004599826591503289,0.061781225282521474,0.03243726556972852,0.4806205214016021,0.03865906059564579,0.0529558404223136,0.011591229425181471,0.007511320087822184
27
- c12_true,regular,0.0016693961090548702,0.03897032951788297,0.02326327402676855,0.17260453578025575,0.016850282792888936,0.0026662470927620897,0.004072612327050477,0.0020385036302272173
28
- c12_true,multi_peak,0.0037808368307730507,0.059014412796213514,0.031622069252152295,0.33567738580325296,0.027095662666455148,0.027748873656881706,0.007171474611534486,0.005401270526890007
29
- c12_true,broad,0.004444780574727153,0.060746845863168204,0.03544820419379643,0.43100656498046147,0.03307429429084536,0.03942695771536184,0.010783221661334946,0.006979659876032244
30
- c12_true,low_energy,0.0058760876981689344,0.07322449266674026,0.046781046434290825,0.48282467018044184,0.03651206977369766,0.0415786522928448,0.012615322852359405,0.007672512526845648
31
- c12_true,noisy_difficult,0.003576403389507461,0.05289943770520271,0.028759426629495998,0.4062339923684559,0.032320794072889146,0.04145704092465282,0.008826089387256947,0.006780359912515869
32
- pca8_oracle,regular,0.0026271206794291854,0.053721138261376866,0.028357567354327158,0.220411198716315,0.1440648975826445,0.013604843700748114,0.005730482317241175,0.0025589097668195053
33
- pca8_oracle,multi_peak,0.0048665368951679696,0.07459590181944863,0.03793201817288285,0.40366587184724356,0.27217426730526817,0.05107216276819744,0.009717776100077326,0.005812714360506525
34
- pca8_oracle,broad,0.005575849840949688,0.07888679194544988,0.04493383622713505,0.5243943924941714,0.304258746050653,0.06101596852143606,0.014040810233425526,0.0077152724436942545
35
- pca8_oracle,low_energy,0.00682521300641672,0.08948080992651364,0.05630626062315608,0.5667028521734571,0.29939609943401246,0.06465362169085041,0.015323036838145484,0.008175544544226594
36
- pca8_oracle,noisy_difficult,0.00427876032208876,0.06349643491326816,0.03472367954987382,0.47377346574314055,0.2848894251953988,0.07034084258512371,0.01118021843481868,0.007253474275034572
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_code_audit_bars.png DELETED
Binary file (34.9 kB)
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_condition_full_prior_summary.csv DELETED
@@ -1,8 +0,0 @@
1
- method,mse,weighted_l1,log_l1,shape,energy,peak,freq,direction
2
- semantic_only,0.005112613041308664,0.06838105820001118,0.036461800987285284,0.435904833532515,0.0347583753958581,0.03923887990060307,0.011485384496313238,0.006472567465925027
3
- c4_true,0.004017224021640326,0.05921096585336186,0.03250912863702055,0.37283168520246235,0.03106844144326354,0.031943115479652846,0.00890542147681117,0.005954965328176816
4
- c8_true,0.005140744164467804,0.06856837454769346,0.03759100294065854,0.437550839923677,0.02367679363796635,0.039439244905398005,0.011518598016765382,0.006481514046234744
5
- c8_shuffle,0.005140389722313673,0.06836396331588428,0.03810743461289103,0.4379725990787385,0.028362938956845374,0.039615790581419355,0.011518013087056932,0.006460506712929124
6
- c8_zero,0.005112612863913888,0.06838105831827436,0.036461800750758916,0.43590483637083144,0.0347583842655969,0.03923888126062968,0.01148538457022773,0.006472567451142129
7
- c12_true,0.00378236624353107,0.05671793997051224,0.032291722557847465,0.35725890360181295,0.028688163452205203,0.02957762779283618,0.008337084684402698,0.0056587932483544425
8
- pca8_oracle,0.004772858790284585,0.071953889041666,0.039408559777906964,0.4295983872716389,0.26294957739966257,0.05121978514251255,0.010886672514653395,0.006182369147796953
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_condition_part_summary.csv DELETED
@@ -1,16 +0,0 @@
1
- method,mse,weighted_l1,log_l1,shape,energy,peak,freq,direction
2
- semantic_only,0.0010285928387135741,0.021637129139096017,0.012319819099964604,0.5172249830904461,0.03935279398565254,0.010487283254781413,0.015947777408337784,0.009886239596184284
3
- c4_true,0.0008014074816841573,0.018743782792062985,0.011000447743941866,0.38596281598484705,0.03225620108700934,0.009629304912532605,0.010181212442971412,0.007311572431631032
4
- c4_shuffle,0.001181723124953726,0.02352181975803678,0.01295351500194224,0.4911849782580421,0.04587278716147892,0.012455754314682313,0.014908942852228407,0.009115476153850083
5
- c4_zero,0.0010285928119195713,0.021637129020832833,0.012319819040833012,0.5172249830904461,0.03935279788833762,0.010487283410001842,0.01594777749703517,0.009886239566618488
6
- c8_true,0.0010336554897505614,0.021696459117626386,0.012644721934246638,0.4425717762538365,0.026729060129986867,0.010529126018463146,0.012699523615458655,0.007733687706705596
7
- c8_shuffle,0.0010334896404177896,0.02162585664717924,0.01276968778776271,0.44523407542516313,0.030091781080478712,0.01060087312131174,0.012824824242483056,0.007807029115538749
8
- c8_zero,0.0010285928119195713,0.021637129020832833,0.012319819040833012,0.5172249830904461,0.03935279788833762,0.010487283410001842,0.01594777749703517,0.009886239566618488
9
- c12_true,0.0007535116719303741,0.017950309263098808,0.010826981227312769,0.3664118661766961,0.03199222775560523,0.009098108680475326,0.009474709312180205,0.0068885886021668
10
- c12_shuffle,0.001299657415421236,0.0246896855533123,0.01236792795714878,0.4508508363413432,0.038520143441264594,0.012356049166844478,0.013172189069409219,0.008304762491394602
11
- c12_zero,0.0010285928119195713,0.021637129020832833,0.012319819040833012,0.5172249830904461,0.03935279788833762,0.010487283410001842,0.01594777749703517,0.009886239566618488
12
- pca0_oracle,0.0010095475322847802,0.021758688998127742,0.012502002160227487,0.5228070313968356,0.0603684905975584,0.010685175908581606,0.016237796934705877,0.010010354413044832
13
- pca4_oracle,0.001002042039689268,0.022854297052300167,0.01304769538165558,0.5228484187807355,0.12899460868229942,0.013601358950374618,0.01581583396782951,0.009862659277305716
14
- pca8_oracle,0.0009734327738572444,0.022810132641877447,0.013129668132889839,0.5223747274232289,0.15421648784762337,0.01484525322707163,0.015610851229183258,0.009690681886341836
15
- pca16_oracle,0.0008975967325063215,0.021937056666328794,0.013048762056444372,0.5171565072877067,0.17199333721683138,0.015217149844540962,0.015089252490609412,0.009471804746204899
16
- pca32_oracle,0.0007755137113336888,0.020187827359352793,0.012435147864004922,0.5012068757935176,0.17844206307615554,0.015649960642414435,0.014180889131412619,0.009037073169435774
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/causal_training_history.csv DELETED
@@ -1,21 +0,0 @@
1
- variant,latent_dim,epoch,time_sec,train_loss,train_base_loss,train_rate,train_img,train_log,train_shape,train_energy,train_peak,train_freq,train_direction,train_dice,train_total,train_causal,train_diversity,train_gap,val_loss,val_base_loss,val_rate,val_img,val_log,val_shape,val_energy,val_peak,val_freq,val_direction,val_dice,val_causal_gap,val_mean_latent_std,val_score
2
- c12,12,1,375.356098651886,0.5481291579405466,0.5481291579405466,0.0,0.021798545430103938,0.011613898312052092,0.39119576644897464,0.03188299823304017,0.009141462785502276,0.011446465666095416,0.006927779437353214,0.9020272866884868,0.5489550413290659,0.0014291909973447522,0.016283354456193288,9.426883655029173e-05,0.593629346953498,0.593629346953498,0.0,0.021675404013385847,0.013003891880904872,0.4438971115483178,0.03074153305755721,0.010556126065138314,0.012720933657080408,0.007725672301141516,0.9127110696974254,0.0002822327825549384,0.07434626668691635,0.5939337766347742
3
- c12,12,2,377.0659532546997,0.5362224791844686,0.5362224791844686,0.0,0.021775506806870303,0.011704953936239083,0.3817618544896444,0.02422823432087898,0.009242385266969601,0.01099314279233416,0.006606705355147521,0.9021022311846415,0.5366523288885753,0.0012177115101367235,0.00018250017805985407,0.0004552785734316179,0.58903211639041,0.58903211639041,0.0,0.021656018105291185,0.012503802318066831,0.44166022822970435,0.02614550514235383,0.010523270061683087,0.012690505914626614,0.007738524220056004,0.9127590012928796,0.0005917721755972635,0.09272179007530212,0.5892591674592216
4
- c12,12,3,375.340989112854,0.5367248613834381,0.5367248613834381,0.0,0.021699281396965187,0.011626602997382482,0.38420872457822164,0.02185097098350525,0.009100019774710139,0.011132450985411803,0.006694494636108478,0.9019208218256632,0.5371037997404734,0.001075972502740721,0.00011737367528606531,0.0009300101390884568,0.5882984418717642,0.5882984418717642,0.0,0.021635016042088704,0.012553491526179843,0.44156919821860297,0.02498153174325587,0.0104848177113112,0.012679524764063813,0.0077307989288653645,0.9127509981866867,0.0013981061749204638,0.10513827204704285,0.5883239010104278
5
- c12,12,4,376.1749415397644,0.5354055147171021,0.5354055147171021,0.0,0.021568402563532194,0.011595834230383238,0.38321917899449665,0.021181836920479934,0.00901865469540159,0.01108240385974447,0.006663104412456353,0.902158934434255,0.5357591871420543,0.001009523277791838,1.6993584382968643e-05,0.0013612994182234008,0.5881627817002554,0.5881627817002554,0.0,0.021614655438396666,0.012409283454337764,0.44097392946954755,0.025723386319383743,0.010516412075727231,0.01267807926273062,0.007742256717017245,0.9127898812294006,0.0011150522549296655,0.09482403099536896,0.588259002627014
6
- c12,12,5,375.2234983444214,0.5297534540494283,0.5297534540494283,0.0,0.021633496743937334,0.011656551035741964,0.3764087144533793,0.021131821237504483,0.008972832853595417,0.01083251591026783,0.00648953548197945,0.9015390345255534,0.5301030071576437,0.0009972691241030892,2.5467515661982056e-05,0.0015420300432791312,0.5867839209617131,0.5867839209617131,0.0,0.021345573373966746,0.012374019102444725,0.4400356922830854,0.025178391515972124,0.010483759980175703,0.012614970598074178,0.0077422610336234645,0.9127489914969792,0.0011839034139282173,0.09554561227560043,0.5868629360119443
7
- c12,12,6,375.306259393692,0.5305995781421662,0.5305995781421662,0.0,0.021100208756824335,0.011479389895995458,0.37682336378097536,0.022904716956118742,0.009059069167822599,0.010730923041701318,0.006617522978534301,0.9021113249460856,0.5309567918777466,0.001018151861615479,4.3046089044461645e-05,0.0013568060144316405,0.5801971029667627,0.5801971029667627,0.0,0.020873336239703118,0.012237219982558773,0.43186811748005094,0.026357809052107824,0.010548437162051125,0.012147134125587485,0.0077456337444129445,0.912496168462057,0.0012847323281069596,0.10438073426485062,0.5802509128879904
8
- c12,12,7,377.23606300354004,0.5215828765233358,0.5215828765233358,0.0,0.02049009939779838,0.011223019761343798,0.365291735569636,0.024885773340861003,0.009114339218785366,0.010139540459960699,0.006514762082447608,0.9023147617975871,0.5219489343166351,0.001045882121194154,0.0,0.0014223542384958516,0.5690574768989806,0.5690574768989806,0.0,0.02000873815268278,0.011931078523279183,0.41758731338712907,0.029355664367950153,0.010594115659062351,0.011291667996417908,0.007720940273314241,0.9119829393568493,0.000904778414960241,0.12038547545671463,0.5692062713215258
9
- c12,12,8,376.7237596511841,0.5100302851994832,0.5100302851994832,0.0,0.01988510761161645,0.010969051909943421,0.3505439485708872,0.027663228770097095,0.00893286546319723,0.009323090452700853,0.006421383836617073,0.9013378702799479,0.510411841392517,0.0010901592516650755,0.0,0.0009557946283215036,0.5634298551650274,0.5634298551650274,0.0,0.019781229958411247,0.011852999912604453,0.41019562785587615,0.03107032132527185,0.010238552118636786,0.010833994588918157,0.007668148016645795,0.9115947286287943,0.0010209099494940823,0.15407392382621765,0.5635496184017551
10
- c12,12,9,376.85094022750854,0.507263090133667,0.507263090133667,0.0,0.019617830522358416,0.010865601129829884,0.3472577447891235,0.028270018259684244,0.00882062143770357,0.009081354944656292,0.006440112157414357,0.9011601126988729,0.5076305433909098,0.0010498686678086719,0.0,0.0010557570937089623,0.5571970977480449,0.5571970977480449,0.0,0.019513066636309737,0.0115175171503945,0.4024127385919056,0.03196660503153763,0.010277780327236368,0.010512134488967676,0.00767862189945484,0.911656053293319,0.0010454020498039584,0.17266879975795746,0.5573107370623732
11
- c12,12,10,375.61447954177856,0.5034275888601939,0.5034275888601939,0.0,0.01945827005058527,0.01086595336596171,0.34302596426010135,0.02805961936712265,0.008680547054857015,0.008941962257027626,0.00640202797204256,0.9008666528065999,0.503779356320699,0.0010050510846388837,0.0,0.0013267192649655045,0.5546970977669671,0.5546970977669671,0.0,0.01933484131263362,0.011616076194932537,0.3993587087071131,0.032680437027935,0.010001635866328365,0.010205556165486102,0.007613758623067822,0.9112323588795133,0.001414736350333052,0.19268487393856049,0.554718405005888
12
- c12,12,11,375.24995708465576,0.5010197977224986,0.5010197977224986,0.0,0.01938673095156749,0.01072282670189937,0.3405762590169907,0.027836419428388277,0.008590539732947945,0.00881740476563573,0.006425728273267547,0.9003096303939819,0.5013628186384836,0.0009800632501331468,0.0,0.0014654783327132464,0.5528195623367552,0.5528195623367552,0.0,0.0191843296356854,0.01143684195325015,0.39693913478699944,0.03328354905049006,0.009874344426428988,0.010215239288906256,0.007620674602332569,0.9113265749007936,0.001349674340980571,0.1880955547094345,0.5528571359738578
13
- c12,12,12,373.3766739368439,0.4982270418802897,0.4982270418802897,0.0,0.019327664556602637,0.010744002804160118,0.3369953593810399,0.028010406091809274,0.008765921199073394,0.008687555788705746,0.006345666376252969,0.9003536230723063,0.4985640133221944,0.0009627767282848556,0.0,0.0018640609867870807,0.5500121920827835,0.5500121920827835,0.0,0.019020675430222164,0.01139732093978969,0.39259391076981076,0.03487931700452926,0.01010480767766398,0.010063974061123436,0.0075816902006784126,0.9109661739970011,0.0018461983861579071,0.2099224030971527,0.5500121864013463
14
- c12,12,13,375.4060823917389,0.4929509384632111,0.4929509384632111,0.0,0.018882986719409623,0.010555492761234443,0.3316131766239802,0.027752760390440622,0.008330006399502357,0.008541071416189273,0.006239386618137359,0.9002649874687195,0.4932921314239502,0.0009748362200334668,0.0,0.0019581074891611935,0.5482192564578283,0.5482192564578283,0.0,0.018971675622557835,0.011403986060666659,0.3897369991219233,0.03596245778340196,0.010054939234304049,0.010053900491801045,0.007547523235044782,0.9108573813287039,0.0017904211242224962,0.22663871943950653,0.5482192457705322
15
- c12,12,14,377.41549587249756,0.49390626017252603,0.49390626017252603,0.0,0.018556087881326674,0.010424449374278387,0.33337370745340983,0.027144863019386928,0.008280318172027668,0.008596581303824982,0.0063180246464908125,0.9015438667933147,0.4942530823548635,0.0009909214425521593,0.0,0.0018746985763621828,0.5442225956727588,0.5442225956727588,0.0,0.018793071457554423,0.011101246781883732,0.38639049681406173,0.034259687044790814,0.010025053351585354,0.009904929961536139,0.007500446719368772,0.9109539077395484,0.0015537958603263611,0.23742897808551788,0.5442225887347751
16
- c12,12,15,374.57928013801575,0.4879121992588043,0.4879121992588043,0.0,0.018680525173743565,0.01044924617310365,0.32630121620496116,0.026820317228635152,0.008347869131714106,0.00838456108296911,0.006138053042193254,0.9005078458786011,0.4882546723683675,0.0009784934458633265,0.0,0.0018599987762669722,0.5416236288017697,0.5416236288017697,0.0,0.018572068492334986,0.011036009498177067,0.3834992429566762,0.034413220153914556,0.00982488968246986,0.009978582439500661,0.007435119925214658,0.9108078158090985,0.0015780522353163668,0.24796634912490845,0.5416236129197632
17
- c12,12,16,374.78523564338684,0.48435816121101377,0.48435816121101377,0.0,0.01854543756445249,0.01036274675031503,0.32214861758550006,0.027183233638604483,0.008152601431434352,0.008309419980893533,0.006059537000954151,0.8999115562438965,0.48470149540901186,0.000980953940966477,0.0,0.0018201460336955886,0.5383955074681176,0.5383955074681176,0.0,0.018438149332290606,0.010934829238861327,0.38056029024578275,0.03345783640231405,0.009575375119253757,0.009925686214710511,0.007377515532194622,0.91070005155745,0.0015295867093040475,0.2573261559009552,0.5383954958088459
18
- c12,12,17,375.4057195186615,0.4858545018831889,0.4858545018831889,0.0,0.01828891504307588,0.010265505398313205,0.3240912417968114,0.0276919092386961,0.00791236455924809,0.008449929422388475,0.006106408959875504,0.9000090823173523,0.4862018145720164,0.0009923230848896006,0.0,0.0015495519357112547,0.5325070912875827,0.5325070912875827,0.0,0.0183464948472286,0.010787804448415362,0.3743760221534305,0.03242616086370415,0.009443070288629287,0.00984728600208958,0.007168316452335271,0.9103870912203713,0.0015570339173935945,0.2719361186027527,0.532507083879503
19
- c12,12,18,375.6031596660614,0.4815242377122243,0.4815242377122243,0.0,0.018189024036129316,0.010152820467948914,0.3193099800348282,0.027175174946586292,0.007915497479960322,0.008391331683844329,0.005955454832563797,0.8999922814369201,0.4818710346221924,0.0009908461997595926,0.0,0.0015711698761830728,0.5308343280875494,0.5308343280875494,0.0,0.018237237862887837,0.010778898994127909,0.3716696477125561,0.03375963408440825,0.009472961108835916,0.009682698995761928,0.007070973057240721,0.9100759076693702,0.0015071118546147195,0.26563721895217896,0.5308343199251723
20
- c12,12,19,374.2583611011505,0.47636756841341654,0.47636756841341654,0.0,0.018179396353662013,0.010071316301822663,0.31338094170888264,0.02693996358414491,0.007824280134091775,0.008251137594381968,0.005801114315167069,0.8994708518981933,0.4767124565442403,0.0009853952241440614,0.0,0.0015627151511919996,0.5287075477933126,0.5287075477933126,0.0,0.01807313070942958,0.010788174641747323,0.36796792111699544,0.03570671941316317,0.009486166072920674,0.00966817271407871,0.006985736899964866,0.9098116821712918,0.0015059328168660166,0.27385368943214417,0.5287075346524251
21
- c12,12,20,376.3787953853607,0.47209075578053794,0.47209075578053794,0.0,0.017972640266021092,0.010004536828647057,0.3088926980495453,0.026397575015823047,0.007601803181692958,0.008173396352678537,0.005698151058206956,0.8995036969184875,0.47243266328175865,0.0009768769474079212,0.0,0.0016348677257386347,0.5249851232483274,0.5249851232483274,0.0,0.017950309263098808,0.010826981227312769,0.3664118661766961,0.03199222775560523,0.009098108680475326,0.009474709312180205,0.0068885886021668,0.9094647736776442,0.0015409467501624945,0.25657251477241516,0.5249851110997418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c4_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:024d01d13b522add7a9757dd5aeef7dfe936de9ae96daa43eed65edd19cef3e9
3
- size 13289488
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_c8_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:66fe62dd6e7cb32d3d03e27504c097851dce6d4e115584fdca939890ce7c5413
3
- size 13290512
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/best_semantic_decoder_exp2b_base.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:d474e5e6502778b2a146521058112407943cfe6ec2d0029d00bdef6e6ee4a864
3
- size 6323841
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c12_causal_manual.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:eb7b6df37eb14d0a585b90f772cf30439683f5bc3792c85ded38e378e40452da
3
- size 13292954
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c4_causal_manual.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:4751bbcf07da04e4a6032bdfa5e298bcb1bc922350c2dbaf1e08f4a129f037f9
3
- size 13290713
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c8_causal_manual.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e6094c1e7873211b8d22687b89c525811ed82737128129bc2e2ba8d1ff9a4dfd
3
- size 13291737
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/downloaded_hf_folder/WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_semantic_decoder.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ee7cfbb0876514442f658168f8757b086a3f4e8726c82ea5c1c2e8f2eb7e09b2
3
- size 6323103
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/experiment2b_decision.json DELETED
@@ -1,28 +0,0 @@
1
- {
2
- "run_sentinel": "ICWDS_WSHC_EXP2B_CAUSAL_RESIDUAL_BOTTLENECK_V1",
3
- "criteria": {
4
- "zero_identity_exact": true,
5
- "pca8_shape_gain_ge_10pct": false,
6
- "pca32_shape_gain_ge_20pct": false,
7
- "c8_shape_gain_ge_10pct": true,
8
- "c8_mse_gain_ge_10pct": false,
9
- "c8_retains_ge_50pct_of_pca8_shape_gain": true,
10
- "shuffle_shape_gap_ge_5pct": false,
11
- "shuffle_mse_gap_ge_5pct": false,
12
- "complex_gain_ge_regular_gain": false
13
- },
14
- "metrics": {
15
- "c8_shape_gain_vs_semantic_only": 0.14433410851609063,
16
- "c8_mse_gain_vs_semantic_only": -0.0049219193897158675,
17
- "pca8_shape_gain_vs_semantic_only": -0.009956487990995466,
18
- "pca32_shape_gain_vs_semantic_only": 0.030969322481716577,
19
- "c8_shape_gain_retention_vs_pca8": 74653206836.60959,
20
- "c8_shuffle_shape_gap": 0.006015519547725834,
21
- "c8_shuffle_mse_gap": -0.00016044933192560507,
22
- "regular_shape_gain": 0.0008977841537090026,
23
- "complex_shape_gain_mean": -0.00462092683500052,
24
- "max_zero_identity_diff": 2.980232238769531e-07,
25
- "smallest_passing_continuous_dim": 4
26
- },
27
- "recommendation": "Residual manifold appears insufficiently low-dimensional: reconsider or remove per-wave shape code; spend bits on semantic precision/background."
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latent_utilization_diagnostics.csv DELETED
@@ -1,4 +0,0 @@
1
- variant,latent_dim,n,mean_std,min_std,max_std,effective_rank,mean_abs_offdiag_corr
2
- c4,4,11910,0.30168530344963074,0.23066112399101257,0.3482239842414856,2.9832115173339844,0.28559038043022156
3
- c8,8,11910,0.1214737668633461,0.06882838904857635,0.2111997902393341,1.0637741088867188,0.9774099588394165
4
- c12,12,11910,0.25949305295944214,0.19109365344047546,0.37045663595199585,4.088396072387695,0.4084055423736572
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c12_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:1b5a106dedb2881627356ba376dd2e7a697f6d01725e91d5fa1bb1e8744c2bcf
3
- size 39891227
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c12_causal_manual.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:eb7b6df37eb14d0a585b90f772cf30439683f5bc3792c85ded38e378e40452da
3
- size 13292954
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c4_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:4751bbcf07da04e4a6032bdfa5e298bcb1bc922350c2dbaf1e08f4a129f037f9
3
- size 13290713
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c4_causal_manual.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:4751bbcf07da04e4a6032bdfa5e298bcb1bc922350c2dbaf1e08f4a129f037f9
3
- size 13290713
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c8_causal.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e6094c1e7873211b8d22687b89c525811ed82737128129bc2e2ba8d1ff9a4dfd
3
- size 13291737
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_c8_causal_manual.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e6094c1e7873211b8d22687b89c525811ed82737128129bc2e2ba8d1ff9a4dfd
3
- size 13291737
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/latest_semantic_decoder.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ee7cfbb0876514442f658168f8757b086a3f4e8726c82ea5c1c2e8f2eb7e09b2
3
- size 6323103
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/model_summary_exp2b.json DELETED
@@ -1,87 +0,0 @@
1
- {
2
- "run_sentinel": "ICWDS_WSHC_EXP2B_CAUSAL_RESIDUAL_BOTTLENECK_V1",
3
- "architecture": "Frozen deterministic semantic backbone + continuous causal residual codec Delta(z,s)=F(z,s)-F(0,s)",
4
- "latent_dims": [
5
- 4,
6
- 8,
7
- 12
8
- ],
9
- "pca_dims": [
10
- 0,
11
- 4,
12
- 8,
13
- 16,
14
- 32
15
- ],
16
- "best_checkpoints": {
17
- "c4": {
18
- "path": "/content/icwds_wshc_exp2b_causal_residual/best_c4_causal.pt",
19
- "score": Infinity
20
- },
21
- "c8": {
22
- "path": "/content/icwds_wshc_exp2b_causal_residual/best_c8_causal.pt",
23
- "score": Infinity
24
- },
25
- "c12": {
26
- "path": "/content/icwds_wshc_exp2b_causal_residual/best_c12_causal.pt",
27
- "score": 0.5249851110997418
28
- }
29
- },
30
- "zero_identity_sentinels": {
31
- "c4": 2.980232238769531e-07,
32
- "c8": 2.980232238769531e-07,
33
- "c12": 2.980232238769531e-07
34
- },
35
- "decision": {
36
- "run_sentinel": "ICWDS_WSHC_EXP2B_CAUSAL_RESIDUAL_BOTTLENECK_V1",
37
- "criteria": {
38
- "zero_identity_exact": true,
39
- "pca8_shape_gain_ge_10pct": false,
40
- "pca32_shape_gain_ge_20pct": false,
41
- "c8_shape_gain_ge_10pct": true,
42
- "c8_mse_gain_ge_10pct": false,
43
- "c8_retains_ge_50pct_of_pca8_shape_gain": true,
44
- "shuffle_shape_gap_ge_5pct": false,
45
- "shuffle_mse_gap_ge_5pct": false,
46
- "complex_gain_ge_regular_gain": false
47
- },
48
- "metrics": {
49
- "c8_shape_gain_vs_semantic_only": 0.14433410851609063,
50
- "c8_mse_gain_vs_semantic_only": -0.0049219193897158675,
51
- "pca8_shape_gain_vs_semantic_only": -0.009956487990995466,
52
- "pca32_shape_gain_vs_semantic_only": 0.030969322481716577,
53
- "c8_shape_gain_retention_vs_pca8": 74653206836.60959,
54
- "c8_shuffle_shape_gap": 0.006015519547725834,
55
- "c8_shuffle_mse_gap": -0.00016044933192560507,
56
- "regular_shape_gain": 0.0008977841537090026,
57
- "complex_shape_gain_mean": -0.00462092683500052,
58
- "max_zero_identity_diff": 2.980232238769531e-07,
59
- "smallest_passing_continuous_dim": 4
60
- },
61
- "recommendation": "Residual manifold appears insufficiently low-dimensional: reconsider or remove per-wave shape code; spend bits on semantic precision/background."
62
- },
63
- "outputs": [
64
- "WaveSemanticHybridCodec_Exp2B.py",
65
- "WaveSemanticHybridCodec_Exp2B_best.pt",
66
- "best_c12_causal.pt",
67
- "best_c4_causal.pt",
68
- "best_c8_causal.pt",
69
- "best_semantic_decoder_exp2b_base.pt",
70
- "causal_capacity_summary.csv",
71
- "causal_casewise_summary.csv",
72
- "causal_code_audit_bars.png",
73
- "causal_condition_full_prior_summary.csv",
74
- "causal_condition_part_summary.csv",
75
- "causal_residual_full_prior_gallery.png",
76
- "causal_training_history.csv",
77
- "experiment2b_decision.json",
78
- "latent_utilization_diagnostics.csv",
79
- "latest_c12_causal.pt",
80
- "latest_c4_causal.pt",
81
- "latest_c8_causal.pt",
82
- "latest_semantic_decoder.pt",
83
- "pca_oracle_capacity.png",
84
- "residual_pca_oracle.npz",
85
- "training_curves_exp2b.png"
86
- ]
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
WaveSemanticHybridCodec/Exp2B_CausalResidualBottleneck/pca_oracle_capacity.png DELETED
Binary file (65.2 kB)