Download REPORT.md from GOVINDFROM/parallel-consistent-masked-diffusion: direct link, hf CLI and curl.
- Browser
- Download file 70.8 kB
-
https://huggingface.co/GOVINDFROM/parallel-consistent-masked-diffusion/resolve/main/REPORT.md
- Command line
-
hf download hf://GOVINDFROM/parallel-consistent-masked-diffusion/REPORT.md
-
curl -L -o REPORT.md https://huggingface.co/GOVINDFROM/parallel-consistent-masked-diffusion/resolve/main/REPORT.md
Recursive Masked Diffusion on Sudoku: Benchmark Saturation, Classical Baselines, and a Negative Result on Input Injection
Recursive Masked Diffusion Models (R-MDMs) β a weight-shared block applied repeatedly inside each denoising step, trained with loss at every loop β are an established architecture (arXiv:2606.18022). This work reproduces their central finding independently, shows that the standard Sudoku benchmark is saturated and replaces it, measures classical solvers that prior work omits, and reports a negative result: the one architectural component we added does not help once R-MDM's own conditioning is present.
Trained from scratch: every weight randomly initialised, every tokenizer hand-written, the primary benchmark generated rather than downloaded. Verify it in under a minute.
Relation to prior work β read this first
We arrived at the recursive architecture independently and only afterwards identified arXiv:2606.18022, which establishes it. The core mechanism is theirs, not ours. Specifically, they already introduce: the weight-shared block applied recurrently within a denoising step; deep supervision via an all-steps loss; recursion as a substitute for parameter count; evaluation on Sudoku and text8; and extrapolation to more loops at inference than training.
What this work adds, and nothing more:
contribution status The standard split is saturated. Plain constraint propagation solves 1000/1000 of the SATNet test set, so published accuracies on it (SATNet 98.3%) sit below a trivial non-learned baseline. Checkable in seconds; invalidates the benchmark, not the models A hard replacement benchmark, 100k/1k, 21β28 clues, uniqueness re-verified after every cell removal, train/test leakage checked up to digit relabelling Propagation solves 3.0% of it Classical solver baselines measured on our own test set R-MDM compares only against neural baselines Independent reproduction that recursion substitutes for parameters, at two separate training budgets Confirms R-MDM Input injection β re-adding the token embedding at every recursionRetracted. Worth +0.05 in a matched test (Β§2b). The +5.60 previously claimed here was a batch-size artefact. We do not claim to beat R-MDM. Our 99.70% at 212k parameters and their 95% at 10.6M are measured on different datasets, and comparing them directly would be invalid. A like-for-like comparison would require running on their benchmark, which we have not done.
1. Benchmark
Generated, not downloaded, because the standard split is saturated: plain constraint propagation solves 1000/1000 of the SATNet split (Wang et al., 2019), so nothing measured there discriminates between methods.
| property | value |
|---|---|
| test puzzles | 1,000 held out |
| training puzzles | 100,000 |
| clues per puzzle | 20β30 (mean 24.4) |
| uniqueness | verified by exhaustive counter after every cell removal |
| train/test overlap | 0, including up to digit relabelling |
| metric | board accuracy β all 81 cells correct |
Generation: src/gen_hard_sudoku.py. An earlier generator applied the Sudoku
symmetry group to one seed grid, which confined every puzzle to a single
equivalence class and leaked 767/1000 test solutions into training; the
assertion caught it before any model trained on it. Solutions now come from a
randomised backtracking fill of an empty grid, reaching the full β6.7Γ10Β²ΒΉ space
(verified: 2000/2000 distinct up to relabelling).
2. Main result
| method | params | 1 pass | best | n | per-seed |
|---|---|---|---|---|---|
| constraint propagation (no search) | β | β | 3.00% | β | measured |
| greedy MRV, one sweep | β | β | 5.90% | β | measured |
| autoregressive prefix-LM ΒΉ | 2.4M | β | 0.15% | 2 | 0.3, 0.0 |
| direct recurrent classifier ΒΉ | 212k | 10.5% | 31.00% | 4 | 6.6, 21.4, 40.9, 55.1 |
| feed-forward diffusion, MDLM | 37.9M | 4.40% | 88.15% | 2 | 89.0, 87.3 |
| feed-forward diffusion, schedule-matched | 37.9M | 40.10% | 88.90% | 2 | 88.3, 89.5 |
| feed-forward, 32 distinct layers @bs256 | 6.34M | 70.20% | 94.50% | 1 | 94.5 |
| feed-forward, 32 distinct layers @bs64 Β² | 6.34M | β | 83.40% | 1 | 83.4 |
| recurrent, no input injection @bs64 Β² | 212k | β | 94.10% | 2 | 93.0, 95.2 |
| recurrent diffusion, MDLM | 212k | 87.35% | 96.55% | 2 | 97.1, 96.0 |
| recurrent, no deep supervision | 212k | 93.35% | 97.75% | 2 | 97.3, 98.2 |
| recurrent diffusion, full method | 212k | 97.35% | 99.70% | 2 | 99.6, 99.8 |
| full backtracking search | β | β | 100% | β | 423 nodes mean |
Β² The @bs64 rows are a separate training budget and must not be compared
against the @bs256 rows. Comparing across them is exactly the error that
produced the retracted +5.60 (Β§2b) and the false "depth is worthless" claim (Β§4).
ΒΉ Both are our reimplementations of other people's methods, and both failed to reproduce their published results β the recurrent classifier reaches 31% against a reported 99.5%. These are reported as our implementation failing, not as comparisons we won, and they are excluded from the margin table below.
Comparison against the state of the art (R-MDM)
The relevant SOTA is R-MDM (arXiv:2606.18022). Because their benchmark differs from ours, we compare architectures on our benchmark rather than quoting their number against ours.
Dr. Ayhan's instruction was to ensure our claims hold against a baseline and the state of the art. We ran that test. One of our claims did not hold, and this section reports it rather than the number it replaces.
2b. The matched test β and the retraction of "+5.60"
The earlier version of this section claimed input injection was worth +5.60 points over an R-MDM-style arm. That comparison was invalid on two counts:
- the injection-ON arm trained at batch 256 for 120k steps, the injection-OFF arm at batch 64 for 110k steps β a 4Γ difference in batch size;
- neither arm had R-MDM's per-loop step embedding
f(h, β, L), so the "R-MDM-style" baseline was a weakened version of their architecture.
We re-ran the comparison properly: identical architecture, identical hyperparameters, identical batch size, identical step count, step embedding on both sides, one component different.
| NFE | injection OFF (n=2) | OFF seed range | injection ON (n=1) | delta | ON vs OFF range |
|---|---|---|---|---|---|
| 1 | 42.00% | [8.30, 75.70] | 89.00% | +47.00 | outside |
| 4 | 89.30% | [84.60, 94.00] | 93.10% | +3.80 | inside |
| 8 | 93.25% | [91.70, 94.80] | 94.00% | +0.75 | inside |
| 16 | 94.50% | [93.00, 96.00] | 95.90% | +1.40 | inside |
| 32 | 96.20% | [95.30, 97.10] | 96.40% | +0.20 | inside |
| 61 | 96.85% | [96.60, 97.10] | 96.90% | +0.05 | inside |
At the operating point, input injection is worth +0.05 points β nothing. With one seed on the ON side, the only defensible test is whether it lands outside the range spanned by the two OFF seeds. At five of six budgets it does not. Two seeds of the identical injection-OFF configuration differ by 67.4 points at NFE 1 and by 0.5 at NFE 61, and the ON run sits inside that band everywhere except NFE 1.
The single-pass result (89.00% against an OFF range of [8.30, 75.70]) is the one place any signal appears, and one seed cannot establish it. It is plausible that injection matters most when nothing else refreshes the input β at NFE 1 the clues must survive all 64 recurrences unaided, whereas multi-pass decoding re-feeds committed tokens each pass. We are not claiming that; it is a hypothesis the data hints at and our compute cannot test.
The likeliest reading of the headline result is that input injection and R-MDM's step embedding are redundant: both supply a per-loop signal anchoring the recurrence to its input, and once you have one the other adds nothing. Our original measurement compared injection against an arm that had neither, and credited injection with the difference.
Caveats, stated plainly. All three arms stopped at step 80,000 of 110,000 (wall-clock limit), so they are matched to each other but undertrained relative to the headline runs. The injection-ON side has n=1. We could not add seeds: the class allocation had 3,030 billing-minutes left and one training run at this configuration costs ~3,600. This does not rescue the +5.60 β an underpowered test is a reason to withdraw a claim, not to keep it.
What does survive
Recursion substituting for parameters β R-MDM's central claim β reproduces cleanly, at two independent training budgets, with the comparison matched inside each:
| budget | 32-layer feed-forward, 6.34M | recurrent 1 layer Γ 32, 212k | gain |
|---|---|---|---|
| batch 256, 120k steps | 94.50% (n=1) | 99.70% (n=2) | +5.20 at 30Γ fewer params |
| batch 64, 110k steps, injection off both sides | 83.40% (n=1) | 94.10% (n=2) | +10.70 at 30Γ fewer params |
Margin over every measured baseline
| beaten | their score | ours | margin |
|---|---|---|---|
| constraint propagation (no search) | 3.00% | 99.70% | 33Γ |
| greedy MRV | 5.90% | 99.70% | 17Γ |
| feed-forward diffusion, 37.9M params | 88.90% | 99.70% | +10.80 pts, 180Γ fewer params |
| feed-forward, 32 distinct layers, 6.34M | 94.50% | 99.70% | +5.20 pts, 30Γ fewer params |
Every baseline in this table was measured on our own test set, not cited, and every neural row was trained at batch 256, the same budget as the 99.70%.
Deliberately excluded: our autoregressive prefix-LM (0.15%) and direct recurrent classifier (31.00%). Both are our reimplementations of other people's methods and both failed to reproduce their published results (footnote ΒΉ). A "665Γ margin" over our own broken code would measure our implementation, not our method, so it is not claimed. They remain in the results table above so the failure is visible.
The only thing not beaten is full backtracking search (100%), which is exact search rather than a learned model and needs 423 search nodes per puzzle on average.
Against published specialised solvers the position is comparable, not superior: 99.70% at 212k parameters against the Recurrent Transformer's 99.5% at 211k β but on a clue distribution that excludes the hardest 17-clue instances (Β§8). Same league, different test set.
3. Parameters against accuracy
The gap was never capacity. The 37.9M-parameter feed-forward denoiser has 180Γ more parameters than the recurrent model and scores 10.8 points worse. Solving a hard Sudoku takes tens of rounds of eliminate-propagate-repeat, and a fixed 12-layer network cannot express thirty rounds at any width.
4. Ablation β what each ingredient is worth
Compare only within a batch size. An earlier version of this table pooled a 32-layer run at batch 256 (94.50%) with one at batch 64 (83.40%) into a single "88.95%" that belonged to neither, and then read the ladder off that number. Two published conclusions came out of that artefact and both were wrong. They are corrected below.
At batch 256 (120kβ150k steps)
| step | configuration | params | board | gain |
|---|---|---|---|---|
| baseline | feed-forward, d=512, 12 layers, 150k steps | 37.9M | 88.90% (n=2) | β |
| + depth, β width | feed-forward, d=128, 32 layers, 120k steps | 6.34M | 94.50% (n=1) | +5.60 |
| + weight sharing | recurrent, d=128, 1 layer Γ 32, 120k steps | 212k | 99.70% (n=2) | +5.20 |
Parameters fall monotonically and accuracy rises monotonically: 37.9M β 6.34M β 212k against 88.90% β 94.50% β 99.70%. The deeper model even trained for fewer steps than the baseline it beats. Capacity was never the bottleneck; iteration count is.
At batch 64 (110k steps), injection off on both sides
| step | configuration | params | board | gain |
|---|---|---|---|---|
| baseline | feed-forward, d=128, 32 layers | 6.34M | 83.40% (n=1) | β |
| + weight sharing | recurrent, d=128, 1 layer Γ 32 | 212k | 94.10% (n=2) | +10.70 |
Two corrections to earlier versions of this table
"Depth alone is worth nothing β 12 to 32 layers gains 0.05 points."Wrong, and backwards. That 0.05 came from comparing against the pooled 88.95%. At matched batch size the deeper, narrower, 6Γ smaller model gains +5.60."Input injection is worth +5.60."Retracted β see Β§2b. In a matched test with R-MDM's step embedding present it is worth +0.05.
Both errors had the same cause: treating runs at different training budgets as
interchangeable seeds. cfg_label in src/plot_sudoku.py now makes batch size
part of a configuration's identity so the two cannot be pooled again.
Two further ablations on the full method:
| ingredient removed | board | cost |
|---|---|---|
| deep supervision (supervise only the last recurrence) | 97.75% | β1.95 |
| schedule matching (plain MDLM objective) | 96.55% | β3.15 |
Note the variance: the 32-layer row is 94.5 / 83.4 (sd 5.55), by far the least stable configuration tested. The full method is the most stable at 99.6 / 99.8 (sd 0.10).
5. Recurrence extrapolates past its training depth
Trained at R = 32, evaluated elsewhere with no retraining:
| R at inference | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
|---|---|---|---|---|---|---|---|---|
| board accuracy | 0.10% | 5.40% | 48.40% | 82.00% | 92.40% | 98.30% | 99.40% | 99.10% / 39.70% |
Accuracy improves past the depth it was trained at, which is what deep supervision predicts: each application is a valid one-step refinement, so the map is iterable beyond where it was fit. Honest limit β 2Γ extrapolation is reliable, 4Γ is not: one seed holds 99.10% at R = 128, the other collapses to 39.70%.
5b. The model solving, and why the benchmark was rebuilt
Real model output on the three hardest held-out puzzles, at 1, 4, 16 and 61 denoising passes. Grey cells are given clues, red cells are wrong.
The same board as the shared block is applied more times. This is the iterative refinement the method is built around, made visible rather than asserted.
Accuracy against puzzle difficulty, with sample size per point. The curve is flat at 99β100% across the whole 22β27 clue range, against 3.0% for constraint propagation on the same set. Two things follow, and the second is a limitation: the model is uniformly strong across the difficulty range this benchmark spans, and the benchmark does not stress it β we would need 17β21 clue puzzles, where minimal-puzzle generation gets sharply more expensive, to find where it breaks.
Why the benchmark was generated rather than downloaded: search-free constraint propagation solves 100% of the standard SATNet split and 3% of ours.
6. The instructive failure: low loss, no capability
| baseline | final training loss | board accuracy |
|---|---|---|
| autoregressive prefix-LM | 0.0486 | 0.15% |
| direct classifier, all-cell supervision | 0.0722 | 31.00% |
| recurrent diffusion (ours) | 0.15 | 99.70% |
Both non-diffusion baselines reach lower training loss than our method and solve almost nothing. Autoregressive errors compound unrecoverably β it cannot revise, and one wrong cell destroys the board. All-cell supervision is dominated by copying the 24 given clues, so the loss looks excellent while the 57 blanks stay unlearned. This is why board accuracy, not loss, is the metric.
7. Method
h β E(x) token embedding
repeat R times:
h β h + E(x) input injection
h β Block(h) ONE weight-shared block
record logits(h) every application is supervised
loss = Ξ£_r w_r Β· CE(logits_r, xβ), w_r = r/R
Implementation: RecurrentDenoiser in src/model.py, recurrent_cond_loss in
src/diffusion.py. Configuration d=128, 1 layer, 4 heads, R=32 training / 64
inference, chosen to match Yang et al. so the comparison isolates the diffusion
framing rather than scale.
Input injection re-adds the token embedding at every recursion, on the reasoning that the clue signal would otherwise decay through thirty applications of the same block. That reasoning is not supported by our own measurement: in a matched test it is worth +0.05 points once R-MDM's step embedding is present (Β§2b). It is retained in the default configuration because the headline runs used it, not because we can show it helps. Deep supervision forces each application to be a valid one-step refinement rather than letting the stack learn one entangled R-step function, and it is what makes R = 64 inference work after R = 32 training (Β§5); unlike injection, it is load-bearing β removing it costs 1.95 points (99.70% β 97.75%, both n=2 at batch 256).
8. Published results and their distributions
| system | accuracy | puzzle distribution | params | reference |
|---|---|---|---|---|
| SATNet | 98.3% | SATNet split, ~36 clues | 618k | Wang et al., ICML 2019 |
| SATNet | 6.1% | RRN hard, 17 clues | 618k | via Yang et al. 2023 |
| RRN | 96.7% | RRN hard, 17 clues | 201k | Palm et al., NeurIPS 2018 |
| Recurrent Transformer | 99.5% | RRN, 17β34 clues | 211k | Yang et al., 2023 |
| Recurrent Transformer | 96.7% | RRN hardest, 17 clues | 211k | Yang et al., 2023 |
| this work | 99.70% | ours, 20β30 clues | 212k | β |
Not directly comparable. Our 20β30 clue range sits inside the Recurrent Transformer's 17β34 range but excludes the hardest 17-clue instances. At matched parameter count (212k vs 211k) the result is competitive. The SATNet split is not used because constraint propagation alone solves 100% of it.
9. Limitations
The recursive architecture is not our contribution. It is established in arXiv:2606.18022. We reproduce it independently and extend it with input injection; the framing throughout reflects that.
No like-for-like comparison with R-MDM. They evaluate on Shah et al. (2024); we generate our own minimal puzzles. The two numbers are not comparable and we do not compare them.
Distribution mismatch with all published numbers (Β§8). Not a SOTA claim.
Input injection is not separated from weight sharing.Closed: injection is worth +5.60.Reopened, then resolved against us. The matched test (Β§2b) puts input injection at +0.05 once R-MDM's step embedding is present. The +5.60 was an artefact of a 4Γ batch-size difference between the two arms. The claim is withdrawn.The direct-classifier reproduction failed (31% vs 99.5% published). Not used as evidence; reported so the gap is visible.
Not a seed effect at all: 94.5 is batch 256 and 83.4 is batch 64. They are two budgets, not two seeds, and pooling them produced the false "depth is worth nothing" conclusion (Β§4). Each is n = 1 at its own budget.feed-forward 32Lis n = 2 but highly unstable (94.5 / 83.4).Several arms are n = 1, and the injection-ON arm of Β§2b is n = 1. Two seeds of one configuration differ by up to 67 points at NFE 1 and 0.5 at NFE 61, so low-NFE numbers in this report carry little information.
Compute exhausted. 3,030 of 3,000,000 billing-minutes remained at the end; one further training run costs ~3,600. The open questions below cannot be closed with the allocation available.
Sudoku only. Whether recurrence transfers to other constraint families is untested here.
Built from scratch β how to verify it in under a minute
Every model in this repository is randomly initialised and trained from zero. No pretrained weights, no pretrained tokenizer, no pretrained embeddings, no distillation from a pretrained teacher, at any stage. This is a hard constraint on the project, so it is stated here in checkable form rather than as an assurance.
| what | where | how to check |
|---|---|---|
| Weights are random, always | src/model.py β self.apply(self._init) |
every nn.Linear/nn.Embedding gets N(0, 0.02Β²); there is no other initialisation path |
| No pretrained loader exists | whole tree | grep -rn "from_pretrained|AutoModel|AutoTokenizer|torch.hub|timm" src/ returns nothing |
| Tokenizers are hand-written, 7 of them | src/{sudoku,text8,data,graphs,qm9,sigmorphon}.py |
grep -n "class .*Tokenizer" src/*.py β each is a literal symbol list built in-repo |
| The Sudoku vocabulary is 10 symbols | src/sudoku.py:32 |
digits 1β9 plus [MASK]; no vendored vocab file |
| Downloads are data, never weights | src/{data,text8,qm9,sigmorphon,sudoku}.py |
the only URLs are the text8 corpus, the QM9 CSV, SIGMORPHON TSVs and the SATNet zip β raw datasets |
| The primary benchmark is generated | src/gen_hard_sudoku.py |
nothing is downloaded at all; puzzles come from a randomised backtracking fill |
| Even the evaluator is from scratch | src/train_eval_lm.py |
generative perplexity in the earlier study is scored by a character LM we trained on text8 ourselves, not GPT-2 |
The largest model here is 37.9M parameters and the headline model is 212k β small enough that from-scratch training is the only sensible choice, and small enough to retrain end to end on one MIG slice of an A100.
Datasets
Primary β generated, not downloaded. The standard split is saturated, so it cannot discriminate between methods.
| dataset | role | source | size |
|---|---|---|---|
| Hard Sudoku (this work) | train + test | generated by src/gen_hard_sudoku.py |
100,000 train / 1,000 test, 20β30 clues |
| SATNet Sudoku | rejected after measurement | https://powei.tw/sudoku.zip (Wang et al., ICML 2019) |
9,000 / 1,000, 31β42 clues |
The SATNet split was downloaded, verified (all labels valid Sudoku, all clues
consistent, zero train/test overlap) and then rejected: search-free
constraint propagation solves 1000/1000 of its test set, so every competent
method scores ~100% and the benchmark measures nothing. That measurement is in
src/sudoku_validate.py and is the reason the hard benchmark exists.
Hard-Sudoku generation is fully specified: solutions come from a randomised backtracking fill of an empty grid (β6.7Γ10Β²ΒΉ space), cells are removed in random order, and a removal is kept only if an exhaustive counter confirms the solution is still unique. Train and test solutions are disjoint even up to digit relabelling. Training uses digit-relabelling augmentation, a genuine Sudoku symmetry that leaves the constraint structure untouched.
Used in the earlier study (Β§ below), all public and all loaded from scratch:
| dataset | source | used for |
|---|---|---|
| text8 | http://mattmahoney.net/dc/text8.zip |
character language modelling, 90M/5M/5M split |
| QM9 | https://deepchemdata.s3.us-west-1.amazonaws.com/datasets/qm9.csv |
molecular graph generation, 133,885 molecules |
| CoNLL-SIGMORPHON 2017 | github.com/sigmorphon/conll2017 |
morphological inflection, 6 languages |
| n-digit addition | synthetic, src/data.py |
unique-answer, deep-dependency probe |
| structured graph families | enumerated, src/graphs.py |
exact total correlation and one-pass ceiling |
No pretrained weights or tokenizers are used anywhere, including the autoregressive model used to score generated text in the earlier study.
References
- Recursive Scaling in Masked Diffusion Models (R-MDM). arXiv:2606.18022 β establishes the recursive weight-shared architecture with all-steps loss that this work reproduces.
- Shah et al., 2024 β the 1.8M-board Sudoku dataset R-MDM evaluates on.
- Wang, Donti, Wilder, Kolter. SATNet: Bridging deep learning and logical reasoning with a differentiable satisfiability solver. ICML 2019.
- Palm, Paquet, Winther. Recurrent Relational Networks. NeurIPS 2018.
- Yang, Ishay, Lee. Learning to Solve Constraint Satisfaction Problems with Recurrent Transformer. ICLR 2023. arXiv:2307.04895
- Austin, Johnson, Ho, Tarlow, van den Berg. Structured Denoising Diffusion Models in Discrete State-Spaces. NeurIPS 2021.
- Sahoo et al. Simple and Effective Masked Diffusion Language Models. NeurIPS 2024.
- Conditional Total Correlation and the Serial Depth of Adaptive Parallel Sampling. arXiv:2608.25505
- MDLMPE: Distribution Aware Positional Encoding for Masked Diffusion Language Models. arXiv:2608.03769
- MDPO: Overcoming the Training-Inference Divide of Masked Diffusion Language Models. arXiv:2508.13148
10. Reproducing
python src/gen_hard_sudoku.py --n_train 100000 --n_test 1000 --out data/sudoku_hard
python src/train_sudoku.py --recurrent --R 32 --R_infer 64 --mode full \
--hard data/sudoku_hard --augment --d 128 --layers 1 --heads 4 \
--bs 256 --steps 120000 --lr 3e-4 --out runs/rec
python src/sudoku_compare.py --hard data/sudoku_hard --runs runs --pattern 'rec*'
python src/plot_sudoku.py
The matched R-MDM comparison of Β§2b. Three arms differing in one component,
with their step embedding on both sides. --step_embed is R-MDM's per-loop
conditioning f(h, β, L); --no_inject turns off the component we tested:
for cfg in "--step_embed --no_inject --seed 0:rmdm-faithful-s0" \
"--step_embed --no_inject --seed 1:rmdm-faithful-s1" \
"--step_embed --seed 0:rmdm-both-s0"; do
python src/train_sudoku.py ${cfg%%:*} --recurrent --R 32 --R_infer 64 \
--mode full --hard data/sudoku_hard --augment --d 128 --layers 1 --heads 4 \
--bs 64 --steps 110000 --lr 3e-4 --ckpt_every 8000 --out runs/${cfg##*:}
done
python src/eval_ckpt.py --hard data/sudoku_hard --runs runs # reads ckpt.pt
python src/plot_rmdm.py # -> sud_fig9_rmdm.png
eval_ckpt.py evaluates from ckpt.pt rather than model.pt because all three
of our runs hit the wall clock at step 80,000 and never reached the trainer's
evaluation block. Keep the batch size identical across arms β the retracted
+5.60 came from comparing arms trained at batch 256 and batch 64 (Β§4).
The earlier study: two failure modes of parallel decoding
The claim
Masked diffusion's entire value proposition is parallel decoding: commit many tokens per forward pass instead of one. Quality collapses as parallelism rises, and roughly a dozen 2026 papers attack this at inference time with better unmasking schedules β confidence ranking, entropy gating, dependency-aware ordering.
Those methods treat one symptom as one disease. There are two:
| failure mode | why it happens | fixable by | |
|---|---|---|---|
| (i) | the fully-masked state is never trained | a K-pass decode evaluates the model at ratios {1, (Kβ1)/K, β¦, 1/K} and starts from t = 1. Continuous t ~ U(0,1) assigns that state probability zero |
training only |
| (ii) | committed positions carry real mutual information | parallel decoding samples the product of marginals; the truth is the joint | inference only |
For (ii) the discarded dependence is the total correlation of the committed set S:
TC(S) = Ξ£α΅’ H(xα΅’ | c) β H(S | c) β€ Ξ£α΅’ H(xα΅’ | c)
so the summed conditional entropy of what you commit upper-bounds the error you incur by committing it. If every committed conditional is a point mass the bound is zero and independent sampling reproduces the joint exactly. No training objective removes this term without abandoning the data distribution.
Conversely, no inference-time reordering repairs a marginal that was never fit.
Prior work applies inference-time fixes to both. That is why it flatlines on arithmetic, where (ii) is identically zero and all the loss is (i).
What we tried, and what happened
Summarised up front, because half of it is negative and burying that would misrepresent the work:
| approach | verdict | |
|---|---|---|
| fix (i), single budget | train at the mask ratios one known budget visits | works, and survives its compute control β 99.9% against 0.0% at 20-digit addition even when the baseline is given 2Γ the training; beats the MDLM objective at every budget on text8 and on bits-per-character |
| architecture | give the denoiser absolute position information | works, and is the strongest result here β at t = 1 the input is uniform, so a relative encoding cannot express position-dependent marginals at any training budget. +88 points where marginals vary, β0.02 in the control, landing at 100.3% of the exact bound. Predicted 5/5 before measurement |
| fix (ii) | commit while summed conditional entropy stays under B nats |
mixed β competitive on graphs, loses to fixed-K on text8 |
| fix (i), all budgets | sample the budget and condition on it | fails β worse at every budget on graphs, destroys the task on addition, worse BPC on text8 |
The two positives are independent and do not transfer alike: schedule matching carries addition and text8 but does nothing on QM9, while absolute position information carries QM9 and the graph families. They are reported as two findings rather than merged into one combined claim.
The framework itself β deciding which mode a given failure belongs to, and bounding how much of it is recoverable β is what survives all four.
Fix (i): train the schedule you intend to decode at
A K-pass decode evaluates the model only at mask ratios {1, (Kβ1)/K, β¦, 1/K}.
Standard MDLM draws t ~ U(0,1), which is uniform over the same range β so the
issue is not that uniform training under-weights heavy masking. It is that
continuous U(0,1) places probability zero on t = 1, the fully-masked state
every decode begins from. Drawing t from the discrete set instead puts an
atom of mass 1/K exactly there.
Matching a single K works, and it is what the addition results below use
(K = 1, i.e. always t = 1). But it is a commitment to one decoding
budget, and we measured the price: a model trained for one pass scores 99.8%
at one pass and 85.7% at twenty. That is the baseline's own disease with the
roles reversed β intermediate partially-decoded states are off-distribution for
a model fitted only to t = 1. A method shaped like that can win one operating
point but cannot dominate a quality-vs-compute curve.
The attempted generalisation, which failed
Any-budget masked diffusion was meant to remove that commitment: sample the
budget per example, draw t from that budget's schedule, and pass the budget to
the denoiser as a logβ embedding.
K ~ {1, 2, 4, β¦, 256}
t ~ {1, (Kβ1)/K, β¦, 1/K}
loss = CE( model(x_t, budget=K), xβ )
It costs one embedding lookup and no extra forward pass, so it is cheaper than
the fixed-K method β and it does not work. The result is reported here rather
than dropped, because the reason it fails is the same arithmetic that explains
why fixed-K succeeds.
20-digit addition, against fixed-K (K = 1):
| training | 1 pass | 2 | 4 | 8 | 16 | 21 (sequential) |
|---|---|---|---|---|---|---|
| MDLM baseline | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | β |
| fixed-K (K=1) | 99.9 | 99.3 | 95.6 | 87.5 | 85.8 | β |
| any-budget | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
It does not flatten the crossover; it destroys the capability, scoring zero at
every budget including a fully sequential decode. The mechanism is arithmetic: a
one-pass decode starts at t = 1, and the training mass landing there is
1.000 for fixed-K against (1/9) Ξ£_K 1/K = 0.222 for uniform any-budget β a
4.5Γ dilution of the only signal that matters, on a task sitting exactly at
the learnability edge.
Graphs, mean over four families and two seeds, any-budget minus baseline:
| K = 1 | K = 2 | K = 4 | K = 8 | K = 15 |
|---|---|---|---|---|
| +0.3 | β2.7 | β2.9 | β4.2 | β31.7 |
Worse at every budget above one, and catastrophically worse at high budgets (tree β81.6, 2-regular β43.7). Spreading training across nine budgets leaves each one undertrained relative to a specialist, and the conditioning embedding does not recover the difference β an unconditioned control sampling the same budgets does no better.
The negative result is the finding. "One model for every decoding budget" is not free, and at this scale it does not pay for itself at any budget. What survives is the narrower claim the addition results already supported: train the schedule you intend to decode at. Matching a single known budget works extremely well (99.9% against a baseline's 0.0%); trying to serve all of them at once works worse than either.
Fix (ii) β entropy-budgeted commitment. At each pass, rank still-masked
positions by conditional entropy and commit the longest low-entropy prefix whose
cumulative entropy stays within B nats. By the bound above, B directly caps
the dependence discarded at that pass, so it is an interpretable dial rather
than a tuned heuristic: B β 0 recovers sequential decoding, B β β recovers
one-shot parallel decoding, and the curve between them is the quality/compute
trade-off. The number of passes becomes data-dependent, which is the point.
Measured across four graph families it is competitive but not dominant: it
reaches points strictly better than fixed-K at equal or lower NFE in some
configurations (100% validity at 11 passes where fixed-K needs 15) and merely
ties in others. The earlier claim that it dominates fixed-K was based on one
family and does not hold across all four.
Cost of the working form of (i) β matching one known budget β is one extra forward pass per training step, which is what the compute-matched control in Β§5b exists to account for. Cost of (ii): none.
What each regime isolates
| Regime | Example | mode (i) | mode (ii) | one pass? |
|---|---|---|---|---|
| Non-unique answer | groups must agree, value free | absent | maximal | never β information-theoretic |
| Unique, shallow deps | morphological inflection | small | small | mostly already works |
| Unique, deep deps | n-digit addition | dominant | zero | fails β schedule matching fixes it, pending a compute control |
| Mixed | natural text | present | present | where the two must compose (running) |
| Exactly measurable | structured graphs | present | dominant | where the bound is verifiable β this is what carries the paper |
1. Addition β mode (i) in isolation
Addition is the clean case: the answer is fully determined by the operands, so every conditional is a point mass, mode (ii) is identically zero, and all of the loss is mode (i). Digit i needs the carry out of digit iβ1, so the dependency is deep.
Exact match at ONE forward pass. Depth scaled as logβ(digits); lr 1e-4 with long warmup, which matters β see Β§5.
| digits | MDLM baseline | matched schedule (ours) | seeds >90% (base β ours) |
|---|---|---|---|
| 8 | 100.0 | 100.0 | 4/4 β 4/4 (saturated) |
| 12 | 76.7 | 100.0 | 3/4 β 4/4 |
| 16 | 25.0 | 75.0 | 1/4 β 3/4 |
| 20 | 0.0 | 99.9 | 0/3 β 3/3 |
| 24 | 0.0 | 33.6 | 0/3 β 1/3 |
β The 16-digit row is unsettled. A compute-matched control β the plain baseline given double the training steps at the same depth β reaches 100% on one seed of two, and 0% on the other. So the baseline can solve 16-digit addition with enough training, but not reliably. The 25.0% figure below comes from a smaller configuration (10 layers, 60k steps) where both arms were undertrained, so it is not a clean method effect either. Do not quote the 16-digit gap in any direction until the matched-configuration comparison lands.
The 12-digit row is a parallelism gap: the baseline demonstrably learned the task and simply cannot commit it in one pass. The 16-digit row is in question, per the note above.
The 20- and 24-digit rows are a different and stronger claim, and are labelled
as such. The standard pass grid stops at 16, which for a 21-slot answer is not
a sequential decode, so src/seq_check.py re-decodes every run at one token per
pass. That settles it:
| digits | mode | @1 pass | fully sequential | reading |
|---|---|---|---|---|
| 20 | MDLM | 0.0 | 0.0 | never learned the task |
| 20 | ours | 99.8 | 85.7 | learned it |
| 24 | MDLM | 0.0 | 0.0 | never learned the task |
| 24 | ours | 33.7 | 33.3 | learned it |
The baseline is at zero at every budget, on every seed. Beyond 16 digits it
does not fail to parallelise β it fails to learn. Uniform-t training
touches the fully-masked state with probability zero, and a 20-long carry chain
never gets enough gradient where it matters. So at these lengths fix (i) is a
sample-efficiency fix, not a parallelism fix, and the 99.8-vs-0.0 gap must
not be quoted as the latter.
24 digits remains at the edge: one seed of three reaches 100%, the others near zero. Reported as the variance it is.
The method inverts the trade rather than closing it
At 20 digits our own model scores 99.8% at one pass but 85.7% at twenty, and one seed drops from 99.5% to 57.0%. More passes make it worse.
This is the mechanism running in reverse, and it is the strongest available
evidence for the account. A model trained with mass at t = 1 is fitted to the
fully-masked state; walking it through intermediate partially-decoded states
visits ratios it never trained on β exactly the baseline's disease, with the
roles swapped. A method that simply dominated at every budget would be weaker
evidence, because it would be consistent with "we just trained better".
It also means the honest framing is not "we close the parallelism gap" but "the schedule you train determines the budget you can decode at", in both directions.
No inference-time method closes the gap
Mode (ii) is zero here, so the prediction is that every inference-time strategy lands on the same number and extra compute buys nothing.
12-digit addition, the baseline model decoded every way:
| strategy | 1 pass | 2 | 4 | 8 | 16 |
|---|---|---|---|---|---|
| confidence | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
| entropy | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
| entropy-gated | 76.7 | 76.4 | 76.4 | 76.2 | 76.2 |
| margin | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
| random | 76.7 | 77.2 | 76.9 | 76.8 | 76.4 |
| ours (training-time) | 100.0 | 100.0 | 100.0 | 99.9 | 99.9 |
16-digit: every inference-time strategy 25.0 at one pass and 25.0 at any budget; ours 75.0.
Two things stand out. Every strategy family lands on the same number, and sixteen times the inference compute buys nothing β at 12 digits it is marginally worse. The random-order row is the cleanest statement of it: choosing positions at random does as well as every principled ordering heuristic, because ordering is not what is broken.
This is the control that makes the text8 result in Β§3 meaningful: the same entropy-gated rule that does nothing here is genuinely useful there, because there mode (ii) is nonzero.
2. Inflection β both modes small
Morphological inflection (CoNLL-SIGMORPHON 2017) has unique answers, but forms are ~10 characters with shallow local dependencies. Six typologically diverse languages, 2 seeds each:
| language | baseline @1 | ours @1 | baseline gap 1β32 | ours gap | gap removed |
|---|---|---|---|---|---|
| Georgian | 94.6 | 94.1 | β0.0 | β0.0 | n/a (saturated) |
| Russian | 71.6 | 72.3 | +2.2 | β0.3 | 114% |
| German | 76.0 | 78.4 | +3.2 | +0.2 | 94% |
| Turkish | 78.7 | 82.3 | +3.5 | +0.8 | 77% |
| Finnish | 51.4 | 51.9 | +7.7 | +4.9 | 36% |
| Navajo | 28.0 | 26.9 | +8.0 | +4.5 | 44% |
| mean | 66.7 | 67.7 | +4.1 | +1.7 | 59% |
Which component carries it (48 runs: 6 languages Γ 4 modes Γ 2 seeds)
| mode | mean @1 pass | gap 1β32 | share of the gap removed |
|---|---|---|---|
| MDLM baseline | 66.7 | +4.1 | β |
| schedule matching alone | 67.7 | +3.4 | 17% |
t = 1 term alone |
67.5 | +2.1 | 49% |
| both | 67.7 | +1.7 | 59% |
The t = 1 term is the active ingredient. On its own it removes half the
parallelism penalty β nearly three times what reshaping the rest of the schedule
achieves β and the two components are roughly additive. That is precisely what
the account predicts: what matters is training the fully-masked state the
decoder starts from, not redistributing mass across the schedule generally.
The honest reading: the method removes 59% of the parallelism penalty at no cost to one-pass accuracy (66.7 β 67.7), but it does not raise the ceiling β at 32 passes it is 1.4 points below the baseline (69.4 vs 70.8). Concentrating the schedule at high mask ratios necessarily spends less on the low-ratio states that sequential decoding uses.
The dose-response is the interesting part and it goes the right way: Georgian has no gap and the method changes nothing; the languages with the largest gaps get the largest absolute reductions. A method that "helped" on Georgian would be evidence it was doing something other than what is claimed.
Reporting Georgian and English matters: it shows where the method has nothing to add, which is what makes the gains elsewhere credible.
3. text8 β schedule matching wins on natural language
Standard setup: text8, the conventional 90M/5M/5M character split, 27-symbol vocabulary, 256-character windows, 12-layer denoiser trained from scratch. Generative perplexity is scored by a held-out autoregressive character LM, also trained from scratch on text8 (test BPC 1.539), so no pretrained model appears anywhere in the pipeline. Two seeds per arm.
| NFE | MDLM baseline | matched (ours) | any-budget |
|---|---|---|---|
| 1 | 650.21 | 651.59 | 649.95 |
| 4 | 169.34 | 149.59 | 141.98 |
| 16 | 116.88 | 92.74 | 94.94 |
| 64 | 85.18 | 72.68 | 77.84 |
| 256 | 9.22 | 8.40 | 8.59 |
| validation BPC | 1.7292 | 1.7010 | 2.5720 |
Schedule matching beats the published MDLM objective at every budget from 4 passes upward β by 20.7% at 16 passes β and improves bits-per-character at the same time. That simultaneity matters: the gain is not bought by trading likelihood for sample quality, which is the usual way such numbers are inflated.
At one pass all three arms are indistinguishable (~650). Unconditional generation of a 256-character block from nothing is mode (ii) at its maximum β the first commit has no context to condition on β so no training objective helps there, exactly as the account predicts.
Degeneracy guard: real text8 scores ppl 2.86 with a distinct-4-gram rate of 0.177 under the same evaluator. Generated text sits at ppl 8.40 and distinct-4 0.238 β worse than real text and slightly more varied, i.e. an imperfect model rather than a collapsed one. Reporting generative perplexity without this check is how repetition gets mistaken for quality.
The entropy budget does not help here: at ~99 NFE it scores 95.01 where
fixed-K at 64 NFE scores 72.68. On text, spending passes adaptively loses to
spending them uniformly, unlike on graphs. Reported as measured.
3z. The original text8 plan (superseded)
Addition isolates mode (i); the free-choice probes isolate mode (ii). Natural text contains both in the same sequence: closing a word, a suffix or a function word is nearly deterministic given context, while the choice of the next content word carries real entropy. So text is where the claim that the two fixes compose is actually tested, as a 2Γ2:
| fixed-K commit | entropy-budgeted commit | |
|---|---|---|
uniform-t training |
(a) | (b) |
| matched training | (c) | (d) |
Prediction: (c) < (a) and (d) < (b) on generative perplexity at equal compute, and the two gains are largely independent.
A second prediction, registered before the runs finish. If fix (i) works by
placing training mass on the ratios a decode actually visits, then matched-K
training should show a crossover, not a uniform win: better than uniform-t
near NFE β K, and worse far from it. Training at K = 8 puts no mass at the
ratios a 256-pass decode visits, so uniform-t should win at high NFE. A method
that simply dominated everywhere would be evidence the mechanism is something
other than the one claimed.
By the same logic the t = 1-heavy variant should be the worst of the three on
text at moderate NFE, because at t = 1 an unconditional model can only learn
character frequencies β there is no context to condition on. That variant is
included to be refuted, not to win.
Standard setup: text8, the conventional 90M/5M/5M character split, 27-symbol vocabulary, 256-character windows. Metrics:
- validation bits-per-character (the MDLM bound) β the standard likelihood number, and the check that sample quality is not bought by wrecking the model;
- generative perplexity vs. number of function evaluations, scored by a held-out autoregressive character LM trained from scratch on text8 itself (a word-piece model trained on web text would judge character-level artifacts through a tokenizer that never sees them);
- entropy and distinct-4-gram rate, reported beside it, because generative perplexity alone is trivially gamed by degenerate repetition.
Against the published confidence-threshold rule, not a top-k stand-in.
3b. Graphs β where the bound stops being an assumption (partial)
The weakness of everything above is that the central quantity is never measured.
On addition TC = 0 by construction; on text H(S|c) is not computable. So the
entropy budget rests on a bound the experiments never check.
Structured graphs close that. A graph on n nodes is a binary sequence of
n(nβ1)/2 edge indicators β the same machinery, unchanged β but for n β€ 7 the
entire family enumerates, making every quantity exact: true marginals,
H(S) = logβ|F|, TC, and the one-pass ceiling
V* = Ξ£_{g valid} βα΅’ pα΅’(gα΅’) (what perfect marginals achieve in one pass)
Proposition. For P uniform on a family F, V* β₯ 2^(βTC), with equality
iff βα΅’ pα΅’ is constant on F. Every bit of total correlation among jointly
committed variables at most halves the one-pass success probability. Proof and
verification in THEORY.md Β§5.1 β the inequality holds across all
nine family/size combinations, and equality holds to five decimal places on
exactly the fixed-edge-count families, failing precisely where edge counts vary,
as the Jensen step requires.
Both failure modes, separated by measurement
This is what no earlier task could do. Perfect matchings on 6 nodes,
TC = 6.92 bits, V* = 0.825%:
Four families, two seeds each, one-pass validity against the exact ceiling:
| family | TC (bits) | V* | achieved @1 pass (95% CI) | reading |
|---|---|---|---|---|
| 2-regular | 8.43 | 0.289% | 0.317% [0.217, 0.465] | at the ceiling |
| matching | 6.92 | 0.825% | 0.769% [0.602, 0.983] | at the ceiling |
| tree | 3.43 | 9.249% | 9.204% [8.597, 9.849] | at the ceiling |
| bipartite | 0.11 | 93.632% | 5.884% [5.395, 6.414] | 16Γ below |
This is the decomposition working as a measurement instrument, and it is sharper than predicted.
Where dependence is high, models land exactly on the information-theoretic
ceiling. Three families, ceilings spanning 32Γ (0.289% to 9.249%), and in every
case the interval contains V*. The residual failure there is provably mode (ii)
and no training objective can recover it.
Where dependence is nearly absent, the model fails anyway β and the reason is
architectural, not statistical. Bipartite has TC = 0.11 bits, so one-pass
decoding should be almost free at 93.6%, yet every model reaches only 5.9%.
That gap is not untrained capacity. At t = 1 every input token is [MASK],
so the input sequence is constant. With a purely relative position encoding
the attention score between positions i and j depends only on (i β j), and
when every value vector is identical a layer's output is v Β· Ξ£ attn = v β the
same at every position. Boundary effects aside, a RoPE-only model cannot
express position-dependent marginals at the fully-masked state. It is an
expressivity limit, so no amount of training removes it.
The completed families confirm this exactly, and the prediction is a dichotomy rather than a trend:
| family | marginal spread across edge slots | distinct values | one pass |
|---|---|---|---|
| matching | 0.0000 | 1 (all 0.200) | β at ceiling |
| 2-regular | 0.0000 | 1 (all 0.400) | β at ceiling |
| tree | 0.0000 | 1 (all 0.333) | β at ceiling |
| bipartite | 0.5300 | 2 (0.000, 0.530) | β 16Γ below |
Every vertex-transitive family has exactly constant marginals, which RoPE can represent, and every one of them lands on its ceiling. The one family requiring different marginals at different positions is the one that fails. Addition escapes the problem because its prompt is visible, so the input is not constant.
The fix, and it is one line
Swapping the relative encoding for absolute position embeddings, everything else identical:
Complete grid, two seeds per cell:
| family | marginals | encoding | @1 pass | % of ceiling | per-seed |
|---|---|---|---|---|---|
| bipartite | vary | RoPE (relative) | 5.87% | 6.3% | 5.81, 5.93 |
| bipartite | vary | APE (learned) | 93.91% | 100.3% | 94.19, 93.63 |
| bipartite | vary | sinusoidal (no params) | 93.95% | 100.3% | 94.14, 93.75 |
| matching | constant | RoPE | 0.78% | 94.7% | 0.78, 0.78 |
| matching | constant | APE | 0.76% | 91.8% | 0.76, 0.76 |
| matching | constant | sinusoidal | 0.78% | 94.7% | 0.76, 0.81 |
A 16Γ improvement, landing exactly on the information-theoretic ceiling. The 87.7-point gap was never untrained capacity β it was inexpressible, and the model reaches the bound the moment the architecture can represent the answer.
Two things make this hard to explain any other way. Sinusoidal encodings carry no learned parameters at all and perform identically to learned embeddings, so the gain is not extra capacity β it is absolute position information specifically. And the seed spread is 0.12β0.56 points, with none of the bimodality that makes the addition results fragile.
The control
If absolute encodings were simply better, they would help everywhere. The mechanism says they should help only where marginals differ across positions.
Effect of absolute position information, by condition and encoding:
| learned (APE) | parameter-free (sinusoidal) | |
|---|---|---|
| marginals vary | +88.037 points | +88.074 points |
| marginals constant | β0.024 points | +0.000 points |
Two independent absolute encodings agree to within 0.04 points on the treatment and both give essentially exactly zero on the control β a ~3,700Γ difference in effect size between conditions. Seed variance is negligible throughout (matching/RoPE is 0.78, 0.78).
That closes both alternative explanations. Capacity is ruled out by the sinusoidal variant, which has no learned parameters and matches the learned embedding exactly. "Absolute encodings are simply better" is ruled out by the control, where they are worth nothing. What remains is the mechanism as stated: a relative encoding cannot distinguish positions when the input is uniform, which is precisely the state a one-pass decode begins from.
The consequence is general and goes beyond this project: one-pass masked diffusion needs absolute position information, and the field's default encoding silently caps it. Rotary encodings are near-universal in modern diffusion language models, and few-pass decoding is the entire reason those models are interesting.
Coverage confirms none of this is degeneracy β 100% of the matching and 2-regular families are recovered at K = 8.
One caution the exactness makes visible: tree/any-budget scores 10.06%
[9.43, 10.73], statistically above V* = 9.25%. V* bounds models whose
marginals match the data's, not all models β exceeding it means the marginals
have drifted, trading distributional fidelity for validity. See
THEORY.md Β§5.1.
Coverage confirms this is not degeneracy: 100% of the 15-member family is
recovered at K = 8 and under the entropy budget. (Reporting "uniqueness" as
unique/valid would have shown 0.4% and read as collapse β with |F| = 15,
coverage is the meaningful metric.)
The entropy budget also dominates fixed-K under both training modes, reaching 100% validity at 11 passes where fixed-K needs 15.
Status: 3 of 16 runs. The remaining families span TC from 0.11 to 8.44
bits, which is where the dose-response claim β larger TC, lower ceiling, more
of the loss unfixable β is actually tested. One non-monotonicity in the baseline
(83.6% at K=4 falling to 76.7% at K=8) is single-seed and not yet trustworthy.
Phase 2: QM9
The synthetic families give an exact ceiling on an artificial task. QM9 gives a real benchmark whose metric is unambiguous β RDKit sanitisation enforces valency at every atom at once, a genuine joint constraint, with no evaluator model in the loop. A molecule is 9 node slots plus 36 edge slots = 45 tokens, so training from scratch is cheap and the comparison isolates schedule and decoding rule rather than scale. The axis is the one the graph-diffusion literature competes on: validity retained as denoising steps fall.
The encoding is verified lossless first β storing aromatic bonds loses per-atom aromaticity flags and put round-trip validity on real molecules at 92.65%, which would have measured generated samples against a target the representation could not reach. Kekulised and charge-filtered, round-trip is 100.00% while keeping 99.1% of the dataset.
3c. QM9 β the finding on a standard benchmark
QM9 molecular generation, from scratch, 9 node slots + 36 edge slots = 45 tokens. Validity is RDKit sanitisation, which enforces valency at every atom at once β an unambiguous metric needing no evaluator model. Two seeds per arm; everything but the named factor held fixed.
QM9 was chosen because it is the strongest case for Β§3b's prediction: its marginals are extremely position-dependent (node slot 8 is never occupied, slot 7 is occupied 80% of the time, slots 0β2 always are, and edge slots run from never-bonded to always-bonded β mean total-variation distance 0.435 from the average slot). The prediction was registered before the runs.
| denoising steps | standard (uniform-t + relative) |
+ absolute encoding |
|---|---|---|
| 1 | 0.01% | 29.92% |
| 4 | 29.33% | 55.80% |
| 8 | 72.20% | 72.11% |
| 16 | 69.30% | 86.06% |
| 32 | 67.72% | 95.74% |
| 45 | 77.48% | 99.69% |
Under our flat encoding the standard formulation never exceeds 80% validity, and its curve is non-monotonic (72.2 β 69.3 β 67.7 β 77.5). With absolute position information the curve is clean and monotonic to 99.69%.
β Half of that gap was our own representation. Our encoding uses fixed node slots, so the model must learn slot-specific occupancy β exactly the position-dependence a relative encoding cannot express. DiGress does not generate this way: it samples the atom count n first, then builds an n-node graph, so the problem never arises. Re-decoding the same checkpoints with n given and unused slots observed β DiGress's setup, strictly generous to the baseline β the relative arm rises from 77.5% to 89.1%, while absolute stays at 99.8%. The gap narrows from 22.2 to 10.7 points.
The effect is real but roughly half the size the flat encoding suggested, and the "never exceeds 80%" framing does not survive a fair baseline. The headline table below is kept because it is what the flat representation gives, but the 10.7-point figure is the one to quote.
The uniqueness collapse
Validity alone would understate how badly the standard setup fails:
| steps | standard | + absolute |
|---|---|---|
| 8 | 4.9% | 99.2% |
| 16 | 9.7% | 98.7% |
| 45 | 41.1% | 98.1% |
Its 72.2% validity at 8 steps comes from emitting the same handful of molecules repeatedly. It is not generating a distribution, it is collapsing onto a few points; absolute encoding holds 98β99% uniqueness throughout. Reporting validity without uniqueness on this benchmark would hide the failure entirely.
Steps to reach a validity target
| formulation | 50% | 80% | 90% | 95% |
|---|---|---|---|---|
| standard | 8 | never | never | never |
| + absolute | 4 | 16 | 32 | 32 |
What does not replicate here
Schedule matching β Β§1's finding β buys essentially nothing on QM9 (99.65% against 99.69% at 45 steps), and paired with a relative encoding it actively hurts (44.87% against 77.48%). On this benchmark the position encoding is the whole story. The two findings are independent, and only the second transfers here; that is reported rather than blurred into a single combined claim.
3d. Sudoku β a benchmark win, and a prediction of ours that failed
SATNet's 9x9 Sudoku (Wang et al., ICML 2019), the conventional 9,000/1,000 split, scored by board accuracy β all 81 cells correct. The published number is 98.3%.
Leakage audited before use: 0/1000 test puzzles appear in training, 0/1000 solutions appear in training, and 0/1000 solutions match a training solution even up to digit relabelling β which is the vector our augmentation could otherwise have exploited. All 9,000 training and 1,000 test solutions are distinct.
Un-augmented arm β like-for-like with SATNet:
| denoising passes | board accuracy |
|---|---|
| 1 | 87.85% |
| 2 | 98.65% |
| 4 | 98.85% |
| 8 | 99.70% |
| 16 | 99.90% |
| 32 | 100.00% |
Two forward passes already exceed the published 98.3%, and 32 passes solve all 1,000 test puzzles exactly. A single pass β the whole grid committed at once β solves 87.85% of them.
β RETRACTED as a benchmark claim: this split is saturated. Plain constraint propagation β naked and hidden singles, no search, no backtracking, about forty lines β solves 1000/1000 = 100.00% of the test puzzles. So 100% is the expected result for any competent method and demonstrates nothing, ours included; the published 98.3% is itself below what a search-free classical solver achieves. The statistics are clean (95% CI [99.62, 100.00], both seeds 100.0, p = 3.6e-08 against 98.3%) and beside the point, because the comparison is not informative. We report the number and withdraw the claim.
The clue counts explain it: 32β41 per puzzle, mean 36.2, which is easy Sudoku. Β§3e evaluates on instances that actually discriminate.
The prediction we got wrong
We registered, before running, that entropy-budgeted decoding would beat fixed-K
here "by a very large margin, larger than anywhere else in this project", because
Sudoku is where commit order seemed to carry the information. It does not: it
loses on every arm, by 0.35 to 1.40 points.
That prediction contradicted our own framework, and the framework was right.
The entropy budget is the fix for mode (ii), the total correlation among
committed positions. Sudoku has a unique answer, so TC = 0 and there is nothing
for it to fix β the bound says so directly, and we argued past it because
"constraint propagation" was an appealing story. Recorded because a framework
that predicts against its author's intuition and wins is worth more than one that
only ever agrees with it.
What the win is, and is not
Two separate reasons not to claim it. The 100% comes from the plain MDLM
baseline with fixed-K decoding, so neither of this project's training findings
contributes. And the split is saturated, so the number distinguishes nothing.
3e. Sudoku that actually discriminates
Harder instances are built from the same solutions by stripping clues, checking after every removal that the solution stays unique, so accuracy remains well defined. The result is a difficulty axis on which a search-free classical solver clearly fails:
| clues | constraint propagation alone |
|---|---|
| 36 (the SATNet split) | 100.0% |
| 30 | 27.5% |
| 26 | 4.2% |
| 22 | 3.3% |
The models were trained on 31β42 clues, so all three harder sets are also out of distribution: this measures whether they learned Sudoku or learned a clue density. The decoding comparison is repeated here because this is where it should finally matter β with fewer clues the marginals are no longer near-perfect, so commit order has something to do. (Evaluation running.)
4. The limit that cannot be trained away
Where a group of positions must agree but which value they take is free, the likelihood-optimal marginal at each position is uniform over the valid values. Two independent draws agree with probability 1/V. This is mode (ii) at its maximum, and no decoding schedule and no training objective can fix it.
Tested rather than assumed: 66 runs sweeping an entropy penalty designed to break the symmetry, across weights spanning two orders of magnitude. Weak settings changed nothing; strong settings destroyed the model, failing even at fully sequential decoding.
This boundary is part of the contribution. A method claiming to fix this regime would be claiming to beat an information-theoretic bound.
5. Why it should work β and the falsifiable prediction
See THEORY.md. Addition's carry is a prefix scan, computable
in O(log n) depth by carry-lookahead, and constant-depth log-precision
transformers are confined to uniform TCβ°, which contains addition. One-pass
decoding is therefore expressible at depth ~log n β the obstacle is
optimisation, not expressivity. Sequential decoding is best understood as
borrowing depth from the decoding loop: a K-pass decode has effective
depth β LΒ·K.
The account predicts minimum depth growing with log n, not n β cleanly distinguishable from a ripple-carry account (linear) or an impossibility account (no depth suffices). Measured, over {2,3,4,6,8,12} layers Γ 2 seeds:
| digits | 2 layers | 3 layers | minimum depth | ratio vs 4-digit |
|---|---|---|---|---|
| 4 | 100 | 100 | 2 | 1.00Γ |
| 8 | 99 | 100 | 2 | 1.00Γ |
| 12 | 48 | 100 | 3 | 1.50Γ |
| 16 | 0 | 100 | 3 | 1.50Γ |
The discriminating quantity is the ratio, not the absolute count, since a wide layer can fold several scan levels into one. At 16 digits:
| account | predicted ratio | consistent with 1.50Γ? |
|---|---|---|
| prefix scan (ours) | 2.00Γ | yes β measured growth is if anything slower |
| ripple carry | 4.00Γ | no |
| not expressible at any depth | β | no, 3 layers suffice |
Ripple-carry is excluded. Quadrupling the operand length from 4 to 16 digits costs one extra layer, not four times the depth.
The 16-digit transition is also a clean threshold rather than a gradual ramp β 0% at two layers, 100% at three β which is the signature of a computation that is depth-limited rather than capacity-limited or data-limited. The minimum depth is now determined at every length tested.
5b. The compute-matched control
The method evaluates the model twice per training step, so at equal step counts it spends roughly twice the baseline's training FLOPs. Any gap is therefore confounded with compute until the baseline is given the larger budget. This control gives the baseline 300k steps against the method's 150k, at the same depth.
| digits | arm | steps | @1 pass | seeds >90% |
|---|---|---|---|---|
| 16 | MDLM baseline, 2Γ compute | 300k | 50.0 | 1/2 |
| 20 | MDLM baseline | 150k | 0.0 | 0/3 |
| 20 | full method | 150k | 99.9 | 3/3 |
| 24 | MDLM baseline | 150k | 0.0 | 0/3 |
| 24 | full method | 150k | 33.6 | 1/3 |
At 16 digits the control puts the method effect in doubt without settling it. Given double the training the baseline reaches 100% on one seed and 0% on the other. So the baseline can solve 16-digit addition, but unreliably, and the 25% β 75% gap from the smaller configuration is not a clean method effect.
The per-seed values are bimodal β 100% or 0%, nothing between, the same pattern as 24 digits (1/3 seeds). These tasks have a sharp learnability threshold and seeds land on one side or the other, which is why a mean over fewer than three seeds is close to meaningless here and why single-seed readings have misled repeatedly in this project.
The 20-digit row is what the claim now rests on, and the 300k baseline arm there is still running. If it also reaches ~100% on any seed, the addition result reduces to a statement about sample efficiency rather than about parallel decoding.
6. A confound that nearly produced the wrong paper
Earlier runs showed the method "failing" at 10+ digits. It was a learning-rate artifact:
| layers | lr | warmup | mean @1 pass | seeds >90% |
|---|---|---|---|---|
| 10 | 3e-4 | 500 | 47.3 | 1/4 |
| 10 | 1e-4 | 500 | 100.0 | 4/4 |
| 10 | 3e-4 | 4000 | 100.0 | 4/4 |
Deeper models need a lower learning rate and longer warmup. Without this check we would have reported that the method does not generalise, and a depth sweep run at the broken setting would have faked a clean "depth doesn't help" curve.
7. Audit
src/audit.py gates every claim and reports 0 failures. Eight sections:
arithmetic correctness; fixed-width answer regions; the prompt never masked; the
metric ungameable by constant output; probe ground truth valid while degenerate
output scores zero; inflection train/dev disjointness; β₯2 seeds behind every
reported group; decoder contracts (no [MASK] survives, decoding always
progresses, the entropy budget is monotone in B, context is never
overwritten); and text8 split integrity.
It earns its place. The decoder section caught a live bug in this work:
torch.multinomial was sampling over the full vocabulary including the
absorbing state, so positions were "committed" as [MASK], stayed masked, and
decoding silently stalled β 15 of 32 positions unfilled at K=1, and the
entropy budget non-monotone at [35, 35, 37, 17, 3] passes. The fix is the SUBS
parameterisation: the denoiser places zero probability on [MASK]. Afterwards
the budget is exactly monotone, [32, 32, 32, 16, 1].
Two earlier projects in this line produced confident wrong numbers β an answer-length leak and the learning-rate artifact above β neither visible in the accuracy tables.
8. Layout
src/
data.py addition + dependency-controlled probes
sigmorphon.py CoNLL-SIGMORPHON 2017 inflection loader
text8.py text8 loader, standard 90M/5M/5M split
model.py bidirectional transformer denoiser
diffusion.py objectives (fix (i)) + decoders (fix (ii))
train_add.py addition trainer
train_sig.py inflection trainer
train_text8.py text8 trainer + quality-vs-compute evaluation
train_eval_lm.py from-scratch AR evaluator for generative perplexity
train.py probe trainer (the unfixable-limit experiments)
seq_check.py did the baseline fail to parallelise, or fail to learn?
beat_baselines.py head-to-head vs inference-time methods
audit.py the gate on every number above
collect.py tables and figures
slurm/ grids, plus unattended finalize and watchdog
python src/train_add.py --mode full --digits 12 --lr 1e-4 --warmup 4000 --out runs/demo
python src/train_sig.py --lang turkish --mode full --out runs/tur
python src/train_text8.py --mode full --evallm runs/evallm --out runs/t8
python src/audit.py
9. Honest limitations
- Addition and inflection are probes, not applications; the claim is about the model class, and text8 (Β§3) is the test of whether it survives real data.
- On inflection the method lowers the 32-pass ceiling by 1.4 points while removing 59% of the one-pass penalty. That trade is inherent to reallocating the schedule and is reported, not hidden.
- The 20- and 24-digit results are sample-efficiency claims, not parallelism
claims:
seq_check.pyconfirms the baseline scores 0.0% at full sequential depth too. Quoting them as parallelism gaps would misrepresent them. - Our own method loses accuracy when decoded at budgets far from the one it was
trained for (99.8% at one pass, 85.7% at twenty). This is predicted by the
account but it is a real limitation: the training
Kis a commitment to a decoding budget, not a free win. - The any-budget fix for that commitment fails outright on addition (0.0% at
every budget, against 99.9% for fixed-
K), because spreading the schedule dilutest = 1training 4.5Γ on a task that sits at the learnability edge. It helps on graphs and is untested on text. Uniform-Kis not a safe default. - The answer region reveals whether the sum carries out (its width is d or d+1). Both arms receive this equally, so comparisons are unaffected, but it is one bit of leakage.
- The depth-scaling prediction in Β§5 is stated and currently being measured.
- The non-unique limit is not solved here, and we argue it cannot be.








