Fix SWAP-MTX: Fisher-Yates shuffle was never actually shuffling correctly
Found while building the analysis report for the ACL-RWT relaunch campaign: cfg=0 was missing from run coverage for 2 of 3 seeds, reproduced identically across all three architectures. Root-caused rather than worked around, per Captain Bob's "this is worrisome." SWAP-MTX (capsules/doe.4th Block 2104) never actually swapped two RUN-MATRIX cells -- it performed a lossy one-way copy (second MATRIX! call mis-targeted mat[i] again instead of mat[j]). Confirmed by direct empirical test on the hosted build: INIT-MATRIX gives mat[0]=0, mat[5]=5; after 0 5 SWAP-MTX, mat[0]=0 (unchanged, should be 5) and mat[5]=0 (correct), with the original value 5 permanently destroyed. Every Fisher-Yates shuffle this mechanism has ever run silently duplicated some values and dropped others -- not a true permutation. Not new, not introduced by item 4.6/Stadium work; predates this session. Fixed with explicit temp variables (SW-I/SW-J/SW-VI/SW-VJ), trivially verifiable by inspection over clever stack juggling. Verified on the hosted build for all three seeds used by the relaunch campaign: each now produces all 16 cfg values exactly 30 times, run_id 0-479 fully distinct. Three-arch QEMU acceptance clean: 1012/0/0 POST on all three, identical dict_hash (expected -- doe.4th isn't C-registered or auto-loaded at boot). BLOCK_MAP.md correctly shows only doe.4th's own hash changed. Also includes the R analysis/chart pipeline (analyse_stadium_relaunch.R) built for the relaunch campaign report, and the three acceptance boot logs. Retroactive caveat: the relaunch campaign's own run-matrix coverage (experiments/bare_metal/runs/acl-rwt-20260820/) is not a valid uniform permutation, having run against the buggy shuffle. Whether to re-run it against the fix is a separate call, not made here. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
79d160c1ca
commit
7e2fd9f044
+6
-3
@@ -66,10 +66,13 @@ Block 2104
|
||||
CREATE RUN-MATRIX N-RUNS 8 * ALLOT
|
||||
: MATRIX! ( val idx -- ) 8 * RUN-MATRIX + ! ;
|
||||
: MATRIX@ ( idx -- val ) 8 * RUN-MATRIX + @ ;
|
||||
VARIABLE SW-I VARIABLE SW-J VARIABLE SW-VI VARIABLE SW-VJ
|
||||
: SWAP-MTX ( i j -- )
|
||||
OVER MATRIX@ >R
|
||||
OVER MATRIX@ ROT MATRIX!
|
||||
R> SWAP MATRIX! ;
|
||||
SW-J ! SW-I !
|
||||
SW-I @ MATRIX@ SW-VI !
|
||||
SW-J @ MATRIX@ SW-VJ !
|
||||
SW-VJ @ SW-I @ MATRIX!
|
||||
SW-VI @ SW-J @ MATRIX! ;
|
||||
: INIT-MATRIX ( -- )
|
||||
N-RUNS 0 DO I I MATRIX! LOOP ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user