threshold-computers / src /check_codec.py
phanerozoic's picture
threshold-computers: a family of machines built from ternary threshold gates, with the paper on universal construction and exact self-reproduction
3579fb4
Raw
History Blame Contribute Delete
4.34 kB
"""The recipe codec on every short string and at every boundary of the format.
Checked for both encoders: the round trip, the length bound of the completeness
lemma, and that the reserved tag 128 is never emitted. The boundaries covered
are the 127-byte literal cap and the run lengths that map to the extreme repeat
tags, together with exhaustive coverage at small lengths.
"""
import itertools
import json
import os
import random
import sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from selfrep import describe, describe_literal, decode
REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def runs_path(name: str) -> str:
d = os.path.join(REPO, "paper", "runs")
os.makedirs(d, exist_ok=True)
return os.path.join(d, name)
def bound(n: int) -> int:
return n + -(-n // 127) + 1
def tags(tape: bytes):
i, out = 0, []
while True:
t = tape[i]
out.append(t)
i += 1
if t == 0:
return out
i += t if t <= 127 else 1
class Audit:
def __init__(self):
self.n = 0
self.roundtrip = []
self.overlong = []
self.not_tight = []
self.tag128 = []
def check(self, b: bytes) -> None:
self.n += 1
for enc in (describe, describe_literal):
r = enc(b)
if decode(r) != b:
self.roundtrip.append((enc.__name__, len(b)))
if len(r) > bound(len(b)):
self.overlong.append((enc.__name__, len(b), len(r)))
if len(describe_literal(b)) != bound(len(b)):
self.not_tight.append(len(b))
if 128 in tags(describe(b)):
self.tag128.append(len(b))
@property
def ok(self) -> bool:
return not (self.roundtrip or self.overlong or self.not_tight or self.tag128)
def main() -> int:
a = Audit()
for n in range(0, 15):
for t in itertools.product((0, 1), repeat=n):
a.check(bytes(t))
binary = a.n
for n in range(0, 10):
for t in itertools.product((0, 1, 2), repeat=n):
a.check(bytes(t))
ternary = a.n - binary
print(f" exhaustive: {binary:,} binary strings to length 14, "
f"{ternary:,} ternary to length 9")
edges = (list(range(0, 12))
+ [126, 127, 128, 129, 130, 251, 252, 253, 254, 255, 256, 257,
380, 381, 382, 508, 509, 510])
before = a.n
for L in edges:
a.check(bytes([0x41]) * L)
a.check(bytes([0x00]) * L)
a.check(bytes([0xFF]) * L)
a.check(bytes(range(256))[:L] if L <= 256 else bytes(range(256)) * (L // 256))
a.check(bytes([0x41] * L + [0x42]))
a.check(bytes([0x42] + [0x41] * L))
a.check(bytes([0x41] * L + [0x42] * L))
a.check(bytes(([0x41] * 4 + [0x42]) * max(1, L)))
a.check(bytes(([0x41] * 3 + [0x42]) * max(1, L)))
print(f" boundaries: {a.n - before:,} strings straddling the literal cap, "
f"the extreme repeat tags, and the run/literal transitions")
rng = random.Random(11)
before = a.n
for _ in range(4000):
n = rng.randrange(0, 900)
alpha = rng.choice([2, 3, 7, 256])
a.check(bytes(rng.randrange(alpha) for _ in range(n)))
for _ in range(1500):
n = rng.randrange(0, 900)
out = bytearray()
while len(out) < n:
out += bytes([rng.randrange(256)]) * rng.choice([1, 2, 3, 4, 5, 126, 127, 128, 253])
a.check(bytes(out[:n]))
print(f" random and run-structured: {a.n - before:,} strings")
print(f" total {a.n:,}: round-trip exact, neither encoder exceeds "
f"|f| + ceil(|f|/127) + 1, the literal encoder attains it, "
f"tag 128 never emitted: {'yes' if a.ok else 'NO'}")
if not a.ok:
print(" roundtrip:", a.roundtrip[:5])
print(" overlong:", a.overlong[:5])
print(" not tight:", a.not_tight[:5])
print(" tag128:", a.tag128[:5])
json.dump({"strings": a.n, "roundtrip_failures": len(a.roundtrip),
"bound_failures": len(a.overlong),
"literal_not_tight": len(a.not_tight),
"tag128_emitted": len(a.tag128)},
open(runs_path("paper_codec.json"), "w"), indent=1)
return 0 if a.ok else 1
if __name__ == "__main__":
sys.exit(main())