GOVINDFROM commited on
Commit
c885c6c
·
verified ·
1 Parent(s): 997c9bc

Retract input-injection claim; correct batch-size pooling error

Browse files
Files changed (1) hide show
  1. REPORT.md +1319 -0
REPORT.md ADDED
@@ -0,0 +1,1319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Recursive Masked Diffusion on Sudoku: Benchmark Saturation, Classical Baselines, and a Negative Result on Input Injection
2
+
3
+ **Recursive Masked Diffusion Models (R-MDMs) — a weight-shared block applied
4
+ repeatedly inside each denoising step, trained with loss at every loop — are an
5
+ established architecture ([arXiv:2606.18022](https://arxiv.org/html/2606.18022v1)).
6
+ This work reproduces their central finding independently, shows that the standard
7
+ Sudoku benchmark is **saturated** and replaces it, measures **classical solvers**
8
+ that prior work omits, and reports a **negative result**: the one architectural
9
+ component we added does not help once R-MDM's own conditioning is present.**
10
+
11
+ Trained from scratch. No pretrained weights, no pretrained tokenizer.
12
+
13
+ > ### Relation to prior work — read this first
14
+ >
15
+ > We arrived at the recursive architecture independently and only afterwards
16
+ > identified [arXiv:2606.18022](https://arxiv.org/html/2606.18022v1), which
17
+ > establishes it. **The core mechanism is theirs, not ours.** Specifically, they
18
+ > already introduce: the weight-shared block applied recurrently within a
19
+ > denoising step; deep supervision via an all-steps loss; recursion as a
20
+ > substitute for parameter count; evaluation on Sudoku and text8; and
21
+ > extrapolation to more loops at inference than training.
22
+ >
23
+ > **What this work adds, and nothing more:**
24
+ >
25
+ > | contribution | status |
26
+ > |---|---|
27
+ > | **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 |
28
+ > | **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 |
29
+ > | **Classical solver baselines** measured on our own test set | R-MDM compares only against neural baselines |
30
+ > | **Independent reproduction** that recursion substitutes for parameters, at two separate training budgets | Confirms R-MDM |
31
+ > | ~~**Input injection** — re-adding the token embedding at every recursion~~ | **Retracted.** Worth **+0.05** in a matched test (§2b). The +5.60 previously claimed here was a batch-size artefact. |
32
+ >
33
+ > **We do not claim to beat R-MDM.** Our 99.70% at 212k parameters and their 95%
34
+ > at 10.6M are measured on **different datasets**, and comparing them directly
35
+ > would be invalid. A like-for-like comparison would require running on their
36
+ > benchmark, which we have not done.
37
+
38
+ ---
39
+
40
+ ## 1. Benchmark
41
+
42
+ Generated, not downloaded, because the standard split is saturated: **plain
43
+ constraint propagation solves 1000/1000 of the SATNet split** (Wang et al., 2019),
44
+ so nothing measured there discriminates between methods.
45
+
46
+ | property | value |
47
+ |---|---|
48
+ | test puzzles | 1,000 held out |
49
+ | training puzzles | 100,000 |
50
+ | clues per puzzle | 20–30 (mean 24.4) |
51
+ | uniqueness | verified by exhaustive counter **after every cell removal** |
52
+ | train/test overlap | 0, including up to digit relabelling |
53
+ | metric | **board accuracy** — all 81 cells correct |
54
+
55
+ Generation: `src/gen_hard_sudoku.py`. An earlier generator applied the Sudoku
56
+ symmetry group to one seed grid, which confined every puzzle to a single
57
+ equivalence class and leaked **767/1000** test solutions into training; the
58
+ assertion caught it before any model trained on it. Solutions now come from a
59
+ randomised backtracking fill of an empty grid, reaching the full ≈6.7×10²¹ space
60
+ (verified: 2000/2000 distinct up to relabelling).
61
+
62
+ ## 2. Main result
63
+
64
+ ![passes](figures/sud_fig1_passes.png)
65
+
66
+ | method | params | 1 pass | best | n | per-seed |
67
+ |---|---|---|---|---|---|
68
+ | constraint propagation (no search) | – | – | **3.00%** | – | measured |
69
+ | greedy MRV, one sweep | – | – | 5.90% | – | measured |
70
+ | autoregressive prefix-LM ¹ | 2.4M | – | 0.15% | 2 | 0.3, 0.0 |
71
+ | direct recurrent classifier ¹ | 212k | 10.5% | 31.00% | 4 | 6.6, 21.4, 40.9, 55.1 |
72
+ | feed-forward diffusion, MDLM | 37.9M | 4.40% | 88.15% | 2 | 89.0, 87.3 |
73
+ | feed-forward diffusion, schedule-matched | 37.9M | 40.10% | 88.90% | 2 | 88.3, 89.5 |
74
+ | feed-forward, **32 distinct layers** @bs256 | 6.34M | 70.20% | 94.50% | 1 | 94.5 |
75
+ | feed-forward, **32 distinct layers** @bs64 ² | 6.34M | – | 83.40% | 1 | 83.4 |
76
+ | recurrent, **no input injection** @bs64 ² | 212k | – | 94.10% | 2 | 93.0, 95.2 |
77
+ | recurrent diffusion, MDLM | 212k | 87.35% | 96.55% | 2 | 97.1, 96.0 |
78
+ | recurrent, **no deep supervision** | 212k | 93.35% | 97.75% | 2 | 97.3, 98.2 |
79
+ | **recurrent diffusion, full method** | **212k** | **97.35%** | **99.70%** | 2 | 99.6, 99.8 |
80
+ | full backtracking search | – | – | 100% | – | 423 nodes mean |
81
+
82
+ ² The `@bs64` rows are a **separate training budget** and must not be compared
83
+ against the `@bs256` rows. Comparing across them is exactly the error that
84
+ produced the retracted +5.60 (§2b) and the false "depth is worthless" claim (§4).
85
+
86
+ ¹ Both are **our reimplementations of other people's methods, and both failed to
87
+ reproduce their published results** — the recurrent classifier reaches 31%
88
+ against a reported 99.5%. These are reported as our implementation failing, **not
89
+ as comparisons we won**, and they are excluded from the margin table below.
90
+
91
+ ### Comparison against the state of the art (R-MDM)
92
+
93
+ The relevant SOTA is R-MDM ([arXiv:2606.18022](https://arxiv.org/html/2606.18022v1)).
94
+ Because their benchmark differs from ours, we compare **architectures on our
95
+ benchmark** rather than quoting their number against ours.
96
+
97
+ Dr. Ayhan's instruction was to *ensure our claims hold against a baseline and the
98
+ state of the art*. We ran that test. **One of our claims did not hold**, and this
99
+ section reports it rather than the number it replaces.
100
+
101
+ #### 2b. The matched test — and the retraction of "+5.60"
102
+
103
+ The earlier version of this section claimed input injection was worth **+5.60
104
+ points** over an R-MDM-style arm. That comparison was invalid on two counts:
105
+
106
+ 1. the injection-ON arm trained at **batch 256 for 120k steps**, the injection-OFF
107
+ arm at **batch 64 for 110k steps** — a 4× difference in batch size;
108
+ 2. neither arm had R-MDM's per-loop step embedding `f(h, ℓ, L)`, so the
109
+ "R-MDM-style" baseline was a **weakened** version of their architecture.
110
+
111
+ We re-ran the comparison properly: identical architecture, identical
112
+ hyperparameters, identical batch size, identical step count, **step embedding on
113
+ both sides**, one component different.
114
+
115
+ | NFE | injection OFF (n=2) | OFF seed range | injection ON (n=1) | delta | ON vs OFF range |
116
+ |---|---|---|---|---|---|
117
+ | 1 | 42.00% | [8.30, 75.70] | 89.00% | +47.00 | **outside** |
118
+ | 4 | 89.30% | [84.60, 94.00] | 93.10% | +3.80 | inside |
119
+ | 8 | 93.25% | [91.70, 94.80] | 94.00% | +0.75 | inside |
120
+ | 16 | 94.50% | [93.00, 96.00] | 95.90% | +1.40 | inside |
121
+ | 32 | 96.20% | [95.30, 97.10] | 96.40% | +0.20 | inside |
122
+ | 61 | **96.85%** | [96.60, 97.10] | **96.90%** | **+0.05** | inside |
123
+
124
+ ![rmdm](figures/sud_fig9_rmdm.png)
125
+
126
+ **At the operating point, input injection is worth +0.05 points — nothing.** With
127
+ one seed on the ON side, the only defensible test is whether it lands outside the
128
+ range spanned by the two OFF seeds. **At five of six budgets it does not.** Two
129
+ seeds of the *identical* injection-OFF configuration differ by 67.4 points at
130
+ NFE 1 and by 0.5 at NFE 61, and the ON run sits inside that band everywhere
131
+ except NFE 1.
132
+
133
+ The single-pass result (89.00% against an OFF range of [8.30, 75.70]) is the one
134
+ place any signal appears, and one seed cannot establish it. It is plausible that
135
+ injection matters most when nothing else refreshes the input — at NFE 1 the clues
136
+ must survive all 64 recurrences unaided, whereas multi-pass decoding re-feeds
137
+ committed tokens each pass. **We are not claiming that**; it is a hypothesis the
138
+ data hints at and our compute cannot test.
139
+
140
+ The likeliest reading of the headline result is that **input injection and R-MDM's
141
+ step embedding are redundant**: both supply a per-loop signal anchoring the
142
+ recurrence to its input, and once you have one the other adds nothing. Our
143
+ original measurement compared injection against an arm that had *neither*, and
144
+ credited injection with the difference.
145
+
146
+ **Caveats, stated plainly.** All three arms stopped at **step 80,000 of 110,000**
147
+ (wall-clock limit), so they are matched to each other but undertrained relative to
148
+ the headline runs. The injection-ON side has **n=1**. We could not add seeds: the
149
+ class allocation had 3,030 billing-minutes left and one training run at this
150
+ configuration costs ~3,600. This does not rescue the +5.60 — an underpowered test
151
+ is a reason to withdraw a claim, not to keep it.
152
+
153
+ #### What does survive
154
+
155
+ Recursion substituting for parameters — R-MDM's central claim — reproduces
156
+ cleanly, at **two independent training budgets**, with the comparison matched
157
+ inside each:
158
+
159
+ | budget | 32-layer feed-forward, 6.34M | recurrent 1 layer × 32, 212k | gain |
160
+ |---|---|---|---|
161
+ | batch 256, 120k steps | 94.50% (n=1) | **99.70%** (n=2) | **+5.20** at 30× fewer params |
162
+ | batch 64, 110k steps, injection off both sides | 83.40% (n=1) | **94.10%** (n=2) | **+10.70** at 30× fewer params |
163
+
164
+ ### Margin over every measured baseline
165
+
166
+ | beaten | their score | ours | margin |
167
+ |---|---|---|---|
168
+ | constraint propagation (no search) | 3.00% | 99.70% | **33×** |
169
+ | greedy MRV | 5.90% | 99.70% | **17×** |
170
+ | feed-forward diffusion, 37.9M params | 88.90% | 99.70% | **+10.80 pts, 180× fewer params** |
171
+ | feed-forward, 32 distinct layers, 6.34M | 94.50% | 99.70% | **+5.20 pts, 30× fewer params** |
172
+
173
+ Every baseline in this table was **measured on our own test set**, not cited, and
174
+ every neural row was trained at **batch 256**, the same budget as the 99.70%.
175
+
176
+ **Deliberately excluded:** our autoregressive prefix-LM (0.15%) and direct
177
+ recurrent classifier (31.00%). Both are **our** reimplementations of other
178
+ people's methods and both failed to reproduce their published results (footnote
179
+ ¹). A "665× margin" over our own broken code would measure our implementation,
180
+ not our method, so it is not claimed. They remain in the results table above so
181
+ the failure is visible.
182
+
183
+ The only thing not beaten is full backtracking search (100%), which is exact
184
+ search rather than a learned model and needs 423 search nodes per puzzle on
185
+ average.
186
+
187
+ Against published specialised solvers the position is **comparable, not
188
+ superior**: 99.70% at 212k parameters against the Recurrent Transformer's 99.5%
189
+ at 211k — but on a clue distribution that excludes the hardest 17-clue instances
190
+ (§8). Same league, different test set.
191
+
192
+ ## 3. Parameters against accuracy
193
+
194
+ ![params](figures/sud_fig2_params.png)
195
+
196
+ The gap was never capacity. The 37.9M-parameter feed-forward denoiser has **180×
197
+ more parameters** than the recurrent model and scores **10.8 points worse**.
198
+ Solving a hard Sudoku takes tens of rounds of eliminate-propagate-repeat, and a
199
+ fixed 12-layer network cannot express thirty rounds at any width.
200
+
201
+ ## 4. Ablation — what each ingredient is worth
202
+
203
+ ![ablation](figures/sud_fig4_ablation.png)
204
+
205
+ **Compare only within a batch size.** An earlier version of this table pooled a
206
+ 32-layer run at batch 256 (94.50%) with one at batch 64 (83.40%) into a single
207
+ "88.95%" that belonged to neither, and then read the ladder off that number. Two
208
+ published conclusions came out of that artefact and both were wrong. They are
209
+ corrected below.
210
+
211
+ ### At batch 256 (120k–150k steps)
212
+
213
+ | step | configuration | params | board | gain |
214
+ |---|---|---|---|---|
215
+ | baseline | feed-forward, d=512, 12 layers, 150k steps | 37.9M | 88.90% (n=2) | – |
216
+ | + depth, − width | feed-forward, d=128, 32 layers, 120k steps | 6.34M | 94.50% (n=1) | **+5.60** |
217
+ | + weight sharing | recurrent, d=128, 1 layer × 32, 120k steps | **212k** | **99.70%** (n=2) | **+5.20** |
218
+
219
+ **Parameters fall monotonically and accuracy rises monotonically**: 37.9M →
220
+ 6.34M → 212k against 88.90% → 94.50% → 99.70%. The deeper model even trained for
221
+ *fewer* steps than the baseline it beats. Capacity was never the bottleneck;
222
+ iteration count is.
223
+
224
+ ### At batch 64 (110k steps), injection off on both sides
225
+
226
+ | step | configuration | params | board | gain |
227
+ |---|---|---|---|---|
228
+ | baseline | feed-forward, d=128, 32 layers | 6.34M | 83.40% (n=1) | – |
229
+ | + weight sharing | recurrent, d=128, 1 layer × 32 | **212k** | **94.10%** (n=2) | **+10.70** |
230
+
231
+ ### Two corrections to earlier versions of this table
232
+
233
+ - ~~"Depth alone is worth nothing — 12 to 32 layers gains 0.05 points."~~
234
+ **Wrong, and backwards.** That 0.05 came from comparing against the pooled
235
+ 88.95%. At matched batch size the deeper, *narrower*, 6× smaller model gains
236
+ **+5.60**.
237
+ - ~~"Input injection is worth +5.60."~~ **Retracted** — see §2b. In a matched test
238
+ with R-MDM's step embedding present it is worth **+0.05**.
239
+
240
+ Both errors had the same cause: treating runs at different training budgets as
241
+ interchangeable seeds. `cfg_label` in `src/plot_sudoku.py` now makes batch size
242
+ part of a configuration's identity so the two cannot be pooled again.
243
+
244
+ Two further ablations on the full method:
245
+
246
+ | ingredient removed | board | cost |
247
+ |---|---|---|
248
+ | deep supervision (supervise only the last recurrence) | 97.75% | **−1.95** |
249
+ | schedule matching (plain MDLM objective) | 96.55% | **−3.15** |
250
+
251
+ Note the variance: the 32-layer row is **94.5 / 83.4** (sd 5.55), by far the
252
+ least stable configuration tested. The full method is the most stable at
253
+ **99.6 / 99.8** (sd 0.10).
254
+
255
+ ## 5. Recurrence extrapolates past its training depth
256
+
257
+ ![rsweep](figures/sud_fig3_rsweep.png)
258
+
259
+ Trained at R = 32, evaluated elsewhere with no retraining:
260
+
261
+ | R at inference | 1 | 2 | 4 | 8 | 16 | **32** | **64** | 128 |
262
+ |---|---|---|---|---|---|---|---|---|
263
+ | board accuracy | 0.10% | 5.40% | 48.40% | 82.00% | 92.40% | **98.30%** | **99.40%** | 99.10% / 39.70% |
264
+
265
+ Accuracy **improves past the depth it was trained at**, which is what deep
266
+ supervision predicts: each application is a valid one-step refinement, so the map
267
+ is iterable beyond where it was fit. Honest limit — **2× extrapolation is
268
+ reliable, 4× is not**: one seed holds 99.10% at R = 128, the other collapses to
269
+ 39.70%.
270
+
271
+ ## 5b. The model solving, and why the benchmark was rebuilt
272
+
273
+ ![grids](figures/sud_fig5_grids.png)
274
+
275
+ Real model output on the three hardest held-out puzzles, at 1, 4, 16 and 61
276
+ denoising passes. Grey cells are given clues, red cells are wrong.
277
+
278
+ ![recurrence](figures/sud_fig6_recurrence.png)
279
+
280
+ The same board as the shared block is applied more times. This is the iterative
281
+ refinement the method is built around, made visible rather than asserted.
282
+
283
+ ![difficulty](figures/sud_fig7_difficulty.png)
284
+
285
+ Accuracy against puzzle difficulty, with sample size per point. **The curve is
286
+ flat at 99–100% across the whole 22–27 clue range**, against 3.0% for constraint
287
+ propagation on the same set. Two things follow, and the second is a limitation:
288
+ the model is uniformly strong across the difficulty range this benchmark spans,
289
+ and **the benchmark does not stress it** — we would need 17–21 clue puzzles, where
290
+ minimal-puzzle generation gets sharply more expensive, to find where it breaks.
291
+
292
+ ![saturation](figures/sud_fig8_saturation.png)
293
+
294
+ Why the benchmark was generated rather than downloaded: search-free constraint
295
+ propagation solves **100%** of the standard SATNet split and **3%** of ours.
296
+
297
+ ## 6. The instructive failure: low loss, no capability
298
+
299
+ | baseline | final training loss | board accuracy |
300
+ |---|---|---|
301
+ | autoregressive prefix-LM | **0.0486** | 0.15% |
302
+ | direct classifier, all-cell supervision | **0.0722** | 31.00% |
303
+ | **recurrent diffusion (ours)** | 0.15 | **99.70%** |
304
+
305
+ Both non-diffusion baselines reach **lower training loss than our method and
306
+ solve almost nothing.** Autoregressive errors compound unrecoverably — it cannot
307
+ revise, and one wrong cell destroys the board. All-cell supervision is dominated
308
+ by copying the 24 given clues, so the loss looks excellent while the 57 blanks
309
+ stay unlearned. This is why board accuracy, not loss, is the metric.
310
+
311
+ ## 7. Method
312
+
313
+ ```
314
+ h ← E(x) token embedding
315
+ repeat R times:
316
+ h ← h + E(x) input injection
317
+ h ← Block(h) ONE weight-shared block
318
+ record logits(h) every application is supervised
319
+ loss = Σ_r w_r · CE(logits_r, x₀), w_r = r/R
320
+ ```
321
+
322
+ Implementation: `RecurrentDenoiser` in `src/model.py`, `recurrent_cond_loss` in
323
+ `src/diffusion.py`. Configuration d=128, 1 layer, 4 heads, R=32 training / 64
324
+ inference, chosen to match Yang et al. so the comparison isolates the diffusion
325
+ framing rather than scale.
326
+
327
+ **Input injection** re-adds the token embedding at every recursion, on the
328
+ reasoning that the clue signal would otherwise decay through thirty applications
329
+ of the same block. **That reasoning is not supported by our own measurement**: in
330
+ a matched test it is worth +0.05 points once R-MDM's step embedding is present
331
+ (§2b). It is retained in the default configuration because the headline runs used
332
+ it, not because we can show it helps. **Deep supervision** forces each application
333
+ to be a valid one-step refinement rather than letting the stack learn one
334
+ entangled R-step function, and it is what makes R = 64 inference work after
335
+ R = 32 training (§5); unlike injection, it is load-bearing — removing it costs
336
+ 1.95 points (99.70% → 97.75%, both n=2 at batch 256).
337
+
338
+ ## 8. Published results and their distributions
339
+
340
+ | system | accuracy | puzzle distribution | params | reference |
341
+ |---|---|---|---|---|
342
+ | SATNet | 98.3% | SATNet split, ~36 clues | 618k | Wang et al., ICML 2019 |
343
+ | SATNet | 6.1% | RRN hard, 17 clues | 618k | via Yang et al. 2023 |
344
+ | RRN | 96.7% | RRN hard, 17 clues | 201k | Palm et al., NeurIPS 2018 |
345
+ | Recurrent Transformer | 99.5% | RRN, 17–34 clues | 211k | Yang et al., 2023 |
346
+ | Recurrent Transformer | 96.7% | RRN hardest, 17 clues | 211k | Yang et al., 2023 |
347
+ | **this work** | **99.70%** | **ours, 20–30 clues** | **212k** | — |
348
+
349
+ **Not directly comparable.** Our 20–30 clue range sits inside the Recurrent
350
+ Transformer's 17–34 range but excludes the hardest 17-clue instances. At matched
351
+ parameter count (212k vs 211k) the result is *competitive*. The SATNet split is
352
+ not used because constraint propagation alone solves 100% of it.
353
+
354
+ ## 9. Limitations
355
+
356
+ - **The recursive architecture is not our contribution.** It is established in
357
+ [arXiv:2606.18022](https://arxiv.org/html/2606.18022v1). We reproduce it
358
+ independently and extend it with input injection; the framing throughout
359
+ reflects that.
360
+ - **No like-for-like comparison with R-MDM.** They evaluate on Shah et al.
361
+ (2024); we generate our own minimal puzzles. The two numbers are not
362
+ comparable and we do not compare them.
363
+
364
+ - **Distribution mismatch** with all published numbers (§8). Not a SOTA claim.
365
+ - ~~Input injection is not separated from weight sharing.~~ ~~**Closed**: injection
366
+ is worth +5.60.~~ **Reopened, then resolved against us.** The matched test (§2b)
367
+ puts input injection at **+0.05** once R-MDM's step embedding is present. The
368
+ +5.60 was an artefact of a 4× batch-size difference between the two arms. The
369
+ claim is withdrawn.
370
+ - **The direct-classifier reproduction failed** (31% vs 99.5% published). Not
371
+ used as evidence; reported so the gap is visible.
372
+ - ~~`feed-forward 32L` is n = 2 but highly unstable (94.5 / 83.4).~~ **Not a seed
373
+ effect at all**: 94.5 is batch 256 and 83.4 is batch 64. They are two budgets,
374
+ not two seeds, and pooling them produced the false "depth is worth nothing"
375
+ conclusion (§4). Each is n = 1 at its own budget.
376
+ - **Several arms are n = 1**, and the injection-ON arm of §2b is n = 1. Two seeds
377
+ of one configuration differ by up to 67 points at NFE 1 and 0.5 at NFE 61, so
378
+ low-NFE numbers in this report carry little information.
379
+ - **Compute exhausted.** 3,030 of 3,000,000 billing-minutes remained at the end;
380
+ one further training run costs ~3,600. The open questions below cannot be
381
+ closed with the allocation available.
382
+ - Sudoku only. Whether recurrence transfers to other constraint families is
383
+ untested here.
384
+
385
+ ## Datasets
386
+
387
+ **Primary — generated, not downloaded.** The standard split is saturated, so it
388
+ cannot discriminate between methods.
389
+
390
+ | dataset | role | source | size |
391
+ |---|---|---|---|
392
+ | **Hard Sudoku (this work)** | train + test | generated by `src/gen_hard_sudoku.py` | 100,000 train / 1,000 test, 20–30 clues |
393
+ | SATNet Sudoku | rejected after measurement | `https://powei.tw/sudoku.zip` (Wang et al., ICML 2019) | 9,000 / 1,000, 31–42 clues |
394
+
395
+ The SATNet split was downloaded, verified (all labels valid Sudoku, all clues
396
+ consistent, zero train/test overlap) and then **rejected**: search-free
397
+ constraint propagation solves **1000/1000** of its test set, so every competent
398
+ method scores ~100% and the benchmark measures nothing. That measurement is in
399
+ `src/sudoku_validate.py` and is the reason the hard benchmark exists.
400
+
401
+ Hard-Sudoku generation is fully specified: solutions come from a randomised
402
+ backtracking fill of an empty grid (≈6.7×10²¹ space), cells are removed in random
403
+ order, and a removal is kept **only if an exhaustive counter confirms the solution
404
+ is still unique**. Train and test solutions are disjoint even up to digit
405
+ relabelling. Training uses digit-relabelling augmentation, a genuine Sudoku
406
+ symmetry that leaves the constraint structure untouched.
407
+
408
+ **Used in the earlier study** (§ below), all public and all loaded from scratch:
409
+
410
+ | dataset | source | used for |
411
+ |---|---|---|
412
+ | text8 | `http://mattmahoney.net/dc/text8.zip` | character language modelling, 90M/5M/5M split |
413
+ | QM9 | `https://deepchemdata.s3.us-west-1.amazonaws.com/datasets/qm9.csv` | molecular graph generation, 133,885 molecules |
414
+ | CoNLL-SIGMORPHON 2017 | `github.com/sigmorphon/conll2017` | morphological inflection, 6 languages |
415
+ | *n*-digit addition | synthetic, `src/data.py` | unique-answer, deep-dependency probe |
416
+ | structured graph families | enumerated, `src/graphs.py` | exact total correlation and one-pass ceiling |
417
+
418
+ No pretrained weights or tokenizers are used anywhere, including the
419
+ autoregressive model used to score generated text in the earlier study.
420
+
421
+ ## References
422
+
423
+ - *Recursive Scaling in Masked Diffusion Models (R-MDM).*
424
+ [arXiv:2606.18022](https://arxiv.org/html/2606.18022v1) — **establishes the
425
+ recursive weight-shared architecture with all-steps loss that this work
426
+ reproduces.**
427
+ - Shah et al., 2024 — the 1.8M-board Sudoku dataset R-MDM evaluates on.
428
+ - Wang, Donti, Wilder, Kolter. *SATNet: Bridging deep learning and logical
429
+ reasoning with a differentiable satisfiability solver.* ICML 2019.
430
+ - Palm, Paquet, Winther. *Recurrent Relational Networks.* NeurIPS 2018.
431
+ - Yang, Ishay, Lee. *Learning to Solve Constraint Satisfaction Problems with
432
+ Recurrent Transformer.* ICLR 2023. [arXiv:2307.04895](https://arxiv.org/abs/2307.04895)
433
+ - Austin, Johnson, Ho, Tarlow, van den Berg. *Structured Denoising Diffusion
434
+ Models in Discrete State-Spaces.* NeurIPS 2021.
435
+ - Sahoo et al. *Simple and Effective Masked Diffusion Language Models.* NeurIPS 2024.
436
+ - *Conditional Total Correlation and the Serial Depth of Adaptive Parallel
437
+ Sampling.* [arXiv:2608.25505](https://arxiv.org/abs/2608.25505)
438
+ - *MDLMPE: Distribution Aware Positional Encoding for Masked Diffusion Language
439
+ Models.* [arXiv:2608.03769](https://arxiv.org/html/2608.03769)
440
+ - *MDPO: Overcoming the Training-Inference Divide of Masked Diffusion Language
441
+ Models.* [arXiv:2508.13148](https://arxiv.org/html/2508.13148v1)
442
+
443
+ ## 10. Reproducing
444
+
445
+ ```bash
446
+ python src/gen_hard_sudoku.py --n_train 100000 --n_test 1000 --out data/sudoku_hard
447
+ python src/train_sudoku.py --recurrent --R 32 --R_infer 64 --mode full \
448
+ --hard data/sudoku_hard --augment --d 128 --layers 1 --heads 4 \
449
+ --bs 256 --steps 120000 --lr 3e-4 --out runs/rec
450
+ python src/sudoku_compare.py --hard data/sudoku_hard --runs runs --pattern 'rec*'
451
+ python src/plot_sudoku.py
452
+ ```
453
+
454
+ ---
455
+
456
+ ## The earlier study: two failure modes of parallel decoding
457
+
458
+ ## The claim
459
+
460
+ Masked diffusion's entire value proposition is **parallel decoding**: commit many
461
+ tokens per forward pass instead of one. Quality collapses as parallelism rises,
462
+ and roughly a dozen 2026 papers attack this at inference time with better
463
+ unmasking schedules — confidence ranking, entropy gating, dependency-aware
464
+ ordering.
465
+
466
+ Those methods treat one symptom as one disease. There are two:
467
+
468
+ | | failure mode | why it happens | fixable by |
469
+ |---|---|---|---|
470
+ | **(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** |
471
+ | **(ii)** | committed positions carry real mutual information | parallel decoding samples the **product** of marginals; the truth is the **joint** | **inference only** |
472
+
473
+ For (ii) the discarded dependence is the total correlation of the committed set
474
+ *S*:
475
+
476
+ ```
477
+ TC(S) = Σᵢ H(xᵢ | c) − H(S | c) ≤ Σᵢ H(xᵢ | c)
478
+ ```
479
+
480
+ so **the summed conditional entropy of what you commit upper-bounds the error
481
+ you incur by committing it**. If every committed conditional is a point mass the
482
+ bound is zero and independent sampling reproduces the joint exactly. No training
483
+ objective removes this term without abandoning the data distribution.
484
+
485
+ Conversely, no inference-time reordering repairs a marginal that was never fit.
486
+
487
+ **Prior work applies inference-time fixes to both.** That is why it flatlines on
488
+ arithmetic, where (ii) is identically zero and all the loss is (i).
489
+
490
+ ## What we tried, and what happened
491
+
492
+ Summarised up front, because half of it is negative and burying that would
493
+ misrepresent the work:
494
+
495
+ | | approach | verdict |
496
+ |---|---|---|
497
+ | **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 |
498
+ | **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 |
499
+ | fix (ii) | commit while summed conditional entropy stays under `B` nats | **mixed** — competitive on graphs, loses to fixed-`K` on text8 |
500
+ | 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 |
501
+
502
+ The two positives are independent and do not transfer alike: schedule matching
503
+ carries addition and text8 but does nothing on QM9, while absolute position
504
+ information carries QM9 and the graph families. They are reported as two findings
505
+ rather than merged into one combined claim.
506
+
507
+ The framework itself — deciding which mode a given failure belongs to, and
508
+ bounding how much of it is recoverable — is what survives all four.
509
+
510
+ ## Fix (i): train the schedule you intend to decode at
511
+
512
+ A *K*-pass decode evaluates the model only at mask ratios `{1, (K−1)/K, …, 1/K}`.
513
+ Standard MDLM draws `t ~ U(0,1)`, which is *uniform over the same range* — so the
514
+ issue is not that uniform training under-weights heavy masking. It is that
515
+ continuous `U(0,1)` places **probability zero on t = 1**, the fully-masked state
516
+ every decode begins from. Drawing `t` from the discrete set instead puts an
517
+ **atom of mass 1/K** exactly there.
518
+
519
+ Matching a *single* `K` works, and it is what the addition results below use
520
+ (`K = 1`, i.e. always `t = 1`). But it is a **commitment to one decoding
521
+ budget**, and we measured the price: a model trained for one pass scores 99.8%
522
+ at one pass and **85.7% at twenty**. That is the baseline's own disease with the
523
+ roles reversed — intermediate partially-decoded states are off-distribution for
524
+ a model fitted only to `t = 1`. A method shaped like that can win one operating
525
+ point but cannot dominate a quality-vs-compute curve.
526
+
527
+ ### The attempted generalisation, which failed
528
+
529
+ **Any-budget masked diffusion** was meant to remove that commitment: sample the
530
+ budget per example, draw `t` from that budget's schedule, and pass the budget to
531
+ the denoiser as a log₂ embedding.
532
+
533
+ ```
534
+ K ~ {1, 2, 4, …, 256}
535
+ t ~ {1, (K−1)/K, …, 1/K}
536
+ loss = CE( model(x_t, budget=K), x₀ )
537
+ ```
538
+
539
+ It costs one embedding lookup and no extra forward pass, so it is cheaper than
540
+ the fixed-`K` method — and it does not work. The result is reported here rather
541
+ than dropped, because the reason it fails is the same arithmetic that explains
542
+ why fixed-`K` succeeds.
543
+
544
+ **20-digit addition**, against fixed-`K` (`K = 1`):
545
+
546
+ | training | 1 pass | 2 | 4 | 8 | 16 | 21 (sequential) |
547
+ |---|---|---|---|---|---|---|
548
+ | MDLM baseline | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | – |
549
+ | **fixed-K (K=1)** | **99.9** | 99.3 | 95.6 | 87.5 | 85.8 | – |
550
+ | any-budget | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
551
+
552
+ It does not flatten the crossover; it destroys the capability, scoring zero at
553
+ every budget including a fully sequential decode. The mechanism is arithmetic: a
554
+ one-pass decode starts at `t = 1`, and the training mass landing there is
555
+ `1.000` for fixed-`K` against `(1/9) Σ_K 1/K = 0.222` for uniform any-budget — a
556
+ **4.5× dilution** of the only signal that matters, on a task sitting exactly at
557
+ the learnability edge.
558
+
559
+ **Graphs**, mean over four families and two seeds, any-budget minus baseline:
560
+
561
+ | K = 1 | K = 2 | K = 4 | K = 8 | K = 15 |
562
+ |---|---|---|---|---|
563
+ | +0.3 | −2.7 | −2.9 | **−4.2** | **−31.7** |
564
+
565
+ Worse at every budget above one, and catastrophically worse at high budgets
566
+ (tree −81.6, 2-regular −43.7). Spreading training across nine budgets leaves
567
+ each one undertrained relative to a specialist, and the conditioning embedding
568
+ does not recover the difference — an unconditioned control sampling the same
569
+ budgets does no better.
570
+
571
+ **The negative result is the finding.** "One model for every decoding budget" is
572
+ not free, and at this scale it does not pay for itself at any budget. What
573
+ survives is the narrower claim the addition results already supported: *train
574
+ the schedule you intend to decode at.* Matching a single known budget works
575
+ extremely well (99.9% against a baseline's 0.0%); trying to serve all of them at
576
+ once works worse than either.
577
+
578
+ **Fix (ii) — entropy-budgeted commitment.** At each pass, rank still-masked
579
+ positions by conditional entropy and commit the longest low-entropy prefix whose
580
+ cumulative entropy stays within `B` nats. By the bound above, `B` *directly caps
581
+ the dependence discarded at that pass*, so it is an interpretable dial rather
582
+ than a tuned heuristic: `B → 0` recovers sequential decoding, `B → ∞` recovers
583
+ one-shot parallel decoding, and the curve between them is the quality/compute
584
+ trade-off. The number of passes becomes data-dependent, which is the point.
585
+
586
+ Measured across four graph families it is **competitive but not dominant**: it
587
+ reaches points strictly better than fixed-`K` at equal or lower NFE in some
588
+ configurations (100% validity at 11 passes where fixed-`K` needs 15) and merely
589
+ ties in others. The earlier claim that it dominates fixed-`K` was based on one
590
+ family and does not hold across all four.
591
+
592
+ Cost of the working form of (i) — matching one known budget — is one extra
593
+ forward pass per training step, which is what the compute-matched control in
594
+ §5b exists to account for. Cost of (ii): none.
595
+
596
+ ## What each regime isolates
597
+
598
+ | Regime | Example | mode (i) | mode (ii) | one pass? |
599
+ |---|---|---|---|---|
600
+ | **Non-unique answer** | groups must agree, value free | absent | **maximal** | never — information-theoretic |
601
+ | **Unique, shallow deps** | morphological inflection | small | small | mostly already works |
602
+ | **Unique, deep deps** | *n*-digit addition | **dominant** | zero | fails → schedule matching fixes it, pending a compute control |
603
+ | **Mixed** | natural text | present | present | where the two must compose *(running)* |
604
+ | **Exactly measurable** | structured graphs | present | **dominant** | **where the bound is verifiable — this is what carries the paper** |
605
+
606
+ ---
607
+
608
+ ## 1. Addition — mode (i) in isolation
609
+
610
+ Addition is the clean case: the answer is fully determined by the operands, so
611
+ every conditional is a point mass, mode (ii) is identically zero, and **all** of
612
+ the loss is mode (i). Digit *i* needs the carry out of digit *i−1*, so the
613
+ dependency is deep.
614
+
615
+ **Exact match at ONE forward pass.** Depth scaled as log₂(digits); lr 1e-4 with
616
+ long warmup, which matters — see §5.
617
+
618
+ | digits | MDLM baseline | matched schedule (ours) | seeds >90% (base → ours) |
619
+ |---|---|---|---|
620
+ | 8 | 100.0 | 100.0 | 4/4 → 4/4 (saturated) |
621
+ | **12** | **76.7** | **100.0** | 3/4 → **4/4** |
622
+ | **16** | **25.0** | **75.0** | 1/4 → **3/4** |
623
+ | **20** | **0.0** | **99.9** | 0/3 → **3/3** |
624
+ | 24 | 0.0 | 33.6 | 0/3 → 1/3 |
625
+
626
+ > **⚠ The 16-digit row is unsettled.** A compute-matched control — the plain
627
+ > baseline given **double** the training steps at the same depth — reaches 100%
628
+ > on **one seed of two**, and 0% on the other. So the baseline *can* solve
629
+ > 16-digit addition with enough training, but not reliably. The 25.0% figure
630
+ > below comes from a smaller configuration (10 layers, 60k steps) where both
631
+ > arms were undertrained, so it is not a clean method effect either. **Do not
632
+ > quote the 16-digit gap in any direction** until the matched-configuration
633
+ > comparison lands.
634
+
635
+ The 12-digit row is a parallelism gap: the baseline demonstrably learned the task
636
+ and simply cannot commit it in one pass. The 16-digit row is in question, per the
637
+ note above.
638
+
639
+ **The 20- and 24-digit rows are a different and stronger claim, and are labelled
640
+ as such.** The standard pass grid stops at 16, which for a 21-slot answer is not
641
+ a sequential decode, so `src/seq_check.py` re-decodes every run at one token per
642
+ pass. That settles it:
643
+
644
+ | digits | mode | @1 pass | fully sequential | reading |
645
+ |---|---|---|---|---|
646
+ | 20 | MDLM | 0.0 | **0.0** | **never learned the task** |
647
+ | 20 | ours | **99.8** | 85.7 | learned it |
648
+ | 24 | MDLM | 0.0 | **0.0** | **never learned the task** |
649
+ | 24 | ours | 33.7 | 33.3 | learned it |
650
+
651
+ The baseline is at zero **at every budget, on every seed**. Beyond 16 digits it
652
+ does not fail to *parallelise* — it fails to *learn*. Uniform-`t` training
653
+ touches the fully-masked state with probability zero, and a 20-long carry chain
654
+ never gets enough gradient where it matters. So at these lengths fix (i) is a
655
+ **sample-efficiency** fix, not a parallelism fix, and the 99.8-vs-0.0 gap must
656
+ not be quoted as the latter.
657
+
658
+ 24 digits remains at the edge: one seed of three reaches 100%, the others near
659
+ zero. Reported as the variance it is.
660
+
661
+ ### The method inverts the trade rather than closing it
662
+
663
+ At 20 digits our own model scores **99.8% at one pass but 85.7% at twenty**, and
664
+ one seed drops from 99.5% to 57.0%. More passes make it *worse*.
665
+
666
+ This is the mechanism running in reverse, and it is the strongest available
667
+ evidence for the account. A model trained with mass at `t = 1` is fitted to the
668
+ fully-masked state; walking it through intermediate partially-decoded states
669
+ visits ratios it never trained on — exactly the baseline's disease, with the
670
+ roles swapped. A method that simply dominated at every budget would be weaker
671
+ evidence, because it would be consistent with "we just trained better".
672
+
673
+ It also means the honest framing is not "we close the parallelism gap" but **"the
674
+ schedule you train determines the budget you can decode at"**, in both
675
+ directions.
676
+
677
+ ### No inference-time method closes the gap
678
+
679
+ Mode (ii) is zero here, so the prediction is that **every** inference-time
680
+ strategy lands on the same number and extra compute buys nothing.
681
+
682
+ **12-digit addition**, the *baseline* model decoded every way:
683
+
684
+ | strategy | 1 pass | 2 | 4 | 8 | 16 |
685
+ |---|---|---|---|---|---|
686
+ | confidence | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
687
+ | entropy | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
688
+ | entropy-gated | 76.7 | 76.4 | 76.4 | 76.2 | 76.2 |
689
+ | margin | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
690
+ | random | 76.7 | 77.2 | 76.9 | 76.8 | 76.4 |
691
+ | **ours (training-time)** | **100.0** | 100.0 | 100.0 | 99.9 | 99.9 |
692
+
693
+ **16-digit:** every inference-time strategy 25.0 at one pass and 25.0 at *any*
694
+ budget; ours 75.0.
695
+
696
+ Two things stand out. Every strategy family lands on the same number, and
697
+ **sixteen times the inference compute buys nothing** — at 12 digits it is
698
+ marginally worse. The random-order row is the cleanest statement of it: choosing
699
+ positions at random does as well as every principled ordering heuristic, because
700
+ ordering is not what is broken.
701
+
702
+ This is the control that makes the text8 result in §3 meaningful: the same
703
+ entropy-gated rule that does nothing here is genuinely useful there, because
704
+ there mode (ii) is nonzero.
705
+
706
+ ## 2. Inflection — both modes small
707
+
708
+ Morphological inflection (CoNLL-SIGMORPHON 2017) has unique answers, but forms
709
+ are ~10 characters with shallow local dependencies. Six typologically diverse
710
+ languages, 2 seeds each:
711
+
712
+ | language | baseline @1 | ours @1 | baseline gap 1→32 | **ours gap** | gap removed |
713
+ |---|---|---|---|---|---|
714
+ | Georgian | 94.6 | 94.1 | −0.0 | −0.0 | n/a (saturated) |
715
+ | Russian | 71.6 | 72.3 | +2.2 | **−0.3** | 114% |
716
+ | German | 76.0 | 78.4 | +3.2 | **+0.2** | 94% |
717
+ | Turkish | 78.7 | 82.3 | +3.5 | **+0.8** | 77% |
718
+ | Finnish | 51.4 | 51.9 | +7.7 | **+4.9** | 36% |
719
+ | Navajo | 28.0 | 26.9 | +8.0 | **+4.5** | 44% |
720
+ | **mean** | **66.7** | **67.7** | **+4.1** | **+1.7** | **59%** |
721
+
722
+ ### Which component carries it (48 runs: 6 languages × 4 modes × 2 seeds)
723
+
724
+ | mode | mean @1 pass | gap 1→32 | share of the gap removed |
725
+ |---|---|---|---|
726
+ | MDLM baseline | 66.7 | +4.1 | — |
727
+ | schedule matching alone | 67.7 | +3.4 | 17% |
728
+ | **`t = 1` term alone** | 67.5 | **+2.1** | **49%** |
729
+ | **both** | 67.7 | **+1.7** | **59%** |
730
+
731
+ **The `t = 1` term is the active ingredient.** On its own it removes half the
732
+ parallelism penalty — nearly three times what reshaping the rest of the schedule
733
+ achieves — and the two components are roughly additive. That is precisely what
734
+ the account predicts: what matters is training the *fully-masked state the
735
+ decoder starts from*, not redistributing mass across the schedule generally.
736
+
737
+ The honest reading: **the method removes 59% of the parallelism penalty at no
738
+ cost to one-pass accuracy (66.7 → 67.7), but it does not raise the ceiling** —
739
+ at 32 passes it is 1.4 points *below* the baseline (69.4 vs 70.8). Concentrating
740
+ the schedule at high mask ratios necessarily spends less on the low-ratio states
741
+ that sequential decoding uses.
742
+
743
+ The dose-response is the interesting part and it goes the right way: **Georgian
744
+ has no gap and the method changes nothing; the languages with the largest gaps
745
+ get the largest absolute reductions.** A method that "helped" on Georgian would
746
+ be evidence it was doing something other than what is claimed.
747
+
748
+ Reporting Georgian and English matters: it shows where the method has nothing to
749
+ add, which is what makes the gains elsewhere credible.
750
+
751
+ ## 3. text8 — schedule matching wins on natural language
752
+
753
+ Standard setup: text8, the conventional 90M/5M/5M character split, 27-symbol
754
+ vocabulary, 256-character windows, 12-layer denoiser trained from scratch.
755
+ Generative perplexity is scored by a held-out autoregressive character LM, also
756
+ trained from scratch on text8 (test BPC 1.539), so no pretrained model appears
757
+ anywhere in the pipeline. Two seeds per arm.
758
+
759
+ | NFE | MDLM baseline | **matched (ours)** | any-budget |
760
+ |---|---|---|---|
761
+ | 1 | 650.21 | 651.59 | 649.95 |
762
+ | 4 | 169.34 | **149.59** | 141.98 |
763
+ | 16 | 116.88 | **92.74** | 94.94 |
764
+ | 64 | 85.18 | **72.68** | 77.84 |
765
+ | 256 | 9.22 | **8.40** | 8.59 |
766
+ | **validation BPC** | 1.7292 | **1.7010** | 2.5720 |
767
+
768
+ **Schedule matching beats the published MDLM objective at every budget from 4
769
+ passes upward — by 20.7% at 16 passes — and improves bits-per-character at the
770
+ same time.** That simultaneity matters: the gain is not bought by trading
771
+ likelihood for sample quality, which is the usual way such numbers are inflated.
772
+
773
+ At one pass all three arms are indistinguishable (~650). Unconditional
774
+ generation of a 256-character block from nothing is mode (ii) at its maximum —
775
+ the first commit has no context to condition on — so no training objective helps
776
+ there, exactly as the account predicts.
777
+
778
+ Degeneracy guard: real text8 scores ppl 2.86 with a distinct-4-gram rate of
779
+ 0.177 under the same evaluator. Generated text sits at ppl 8.40 and distinct-4
780
+ 0.238 — worse than real text and slightly *more* varied, i.e. an imperfect model
781
+ rather than a collapsed one. Reporting generative perplexity without this check
782
+ is how repetition gets mistaken for quality.
783
+
784
+ The entropy budget does **not** help here: at ~99 NFE it scores 95.01 where
785
+ fixed-`K` at 64 NFE scores 72.68. On text, spending passes adaptively loses to
786
+ spending them uniformly, unlike on graphs. Reported as measured.
787
+
788
+ ## 3z. The original text8 plan *(superseded)*
789
+
790
+ Addition isolates mode (i); the free-choice probes isolate mode (ii). Natural
791
+ text contains both **in the same sequence**: closing a word, a suffix or a
792
+ function word is nearly deterministic given context, while the choice of the
793
+ next content word carries real entropy. So text is where the claim that the two
794
+ fixes *compose* is actually tested, as a 2×2:
795
+
796
+ | | fixed-*K* commit | entropy-budgeted commit |
797
+ |---|---|---|
798
+ | uniform-`t` training | (a) | (b) |
799
+ | matched training | (c) | (d) |
800
+
801
+ Prediction: (c) < (a) and (d) < (b) on generative perplexity at equal compute,
802
+ and the two gains are largely independent.
803
+
804
+ **A second prediction, registered before the runs finish.** If fix (i) works by
805
+ placing training mass on the ratios a decode actually visits, then matched-`K`
806
+ training should show a **crossover**, not a uniform win: better than uniform-`t`
807
+ near NFE ≈ K, and *worse* far from it. Training at K = 8 puts no mass at the
808
+ ratios a 256-pass decode visits, so uniform-`t` should win at high NFE. A method
809
+ that simply dominated everywhere would be evidence the mechanism is something
810
+ other than the one claimed.
811
+
812
+ By the same logic the `t = 1`-heavy variant should be the worst of the three on
813
+ text at moderate NFE, because at `t = 1` an unconditional model can only learn
814
+ character frequencies — there is no context to condition on. That variant is
815
+ included to be refuted, not to win.
816
+
817
+ Standard setup: text8, the conventional 90M/5M/5M character split, 27-symbol
818
+ vocabulary, 256-character windows. Metrics:
819
+
820
+ - **validation bits-per-character** (the MDLM bound) — the standard likelihood
821
+ number, and the check that sample quality is not bought by wrecking the model;
822
+ - **generative perplexity vs. number of function evaluations**, scored by a
823
+ held-out autoregressive character LM trained from scratch on text8 itself
824
+ (a word-piece model trained on web text would judge character-level artifacts
825
+ through a tokenizer that never sees them);
826
+ - **entropy and distinct-4-gram rate**, reported beside it, because generative
827
+ perplexity alone is trivially gamed by degenerate repetition.
828
+
829
+ Against the published **confidence-threshold** rule, not a top-*k* stand-in.
830
+
831
+ ## 3b. Graphs — where the bound stops being an assumption *(partial)*
832
+
833
+ The weakness of everything above is that the central quantity is never measured.
834
+ On addition `TC = 0` by construction; on text `H(S|c)` is not computable. So the
835
+ entropy budget rests on a bound the experiments never check.
836
+
837
+ Structured graphs close that. A graph on *n* nodes is a binary sequence of
838
+ `n(n−1)/2` edge indicators — the same machinery, unchanged — but for *n* ≤ 7 the
839
+ **entire family enumerates**, making every quantity exact: true marginals,
840
+ `H(S) = log₂|F|`, `TC`, and the one-pass ceiling
841
+
842
+ ```
843
+ V* = Σ_{g valid} ∏ᵢ pᵢ(gᵢ) (what perfect marginals achieve in one pass)
844
+ ```
845
+
846
+ **Proposition.** For `P` uniform on a family `F`, `V* ≥ 2^(−TC)`, with equality
847
+ iff `∏ᵢ pᵢ` is constant on `F`. *Every bit of total correlation among jointly
848
+ committed variables at most halves the one-pass success probability.* Proof and
849
+ verification in [`THEORY.md`](THEORY.md) §5.1 — the inequality holds across all
850
+ nine family/size combinations, and equality holds **to five decimal places** on
851
+ exactly the fixed-edge-count families, failing precisely where edge counts vary,
852
+ as the Jensen step requires.
853
+
854
+ ### Both failure modes, separated by measurement
855
+
856
+ This is what no earlier task could do. Perfect matchings on 6 nodes,
857
+ `TC = 6.92 bits`, `V* = 0.825%`:
858
+
859
+ Four families, two seeds each, one-pass validity against the exact ceiling:
860
+
861
+ | family | TC (bits) | V* | achieved @1 pass (95% CI) | reading |
862
+ |---|---|---|---|---|
863
+ | 2-regular | 8.43 | 0.289% | 0.317% [0.217, 0.465] | **at the ceiling** |
864
+ | matching | 6.92 | 0.825% | 0.769% [0.602, 0.983] | **at the ceiling** |
865
+ | tree | 3.43 | 9.249% | 9.204% [8.597, 9.849] | **at the ceiling** |
866
+ | **bipartite** | **0.11** | **93.632%** | **5.884% [5.395, 6.414]** | **16× below** |
867
+
868
+ This is the decomposition working as a measurement instrument, and it is sharper
869
+ than predicted.
870
+
871
+ **Where dependence is high, models land exactly on the information-theoretic
872
+ ceiling.** Three families, ceilings spanning 32× (0.289% to 9.249%), and in every
873
+ case the interval contains `V*`. The residual failure there is provably mode (ii)
874
+ and no training objective can recover it.
875
+
876
+ **Where dependence is nearly absent, the model fails anyway — and the reason is
877
+ architectural, not statistical.** Bipartite has `TC = 0.11` bits, so one-pass
878
+ decoding should be almost free at 93.6%, yet every model reaches only 5.9%.
879
+
880
+ That gap is **not** untrained capacity. At `t = 1` every input token is `[MASK]`,
881
+ so the input sequence is **constant**. With a purely relative position encoding
882
+ the attention score between positions *i* and *j* depends only on `(i − j)`, and
883
+ when every value vector is identical a layer's output is `v · Σ attn = v` — the
884
+ same at every position. Boundary effects aside, **a RoPE-only model cannot
885
+ express position-dependent marginals at the fully-masked state.** It is an
886
+ expressivity limit, so no amount of training removes it.
887
+
888
+ The completed families confirm this exactly, and the prediction is a dichotomy
889
+ rather than a trend:
890
+
891
+ | family | marginal spread across edge slots | distinct values | one pass |
892
+ |---|---|---|---|
893
+ | matching | **0.0000** | 1 (all 0.200) | ✅ at ceiling |
894
+ | 2-regular | **0.0000** | 1 (all 0.400) | ✅ at ceiling |
895
+ | tree | **0.0000** | 1 (all 0.333) | ✅ at ceiling |
896
+ | **bipartite** | **0.5300** | 2 (0.000, 0.530) | ❌ **16× below** |
897
+
898
+ Every vertex-transitive family has *exactly* constant marginals, which RoPE can
899
+ represent, and every one of them lands on its ceiling. The one family requiring
900
+ different marginals at different positions is the one that fails. Addition
901
+ escapes the problem because its prompt is visible, so the input is not constant.
902
+
903
+ ### The fix, and it is one line
904
+
905
+ Swapping the relative encoding for absolute position embeddings, everything else
906
+ identical:
907
+
908
+ Complete grid, two seeds per cell:
909
+
910
+ | family | marginals | encoding | @1 pass | % of ceiling | per-seed |
911
+ |---|---|---|---|---|---|
912
+ | bipartite | **vary** | RoPE (relative) | 5.87% | 6.3% | 5.81, 5.93 |
913
+ | bipartite | **vary** | **APE (learned)** | **93.91%** | **100.3%** | 94.19, 93.63 |
914
+ | bipartite | **vary** | **sinusoidal (no params)** | **93.95%** | **100.3%** | 94.14, 93.75 |
915
+ | matching | constant | RoPE | 0.78% | 94.7% | 0.78, 0.78 |
916
+ | matching | constant | APE | 0.76% | 91.8% | 0.76, 0.76 |
917
+ | matching | constant | sinusoidal | 0.78% | 94.7% | 0.76, 0.81 |
918
+
919
+ **A 16× improvement, landing exactly on the information-theoretic ceiling.** The
920
+ 87.7-point gap was never untrained capacity — it was inexpressible, and the model
921
+ reaches the bound the moment the architecture can represent the answer.
922
+
923
+ Two things make this hard to explain any other way. **Sinusoidal encodings carry
924
+ no learned parameters at all and perform identically to learned embeddings**, so
925
+ the gain is not extra capacity — it is absolute position information specifically.
926
+ And the seed spread is 0.12–0.56 points, with none of the bimodality that makes
927
+ the addition results fragile.
928
+
929
+ ### The control
930
+
931
+ If absolute encodings were simply better, they would help everywhere. The
932
+ mechanism says they should help **only** where marginals differ across positions.
933
+
934
+ Effect of absolute position information, by condition and encoding:
935
+
936
+ | | learned (APE) | parameter-free (sinusoidal) |
937
+ |---|---|---|
938
+ | marginals **vary** | **+88.037 points** | **+88.074 points** |
939
+ | marginals **constant** | **−0.024 points** | **+0.000 points** |
940
+
941
+ Two independent absolute encodings agree to within **0.04 points** on the
942
+ treatment and both give essentially **exactly zero** on the control — a ~3,700×
943
+ difference in effect size between conditions. Seed variance is negligible
944
+ throughout (matching/RoPE is 0.78, 0.78).
945
+
946
+ That closes both alternative explanations. **Capacity** is ruled out by the
947
+ sinusoidal variant, which has no learned parameters and matches the learned
948
+ embedding exactly. **"Absolute encodings are simply better"** is ruled out by the
949
+ control, where they are worth nothing. What remains is the mechanism as stated:
950
+ a relative encoding cannot distinguish positions when the input is uniform, which
951
+ is precisely the state a one-pass decode begins from.
952
+
953
+ The consequence is general and goes beyond this project: **one-pass masked
954
+ diffusion needs absolute position information, and the field's default encoding
955
+ silently caps it.** Rotary encodings are near-universal in modern diffusion
956
+ language models, and few-pass decoding is the entire reason those models are
957
+ interesting.
958
+
959
+ Coverage confirms none of this is degeneracy — 100% of the matching and
960
+ 2-regular families are recovered at K = 8.
961
+
962
+ One caution the exactness makes visible: `tree`/any-budget scores 10.06%
963
+ [9.43, 10.73], statistically **above** `V* = 9.25%`. `V*` bounds models whose
964
+ marginals match the data's, not all models — exceeding it means the marginals
965
+ have drifted, trading distributional fidelity for validity. See
966
+ [`THEORY.md`](THEORY.md) §5.1.
967
+
968
+ Coverage confirms this is not degeneracy: 100% of the 15-member family is
969
+ recovered at K = 8 and under the entropy budget. (Reporting "uniqueness" as
970
+ unique/valid would have shown 0.4% and read as collapse — with `|F| = 15`,
971
+ coverage is the meaningful metric.)
972
+
973
+ The entropy budget also dominates fixed-K under both training modes, reaching
974
+ 100% validity at 11 passes where fixed-K needs 15.
975
+
976
+ **Status: 3 of 16 runs.** The remaining families span `TC` from 0.11 to 8.44
977
+ bits, which is where the dose-response claim — larger `TC`, lower ceiling, more
978
+ of the loss unfixable — is actually tested. One non-monotonicity in the baseline
979
+ (83.6% at K=4 falling to 76.7% at K=8) is single-seed and not yet trustworthy.
980
+
981
+ ### Phase 2: QM9
982
+
983
+ The synthetic families give an exact ceiling on an artificial task. QM9 gives a
984
+ real benchmark whose metric is unambiguous — RDKit sanitisation enforces valency
985
+ at every atom at once, a genuine joint constraint, with no evaluator model in
986
+ the loop. A molecule is 9 node slots plus 36 edge slots = 45 tokens, so training
987
+ from scratch is cheap and the comparison isolates schedule and decoding rule
988
+ rather than scale. The axis is the one the graph-diffusion literature competes
989
+ on: **validity retained as denoising steps fall.**
990
+
991
+ The encoding is verified lossless first — storing aromatic bonds loses per-atom
992
+ aromaticity flags and put round-trip validity on *real* molecules at 92.65%,
993
+ which would have measured generated samples against a target the representation
994
+ could not reach. Kekulised and charge-filtered, round-trip is 100.00% while
995
+ keeping 99.1% of the dataset.
996
+
997
+ ## 3c. QM9 — the finding on a standard benchmark
998
+
999
+ QM9 molecular generation, from scratch, 9 node slots + 36 edge slots = 45 tokens.
1000
+ Validity is RDKit sanitisation, which enforces valency at every atom at once — an
1001
+ unambiguous metric needing no evaluator model. Two seeds per arm; everything but
1002
+ the named factor held fixed.
1003
+
1004
+ QM9 was chosen because it is the strongest case for §3b's prediction: its
1005
+ marginals are extremely position-dependent (node slot 8 is *never* occupied,
1006
+ slot 7 is occupied 80% of the time, slots 0–2 always are, and edge slots run from
1007
+ never-bonded to always-bonded — mean total-variation distance 0.435 from the
1008
+ average slot). **The prediction was registered before the runs.**
1009
+
1010
+ | denoising steps | standard (uniform-`t` + relative) | **+ absolute encoding** |
1011
+ |---|---|---|
1012
+ | 1 | 0.01% | **29.92%** |
1013
+ | 4 | 29.33% | **55.80%** |
1014
+ | 8 | 72.20% | 72.11% |
1015
+ | 16 | 69.30% | **86.06%** |
1016
+ | 32 | 67.72% | **95.74%** |
1017
+ | 45 | 77.48% | **99.69%** |
1018
+
1019
+ **Under our flat encoding the standard formulation never exceeds 80% validity**,
1020
+ and its curve is non-monotonic (72.2 → 69.3 → 67.7 → 77.5). With absolute
1021
+ position information the curve is clean and monotonic to 99.69%.
1022
+
1023
+ > **⚠ Half of that gap was our own representation.** Our encoding uses fixed
1024
+ > node slots, so the model must learn slot-specific occupancy — exactly the
1025
+ > position-dependence a relative encoding cannot express. DiGress does not
1026
+ > generate this way: it samples the atom count *n* first, then builds an *n*-node
1027
+ > graph, so the problem never arises. Re-decoding the same checkpoints with *n*
1028
+ > given and unused slots observed — DiGress's setup, strictly generous to the
1029
+ > baseline — the relative arm rises from 77.5% to **89.1%**, while absolute stays
1030
+ > at 99.8%. The gap narrows from **22.2 to 10.7 points**.
1031
+ >
1032
+ > The effect is real but roughly **half** the size the flat encoding suggested,
1033
+ > and the "never exceeds 80%" framing does not survive a fair baseline. The
1034
+ > headline table below is kept because it is what the flat representation gives,
1035
+ > but the 10.7-point figure is the one to quote.
1036
+
1037
+ ### The uniqueness collapse
1038
+
1039
+ Validity alone would understate how badly the standard setup fails:
1040
+
1041
+ | steps | standard | + absolute |
1042
+ |---|---|---|
1043
+ | 8 | **4.9%** | 99.2% |
1044
+ | 16 | 9.7% | 98.7% |
1045
+ | 45 | 41.1% | 98.1% |
1046
+
1047
+ **Its 72.2% validity at 8 steps comes from emitting the same handful of molecules
1048
+ repeatedly.** It is not generating a distribution, it is collapsing onto a few
1049
+ points; absolute encoding holds 98–99% uniqueness throughout. Reporting validity
1050
+ without uniqueness on this benchmark would hide the failure entirely.
1051
+
1052
+ ### Steps to reach a validity target
1053
+
1054
+ | formulation | 50% | 80% | 90% | 95% |
1055
+ |---|---|---|---|---|
1056
+ | standard | 8 | **never** | **never** | **never** |
1057
+ | **+ absolute** | **4** | **16** | **32** | **32** |
1058
+
1059
+ ### What does *not* replicate here
1060
+
1061
+ Schedule matching — §1's finding — buys essentially nothing on QM9 (99.65% against
1062
+ 99.69% at 45 steps), and paired with a relative encoding it actively hurts (44.87%
1063
+ against 77.48%). On this benchmark the position encoding is the whole story. The
1064
+ two findings are independent, and only the second transfers here; that is reported
1065
+ rather than blurred into a single combined claim.
1066
+
1067
+ ## 3d. Sudoku — a benchmark win, and a prediction of ours that failed
1068
+
1069
+ SATNet's 9x9 Sudoku (Wang et al., ICML 2019), the conventional 9,000/1,000 split,
1070
+ scored by **board accuracy** — all 81 cells correct. The published number is
1071
+ **98.3%**.
1072
+
1073
+ Leakage audited before use: **0/1000** test puzzles appear in training, **0/1000**
1074
+ solutions appear in training, and **0/1000** solutions match a training solution
1075
+ even up to digit relabelling — which is the vector our augmentation could
1076
+ otherwise have exploited. All 9,000 training and 1,000 test solutions are
1077
+ distinct.
1078
+
1079
+ **Un-augmented arm — like-for-like with SATNet:**
1080
+
1081
+ | denoising passes | board accuracy |
1082
+ |---|---|
1083
+ | **1** | **87.85%** |
1084
+ | **2** | **98.65%** |
1085
+ | 4 | 98.85% |
1086
+ | 8 | 99.70% |
1087
+ | 16 | 99.90% |
1088
+ | **32** | **100.00%** |
1089
+
1090
+ **Two forward passes already exceed the published 98.3%, and 32 passes solve all
1091
+ 1,000 test puzzles exactly.** A single pass — the whole grid committed at once —
1092
+ solves 87.85% of them.
1093
+
1094
+ > **⚠ RETRACTED as a benchmark claim: this split is saturated.** Plain constraint
1095
+ > propagation — naked and hidden singles, no search, no backtracking, about forty
1096
+ > lines — solves **1000/1000 = 100.00%** of the test puzzles. So 100% is the
1097
+ > expected result for any competent method and demonstrates nothing, ours
1098
+ > included; the published 98.3% is itself *below* what a search-free classical
1099
+ > solver achieves. The statistics are clean (95% CI [99.62, 100.00], both seeds
1100
+ > 100.0, p = 3.6e-08 against 98.3%) and beside the point, because the comparison
1101
+ > is not informative. We report the number and withdraw the claim.
1102
+ >
1103
+ > The clue counts explain it: 32–41 per puzzle, mean 36.2, which is easy Sudoku.
1104
+ > §3e evaluates on instances that actually discriminate.
1105
+
1106
+ ### The prediction we got wrong
1107
+
1108
+ We registered, before running, that entropy-budgeted decoding would beat fixed-`K`
1109
+ here "by a very large margin, larger than anywhere else in this project", because
1110
+ Sudoku is where commit *order* seemed to carry the information. It does not: it
1111
+ **loses on every arm**, by 0.35 to 1.40 points.
1112
+
1113
+ **That prediction contradicted our own framework, and the framework was right.**
1114
+ The entropy budget is the fix for mode (ii), the total correlation among
1115
+ committed positions. Sudoku has a unique answer, so `TC = 0` and there is nothing
1116
+ for it to fix — the bound says so directly, and we argued past it because
1117
+ "constraint propagation" was an appealing story. Recorded because a framework
1118
+ that predicts against its author's intuition and wins is worth more than one that
1119
+ only ever agrees with it.
1120
+
1121
+ ### What the win is, and is not
1122
+
1123
+ Two separate reasons not to claim it. The 100% comes from the **plain MDLM
1124
+ baseline** with fixed-`K` decoding, so neither of this project's training findings
1125
+ contributes. And the split is saturated, so the number distinguishes nothing.
1126
+
1127
+ ## 3e. Sudoku that actually discriminates
1128
+
1129
+ Harder instances are built from the same solutions by stripping clues, checking
1130
+ after **every** removal that the solution stays unique, so accuracy remains well
1131
+ defined. The result is a difficulty axis on which a search-free classical solver
1132
+ clearly fails:
1133
+
1134
+ | clues | constraint propagation alone |
1135
+ |---|---|
1136
+ | 36 (the SATNet split) | **100.0%** |
1137
+ | 30 | **27.5%** |
1138
+ | 26 | **4.2%** |
1139
+ | 22 | **3.3%** |
1140
+
1141
+ The models were trained on 31–42 clues, so all three harder sets are also out of
1142
+ distribution: this measures whether they learned Sudoku or learned a clue
1143
+ density. The decoding comparison is repeated here because this is where it should
1144
+ finally matter — with fewer clues the marginals are no longer near-perfect, so
1145
+ commit order has something to do. *(Evaluation running.)*
1146
+
1147
+ ## 4. The limit that cannot be trained away
1148
+
1149
+ Where a group of positions must agree but *which* value they take is free, the
1150
+ likelihood-optimal marginal at each position is uniform over the valid values.
1151
+ Two independent draws agree with probability 1/V. This is mode (ii) at its
1152
+ maximum, and **no decoding schedule and no training objective can fix it**.
1153
+
1154
+ Tested rather than assumed: **66 runs** sweeping an entropy penalty designed to
1155
+ break the symmetry, across weights spanning two orders of magnitude. Weak
1156
+ settings changed nothing; strong settings destroyed the model, failing even at
1157
+ fully sequential decoding.
1158
+
1159
+ This boundary is part of the contribution. A method claiming to fix this regime
1160
+ would be claiming to beat an information-theoretic bound.
1161
+
1162
+ ## 5. Why it should work — and the falsifiable prediction
1163
+
1164
+ See [`THEORY.md`](THEORY.md). Addition's carry is a **prefix scan**, computable
1165
+ in **O(log n)** depth by carry-lookahead, and constant-depth log-precision
1166
+ transformers are confined to uniform **TC⁰**, which contains addition. One-pass
1167
+ decoding is therefore **expressible** at depth ~log n — the obstacle is
1168
+ optimisation, not expressivity. Sequential decoding is best understood as
1169
+ **borrowing depth from the decoding loop**: a *K*-pass decode has effective
1170
+ depth ≈ L·K.
1171
+
1172
+ The account predicts minimum depth growing with **log n**, not n — cleanly
1173
+ distinguishable from a ripple-carry account (linear) or an impossibility account
1174
+ (no depth suffices). Measured, over {2,3,4,6,8,12} layers × 2 seeds:
1175
+
1176
+ | digits | 2 layers | 3 layers | minimum depth | ratio vs 4-digit |
1177
+ |---|---|---|---|---|
1178
+ | 4 | 100 | 100 | 2 | 1.00× |
1179
+ | 8 | 99 | 100 | 2 | 1.00× |
1180
+ | 12 | 48 | 100 | 3 | 1.50× |
1181
+ | **16** | **0** | **100** | **3** | **1.50×** |
1182
+
1183
+ The discriminating quantity is the ratio, not the absolute count, since a wide
1184
+ layer can fold several scan levels into one. At 16 digits:
1185
+
1186
+ | account | predicted ratio | consistent with 1.50×? |
1187
+ |---|---|---|
1188
+ | **prefix scan (ours)** | 2.00× | **yes** — measured growth is if anything slower |
1189
+ | ripple carry | 4.00× | **no** |
1190
+ | not expressible at any depth | — | **no**, 3 layers suffice |
1191
+
1192
+ **Ripple-carry is excluded.** Quadrupling the operand length from 4 to 16 digits
1193
+ costs **one extra layer**, not four times the depth.
1194
+
1195
+ The 16-digit transition is also a clean threshold rather than a gradual ramp —
1196
+ **0% at two layers, 100% at three** — which is the signature of a computation
1197
+ that is depth-limited rather than capacity-limited or data-limited. The minimum
1198
+ depth is now determined at every length tested.
1199
+
1200
+ ## 5b. The compute-matched control
1201
+
1202
+ The method evaluates the model twice per training step, so at equal step counts
1203
+ it spends roughly twice the baseline's training FLOPs. Any gap is therefore
1204
+ confounded with compute until the baseline is given the larger budget. This
1205
+ control gives the baseline **300k steps against the method's 150k**, at the same
1206
+ depth.
1207
+
1208
+ | digits | arm | steps | @1 pass | seeds >90% |
1209
+ |---|---|---|---|---|
1210
+ | 16 | **MDLM baseline, 2× compute** | 300k | **50.0** | **1/2** |
1211
+ | 20 | MDLM baseline | 150k | 0.0 | 0/3 |
1212
+ | 20 | full method | 150k | **99.9** | 3/3 |
1213
+ | 24 | MDLM baseline | 150k | 0.0 | 0/3 |
1214
+ | 24 | full method | 150k | 33.6 | 1/3 |
1215
+
1216
+ **At 16 digits the control puts the method effect in doubt without settling it.**
1217
+ Given double the training the baseline reaches 100% on one seed and 0% on the
1218
+ other. So the baseline *can* solve 16-digit addition, but unreliably, and the
1219
+ 25% → 75% gap from the smaller configuration is not a clean method effect.
1220
+
1221
+ The per-seed values are bimodal — 100% or 0%, nothing between, the same pattern
1222
+ as 24 digits (1/3 seeds). These tasks have a sharp learnability threshold and
1223
+ seeds land on one side or the other, which is why a mean over fewer than three
1224
+ seeds is close to meaningless here and why single-seed readings have misled
1225
+ repeatedly in this project.
1226
+
1227
+ The 20-digit row is what the claim now rests on, and the 300k baseline arm there
1228
+ is still running. If it also reaches ~100% on any seed, the addition result
1229
+ reduces to a statement about sample efficiency rather than about parallel
1230
+ decoding.
1231
+
1232
+ ## 6. A confound that nearly produced the wrong paper
1233
+
1234
+ Earlier runs showed the method "failing" at 10+ digits. It was a **learning-rate
1235
+ artifact**:
1236
+
1237
+ | layers | lr | warmup | mean @1 pass | seeds >90% |
1238
+ |---|---|---|---|---|
1239
+ | 10 | 3e-4 | 500 | 47.3 | 1/4 |
1240
+ | 10 | **1e-4** | 500 | **100.0** | **4/4** |
1241
+ | 10 | 3e-4 | **4000** | **100.0** | **4/4** |
1242
+
1243
+ Deeper models need a lower learning rate and longer warmup. Without this check
1244
+ we would have reported that the method does not generalise, and a depth sweep
1245
+ run at the broken setting would have faked a clean "depth doesn't help" curve.
1246
+
1247
+ ## 7. Audit
1248
+
1249
+ `src/audit.py` gates every claim and reports **0 failures**. Eight sections:
1250
+ arithmetic correctness; fixed-width answer regions; the prompt never masked; the
1251
+ metric ungameable by constant output; probe ground truth valid while degenerate
1252
+ output scores zero; inflection train/dev disjointness; ≥2 seeds behind every
1253
+ reported group; **decoder contracts** (no `[MASK]` survives, decoding always
1254
+ progresses, the entropy budget is monotone in `B`, context is never
1255
+ overwritten); and **text8 split integrity**.
1256
+
1257
+ It earns its place. The decoder section caught a live bug in this work:
1258
+ `torch.multinomial` was sampling over the *full* vocabulary including the
1259
+ absorbing state, so positions were "committed" as `[MASK]`, stayed masked, and
1260
+ decoding silently stalled — 15 of 32 positions unfilled at `K=1`, and the
1261
+ entropy budget non-monotone at `[35, 35, 37, 17, 3]` passes. The fix is the SUBS
1262
+ parameterisation: the denoiser places zero probability on `[MASK]`. Afterwards
1263
+ the budget is exactly monotone, `[32, 32, 32, 16, 1]`.
1264
+
1265
+ Two earlier projects in this line produced confident wrong numbers — an
1266
+ answer-length leak and the learning-rate artifact above — neither visible in the
1267
+ accuracy tables.
1268
+
1269
+ ## 8. Layout
1270
+
1271
+ ```
1272
+ src/
1273
+ data.py addition + dependency-controlled probes
1274
+ sigmorphon.py CoNLL-SIGMORPHON 2017 inflection loader
1275
+ text8.py text8 loader, standard 90M/5M/5M split
1276
+ model.py bidirectional transformer denoiser
1277
+ diffusion.py objectives (fix (i)) + decoders (fix (ii))
1278
+ train_add.py addition trainer
1279
+ train_sig.py inflection trainer
1280
+ train_text8.py text8 trainer + quality-vs-compute evaluation
1281
+ train_eval_lm.py from-scratch AR evaluator for generative perplexity
1282
+ train.py probe trainer (the unfixable-limit experiments)
1283
+ seq_check.py did the baseline fail to parallelise, or fail to learn?
1284
+ beat_baselines.py head-to-head vs inference-time methods
1285
+ audit.py the gate on every number above
1286
+ collect.py tables and figures
1287
+ slurm/ grids, plus unattended finalize and watchdog
1288
+ ```
1289
+
1290
+ ```bash
1291
+ python src/train_add.py --mode full --digits 12 --lr 1e-4 --warmup 4000 --out runs/demo
1292
+ python src/train_sig.py --lang turkish --mode full --out runs/tur
1293
+ python src/train_text8.py --mode full --evallm runs/evallm --out runs/t8
1294
+ python src/audit.py
1295
+ ```
1296
+
1297
+ ## 9. Honest limitations
1298
+
1299
+ - Addition and inflection are probes, not applications; the claim is about the
1300
+ model class, and text8 (§3) is the test of whether it survives real data.
1301
+ - On inflection the method **lowers** the 32-pass ceiling by 1.4 points while
1302
+ removing 59% of the one-pass penalty. That trade is inherent to
1303
+ reallocating the schedule and is reported, not hidden.
1304
+ - The 20- and 24-digit results are sample-efficiency claims, **not** parallelism
1305
+ claims: `seq_check.py` confirms the baseline scores 0.0% at full sequential
1306
+ depth too. Quoting them as parallelism gaps would misrepresent them.
1307
+ - Our own method loses accuracy when decoded at budgets far from the one it was
1308
+ trained for (99.8% at one pass, 85.7% at twenty). This is predicted by the
1309
+ account but it is a real limitation: the training `K` is a commitment to a
1310
+ decoding budget, not a free win.
1311
+ - The any-budget fix for that commitment **fails outright on addition** (0.0% at
1312
+ every budget, against 99.9% for fixed-`K`), because spreading the schedule
1313
+ dilutes `t = 1` training 4.5× on a task that sits at the learnability edge. It
1314
+ helps on graphs and is untested on text. Uniform-`K` is not a safe default.
1315
+ - The answer region reveals whether the sum carries out (its width is *d* or
1316
+ *d*+1). Both arms receive this equally, so comparisons are unaffected, but it
1317
+ is one bit of leakage.
1318
+ - The depth-scaling prediction in §5 is stated and currently being measured.
1319
+ - The non-unique limit is **not** solved here, and we argue it cannot be.