loss-manifest companion: article + 155-entry rated registry + sidecar + loss library + gates/battery + campaign beds + raw run ledgers
4ef8b0b verified | """geolip_vitals.py — the shared diagnostic harness (progression plan Tree 7a). | |
| One implementation, every tree imports it. ALL functions are READOUTS: no gradients, | |
| no losses. CV is a readout, never a force (discovery_catalog #3). Judge addressing by | |
| drift->0.29154 and CV->0.20, never recon cosine (MANIFEST). | |
| Vitals provided: | |
| anchor_drift — geodesic drift of anchors from init; binding fraction @0.29154 | |
| pentachoron_cv — CM 4-volume CV over random 5-row subsets (geovocab2 import) | |
| axis_aliveness — oriented-address usage: axes alive, hppl, collapse flag | |
| gate_stats — gate means vs the 0.012-0.03 band | |
| path_diversity — unique-path counting, FIXED high-bits hash (low-16 bug is the | |
| retracted artifact — never use the low bits) | |
| grad_norm_spread — gradient democracy monitor (orders-of-magnitude spread) | |
| CVScreen — CV@1000-batch early band screen (<0.30 LOW / .35-.50 MID / >.80 HIGH) | |
| Smoke on a torch-capable env: python geolip_vitals.py | |
| """ | |
| from __future__ import annotations | |
| import math | |
| import torch | |
| BINDING = 0.29154 # radians; the binding/separation constant (MANIFEST) | |
| CV_BAND = (0.13, 0.30) # CM CV band (discovery_catalog #4) | |
| GATE_BAND = (0.012, 0.03) # live invariant candidate (acd_campaign) | |
| KNUTH32 = 2654435761 | |
| # ----------------------------------------------------------------------------- drift | |
| def anchor_drift(current: torch.Tensor, init: torch.Tensor, tol: float = 0.05) -> dict: | |
| """Geodesic drift (radians) of each row of `current` from its row in `init`, | |
| both row-normalized. Returns mean/std/per-row drift and the fraction of rows | |
| within +/-tol of BINDING (the GLFM '46%' readout).""" | |
| a = torch.nn.functional.normalize(current.float(), dim=-1) | |
| b = torch.nn.functional.normalize(init.float(), dim=-1) | |
| cos = (a * b).sum(-1).clamp(-1.0, 1.0) | |
| drift = torch.arccos(cos) | |
| frac = ((drift - BINDING).abs() <= tol).float().mean() | |
| return {"mean": drift.mean().item(), "std": drift.std().item(), | |
| "per_row": drift, "binding_fraction": frac.item()} | |
| # -------------------------------------------------------------------------------- cv | |
| def _pentachoron_volumes(pts: torch.Tensor) -> torch.Tensor: | |
| """Batched Cayley-Menger 4-simplex volumes. pts: (B, 5, D) -> (B,) volumes. | |
| One float64 det over all samples (vol^2 = -det(CM)/9216 for n=4). Built-in | |
| per the 2026-07-11 rider amendment (the operator: the installed geovocab2 path is a | |
| per-sample class call — too slow for a vitals loop); geovocab2 stays the | |
| reference implementation, parity-checked via cv_reference_check().""" | |
| B = pts.shape[0] | |
| d2 = torch.cdist(pts.double(), pts.double()).pow(2) # (B,5,5) | |
| cm = torch.ones(B, 6, 6, dtype=torch.float64, device=pts.device) | |
| cm[:, 0, 0] = 0.0 | |
| cm[:, 1:, 1:] = d2 | |
| det = torch.linalg.det(cm) | |
| return (-det / 9216.0).clamp_min(0.0).sqrt().float() | |
| def pentachoron_cv(rows: torch.Tensor, n_samples: int = 200, | |
| generator: torch.Generator | None = None) -> float: | |
| """CV (std/mean) of Cayley-Menger 4-simplex volumes over n_samples random | |
| 5-row subsets. Rows are row-normalized before measurement. Uses the built-in | |
| batched CM (float64 det); validate against geovocab2 with | |
| cv_reference_check() after any change to the volume math.""" | |
| x = torch.nn.functional.normalize(rows.float(), dim=-1) | |
| n = x.shape[0] | |
| if n < 5: | |
| raise ValueError(f"pentachoron_cv needs >=5 rows, got {n}") | |
| g = generator or torch.Generator(device="cpu").manual_seed(0) | |
| idx = torch.stack([torch.randperm(n, generator=g)[:5] | |
| for _ in range(n_samples)]) # (B,5) | |
| v = _pentachoron_volumes(x[idx].cpu()) | |
| return (v.std() / v.mean().clamp_min(1e-12)).item() | |
| def cv_reference_check(n_trials: int = 50, tol: float = 1e-5) -> float: | |
| """Parity check of the built-in batched CM against geovocab2's reference | |
| implementation (the formula's source of truth). Returns max |rel diff|; | |
| raises if geovocab2 is absent or parity fails. Run after touching | |
| _pentachoron_volumes.""" | |
| try: | |
| from geovocab2.shapes.formula.symbolic.cayley_menger import ( | |
| CayleyMengerFromSimplex) | |
| except Exception as e: # pragma: no cover | |
| raise ImportError( | |
| "cv_reference_check requires geovocab2 (install via the geolip-svae " | |
| "umbrella: pip install git+https://github.com/AbstractEyes/" | |
| "geolip-svae).") from e | |
| ref = CayleyMengerFromSimplex() | |
| g = torch.Generator().manual_seed(0) | |
| pts = torch.nn.functional.normalize( | |
| torch.randn(n_trials, 5, 4, generator=g), dim=-1) | |
| mine = _pentachoron_volumes(pts) | |
| # compare at float64: the reference computes in the INPUT dtype, and fp32 | |
| # dets lose up to ~4% on near-degenerate pentachora (measured 2026-07-11) | |
| tsuccessors = torch.stack([ref.forward(p.double())["volume"].float() for p in pts]) | |
| rel = ((mine - tsuccessors).abs() / tsuccessors.abs().clamp_min(1e-12)).max().item() | |
| if rel > tol: | |
| raise AssertionError(f"CM parity vs geovocab2 failed: max rel {rel}") | |
| return rel | |
| # ------------------------------------------------------------------------- aliveness | |
| def axis_aliveness(oriented_weights: torch.Tensor, alive_thresh: float = 1e-3) -> dict: | |
| """`oriented_weights`: (..., 2K) nonnegative oriented-softmax address rows | |
| (sum to 1 on the last dim). Returns axes-alive count, mean-usage perplexity | |
| (hppl analogue; healthy hosted reference 125-126/128), and a collapse flag. | |
| Reference behavior: near-uniform aliveness at div_weight=0 (discovery #22).""" | |
| w = oriented_weights.reshape(-1, oriented_weights.shape[-1]).float() | |
| usage = w.mean(0) | |
| usage = usage / usage.sum().clamp_min(1e-12) | |
| # an axis is alive if its mean usage exceeds alive_thresh x the uniform share | |
| alive = int((usage > alive_thresh * (1.0 / usage.numel())).sum()) | |
| ent = -(usage.clamp_min(1e-12) * usage.clamp_min(1e-12).log()).sum() | |
| ppl = float(ent.exp()) | |
| return {"axes_total": usage.numel(), "axes_alive": alive, "usage_ppl": ppl, | |
| "collapsed": ppl < 0.05 * usage.numel()} | |
| # ------------------------------------------------------------------------------ gates | |
| def gate_stats(gates: torch.Tensor) -> dict: | |
| """Gate values (post-sigmoid/clamp). Reports mean and whether it sits in the | |
| 0.012-0.03 band (read-only — the band is a candidate invariant, never a target).""" | |
| g = gates.float().flatten() | |
| m = g.mean().item() | |
| return {"mean": m, "std": g.std().item(), | |
| "in_band": GATE_BAND[0] <= m <= GATE_BAND[1]} | |
| # ------------------------------------------------------------------------------ paths | |
| def path_diversity(ids: torch.Tensor) -> dict: | |
| """Unique-path counting with the FIXED multiplicative hash: | |
| ((ids * 2654435761) % 2^32) >> 16 — Knuth needs the HIGH bits; the low-16 | |
| variant produced the retracted ~1,500 path ceiling (sessions/2026-07-07). | |
| `ids`: integer tensor, one composed path id per row (any shape).""" | |
| x = ids.reshape(-1).to(torch.int64) | |
| hashed = ((x * KNUTH32) % (1 << 32)) >> 16 | |
| return {"n": int(x.numel()), | |
| "unique_raw": int(torch.unique(x).numel()), | |
| "unique_hashed": int(torch.unique(hashed).numel())} | |
| def compose_path_ids(stage_indices: list[torch.Tensor], radix: int) -> torch.Tensor: | |
| """Compose per-stage discrete indices (each (...,) int in [0, radix)) into a | |
| single path id, positional base-`radix` — construction, not hashing.""" | |
| out = torch.zeros_like(stage_indices[0], dtype=torch.int64) | |
| for s in stage_indices: | |
| out = out * radix + s.to(torch.int64) | |
| return out | |
| # --------------------------------------------------------------------- grad democracy | |
| def grad_norm_spread(groups: dict[str, list[torch.nn.Parameter]]) -> dict: | |
| """Gradient-democracy monitor. `groups`: name -> params of one parallel member | |
| (tower/expert). Reports per-group grad norms and the orders-of-magnitude spread. | |
| Reference: unequalized heterogeneous towers spread ~20 orders (fibonacci dead at | |
| 2.25e-21 under helix); equalized ~0.0 (canon/fibonacci_systems.md).""" | |
| norms = {} | |
| for name, params in groups.items(): | |
| gs = [p.grad for p in params if p.grad is not None] | |
| norms[name] = float(torch.sqrt(sum((g.float() ** 2).sum() for g in gs)).item()) \ | |
| if gs else 0.0 | |
| vals = [v for v in norms.values() if v > 0] | |
| spread = (math.log10(max(vals)) - math.log10(min(vals))) if len(vals) >= 2 else 0.0 | |
| return {"norms": norms, "spread_orders": spread, "dead": [k for k, v in norms.items() if v == 0.0]} | |
| # ----------------------------------------------------------------------------- screen | |
| class CVScreen: | |
| """CV@N early band screen (tri-band ft1): record pentachoron CV at `step_mark` | |
| batches; classify <0.30 LOW / 0.35-0.50 MID / >0.80 HIGH. Turns ~2h/config | |
| into ~7min. Readout only.""" | |
| def __init__(self, step_mark: int = 1000): | |
| self.step_mark = step_mark | |
| self.recorded: float | None = None | |
| def maybe_record(self, step: int, rows: torch.Tensor) -> float | None: | |
| if self.recorded is None and step >= self.step_mark: | |
| self.recorded = pentachoron_cv(rows) | |
| return self.recorded | |
| def band(self) -> str | None: | |
| c = self.recorded | |
| if c is None: | |
| return None | |
| if c < 0.30: | |
| return "LOW" | |
| if 0.35 <= c <= 0.50: | |
| return "MID" | |
| if c > 0.80: | |
| return "HIGH" | |
| return "BETWEEN" | |
| # ------------------------------------------------------------------------------ smoke | |
| if __name__ == "__main__": # shapes/parse smoke ONLY — no training, ever. | |
| g = torch.Generator().manual_seed(0) | |
| K, D = 64, 4 | |
| init = torch.nn.functional.normalize(torch.randn(K, D, generator=g), dim=-1) | |
| cur = torch.nn.functional.normalize(init + 0.29 * torch.randn(K, D, generator=g), dim=-1) | |
| print("drift:", {k: v for k, v in anchor_drift(cur, init).items() if k != "per_row"}) | |
| w = torch.softmax(torch.randn(32, 2 * K, generator=g), dim=-1) | |
| print("aliveness:", axis_aliveness(w)) | |
| print("gates:", gate_stats(torch.full((8,), 0.024))) | |
| ids = compose_path_ids([torch.randint(0, 16, (4096,), generator=g) for _ in range(4)], 16) | |
| print("paths:", path_diversity(ids)) | |
| lin = torch.nn.Linear(8, 8) | |
| lin(torch.randn(4, 8)).sum().backward() | |
| print("democracy:", grad_norm_spread({"a": list(lin.parameters())})) | |
| print("OK — vitals smoke passed (pentachoron_cv needs geovocab2; run on GPU env)") | |