SilverSight/scripts/compression/frozen_model_compress.py
allaun 99c943dcd0 docs(compression): honest-findings writeup + reproducible scripts
Records the full compression investigation as a repo doc plus the scripts that
back every number (real coders, byte-exact lossless round-trips, no straw
baselines). One law: recoverable <=> sparse/structured; no method beats K(data),
schemes only relocate bits between model and residual columns.

Findings (all measured): char-poly = integrity receipt not compressor; Braille/T9
= 4.167 b/B, loses to xz; "16D/583x" GW ringdown = zero-noise self-fit artifact,
~1.5x tying/losing to LPC on noisy strain; frozen-model conservation law
(k=3 smallest tape, worst total); Semantic Mass Number = base conversion
(1.00-1.10x, bijection); capstone superposition/compressed-sensing cliff
(recoverable iff k <= ~d/log N). Honest home for all: receipts/addresses/
recoverability gates (GCCL/RRC), never the ratio column.

docs/research/COMPRESSION_HONEST_FINDINGS.md + scripts/compression/ (7 scripts + README).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 15:52:27 -05:00

148 lines
5.9 KiB
Python

"""
Frozen-model + real arithmetic coder = lossless compressor, with HONEST
two-column accounting (the "weird machine" conservation law).
A decompressor is a program (Turing machine) that outputs the data. Its
self-contained size has two columns:
TOTAL = |program: frozen model + coder| + |tape: arithmetic-coded residual|
Turing-completeness does not help: for the SAME data, making the model bigger
(higher order) shrinks the tape but grows the program. You can shuffle bits
between the columns; you cannot push the SUM below the data's entropy / K.
This script:
- builds a FROZEN order-k byte model on a TRAIN split (no adaptation at code time)
- compresses a held-out TEST split with a genuine Witten-Neal-Cleary coder
- ASSERTS lossless round-trip
- reports, per k: test bits/char, shipped model size (xz of the frozen table),
tape bytes, self-contained TOTAL, and the amortized (model-shared) number.
- baselines: xz / gzip on the same test bytes.
"""
import os, sys, pickle, lzma, gzip, numpy as np
def load_corpus(root, cap):
buf = bytearray()
for dp, _, fs in os.walk(root):
for fn in fs:
if fn.endswith((".md", ".txt", ".lean", ".py")):
try:
with open(os.path.join(dp, fn), "rb") as f:
buf += f.read()
except Exception:
pass
if len(buf) >= cap:
return bytes(buf[:cap])
return bytes(buf)
root = sys.argv[1] if len(sys.argv) > 1 else "/home/allaun/SilverSight"
data = load_corpus(root, 1_800_000)
split = len(data) - 150_000
train, test = data[:split], data[split:]
print(f"train {len(train)} bytes, test {len(test)} bytes (held out)\n")
# ---- WNC 32-bit arithmetic coder over a supplied freq vector ----
BITS = 32; TOP = (1 << BITS) - 1; HALF = 1 << 31; QTR = 1 << 30; TQ = 3 << 30
def freq_for(row_counts):
"""Deterministic positive freq vector from frozen counts (both sides identical)."""
s = row_counts.sum()
if s > 0:
scaled = (row_counts * 4096.0 / s).astype(np.int64)
else:
scaled = np.zeros(256, dtype=np.int64)
return scaled + 1 # Laplace: every symbol codeable; total < 4096+256 << 2^16
def encode(test, model, k):
low, high, pending = 0, TOP, 0
out = bytearray(); bitbuf = 0; nb = 0
def put(b):
nonlocal bitbuf, nb
bitbuf = (bitbuf << 1) | b; nb += 1
if nb == 8: out.append(bitbuf); bitbuf = 0; nb = 0
def emit(b):
nonlocal pending
put(b)
while pending: put(b ^ 1); pending -= 1
ctx = 0; mask = (1 << (8 * k)) - 1 if k else 0
for sym in test:
row = model.get(ctx, ZERO)
f = freq_for(row); tot = int(f.sum())
cum = int(f[:sym].sum()); fs = int(f[sym])
rng = high - low + 1
high = low + rng * (cum + fs) // tot - 1
low = low + rng * cum // tot
while True:
if high < HALF: emit(0)
elif low >= HALF: emit(1); low -= HALF; high -= HALF
elif low >= QTR and high < TQ: pending += 1; low -= QTR; high -= QTR
else: break
low <<= 1; high = (high << 1) | 1
ctx = ((ctx << 8) | sym) & mask if k else 0
pending += 1; emit(1 if low >= QTR else 0)
if nb: out.append(bitbuf << (8 - nb))
return bytes(out)
def decode(enc, model, k, n):
low, high = 0, TOP; pos = 0; total = len(enc) * 8
def getbit():
nonlocal pos
b = (enc[pos >> 3] >> (7 - (pos & 7))) & 1 if pos < total else 0
pos += 1; return b
code = 0
for _ in range(BITS): code = (code << 1) | getbit()
out = bytearray(); ctx = 0; mask = (1 << (8 * k)) - 1 if k else 0
for _ in range(n):
row = model.get(ctx, ZERO)
f = freq_for(row); tot = int(f.sum())
rng = high - low + 1
val = ((code - low + 1) * tot - 1) // rng
cs = np.cumsum(f); sym = int(np.searchsorted(cs, val, side='right'))
cum = int(cs[sym - 1]) if sym > 0 else 0; fs = int(f[sym])
high = low + rng * (cum + fs) // tot - 1
low = low + rng * cum // tot
while True:
if high < HALF: pass
elif low >= HALF: low -= HALF; high -= HALF; code -= HALF
elif low >= QTR and high < TQ: low -= QTR; high -= QTR; code -= QTR
else: break
low <<= 1; high = (high << 1) | 1; code = (code << 1) | getbit()
out.append(sym); ctx = ((ctx << 8) | sym) & mask if k else 0
return bytes(out)
ZERO = np.zeros(256, dtype=np.int64)
def build_frozen(train, k):
model = {}; ctx = 0; mask = (1 << (8 * k)) - 1 if k else 0
for sym in train:
if ctx not in model: model[ctx] = np.zeros(256, dtype=np.int64)
model[ctx][sym] += 1
ctx = ((ctx << 8) | sym) & mask if k else 0
return model
def model_ship_bytes(model):
"""Honest shipped size: frozen table serialized, then xz'd (real bytes)."""
packed = {c: row.astype(np.uint16).tobytes() for c, row in model.items()}
return len(lzma.compress(pickle.dumps(packed), preset=6))
xz_test = len(lzma.compress(test, preset=9))
gz_test = len(gzip.compress(test, 9))
print(f"baselines on test: raw {len(test)} gzip {gz_test} xz {xz_test} "
f"({xz_test*8/len(test):.3f} b/char)\n")
print(f"{'order k':>7} {'test b/char':>11} {'tape B':>9} {'model B(xz)':>12} "
f"{'TOTAL self':>11} {'amortized':>10} {'lossless':>9}")
print("-" * 76)
for k in [0, 1, 2, 3]:
model = build_frozen(train, k)
enc = encode(test, model, k)
dec = decode(enc, model, k, len(test))
ok = dec == test
tape = len(enc)
msz = model_ship_bytes(model)
bpc = tape * 8 / len(test)
total = msz + tape
print(f"{k:>7} {bpc:>11.3f} {tape:>9} {msz:>12} {total:>11} {tape:>10} "
f"{'PASS' if ok else 'FAIL':>9}")
print("\nTAPE shrinks with k (better prediction); MODEL grows with k (more contexts).")
print("TOTAL self-contained = the Hutter number (model must ship). AMORTIZED = tape")
print("only, valid ONLY when both ends already share the frozen model.")