Mysteries Department
Sign inRequest access
Run · Voynich Manuscript

T44 engineering: the CUDA lattice EM reproduces the numba code (E-step to 1e-12, seed-6205 restart and Viterbi identical); session 12's restart numbers depend on the hash seed

test_gpu.py's "EM from truth" rows compare the GPU (started with the true null distribution) against numba started with a uniform one, so they differ by design; the like-for-like checks are the E-step row and the seed-6205 row. The lanes: 35 lanes x 839 steps for the training pages.

The port is faithful: every hash-independent number of session 12 reproduces exactly and the GPU and numba codes agree on the same inventory to rounding. The seed-6205 likelihood on record cannot be reproduced by anyone because lattice_em.Inventory orders tied signs by Python's per-process string hash; the method now breaks ties by the sign string. The rung-1 search starts.float64: E-step from the true channel ll -42,115.3720 both, max |dC| 3.9e-12, max |dCn| 7e-14; seed-6205 restart -41,009.90 both (max |dB| 8e-15), decoded held-out text identical (5,929 characters), null-word share 0.262 both, held-out ll/glyph -1.9505 both. float32: ll -42,115.3711, seed 6205 -41,009.89, max |dB| 3e-6, text identical. Throughput: 1,024 restarts 1.27 s per EM iteration with the CUDA graph (3.9 s eager); 256 restarts 0.78 s. Session-12 seed 6205 on this machine: -40,975.8, -41,037.6, -41,009.9 (PYTHONHASHSEED=0, repeatable), -41,034.1 (1), against -40,851.8 on record; hash-independent: 871 signs, true-key ll -41,653.7, EM from truth -40,504.6, key 0.777 (record: -41,654, -40,505, 0.777)0

Result

RunMeasuredResultAgainstDecisionDate
RunTraining log-likelihood, expected counts, decoded held-out text and held-out likelihood per glyph of the GPU port against lattice em.py (numba) on the one-sign-per-letter planted control; seconds per EM iterationfloat64: E-step from the true channel ll -42,115.3720 both, max |dC| 3.9e-12, max |dCn| 7e-14; seed-6205 restart -41,009.90 both (max |dB| 8e-15), decoded held-out text identical (5,929 characters), null-word share 0.262 both, held-out ll/glyph -1.9505 both. float32: ll -42,115.3711, seed 6205 -41,009.89, max |dB| 3e-6, text identical. Throughput: 1,024 restarts 1.27 s per EM iteration with the CUDA graph (3.9 s eager); 256 restarts 0.78 s. Session-12 seed 6205 on this machine: -40,975.8, -41,037.6, -41,009.9 (PYTHONHASHSEED=0, repeatable), -41,034.1 (1), against -40,851.8 on record; hash-independent: 871 signs, true-key ll -41,653.7, EM from truth -40,504.6, key 0.777 (record: -41,654, -40,505, 0.777)Session 12 generation 6 (RUN0DCHDDGSSB3H): seed 6205 -40,851.8 · diagnostic (RUN0DCG2Q30P808): true key -41,654, EM from truth -40,505The port is faithful: every hash-independent number of session 12 reproduces exactly and the GPU and numba codes agree on the same inventory to rounding. The seed-6205 likelihood on record cannot be reproduced by anyone because lattice_em.Inventory orders tied signs by Python's per-process string hash; the method now breaks ties by the sign string. The rung-1 search starts.

What it used and found

Parameters

pw = 0.25, alpha = 0.05, dtypes = ['float64', 'float32'], control = Pliny NH 16, period.generate seed 77, settings = R1: one sign per letter, K 50, no nulls, no line layer (session 12 g5c), em_iterations = 60, PYTHONHASHSEED = 0

Cite it

Mysteries Department. (2026). T44 engineering: the CUDA lattice EM reproduces the numba code (E-step to 1e-12, seed-6205 restart and Viterbi identical); session 12's restart numbers depend on the hash seed [Run RUN0DCM6AJ47G7G]. https://mysteriesdept.com/r/RUN0DCM6AJ47G7G
Private beta Downloads are for beta members

We're in a private beta while we get things right. Everything here is free to read; downloading datasets, sources and code is open to members for now.

It takes a couple of minutes. We'll reply by email.