The 64-byte enwik9 prefix, settled one time step at a time under live settling rules. Select a position; step f; the patterns that reach it light up the data they were learned from. Generation 4, frozen; the current instrument is generation 5. Notes and open questions · what licenses any of this.
#f-p8-forward at
model header byte 42 and #f-p8-decay at byte 43. The current instrument is
/hutter/pprog/p8v2-gen5-e64/, where the six
retired axis-A ideas are restated on the cap-8 delivery and the decay rule can be moved
with the delivery held still. This page is not rebuilt to follow it: a superseded page
is frozen so it can still be compared with, and the two runs it shares with generation 5
— v024 and v025 — reproduce byte for byte there. See
#viz_standard, “Versioning a
viewer”.
| control | what it changes |
|---|---|
| A1…A7 | What a position does with the applications that reach it. This is f, and it is the axis the generations are working. A1 assignment: the longest k that fires assigns. A2 LSA addition against a decay of 2 per step. A3 addition with renormalisation to constant sum 255. A4 accumulate then decay by the support deficit smax−s. A5 no decay: a pattern of support s is applied only on time steps that are multiples of 2smax−s, so the rate is the fall-off. A6 accumulate then decay by the number of applications that arrived. A7 the generation-4 pair: the k=1 pattern is delivered at min(8, ws) instead of passing through, and the fall-off is 1 instead of 2 — the two move together because the delivery and the fall-off only make sense as a pair. All applied live. A1 and A3 are pruned and kept as controls; A2 keeps its measurements and lost its justification (notes). |
| smax | The reference support A4 and A5 measure a deficit from. Which reading the runs used is an open choice, so it is a control and not a constant. |
| B1 B2 | The backward k=1 application. B1 reconstructs it from the forward argmax table, each of the n predecessors paying the ceiling of the base-2 logarithm of n. B2 reads a stored 65536-byte LPP — refused where that would borrow it from a model with a different learned k=1. |
| C1 C2 | The AND gate at partial activation. C1 min(wa,wb). C2 sums and thresholds at 128. C2 never binds at any runnable sample: the learned k=2 weights are 1 and 2 and the gate has nothing to bite on. |
| min / sub | The application rule. min(wp,ws) is what every run used and is frozen normatively in #f-p8. wp−(255−ws) was tried and rejected, is implemented in no variant, and every frame under it is unverified. Set it on the baseline and step: every non-absolute application dies one hop from a clamped position and the window collapses. That collapse is the single most useful thing on this control. |
| D E F | Which learned model is loaded — not settling rules. Sparsification, replay and pruning change what was learned, so each selects a different model file. Only single-axis combinations were run; two at once is refused rather than borrowed. |
| steps | How far f runs. An application travels one position per time step, so stopping short of W leaves the far end of the window on its initial state. On the baseline the agreement readout gives 11, 12, 14, 27, 49, 62, 64 at 1, 2, 4, 8, 16, 24 and 32 steps. |
| preset | The four runs. Each carries its recorded settled_ok (positions whose settled argmax is the sample byte, clamped ones included, so it is bounded below by the 5 recorded positions) and conv (the time step after which the window's argmax sequence stops changing; equal to W means it never did). Anything not on a preset is the viewer's own and is marked as such. |
| byte | the sample. Non-printable bytes are ·. Shaded where the selected pattern or application was learned from, in that application's colour; striped where two of them share a position. |
| argmax | the settled argmax at this time step. Blue = clamped (the trace records it, held at 255 on its own event, never updated). Green = agrees with the byte, red = disagrees. |
| w1 | the weight of that entry, in log support: v stands for a magnitude of about 2v. Over 99 is shown as tens with a subscript zero. |
| chg | shaded where this time step changed the position's argmax. A clear row means the window has stopped changing. |
Every weight here is a log support, which is why the arithmetic is not the arithmetic it looks like. Nothing on this page names an operation without a row here.
Every pattern the model holds inside the window — 256 k=1 rules
and the k=2 tokens — each expanding to the input positions that formed it.
Selecting one writes its concordance and lights those positions in the grid above.
At this sample the model header says n = M = 64, so the training set
is the 64 bytes on screen and the expansion is exact, not sampled.
Every settled prediction, the patterns that produced it, and the input positions those patterns record. One row per position, over the full run of f under the current controls. Click a row to drive the instrument to it.
Two things in that table are not defects. A row often lists a pattern
out of 0x00: at the first time steps an unclamped neighbour is all
zeros, its argmax is byte 0, and the rule out of byte 0 is genuinely what fired. And
the backward direction is named as a reconstruction rather than by an atom, because
under B1 it is not a stored pattern — the query layer prints no atom for it and
this page will not mint one. It has a support set all the same.
The chain the instrument puts on screen is: input positions → a pattern's log support for a joint event → f → the log support values of the settled event space. What licenses each link. Nothing here is this page's own derivation — everything asserted is quoted from a document published beside this page, and where no document says it, this section says that instead.
| the link | what licenses it |
|---|---|
| input positions → a pattern. A pattern is about the positions the concordance lists. | #f-p8: “the M-1 pattern with
one byte and the next byte being input and output spaces … is a sufficient
statistic on the frequency of the joint events, i.e. the byte pairs.” So the
antecedent–consequent pair names a joint event and the strength is a log count of
it. That count is what the concordance enumerates, which is why LATD is not a debugging
view but the pattern's own definition read back. |
| a count → a byte. Why a strength of 1 is not “seen twice”. | LSA.md: an LSA value “represents the log
value of a count”, the error is uniform in the log domain, two values are
required to have uncorrelated error distributions, and the increment gives
w+1 with probability 2−w. The stored weight is a
stochastic estimate of the count, so the two are not required to agree — and on
this sample they do not. |
| one pattern → a probability, from an absolute antecedent. | #f-p8: “In the case of
assignment, given the full joint pattern on the ESs in which t_i and t_j participate,
we see immediately that softmax on the ES of t_j gives the correct probability
distribution given the event e_i (corresponding to t_i = 255) and the information
about the frequency of the joint events, the sufficient statistic, captured by the
pattern.” With LSA.md: “LSA variables which form an
event space are interpretable as probabilities via softmax.” Read the
conditions: assignment, not accumulation; t_i = 255; before f has run. |
| two patterns → one distribution, and the condition under which that is correct. | #f-p8 states it with its condition
attached: “If another pattern that is derived from a disjoint set of
observations is brought in, these two distributions can be combined into the
correct (per probability theory) combined distribution, which is not true if this
additional parameter is not known (or if the observations are not disjoint, or more
generally, are correlated in a way that is unknown).” |
t_i = 255. In f a forward application delivers
min(wp, ws) where ws is the
source position's current activation — after one time step that is
neither 255 nor a count of anything observed, it is the output of the previous time
step. min of a log count of a joint event and an activation is not
derived anywhere we can find. Axis B is frozen at b1 normatively, but
a freeze is a decision, not a derivation.
log2(2a +
2b): addition in the count domain. Adding the counts of two
event sets that share observations counts the shared observations twice. Whether
that is the intended reading, and what the operation should be when the sets are known
to overlap, is not written down in any document published beside this page.
min, so the source passes
through unchanged — an absolute rule applied to something that represents partial
knowledge (notes). Generation 4's pair, A7, states a
strength instead: the argmax is delivered at min(8, ws), where 8
is the weight that makes the argmax carry half the mass of an ES whose other 255 events
sit at 0 — and the measured share of the argmax expresses as 9 / 8 / 7 at
e64 / e1k / e10k, so 8 is the measured value at e1k and within one unit of it everywhere
(#f-p8-cap8). Under B2 the same pattern is applied at its
actual learned weight, which at this sample is 0, 1 or 2. Whether a stated constant
or the stored count is the right delivery is exactly what v024 against v025
measures: at e64 the stated 8 recovers fourteen unrecorded positions and the stored
truth recovers one, because a 1-unit delivery drowns in a window where the stochastic
add is the same size; by e10k the stored matrix wins
(the report).
#p8v2_gen3 removed
it: “There is no constant sum ever in an ES. The only thing constant is total
probability = 1 and that is after softmax.” That passage of
#f-p8 is marked WITHDRAWN and nothing has
replaced it.
These four are a request for a document, not a finding: the
derivation is the programmer's, and inventing one here would be the same failure as
rendering a rule that was never run. Written up as
#p8v2_latd_probability_ask_20260815.
When the document exists, this section renders it instead of asking for it.
Generation 4. Generation 3's instrument is
/hutter/pprog/p8v2-gen3-e64/, frozen as
that generation's record; generation 2's is
/hutter/pprog/p8v2-e64/. A page is not rebuilt in place when its generation is superseded:
the generation-1 page was, and no longer exists to be compared with. The convention is
in #viz_standard, “Versioning a
viewer”.
Four variants were run — v024 (the A7 pair, the generation's baseline),
v025 (B2 off it, the ground-truth comparison) and the bridges v002 and v013 from
earlier generations — and are marked RUN; every other
setting is the viewer's own and is marked
not a measurement. There is no pick, no ranking and no
compression number here; the picks are the programmer's
(#variant_protocol).
| models/p8v2/enwik9/64/ | the retained models; k=1 argmax table at offset 48, backward LPP at 304, then four bytes per token rule. No k=0 section |
| gen4-pos/ | generation 4's recorded endpoints, which the conformance check compares against |
| gen4.tsv | generation 4's measured facts, including the e64 settling diagnostics |
| axes.json | the axes, their alternatives and their definitions — the page reads it, it is not copied here |
| #f-p8 | f itself: the single normative statement. The application rule, the window and its tiling, the time steps, initialisation, clamping and the argmax tie-break are all in it |
| #f-p8-cap8 | A7, the pair: delivery min(8, ws), fall-off 1, and why the two only move together |
| #f-p8-deficit, #f-p8-period, #f-p8-indegree | A4, A5 and A6, each in its own words |
| LSA.md | what an LSA value is: the log of a count, uniform expected error in the log domain, uncorrelated between values by construction |
| #p8v2_latd_probability_ask_20260815 | the four questions above, written as a request for a derivation |
| p8v2-words.md | the fixture; § Axis A is the settling shell this page implements |
| the generation 4 report | what these runs say, including the ground-truth finding v024 against v025 |
| #pprog_p8v2_gen4_goal_20260815 | the goal generation 4 was run against; unlike earlier generations it carried the picks in |
| #p8v2_gen3 | the push that opened the generation, with the programmer's answers inline |
| #p8v2_gen3_viz_goal_20260810 | the goal this page was built from |
| #viz_standard | what goes on anything we publish, including how a viewer is versioned |
| #hutter_publication_handoff | the division of labour between the two trees |
| build-p8v2-gen4-e64 | rebuilds this page and the notes. Runs no compression |
| p8v2-gen1/ | the generation panels: every variant of a generation over the same input positions |
Published under #viz_standard. Self-contained: no external
stylesheet, no script, no font, no image, nothing fetched. Data symlinked from
../cmpr-src/; page regenerated by
docs/pprog/build-p8v2-gen4-e64, never hand-edited. The blocks are the
authority.