From 07f4671a838088b59c6356ab2b5ffe30038d4b1a Mon Sep 17 00:00:00 2001 From: DreamingOfClouds Date: Mon, 12 Oct 2026 23:44:08 -0500 Subject: [PATCH 1/5] Research: format limits part 2 (no kappa claim): erratum to #595, invoice prices, frontier-word censuses, decoder floors, spec requirements, centre and fragmentation walls Adds research/format-limits-2/ continuing #595: 31 result rows (21 checked, 6 argued, 4 recorded), five conditional candidates, one verify.sh with a hard-failing step 0 (MANIFEST and SOURCES pins), vendored inputs and existing evidence logs. Co-Authored-By: Claude Opus 5.5 --- research/format-limits-2/LICENSE | 201 +++++ research/format-limits-2/MANIFEST.sha256 | 170 ++++ research/format-limits-2/NOTICE.md | 51 ++ research/format-limits-2/README.md | 452 ++++++++++ research/format-limits-2/SOURCES.json | 808 ++++++++++++++++++ research/format-limits-2/requirements.txt | 5 + .../s1-2-erratum-invoice/SOURCES.part.json | 171 ++++ .../checks/e1_scope_multipliers.py | 73 ++ .../s1-2-erratum-invoice/checks/e2_rho.py | 44 + .../s1-2-erratum-invoice/checks/invoice.py | 75 ++ .../s1-2-erratum-invoice/checks/p1_knobs.py | 90 ++ .../s1-2-erratum-invoice/checks/p2_bit.py | 49 ++ .../s1-2-erratum-invoice/checks/p3_rate.py | 42 + .../s1-2-erratum-invoice/checks/p4_s7.py | 58 ++ .../s1-2-erratum-invoice/checks/p5_cover.py | 21 + .../evidence/E2/R39-S-NOTES.md | 17 + .../evidence/E2/rho01_P2.txt | 9 + .../evidence/E2/rho01_P3.txt | 49 ++ .../evidence/E2/rho_bfs_P2.txt | 8 + .../evidence/P1/B15-NOTES.md | 37 + .../evidence/P2/B26-NOTES.md | 36 + .../evidence/P3/B66-NOTES.md | 28 + .../evidence/P4/B54-NOTES.md | 27 + .../evidence/P5/B11-NOTES.md | 29 + .../evidence/P5/B3R-NOTES.md | 28 + .../inputs/derived/k492_registers.json | 1 + .../inputs/pr555/EXPECTED.json.gz | Bin 0 -> 1862 bytes .../inputs/pr595/a5_scope_multipliers.py | 53 ++ .../s1-2-erratum-invoice/inputs/pr595/cert.py | 133 +++ .../inputs/pr595/report.py | 60 ++ .../s1-2-erratum-invoice/inputs/pr595/skel.py | 85 ++ .../inputs/pr626/PLAN.json.gz | Bin 0 -> 8195 bytes .../inputs/pr626/README.md.gz | Bin 0 -> 1127 bytes .../inputs/pr635/PLAN.json.gz | Bin 0 -> 8235 bytes .../inputs/pr645/PLAN.json.gz | Bin 0 -> 7175 bytes .../inputs/pr646/PLAN.json.gz | Bin 0 -> 8128 bytes .../inputs/pr649/PLAN.json.gz | Bin 0 -> 7143 bytes .../inputs/r39s/rho01.cpp | 31 + .../inputs/r39s/rho_bfs.py | 49 ++ .../tools/derive_registers.py | 39 + .../s1-2-erratum-invoice/tools/mksources.py | 20 + .../tools/vendor.out.json | 90 ++ .../s1-2-erratum-invoice/tools/vendor.py | 32 + .../s1-2-erratum-invoice/verify.part.sh | 15 + .../s3-4-census-gauges/SOURCES.part.json | 109 +++ .../s3-4-census-gauges/checks/b_pins.py | 16 + .../checks/c1_census_656.py | 83 ++ .../checks/c2_dirty_borrow.py | 110 +++ .../s3-4-census-gauges/checks/c3_cap_f2_9.py | 23 + .../s3-4-census-gauges/checks/common.py | 21 + .../checks/g1_gauge_bound.py | 129 +++ .../s3-4-census-gauges/evidence/C1/STEPS.json | 37 + .../evidence/C1/ledger_by_step.csv | 6 + .../evidence/C1/ledger_helpers.csv | 493 +++++++++++ .../evidence/C1/ledgers.log | 2 + .../s3-4-census-gauges/evidence/G2/rep1.log | 18 + .../inputs/derived/ck-CANONICAL-WORD.json.gz | Bin 0 -> 92137 bytes .../inputs/derived/g44-CANONICAL-WORD.json.gz | Bin 0 -> 86519 bytes .../inputs/derived/g44-TAGS.json | 1 + .../inputs/pr531/PACKET-PROGRAMS.json.gz | Bin 0 -> 3400 bytes .../inputs/pr531/PROTOTYPE.json.gz | Bin 0 -> 6659 bytes .../pr626/GENERATED-IDENTITY-CONTROLS.json | 300 +++++++ .../inputs/pr645/FULL-WORD.json.gz | Bin 0 -> 126885 bytes .../inputs/pr656/PLAN.json.gz | Bin 0 -> 7243 bytes .../s3-4-census-gauges/verify.part.sh | 10 + .../s5-6-decoders-spec/SOURCES.part.json | 234 +++++ .../s5-6-decoders-spec/checks/anchors.py | 40 + .../checks/d1_decoder_floor.py | 94 ++ .../s5-6-decoders-spec/checks/d1_frames.py | 98 +++ .../s5-6-decoders-spec/checks/d3_punctures.py | 43 + .../checks/d4_structured.py | 40 + .../s5-6-decoders-spec/checks/e8model.py | 98 +++ .../s5-6-decoders-spec/checks/log_checks.py | 40 + .../s5-6-decoders-spec/checks/s1_inplace.py | 55 ++ .../s5-6-decoders-spec/checks/s3_r2_toy.py | 43 + .../evidence/D1/B14_satlift.exit | 1 + .../evidence/D1/B14_satlift.log | 0 .../evidence/D1/B14_satlift.py | 98 +++ .../s5-6-decoders-spec/evidence/D1/B72_sat.py | 32 + .../evidence/D1/B72_sat_n9_o3.exit | 1 + .../evidence/D1/B72_sat_n9_o3.log | 1 + .../evidence/D1/satlift46.py | 134 +++ .../s5-6-decoders-spec/evidence/D2/cen1.out | 4 + .../s5-6-decoders-spec/evidence/D2/cen2.out | 4 + .../s5-6-decoders-spec/evidence/D2/cen3.out | 4 + .../s5-6-decoders-spec/evidence/D2/d1.out | 4 + .../s5-6-decoders-spec/evidence/D2/d2.out | 4 + .../s5-6-decoders-spec/evidence/D2/d3.out | 4 + .../s5-6-decoders-spec/evidence/D2/w1.out | 6 + .../s5-6-decoders-spec/evidence/D2/w2.out | 6 + .../evidence/D3/B14_flip_3.log | 60 ++ .../evidence/D3/B14_flip_3a.out | 28 + .../evidence/D3/B14_flip_3b.out | 57 ++ .../evidence/D3/B14_flip_3c.out | 46 + .../s5-6-decoders-spec/evidence/D3/c1_0.out | 3 + .../s5-6-decoders-spec/evidence/D3/c1_111.out | 3 + .../s5-6-decoders-spec/evidence/D3/c2_0.out | 5 + .../s5-6-decoders-spec/evidence/D3/c2_111.out | 5 + .../s5-6-decoders-spec/evidence/D3/g0.out | 5 + .../s5-6-decoders-spec/evidence/D3/g1.out | 5 + .../s5-6-decoders-spec/evidence/D3/g111.out | 5 + .../s5-6-decoders-spec/evidence/D3/g30.out | 5 + .../s5-6-decoders-spec/evidence/D3/g48.out | 5 + .../s5-6-decoders-spec/evidence/D3/g70.out | 5 + .../inputs/local-hits/P104/HIT_flip_3a.txt | 26 + .../inputs/local-hits/P104/HIT_flip_3b.txt | 26 + .../inputs/local-hits/P104/HIT_flip_3c.txt | 26 + .../inputs/local-hits/P111/HIT_c2_0.txt | 26 + .../inputs/local-hits/P111/HIT_c2_111.txt | 26 + .../inputs/local-hits/P111/HIT_g0.txt | 26 + .../inputs/local-hits/P111/HIT_g1.txt | 26 + .../inputs/local-hits/P111/HIT_g111.txt | 26 + .../inputs/local-hits/P111/HIT_g30.txt | 26 + .../inputs/local-hits/P111/HIT_g48.txt | 26 + .../inputs/local-hits/P111/HIT_g70.txt | 26 + .../main/notes/general-clifford-frames.tex | 102 +++ .../upstream/build/sections/03-motifs.tex | 700 +++++++++++++++ .../main/upstream/build/sections/04-swap.tex | 416 +++++++++ .../inputs/pr622/coupled_frames_base.py | 373 ++++++++ .../inputs/pr626/ck-CANONICAL-WORD.json.gz | Bin 0 -> 92137 bytes .../inputs/pr626/hpe_audit_local.py | 171 ++++ .../s5-6-decoders-spec/verify.part.sh | 20 + .../SOURCES.part.json | 320 +++++++ .../checks/common.py | 17 + .../checks/f1_carriers.py | 30 + .../checks/f1_frag.py | 113 +++ .../checks/f1_pack.py | 35 + .../checks/f1_s3s4.py | 53 ++ .../checks/f6_log.py | 14 + .../checks/o1_faces.py | 51 ++ .../checks/y1_centre_cut.py | 97 +++ .../evidence/F1/B80-NOTES.md | 11 + .../evidence/F1/B81-NOTES.md | 25 + .../evidence/F1/B82-DISCOVERY.json | 49 ++ .../evidence/F1/B82-NOTES.md | 17 + .../evidence/F1/B82-run.log | 49 ++ .../evidence/F1/B85-NOTES.md | 19 + .../evidence/F1/B89-NOTES.md | 15 + .../evidence/F2/B103-NOTES.md | 13 + .../evidence/F2/B105-NOTES.md | 16 + .../evidence/F2/B107-NOTES.md | 11 + .../evidence/F2/B108-NOTES.md | 10 + .../evidence/F2/B98c-NOTES.md | 10 + .../evidence/F2/B99b-NOTES.md | 13 + .../evidence/F3/B90-NOTES.md | 22 + .../evidence/F3/B92-NOTES.md | 16 + .../evidence/F3/B92b-NOTES.md | 14 + .../evidence/F3/B93-NOTES.md | 15 + .../evidence/F3/B94-NOTES.md | 14 + .../evidence/F3/B97-NOTES.md | 13 + .../evidence/F6/B105_miner664.log | 1 + .../evidence/F6/miner664_run1.out | 2 + .../evidence/O1/B68-NOTES.md | 20 + .../evidence/O1/B68-faces.c | 32 + .../evidence/O1/B7-NOTES.md | 24 + .../evidence/O1/B73-NOTES.md | 23 + .../evidence/O1/B74-NOTES.md | 17 + .../evidence/O1/B74-dump.c | 32 + .../evidence/O2/B2-NOTES.md | 58 ++ .../evidence/Y1/B10-NOTES.md | 23 + .../evidence/Y1/B16-NOTES.md | 33 + .../evidence/Y1/B74-NOTES.md | 17 + .../evidence/Y2/B101-NOTES.md | 15 + .../evidence/Y2/B106-NOTES.md | 11 + .../inputs/b82-rec.json | 1 + .../inputs/pr656-FULL-WORD.json.gz | Bin 0 -> 126885 bytes ...-k492audit-pr622-ck-CANONICAL-WORD.json.gz | Bin 0 -> 92137 bytes ...k492audit-pr622-jp8-CANONICAL-WORD.json.gz | Bin 0 -> 94957 bytes .../s7-9-centre-fragmentation/verify.part.sh | 12 + .../format-limits-2/scripts/provenance.py | 51 ++ research/format-limits-2/verify.sh | 39 + 171 files changed, 9430 insertions(+) create mode 100644 research/format-limits-2/LICENSE create mode 100644 research/format-limits-2/MANIFEST.sha256 create mode 100644 research/format-limits-2/NOTICE.md create mode 100644 research/format-limits-2/README.md create mode 100644 research/format-limits-2/SOURCES.json create mode 100644 research/format-limits-2/requirements.txt create mode 100644 research/format-limits-2/s1-2-erratum-invoice/SOURCES.part.json create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/e1_scope_multipliers.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/e2_rho.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/invoice.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/p1_knobs.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/p2_bit.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/p3_rate.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/p4_s7.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/checks/p5_cover.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/E2/R39-S-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P2.txt create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P3.txt create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho_bfs_P2.txt create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/P1/B15-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/P2/B26-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/P3/B66-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/P4/B54-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B11-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B3R-NOTES.md create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/derived/k492_registers.json create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr555/EXPECTED.json.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/a5_scope_multipliers.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/cert.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/report.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/skel.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr626/PLAN.json.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr626/README.md.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr635/PLAN.json.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr645/PLAN.json.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr646/PLAN.json.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/pr649/PLAN.json.gz create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho01.cpp create mode 100644 research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho_bfs.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/tools/derive_registers.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/tools/mksources.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/tools/vendor.out.json create mode 100644 research/format-limits-2/s1-2-erratum-invoice/tools/vendor.py create mode 100644 research/format-limits-2/s1-2-erratum-invoice/verify.part.sh create mode 100644 research/format-limits-2/s3-4-census-gauges/SOURCES.part.json create mode 100644 research/format-limits-2/s3-4-census-gauges/checks/b_pins.py create mode 100644 research/format-limits-2/s3-4-census-gauges/checks/c1_census_656.py create mode 100644 research/format-limits-2/s3-4-census-gauges/checks/c2_dirty_borrow.py create mode 100644 research/format-limits-2/s3-4-census-gauges/checks/c3_cap_f2_9.py create mode 100644 research/format-limits-2/s3-4-census-gauges/checks/common.py create mode 100644 research/format-limits-2/s3-4-census-gauges/checks/g1_gauge_bound.py create mode 100644 research/format-limits-2/s3-4-census-gauges/evidence/C1/STEPS.json create mode 100644 research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_by_step.csv create mode 100644 research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_helpers.csv create mode 100644 research/format-limits-2/s3-4-census-gauges/evidence/C1/ledgers.log create mode 100644 research/format-limits-2/s3-4-census-gauges/evidence/G2/rep1.log create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/derived/ck-CANONICAL-WORD.json.gz create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/derived/g44-CANONICAL-WORD.json.gz create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/derived/g44-TAGS.json create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/pr531/PACKET-PROGRAMS.json.gz create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/pr531/PROTOTYPE.json.gz create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/pr626/GENERATED-IDENTITY-CONTROLS.json create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/pr645/FULL-WORD.json.gz create mode 100644 research/format-limits-2/s3-4-census-gauges/inputs/pr656/PLAN.json.gz create mode 100755 research/format-limits-2/s3-4-census-gauges/verify.part.sh create mode 100644 research/format-limits-2/s5-6-decoders-spec/SOURCES.part.json create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/anchors.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/d1_decoder_floor.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/d1_frames.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/d3_punctures.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/d4_structured.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/e8model.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/log_checks.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/s1_inplace.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/checks/s3_r2_toy.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/B14_satlift.exit create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/B14_satlift.log create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/B14_satlift.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/B72_sat.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/B72_sat_n9_o3.exit create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/B72_sat_n9_o3.log create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D1/satlift46.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/cen1.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/cen2.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/cen3.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/d1.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/d2.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/d3.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/w1.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D2/w2.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/B14_flip_3.log create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/B14_flip_3a.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/B14_flip_3b.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/B14_flip_3c.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/c1_0.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/c1_111.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/c2_0.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/c2_111.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/g0.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/g1.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/g111.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/g30.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/g48.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/evidence/D3/g70.out create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3a.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3b.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3c.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_c2_0.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_c2_111.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_g0.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_g1.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_g111.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_g30.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_g48.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/local-hits/P111/HIT_g70.txt create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/main/notes/general-clifford-frames.tex create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/main/upstream/build/sections/03-motifs.tex create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/main/upstream/build/sections/04-swap.tex create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/pr622/coupled_frames_base.py create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/pr626/ck-CANONICAL-WORD.json.gz create mode 100644 research/format-limits-2/s5-6-decoders-spec/inputs/pr626/hpe_audit_local.py create mode 100755 research/format-limits-2/s5-6-decoders-spec/verify.part.sh create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/SOURCES.part.json create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/common.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/f1_carriers.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/f1_frag.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/f1_pack.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/f1_s3s4.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/f6_log.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/o1_faces.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/checks/y1_centre_cut.py create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B80-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B81-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B82-DISCOVERY.json create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B82-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B82-run.log create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B85-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F1/B89-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F2/B103-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F2/B105-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F2/B107-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F2/B108-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F2/B98c-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F2/B99b-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F3/B90-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F3/B92-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F3/B92b-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F3/B93-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F3/B94-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F3/B97-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F6/B105_miner664.log create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/F6/miner664_run1.out create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O1/B68-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O1/B68-faces.c create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O1/B7-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O1/B73-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O1/B74-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O1/B74-dump.c create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/O2/B2-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/Y1/B10-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/Y1/B16-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/Y1/B74-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/Y2/B101-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/evidence/Y2/B106-NOTES.md create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/inputs/b82-rec.json create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/inputs/pr656-FULL-WORD.json.gz create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/inputs/pr656-k492audit-pr622-ck-CANONICAL-WORD.json.gz create mode 100644 research/format-limits-2/s7-9-centre-fragmentation/inputs/pr656-k492audit-pr622-jp8-CANONICAL-WORD.json.gz create mode 100755 research/format-limits-2/s7-9-centre-fragmentation/verify.part.sh create mode 100644 research/format-limits-2/scripts/provenance.py create mode 100644 research/format-limits-2/verify.sh diff --git a/research/format-limits-2/LICENSE b/research/format-limits-2/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/format-limits-2/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/format-limits-2/MANIFEST.sha256 b/research/format-limits-2/MANIFEST.sha256 new file mode 100644 index 0000000000..1982d5d4a7 --- /dev/null +++ b/research/format-limits-2/MANIFEST.sha256 @@ -0,0 +1,170 @@ +c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4 LICENSE +7809c20cd037dcc29edb5207cbc333bed7b2bd1026cb4f1137f150de90d6866d NOTICE.md +f15d9c66008b323d76b431f130a7ce1e65f018d87721beb37e3a242195bf3f1a README.md +ef0e8e00a8398920fcc8d2fc64a1a6dccebfaecdcb5436afd7859bb0ef85cec3 SOURCES.json +ee3b062cc8f7a5eb8063580fb5fb4333f681552f85f61f4d82643f2684ef628f requirements.txt +760ae16e90740595edffd986ae204c7f3561c83e0fdb123ff97fe5bce9118ec2 s1-2-erratum-invoice/SOURCES.part.json +2dc839aa3f46121c2e67444435731a16388341289bded1abc21ade7f38a7138d s1-2-erratum-invoice/checks/e1_scope_multipliers.py +777db0d2140722c09cf8f7938d155127259df8dee1bcc7dcaccc80435fba26cf s1-2-erratum-invoice/checks/e2_rho.py +d0b4f210ea5f6b5148ff92ffd964c450e92e995810d91cd43421f197ccc04290 s1-2-erratum-invoice/checks/invoice.py +a33e1f6bfec40aec982a71f39ef579101410a4f6a2805c56a794fcb2a7548a5f s1-2-erratum-invoice/checks/p1_knobs.py +319a33fc6b09c7609f0601cfebdf74b38c06036a6fec64d106c37b52ecdad982 s1-2-erratum-invoice/checks/p2_bit.py +85c28ba729e6010c7915d665ab896b904451e0e1da7ab831fcf05893964c631f s1-2-erratum-invoice/checks/p3_rate.py +6097bb96b6cda21c2c0bae8d940100cdef391d44f0367e4b66e87a0abe9b95d7 s1-2-erratum-invoice/checks/p4_s7.py +4d6b3fb7dd0ec009d0664f5a5838afb4f12ee1cd973b60770b60a4b6704bade8 s1-2-erratum-invoice/checks/p5_cover.py +3f3200cccd72d16795175c79b8edbade34e21a07935cab732253b43b6d9a83a5 s1-2-erratum-invoice/evidence/E2/R39-S-NOTES.md +507f8ce06658c64a8c2013a9017849bbccb11b85f48ded217b8c0e0485b88ff8 s1-2-erratum-invoice/evidence/E2/rho01_P2.txt +38c5267c8f558adcf0bfeaf253c15b0fa5c38bbc05686c2f4542771472f9060a s1-2-erratum-invoice/evidence/E2/rho01_P3.txt +4ef341812bdf47cc66b803c40b5b04f03d50bb5f374424086f78ce3c82dc416a s1-2-erratum-invoice/evidence/E2/rho_bfs_P2.txt +350ea8a44a147f9cdcb8ac6ae323b7d8b10a969d3a889247ec79e7fb4e451e77 s1-2-erratum-invoice/evidence/P1/B15-NOTES.md +88c7651b092292d27a071bb22ff850258c2fb97c4efa592bf304e620f16fa240 s1-2-erratum-invoice/evidence/P2/B26-NOTES.md +dc5016c8407eeeb5fae073eace2fcd718a5bef486f53d290c8819f8e7834381c s1-2-erratum-invoice/evidence/P3/B66-NOTES.md +9c37ae11c3ab6273c66e18e8da3ca0adf61d26c53ae28be0fa71ccab70d3703c s1-2-erratum-invoice/evidence/P4/B54-NOTES.md +f79344262d5748660e41d5f0bcf0d47ba2d5116d36423197eeeff97be94a4415 s1-2-erratum-invoice/evidence/P5/B11-NOTES.md +ae42a7642a0e550b7bb8837fa71dd1c6c0d34a5438d584807e606e403d7ff625 s1-2-erratum-invoice/evidence/P5/B3R-NOTES.md +e67e9158ae8bcf485c499b2e5e744016938605aff9848ca9e6106a685f5df2ee s1-2-erratum-invoice/inputs/derived/k492_registers.json +0465a38c683c9a8cfcc11ebdf5bb48013c50982629d43911be792c1011afad50 s1-2-erratum-invoice/inputs/pr555/EXPECTED.json.gz +6479c189696f53cc505febb2c81c4b69a5bf54f211ee4ae64ff841041244b060 s1-2-erratum-invoice/inputs/pr595/a5_scope_multipliers.py +cab1c055cf4dbad6a89b4527e2ef3d138131b6742eaf21bd8b4338a9ee2febf4 s1-2-erratum-invoice/inputs/pr595/cert.py +96fbb236eb58bd471be33ccafbd128cd0590e5dc6f160ad9b9e85bcc2680b437 s1-2-erratum-invoice/inputs/pr595/report.py +9cfbc1316389a46922765cdae85fdde2042f7681986d1c97a19174c4922ea29c s1-2-erratum-invoice/inputs/pr595/skel.py +57dc869171300e4a7600fc82f8ff5063644c59423731890d2a391f2dc6402972 s1-2-erratum-invoice/inputs/pr626/PLAN.json.gz +6b8b4ca567ad0bc88e59eaef98373fb86da2368c57cf5fd16abf66be77fb0279 s1-2-erratum-invoice/inputs/pr626/README.md.gz +81b4a28573e75b93ddda542cf4cc6d5fda42ba6698c2ad2e7d3fcf6bda803125 s1-2-erratum-invoice/inputs/pr635/PLAN.json.gz +67af127042dffb51aff75dc0e905a17cc48dcc1156f7f3e42920543c13c653ea s1-2-erratum-invoice/inputs/pr645/PLAN.json.gz +2912579e14d72946244afa82cc8fec3bc2460a6fb6e0534bf1bed6ca2b50d60e s1-2-erratum-invoice/inputs/pr646/PLAN.json.gz +30fea10ec468f0b280d2e19815ee97e8d3f6faf065467c9a91321cf8372a7430 s1-2-erratum-invoice/inputs/pr649/PLAN.json.gz +238de79583ebe03625e6c4074a212acf4fb3087ebc78771afa0b33562753e552 s1-2-erratum-invoice/inputs/r39s/rho01.cpp +cbe468c4718f20cb1b2b05b980ea23309b65a7699617a4847245a7a1713eacbd s1-2-erratum-invoice/inputs/r39s/rho_bfs.py +a0be2ff4d70e7658d801921af79e4813127d4326085bc271941fee76960bade0 s1-2-erratum-invoice/tools/derive_registers.py +fa9e8c15a1c4fc03da7e6bd209b0fc0eaf5c405bd99cb62f2d8ad13ab91ce300 s1-2-erratum-invoice/tools/mksources.py +6af5b84e952b3f9a98ba9fbc529225d321936358dcfcdf404d0c2d06781097af s1-2-erratum-invoice/tools/vendor.out.json +44cfabecded3e5c7aae0067b033dea586206c1d17b44c68a11c1df5412af60cc s1-2-erratum-invoice/tools/vendor.py +097c752c6203e8b7e2dc8827e3f38c6ca33f17e001e4b79c750170ecfc60b612 s1-2-erratum-invoice/verify.part.sh +8946ca7980cf3dd0bbb6e120407844ebb6b81f08582d39df06987f099e77b8c6 s3-4-census-gauges/SOURCES.part.json +0f2b0972760cb75fddda360787e4def940039c29217ab45610e35732ff16f68e s3-4-census-gauges/checks/b_pins.py +70572de4cb5f954f3da1814a72405a08e98edcfb8ccbeeead4050eb56db2f14f s3-4-census-gauges/checks/c1_census_656.py +442da1c69a5aebd6f68327e9d284cd27699705dfcbffb348aedeb35602fcb851 s3-4-census-gauges/checks/c2_dirty_borrow.py +ff4602ed9d4bfa52911ada6a438bb10052998800e141aca75cb2d548334eef4b s3-4-census-gauges/checks/c3_cap_f2_9.py +49b0ee0db2ca2491cfc6af39bcbb163cebbeaf5214702d1134aa253c351c2074 s3-4-census-gauges/checks/common.py +be72bdb7ba4732b37d4da5c1e486b5902997272490dd508ede78926966d59111 s3-4-census-gauges/checks/g1_gauge_bound.py +e2a8a53212979de70e0f9e9fbd457736d167819e97d455ea3ccc2f1b6356fb0d s3-4-census-gauges/evidence/C1/STEPS.json +4916e77c90696678cc3cb4e320a1fbec622e9d6bd4ca4b3e2a84ad1844ce5518 s3-4-census-gauges/evidence/C1/ledger_by_step.csv +71469db91a3c5672312dde85a9e463d5a6c4527b7cb6f2e2a03594eb59add409 s3-4-census-gauges/evidence/C1/ledger_helpers.csv +171c61ffe5eb12bb2704ba6a1b576c587e0068da750d5cc33e47e7abe9924a85 s3-4-census-gauges/evidence/C1/ledgers.log +7839c5dc45631b9e6012b138ed62cf3d2a1c2e0f900a3872bfb19c214545205b s3-4-census-gauges/evidence/G2/rep1.log +ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45 s3-4-census-gauges/inputs/derived/ck-CANONICAL-WORD.json.gz +72a4952751383e2a5e84b967f1e76fdfda003fe5592df357a599232e586817e3 s3-4-census-gauges/inputs/derived/g44-CANONICAL-WORD.json.gz +0977be8f1226d678c941cd61597621c47f4ed1193bfc1f15456c53fe75dd37f2 s3-4-census-gauges/inputs/derived/g44-TAGS.json +d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9 s3-4-census-gauges/inputs/pr531/PACKET-PROGRAMS.json.gz +ca11de0e8f9291e93e9434c47c8ef6993a364b865b2550f9618d68c19cd60ee0 s3-4-census-gauges/inputs/pr531/PROTOTYPE.json.gz +afe02dd6e947847f7d8cd44d1b730702269a68c3adb30fc858c3816b1ac084e5 s3-4-census-gauges/inputs/pr626/GENERATED-IDENTITY-CONTROLS.json +0ad202612f010df4ab66432a628247b37ad8b497dd6b27595b1685cbd7eb119e s3-4-census-gauges/inputs/pr645/FULL-WORD.json.gz +f0297cd10da2ee01facf2192f26b3ea699b17ea60c0caf214a8aac19643679fd s3-4-census-gauges/inputs/pr656/PLAN.json.gz +8c6799e9f81167d5f10eec275075bae905864f9072e056f5b1ffb9e43426e248 s3-4-census-gauges/verify.part.sh +5437538a63bc5f375d23ebcc321dbeac18648bc2b02af24520707d79d370d228 s5-6-decoders-spec/SOURCES.part.json +bf483581a8a94f968dcdbad9552190d44b4d4672948026ee42dd85d0f4478a23 s5-6-decoders-spec/checks/anchors.py +ef4b7aa039f9c259b94f92e1e2519f00256e1574556980c2490127954608db6e s5-6-decoders-spec/checks/d1_decoder_floor.py +fd969b3c010a1cab2b5e0cdc79f1b04dfceefd85de4fc680a19a4a207a6ae067 s5-6-decoders-spec/checks/d1_frames.py +cf56ec835b3ff6bdada7c1fad135e102dffcd07aa3ed12e9ca9edecf0cde8592 s5-6-decoders-spec/checks/d3_punctures.py +ab40641530ab624741e7a3060bd7b4c0d4e4b69bedf73c3fbb989ef172f792b3 s5-6-decoders-spec/checks/d4_structured.py +7255d13ef349e7a549c0f26addf35ef72d28c72343f3abfcbab2f5eba74834a5 s5-6-decoders-spec/checks/e8model.py +2cf72bdd4182a4bbff11737eea2a9e5b08f32e996d9e84af6fd622b44a77a747 s5-6-decoders-spec/checks/log_checks.py +9f0bdd9626ce1ca7e82873dcfa5f8d0146ddf0fc63dc90c87bc84dd3fcf2a920 s5-6-decoders-spec/checks/s1_inplace.py +326791fa36113e2f765de33d2e008b0d70437796a43843a763c933e17cd06b83 s5-6-decoders-spec/checks/s3_r2_toy.py +9d9b18720961e9b4689fd763b85e7b6f36160ccd3a8a1c9ddc5103bb0f66c396 s5-6-decoders-spec/evidence/D1/B14_satlift.exit +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 s5-6-decoders-spec/evidence/D1/B14_satlift.log +3ba038c2a2a2d766f6a2687e132d6eecbd1efa120cb423b30e8b992f49df6113 s5-6-decoders-spec/evidence/D1/B14_satlift.py +2254f42c0a2b025cb345baf7b22af15c400b0a6fb6abd49d41a5881365845414 s5-6-decoders-spec/evidence/D1/B72_sat.py +9d9b18720961e9b4689fd763b85e7b6f36160ccd3a8a1c9ddc5103bb0f66c396 s5-6-decoders-spec/evidence/D1/B72_sat_n9_o3.exit +8d3091ee1f4d11a1a3efbfcf5f89d10d7e4db4220f23a6ae009c15673eddcc22 s5-6-decoders-spec/evidence/D1/B72_sat_n9_o3.log +dcf96c239888a7eb3d6b5354a97bb557308e8e94d3a75b828e23969e1777215b s5-6-decoders-spec/evidence/D1/satlift46.py +46d763a1e87c309d82765070df94c51e36de45e64a27d47f40606946a62cbcf6 s5-6-decoders-spec/evidence/D2/cen1.out +71314b4f28079348527f8ee9efb24309ad72fd5ea6934c927457722fb2751ef8 s5-6-decoders-spec/evidence/D2/cen2.out +48ac142440860e6ed5fccd96f5a6aa31538e555f17f878501b537e444c31984e s5-6-decoders-spec/evidence/D2/cen3.out +56dd5e20ecb02fbbf1dfee37f2c019bc160a7d136dd8ae8a7bb16688d042ce00 s5-6-decoders-spec/evidence/D2/d1.out +0e19ae1ec5e7d86a9eed9621571af9eaa00abfe165fc8dcd146b5085b520f77c s5-6-decoders-spec/evidence/D2/d2.out +5414c014b669ab8475eb1c39fbf297c2dce9f539242d0320fd8b9cd4267b0a61 s5-6-decoders-spec/evidence/D2/d3.out +cf41e3e53127c5229014618b55fefa0f262d1f250b9f9fbb2963bea558de795b s5-6-decoders-spec/evidence/D2/w1.out +07330ddc5d4f0793df4231d28dae3e8ccc96473a1cfe83be0b84e4b6c97665cd s5-6-decoders-spec/evidence/D2/w2.out +ca31495070ef57979df4effad8c93d3836ac16d3c9a19fb4abe2d9e7c2e3df42 s5-6-decoders-spec/evidence/D3/B14_flip_3.log +e29f3165c0e6b855b0079301a04b15b8a066906c9b0e9df7030cd90572944ae4 s5-6-decoders-spec/evidence/D3/B14_flip_3a.out +17f1bcc4b4bfd5ec0ca20d3b89c68e441d78b3befd68663d475108aaa1c98874 s5-6-decoders-spec/evidence/D3/B14_flip_3b.out +e9ef041b1a76dc94d1f661bf383ac89f285faaff6f17f6a8896e73e660712975 s5-6-decoders-spec/evidence/D3/B14_flip_3c.out +21c0953a5592dea290c4dfa0aceb425cbf7d06e2456c45101c6b5e6db6ab2606 s5-6-decoders-spec/evidence/D3/c1_0.out +7768e0fb8bf8386886b348ede4b8d1090dfd9231d1727c340fad0c7ded4e4156 s5-6-decoders-spec/evidence/D3/c1_111.out +f80e4becb4ffd0dbd9f32a3950698d668125450ed43e3f0f0579e2663a5edc72 s5-6-decoders-spec/evidence/D3/c2_0.out +5518d576d091ead48e6ff96dbcf33e4096e6108e289957c26ac8b69a5e496b35 s5-6-decoders-spec/evidence/D3/c2_111.out +136aeac659db958a4008b54c24d3921efc149741b8ff065b4ea2b3f1514e3337 s5-6-decoders-spec/evidence/D3/g0.out +a3624c2da333fc8e4123a9ed3b2e9ace654895d54c623d258b9eb2a3def81289 s5-6-decoders-spec/evidence/D3/g1.out +0442032f2c0d932ac798e494b385e7987199ae37db27278f117f3b3d04bda026 s5-6-decoders-spec/evidence/D3/g111.out +b2e69115fa90a5b9a9691c403aeba26b871a15be4a92cf923cee11aa26f21150 s5-6-decoders-spec/evidence/D3/g30.out +035d6ddc47f510f4b4fe3eed8c634a1447a0d5ffd4a2b635f32f2acfb52c37c6 s5-6-decoders-spec/evidence/D3/g48.out +9458e545c91b0ff346235473ae192651f29723400a2b81f77522772467acafae s5-6-decoders-spec/evidence/D3/g70.out +8e0178db02c14e1b29058cdbdbd50aac22f2b55a1ba21dc82f417610c9932526 s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3a.txt +d27a8e2d14a2dcbb574995aa9ab82b3b107355faf48ad56f45c6dd5e051d252c s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3b.txt +f3edfb771a76fc57d034b1cddba9de7b97a7d13409817879579eadb03381092e s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3c.txt +0af2b4b42cac05f21794013623f9955bd05cf48374a7e0a1badc29e441a027b7 s5-6-decoders-spec/inputs/local-hits/P111/HIT_c2_0.txt +816768175d2b47ebabfd0f09180d95862bc7e84685f78dc616d9746ebf762a63 s5-6-decoders-spec/inputs/local-hits/P111/HIT_c2_111.txt +c06d83ede44258b7250fe1df62a82011687f704c7f879ce4c91040ebbe2ef6b4 s5-6-decoders-spec/inputs/local-hits/P111/HIT_g0.txt +9a8e8ee205cf3e69e2872c461844232df764a016a8c7e2741a02aeae9cdfc323 s5-6-decoders-spec/inputs/local-hits/P111/HIT_g1.txt +8d5528362385dfc0c19cda625e5b2894d777d9405fc167c4c6723e99baa8db56 s5-6-decoders-spec/inputs/local-hits/P111/HIT_g111.txt +a667c3f13d28828cb0a41b681e08fa6e4c07a1f3270f77555d3a1be29308a1d0 s5-6-decoders-spec/inputs/local-hits/P111/HIT_g30.txt +521a618922d426573a1e808a6f7562eec5cd6ab09538d43b13c4dd79b1597aa7 s5-6-decoders-spec/inputs/local-hits/P111/HIT_g48.txt +b803b2c2621061b9d2b4b31f4137e02c1342d288282a4ee92b7e2f50b2bd9fb3 s5-6-decoders-spec/inputs/local-hits/P111/HIT_g70.txt +c9bb9655b594583c6b4bab8cb485233f1d1e588f83858cf1e4c3530cee8fed54 s5-6-decoders-spec/inputs/main/notes/general-clifford-frames.tex +ed76761194988a01af77ead0ea6469cb5dcd29690ab985a0b5a4006b0f2b69bb s5-6-decoders-spec/inputs/main/upstream/build/sections/03-motifs.tex +412b170ccaab38dba96e95e3cbfae09f4876a9818f8d278776a746b0f8044906 s5-6-decoders-spec/inputs/main/upstream/build/sections/04-swap.tex +b6033cd2959297a624b557f3d04665c8fbb680a4c0987daf0704ef93711700bd s5-6-decoders-spec/inputs/pr622/coupled_frames_base.py +ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45 s5-6-decoders-spec/inputs/pr626/ck-CANONICAL-WORD.json.gz +6bd9a1e279c9c9e4f3767d9f82e537b559292906feb2ddab02f380fb6523a810 s5-6-decoders-spec/inputs/pr626/hpe_audit_local.py +3678aa0a15236f05cceeded680b099b857372f002ee5fade25d8ed2931b70b57 s5-6-decoders-spec/verify.part.sh +4eff6db626517ef1b600ea1f2d7daaeb9d3b7c26b86b78e35780da0305c7cb7b s7-9-centre-fragmentation/SOURCES.part.json +dca23950a66bfa38ff8df71099c134e66c48c984bf0f0b471ddd26b76ff9cf10 s7-9-centre-fragmentation/checks/common.py +8ddeff2008980a1b1126a86641cac30d0d0b90c9c6234e191adc13e13db79fdd s7-9-centre-fragmentation/checks/f1_carriers.py +31bf16d7b75732de0eca22ae1b019ee7758179a34eec25c0ea1c107082200ef3 s7-9-centre-fragmentation/checks/f1_frag.py +cdc1ede574305ddf6c52d4fc513b09435b8cca8af2b515bf7b3a88370976a85f s7-9-centre-fragmentation/checks/f1_pack.py +36efdc752151a4f723e7e9089955a47f16eda87316a279fd375b2e919c96e06b s7-9-centre-fragmentation/checks/f1_s3s4.py +7514cab0f52c3fa1a31cbe9e4aa43d38b43e2188b305516f18be53f9160853be s7-9-centre-fragmentation/checks/f6_log.py +f7176b77e2daffdf6d7440a83283a174abdc12b893cccb868d9cb6f4ad697d59 s7-9-centre-fragmentation/checks/o1_faces.py +69f804a21e2ecf7fc82edc3e0c7bab4efe93815aa47d82045b8111a3d7ae7da7 s7-9-centre-fragmentation/checks/y1_centre_cut.py +c95c492b9b94cf16fd0eaa68b7e1a41c0082de78f33c6059cc2c9a00761184a3 s7-9-centre-fragmentation/evidence/F1/B80-NOTES.md +e3c1e6aa548c6af09c6cdde68d7b1aeb44e874ff8cc8499d8153483bd6287f62 s7-9-centre-fragmentation/evidence/F1/B81-NOTES.md +ba6767bc74e7e91330d27026fa81875d2b116f7a34b818a037d94f1bd519b778 s7-9-centre-fragmentation/evidence/F1/B82-DISCOVERY.json +9cbf48e3c0932ce286826b3a5807432a193275a5f4a6830a52401cbdacde0d54 s7-9-centre-fragmentation/evidence/F1/B82-NOTES.md +ba6767bc74e7e91330d27026fa81875d2b116f7a34b818a037d94f1bd519b778 s7-9-centre-fragmentation/evidence/F1/B82-run.log +c131f3bc7dd229cfc67fc53bd9b79b6a5266f667d9c65c8b335f9df48ca35e70 s7-9-centre-fragmentation/evidence/F1/B85-NOTES.md +85b10b7d8adfcbad634b2e219e2336563324dfd02647282b512d5235e1dcf170 s7-9-centre-fragmentation/evidence/F1/B89-NOTES.md +44d900dd87450634eeb81f7d87bdd67cbd918a80e92ae091c66b57dbcf0c6b98 s7-9-centre-fragmentation/evidence/F2/B103-NOTES.md +b41ddcb848a7f3ecbb75f93e281627cc112b85175b937f4c275f6d3f89242ce9 s7-9-centre-fragmentation/evidence/F2/B105-NOTES.md +357bcdf2dc6f27518a2b9dc14337fd86f00a8d8d3f3b0a1e61de1cae4893fddf s7-9-centre-fragmentation/evidence/F2/B107-NOTES.md +42bc59cc85492f96abed7c0cb75048b418eb4d2730077db827ebb71e88dcd31f s7-9-centre-fragmentation/evidence/F2/B108-NOTES.md +d9a258b3e70ecc982395869018bd7b27872ea83c3273f1ee3c50e53fc127c2d2 s7-9-centre-fragmentation/evidence/F2/B98c-NOTES.md +72917a21ab58fbd99012dc65410a32b27d5966a9e3ee7a3e01289d4bb01f4404 s7-9-centre-fragmentation/evidence/F2/B99b-NOTES.md +96adc6297ab3c0a5406b46c49ce828f596eab28c6d421a72b3e5bb349ea206ab s7-9-centre-fragmentation/evidence/F3/B90-NOTES.md +dbccb5c0d44b1ba04b52f26083adbec1fdd40cbbdcc57dbd5f119496ed5ed8b5 s7-9-centre-fragmentation/evidence/F3/B92-NOTES.md +adb7cefda46501d2769718ef2374554b68722d759eacce1e37030859d3ecbdea s7-9-centre-fragmentation/evidence/F3/B92b-NOTES.md +3dc9d03ab314eb047e90b1d4b94e5245f0769c7eeebd4a939a26c643339422d8 s7-9-centre-fragmentation/evidence/F3/B93-NOTES.md +a08b06c423e298313be7b7a5101d3b37ce98ab1dae91627a4b77d877bd641659 s7-9-centre-fragmentation/evidence/F3/B94-NOTES.md +1c7d4c83ed133b698169ca2be7708ea50d0ab4506e80e58e1a97bb330d9025b7 s7-9-centre-fragmentation/evidence/F3/B97-NOTES.md +3ac09349702214e0ac6db0a6fddb327a83d99e7246d504cd4fb3c4f824268df3 s7-9-centre-fragmentation/evidence/F6/B105_miner664.log +5eb9295206f270b9d61c0b9af5de6a58438e12a0cb727b2b7e9ce6e756cc32fe s7-9-centre-fragmentation/evidence/F6/miner664_run1.out +390e5ea80e1da33988c17532dab42b74ac1ffd2262f07c03e04021c7f529f29c s7-9-centre-fragmentation/evidence/O1/B68-NOTES.md +6c230a05a0dbac13188068dad42dcd0ace52a1c7c11a90ad60c53b2c54b92a84 s7-9-centre-fragmentation/evidence/O1/B68-faces.c +a13c0cf567e7cbac3d5a1d59ad041e7ce0d13fb2518171badcbd4425d4a0a213 s7-9-centre-fragmentation/evidence/O1/B7-NOTES.md +1be2fafbefc53ac40d63497fbf4af8b1549bd10a3fc83c55f4d49254e38c9afe s7-9-centre-fragmentation/evidence/O1/B73-NOTES.md +8491770d60e8234c289ffc9c3342bf2dec4274d6f6658c9c163ad621e19f3aa5 s7-9-centre-fragmentation/evidence/O1/B74-NOTES.md +6e52b14e8f0c352dee5d54e84c4fcbd52399a9d15e27d0375249a7b6ab4d0a34 s7-9-centre-fragmentation/evidence/O1/B74-dump.c +a7b37cc232f220aedcb586e45312232e44347e619e985fd509978a9ec455571e s7-9-centre-fragmentation/evidence/O2/B2-NOTES.md +21c3838e9bfa4b451facc9fe2c6063b1cd3f497e6ad0a2576c42a91b090c1f97 s7-9-centre-fragmentation/evidence/Y1/B10-NOTES.md +3d6c34d60c9fe1d5a3d1af36c7aa9bcaa75dbe56814f1accfea4c546c890dc42 s7-9-centre-fragmentation/evidence/Y1/B16-NOTES.md +8491770d60e8234c289ffc9c3342bf2dec4274d6f6658c9c163ad621e19f3aa5 s7-9-centre-fragmentation/evidence/Y1/B74-NOTES.md +6070ff15252c51783e289a66c389c06da0ca1dd480a7218f151e70b4220cb7e1 s7-9-centre-fragmentation/evidence/Y2/B101-NOTES.md +049906ed7bb49c66205f643638a99393905525e8008b23617b060dc05eeabb4a s7-9-centre-fragmentation/evidence/Y2/B106-NOTES.md +5aaa5bc98240b6b346fe046f1993d68bc4a9abd63acb4c65cac98c34a3a2b55f s7-9-centre-fragmentation/inputs/b82-rec.json +0ad202612f010df4ab66432a628247b37ad8b497dd6b27595b1685cbd7eb119e s7-9-centre-fragmentation/inputs/pr656-FULL-WORD.json.gz +ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45 s7-9-centre-fragmentation/inputs/pr656-k492audit-pr622-ck-CANONICAL-WORD.json.gz +7a3fec1022d3b2b1bd986302a327735ec521d17b043f4a5acb96253a56f6193c s7-9-centre-fragmentation/inputs/pr656-k492audit-pr622-jp8-CANONICAL-WORD.json.gz +35f9462f773a426db74b2c3257fbd19127bdecad2ece393398283953e0a0a9e2 s7-9-centre-fragmentation/verify.part.sh +006c5eceb7fce14b8a9a3af65c183c002f1b528aa7bec777bc14da85578e42f9 scripts/provenance.py +efe690814922109e775439fd4107dfb8a80ce36f67877d5dd2422a7dd4b561f3 verify.sh diff --git a/research/format-limits-2/NOTICE.md b/research/format-limits-2/NOTICE.md new file mode 100644 index 0000000000..481f6bf99b --- /dev/null +++ b/research/format-limits-2/NOTICE.md @@ -0,0 +1,51 @@ +# Notice + +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code; Apache-2.0 (`LICENSE`, copied from +the repository root). + +## New in this package + +Everything under the four section directories except `inputs/` and the existing logs and notes under `evidence/` +(which are shipped unchanged apart from the path removal named in `SOURCES.json`), plus `README.md`, `verify.sh`, +`scripts/provenance.py`, `SOURCES.json`, `requirements.txt` and `MANIFEST.sha256`. + +## Vendored, unchanged (git blob ids in `SOURCES.json`, checked by `scripts/provenance.py`) + +Files of these PRs (commit in `SOURCES.json`), stored verbatim or gzip-compressed: + +- **#531** (icekylinx): `PROTOTYPE.json` and `PACKET-PROGRAMS.json` (the direct-delivery geometry and packet programs). +- **#555** (eumemic): `research/e8-bit-p111/EXPECTED.json` (the bit invoice, row P2). +- **#595** (DreamingOfClouds): `a5_scope_multipliers.py`, `skel.py`, `cert.py`, `report.py` (E1 re-runs them unchanged). +- **#622** (jeremykothe2): the verifier `coupled_frames_base.py` (S4); the #622 / #623 ck and jp8 provider words are vendored from their audit copies inside #656. +- **#626** (chafreaky): `PLAN.json`, README literal, `hpe_audit_local.py`, `GENERATED-IDENTITY-CONTROLS.json`. +- **#635** (jeremykothe2), **#646** (jeremydiviney), **#649** (jeremykothe2): `PLAN.json` profiles (row P3). +- **#645** (icekylinx): `PLAN.json` and `FULL-WORD.json.gz` of the gauge44 word (G1, G2). +- **#656** (jeremykothe2): `PLAN.json`, `FULL-WORD.json.gz`, the audit copies of the ck and jp8 words (C1-C3, Y, F, O rows). +- Three files of main at the base commit: `upstream/build/sections/03-motifs.tex`, `04-swap.tex`, `notes/general-clifford-frames.tex` + (the upstream paper and the frame notes; line anchors of S2-S4). + +## Rebuilt, not files of any PR + +Canonical words rebuilt locally (the gauge44 word of #656 and the ck word of #626); each is pinned by the hashes the PR itself +publishes (`SOURCES.json`, `derived`). + +## Results and constructions this package builds on (credit) + +- **#595** (DreamingOfClouds): the format ceiling, census and lemmas that rows E1, E2, P1 and S1-S4 correct or extend; **#446** (DreamingOfClouds, open): Theorem C. +- **#593, #591, #617, #622, #623** (jeremykothe2): hyperplane-ended helpers and the K-triangle skeleton (G3, O2). +- **#604** (DreamingOfClouds): cold factory-scratch helpers (G1, G3). +- **#626** (chafreaky): the owner repair whose profile the invoice calculus prices. +- **#645** (icekylinx): Gauge44 (G1, G2); **#646** (jeremydiviney): signed-root K480 (G1, O2); **#649, #656, #659, #664, #676** (jeremykothe2): the gauge44 lineage and the frontier words. +- **#531** (icekylinx), **#555** (eumemic): the 504-helper direct delivery and the punctured bit unit. +- **#620** (GamingPuzzled): the E8 decoder floors (the complex P112 decoder of cost 64 is theirs, D1; bit P111 63 is theirs, D3); **#631**: the star-ratio puncture bound 63/111 (D3); **#661** (yuj1r0): R420 phase-B frames at fixed order (F1); + **#665** (Mister-Meeseeks): the rehosting boundary (F2); **#589** (DreamingOfClouds): the bit transport cited by #649. + +## Overlap check with recent swarm PRs + +- **#698** (thakrarsagar): exact certificate that the selected CK supplier's B-phase frames minimise the paid moment over all reassignments preserving circuit, gate order and end-of-B frames. Cited in P5, F1 and F2; it covers the CK B-phase part of their fixed-order frame statements (not jp8, not the A phase); the rest of those rows is distinct. + +- **#703** (Mister-Meeseeks): asymmetric Hurwitz E8 copy cost exactly 10 (scoped negative on #620's quaternionic lines). Related to D1/D3, not a duplicate of any row. +- **#705** (littleBro): determinant obstruction for rank-homogeneous register paths. Related to S2 and F2, not a duplicate. +- **#711** (thakrarsagar): R420 adjacent A swaps force both frames (bit side). Related to F2 (time shifts) and #661, not a duplicate. +- **#683** (Mister-Meeseeks): partial K/M face bypass needs four carriers. Related to appendix item 2 (packet reads), not a duplicate of any row. +- **#687** (cbethin): certifies a single-read relocation neighbourhood in one K-triangle of the #622 word. Related to O2, not a duplicate. diff --git a/research/format-limits-2/README.md b/research/format-limits-2/README.md new file mode 100644 index 0000000000..896fa4f9e3 --- /dev/null +++ b/research/format-limits-2/README.md @@ -0,0 +1,452 @@ +# Format limits, part 2 (no κ claim): erratum to #595, invoice prices, censuses of the frontier word, decoder floors, spec requirements, centre and fragmentation walls + +This package continues the merged #595 (`research/format-limits/`). It states results about the limits of the current +construction format and of the shipped #656 word, and checks the ones that can be checked. **It makes no κ claim and ships +no word.** Each result comes with its scope and assumptions. Each is marked: + +- **CHECKED**: `verify.sh` recomputes it from the files listed below (exact arithmetic unless stated). *CHECKED (log)*: read off a shipped, + sha256-pinned log that `verify.sh` compares but does not regenerate; +- **ARGUED**: a proof or a file:line argument in this README (the quoted lines are themselves checked where stated); +- **RECORDED**: the result of an earlier run that `verify.sh` does not repeat. Where a note or output is shipped under `evidence/` the row names it; otherwise the notes are not shipped (the row says so, or lists the record as "not shipped"). + +A row marked CHECKED for only part of its statement says which part; the rest carries its own status in the row's text. + +```sh +python3 -m pip install -r research/format-limits-2/requirements.txt # sections 5-9 only; sections 1-4 use the standard library +bash research/format-limits-2/verify.sh /fresh/output/dir # from a checkout or `git archive` of the whole repository +``` + +Python ≥ 3.11; `requirements.txt` pins numpy, scipy and sympy; set `PYTHON` to choose the interpreter. Step 0 checks the package against +`MANIFEST.sha256` (every file) and every vendored input against its pin in `SOURCES.json` (git blob ids of the PR files, sha256 of the +rest), and stops with exit 1 on any mismatch. Then the four section groups run at once and print one `PASS`/`FAIL` line per assertion. +Nothing outside the package directory is read. Default: 233 PASS lines (2 in step 0), about 22 s wall on 12 cores (the four groups run at once). `E1_FULL=1 bash verify.sh ...` also re-runs #595's `a5_scope_multipliers.py` unchanged for E1: 228 PASS lines (a single PASS line, which summarises the 14 a5 claim lines, replaces the 6 fast E1 lines), about 62 s. + +**Tested environments** (fresh `git archive`, every claim PASS, 233 PASS lines, exit 0): + +| Python | numpy | scipy | sympy | how installed | +|---|---|---|---|---| +| 3.11.17 | 2.4.6 | 1.17.1 | 1.14.0 | fresh venv from `requirements.txt` | +| 3.14.7 | 2.4.6 | 1.17.1 | 1.14.0 | fresh venv from `requirements.txt` | +| 3.14.7 | 2.5.4 | 1.18.1 | 1.14.0 | development venv, latest releases | + +Floating-point results (the F1 HiGHS MILP, the P1/P3 roots) are compared with explicit tolerances or exact decimals. + +## Results at a glance + +Sections: 1 erratum and scope, 2 invoice calculus and prices, 3 censuses of the frontier word, 4 cold ends and gauges, 5 decoder floors, +6 what the spec and verifier require, 7 centre barrier, 8 fragmentation and rigidity, 9 ledgers for skeleton changes. 31 rows by primary status: 21 CHECKED, 6 ARGUED, 4 RECORDED (rows partly CHECKED say so). + +| id | result | status | +|---|---|---| +| E1 | **ERRATUM to #595.** The ×1.15–2.15 "schedule/ρ family" multipliers (#595 census item 8 and open problem 3; its A.7 table labels the rows "rule dropped") come from dropping idle-frame rules, not from a ρ family: idle changes free ×2.15, one-child batching ×1.55, no split pre-stretch ×1.18 at s = 9 (×1.15 best, s = 5), both sides. | numbers CHECKED; reading ARGUED | +| E2 | ρ is not a verifier input (it is the hard-coded final bank swap). Over all pair-preserving ρ at P ≤ 3 (reachable set exactly Sp(4,2) = 720 and Sp(6,2) = 1,451,520) none beats B_K: multiplier 1.000. | (b) CHECKED (log, re-run and compared); (a) ARGUED | +| P1 | Complex invoice calculus on #626 (reproduced to 16+ digits): centre −1 = +22.6% b; one cst unit +2.81%; one port +2.15%; one w9 helper +0.068% (+0.137% if its width merges). | CHECKED | +| P2 | Bit invoice calculus on #555: c reproduced to 24 digits; cst unit ±2.80% c, port 2.15%. Word-level helper knobs (0.06–0.11% c) not re-run. | root, mass, cst rows CHECKED; rest RECORDED | +| P3 | Helper exchange rate by width on #649: w9 0.070% (no merge) / 0.140% (merged), down to w4 0.026 / 0.072; explains the old 0.027–0.143 spread. | CHECKED | +| P4 | Stage count s = 9 → 7 is worse at every R: hosting overflows 8.7%, b₇ only +0.21% over b₉ at equal R. | CHECKED (model) | +| P5 | The climb mass is a forced cover (mass = mW − deficit): mass padding is illegal, frame annealing gains 0.0% b, "fewer helpers" is not a gain. | identity CHECKED; SA outcome RECORDED | +| C1 | Provenance census of #656: 492 helpers born at 4 allocation sites: S1 scratch 224, S3 packet copy 156, S4 slot copy 112; κ identity exact. | CHECKED (tags from a recorded rebuild) | +| C2 | The shipped word is a dirty-borrow program, not a clean SLP: 2056 distinct read rows (minimum chain cover 2056), 268 of 422 B-phase helpers are pure dirt, equal to the S3 + S4 sites. | CHECKED | +| C3 | The 112 ports form a cap in F₂⁹ (no three XOR to 0, every hyperplane misses ≥ 48); 8-port blocks sit at dimension ≤ 5. | cap CHECKED; corollary ARGUED | +| G1 | Gauge-free cold-end bound N_cold ≤ Σ_b(\|Q_b\| − rank C[Q_b]); #645 attains 44. | CHECKED on #645; 504 / K480 values RECORDED | +| G2 | Gauge44 is gauge-optimal at 44 for its frame schedule; read-order ceiling 48 (+0.13–0.16% b), home-first legal ceiling 46. | 44 = bound CHECKED; ceilings RECORDED | +| G3 | **Theorem.** A helper can end at a hyperplane U only if the supports of its row of M⁻¹ and its column of M lie in Q_U; covers every reordering and relay strategy. | ARGUED (Lean on #593's package RECORDED) | +| D1 | Complex decoder floor on P112: exactly 8 costly terms give cst ≥ 64 (9 label spans over 440,880 supports); all costly terms β ≥ 8 and n ≥ 9 give cst ≥ 72; n = 8 is infinitesimally rigid up to gauge. Open: mixed β ≤ 7 terms with n ≥ 9. | counts, spans, rigidity CHECKED; step (b), (c) ARGUED; flip-walk logs CHECKED (log) | +| D2 | Any n = 8 exact P112 decoder is D = XA, T = XA⁻ᵀ; absorbing one frame line costs exactly +1 cst, a pair +2 (≈ 272k and 951k sampled cases). | ARGUED; census CHECKED (log) | +| D3 | Non-star complex decoders exist: exact cst 63 on all six single-line P111 punctures, cst 56 on P104. Their buildability price is negative (net −0.1 to −10% b). | hits CHECKED (exact); walks CHECKED (log); price RECORDED | +| D4 | Structured classical decoders cost more than coordinate (64): rotations, WHT, halves 72; coset 4-split 192. | CHECKED | +| S1 | In-place elimination is dead under the shipped frame rules: 0 of 12,432 cross-port in-place pairs legal; 33 illegal reads in every row of M (41.2% of the off-diagonal support). | CHECKED | +| S2 | Spec dependencies of the sink wall: the endpoint operator holds on every role, so target sinks cannot be shared; a full sink forces M_in(X) = 0 only for idempotent labels (non-projection labels open). | ARGUED (citations CHECKED) | +| S3 | R2 (one identical exact representative per gate) is specification; relaxing it to a fixed finite set is unsound as a drop-in (h = 3 toy: 4 of 8 addresses moved). | CHECKED (toy) | +| S4 | Centre descents exist only for the 8 barrier centres of the shipped verifier; the "once per word" premise is false (centre −1 = +22.6% b). | ARGUED (file:line CHECKED) | +| Y1 | Centre/cut facts for M = I − G/2 on 112 D₈-root ports: rank G = 8, cut ranks 6/7/7/8, no weight-4 total in the span of the centres; rank 7 occurs at 8 coordinate splits. | CHECKED | +| Y2 | Full centre delivery is frame-illegal (448 of 456 reads); a 7+1 time-split barrier saves 0%. | rank part CHECKED (8 splits); rest ARGUED / RECORDED | +| F1 | Target fragmentation at the shipped op order: legal ceiling 950 of 1096 ops, loose format bound 229 psi/call (HiGHS-proved maximum 36), S3/S4 reader sets admit no modular chain (0/156, 0/112). | CHECKED for the stated parts; rest RECORDED | +| F2 | Tight-frames wall: legal iff G ⊆ U; slack arises only by deleting ops, time shifts, descents or equal-value re-threading; +1 dimension on any helper pushes 2–8 target frames 8 → 9. | ARGUED; instances RECORDED | +| F3 | S1 block scratch cannot be shared or shortened inside the format: 16 distinct sparse forms per block, 0 of 16 equal twins retireable. | RECORDED | +| F4 | Twin substitution for the 73 frame-insulator helpers fails on #656: all 111 twin reads are value-exact, 0 of 111 are legal one at a time (each raises 2–6 final caps), 0 of 73 helpers deletable. | RECORDED (exact oracle, not shipped) | +| F5 | Re-ordering reads of read-only S3 faces fails on #656: for 27 of the 32 structurally clean faces every B slot from the last write to the copy slot (window ≈ 740–860 ops), in given and reversed reader order, gives 0 legal reads. | RECORDED (exact oracle, not shipped) | +| F6 | The opening miner on the rebuilt #664 word finds 2534 disjoint-lifetime helper pairs; all 2534 need frame growth and none is frame-nested, so 0 register-reuse openings: the same rigidity as #656. | CHECKED (log) | +| O1 | Cross-block totals ("X4" faces): 2688 reach-10 quads all span 4 blocks; ledger 12.21% b (hypothetical design) does not close. | faces CHECKED; ledger RECORDED | +| O2 | #617 → #622 K-triangle ledger on the moment engine: ideal gross +0.52% b for 12 helpers, net +0.0146% after 6 lost cold ends and rewired climbs. | RECORDED | +| App. | **Appendix: conditional candidates** (5 items, each with one blocking condition; none is a result). | unverified | + +Earlier statements this package relies on: sections A–F of #595 (cited as premises) and the words and pipelines of #622, #623, #626, +#635, #645, #646, #649, #656 and #659 read by the checks (see `NOTICE.md`). + + +## 1. Erratum and scope + +*Sections 1-2: commands run from `s1-2-erratum-invoice/`.* + +### E1. Erratum to #595: the ×1.15–2.15 "schedule/ρ family" is a set of dropped idle-frame rules + +**Statement.** #595 (census item 8, open problem 3, B.2 rows 5, 12, 13) describes the multipliers ×1.15 to ×2.15 as the value of "the schedule/ρ +freedom". They are not. Each A.7 variant is `skel.profile` with one rule of the scope dropped (its docstring: "Each variant +… drops one rule"). The three that make up the range, recomputed with #595's own `skel.X`: + +| variant (rule dropped) | complex 112/64, best s / s = 9 | bit 111/63, best s / s = 9 | +|---|---|---| +| idle frame changes free | ×1.68 (s = 7) / ×2.15 | ×1.67 / ×2.14 | +| all idle changes of one copy batched into one child | ×1.20 (s = 7) / ×1.55 | ×1.19 / ×1.55 | +| bridges moved off the idle stretches (no split pre-stretch) | ×1.15 (s = 5) / ×1.18 | ×1.15 / ×1.18 | + +No ρ enters these numbers. The remaining A.7 variants (copy-free, loc_h, window−1) are reproduced by the full mode. + +**Scope.** #595 `a5_scope_multipliers.py` at `b_K` with s ∈ {3,…,13}; complex 112/64 and bit 111/63. It says nothing about +whether a real word could drop an idle rule. +**Status.** CHECKED (numbers); the reading "not a ρ family" is ARGUED from the script's variant definitions (and E2). +**Depends on.** #595. **Check.** `python3 -I -B checks/e1_scope_multipliers.py` (16 s on two processes); +`E1_FULL=1` runs the vendored `a5_scope_multipliers.py` unchanged (all 14 claim lines PASS, 56 s). +**Consequence.** Open problem 3 of #595 should read: the schedule freedom is untested; the idle terms are not evidence for it. + +### E2. ρ is not a verifier input, and no pair-preserving ρ beats B_K at the scalar layer + +**Statement.** (a) ρ is hard-coded as the final bank swap (`columns_k.cpp:56`, `bit_global.py:49-55`), so a ρ sweep +cannot be run as a parameter. (b) Enumerating every pair-preserving monomial target ρ over F₂ with the moves of the format +(pair-local shears Y += X / X += Y at cost 1 local; bridges X_d += X_s, Y_s += Y_d), the reachable set is exactly +Sp(4,2) = 720 (P = 2) and Sp(6,2) = 1,451,520 (P = 3). For every target the minimum number of locals is 0 if no pair is +exchanged and 2k + 1 if k pairs are exchanged (k = number of exchanged pairs); the cheapest cost per exchanged pair is +(2P + 1)/P, attained by the full exchange (5 locals, 3 bridges at P = 2; 7 locals, 6 bridges at P = 3), which is B_K. +So no ρ beats B_K per served pair: multiplier 1.000. + +**Scope.** P ≤ 3 bank pairs, the same ρ on every port, one pair per local. F₂ reduction is a necessary condition, so these +are lower bounds on cost. **Escapes (not enumerated):** non-symplectic or multi-bank locals (P ≥ 4), port-dependent ρ, +K ≥ 4 cyclic bridge graphs. +**Status.** (b) CHECKED (log): `rho01` is compiled and re-run and its output compared byte-for-byte with the shipped +`evidence/E2/rho01_P{2,3}.txt`; an independent Python search reproduces P = 2. (a) ARGUED: file:line from `evidence/E2/R39-S-NOTES.md` +(source files not vendored). +**Depends on.** #595, #622, #623. **Check.** `python3 -I -B checks/e2_rho.py` (2 s). + +## 2. Invoice calculus and prices + +All prices are exact finite differences of the pressure root b, the root a of Σ_r (r n_r / mW)(m/r)^a = 1, over the local +width profile {r: n_r} (Decimal, 50 digits). For #626: m = 73, W = 7168, deficit 2560 (mass = mW − 2560). + +**Provenance of the #626 word data.** The register-level inputs (`inputs/derived/k492_registers.json`) are the climb widths +of every register of the ck and jp8 local words, derived by `tools/derive_registers.py` from the rebuilt `CANONICAL-WORD.json.gz` +files (the rebuild of the words from the #626 code, about 9 min, is RECORDED and not repeated). They are bound to the PR by +check: the word climbs plus the idle remainder {1: 123, 37: 1, 48: 2215} equal the PLAN profile of #626 exactly (`P1.gate-profile`), +and kappa = b/(1 + b) = 0.00163552738037539223… reproduces the README literal 0.001635527380375392 (`P1.gate-kappa`). + +### P1. Complex invoice calculus: the knob table + +| knob (all 72 calls) | change of b | +|---|---| +| remove one centre (local −17, host −9, deficit +576) | **+22.60%** (add one: −22.56%) | +| one cst unit: centre cut climb 8 → 7 / one unit climb dropped | **+2.81%** / +2.82% | +| source end FULL → 8 (one source) / target end 8 → 7 (one target) | +2.81% / +2.81% per unit | +| one port: v → v − 1 (deficit 2496, W − 64) | −2.15%, i.e. a port is worth **+2.15%** | +| one w9 helper removed (ck mean + jp8 mean) | +0.068% (freed width stays one narrow child) / +0.137% (merged into 48-bins) | + +Reading: helper changes are mass-neutral (climb mass = hosted width); only the end frames of non-hosted registers (sources, +targets, centres) move the deficit, and one mass unit per call is worth about 2.8% of b, i.e. 20–40 helpers. The "once per +word" cost of a centre descent is false: a centre is +22.6%. +**Scope.** The #626 invoice at its shipped word: knobs are priced on the invoice, the word is not rebuilt for each. Source, +target and centre knobs use the modal shapes (sources (1,1,1,5) in 140 of 224, targets (1,1,4,1,1) in 104 of 224, all of mass 8; +all 8 centres (1,1,1,1,4,8,1)). **Status.** CHECKED. **Depends on.** #626, #649. +**Check.** `python3 -I -B checks/p1_knobs.py` (1 s). Notes: `evidence/P1/B15-NOTES.md`. + +### P2. Bit invoice calculus (#555 R439) + +**Statement.** The shipped c = 0.001733052823330162099157 is the root of the nine-stage profile with its bad term, reproduced to +24 digits (relative difference 1.2·10⁻²²); mass 1,808,352, deficit 10,272 = 256·111 − 288·63. One cst unit (a child r → r − 1 on +all 288 calls) is +2.8017% c (r = 7) to +2.816% (r = 1); the second unit +5.603% cumulatively. +**RECORDED (word-level, not re-run):** one port +2.15% c (cst-neutral), one helper +0.06–0.11% c (by climb pattern and idle +repack), sources and targets with near-identical knob values (`evidence/P2/B26-NOTES.md`; the script needs the per-register +climbs and takes more than 120 s). +**Scope.** #555 nine-stage word. **Status.** CHECKED (root, mass, cst-unit rows); the rest RECORDED. **Depends on.** #555. +**Check.** `python3 -I -B checks/p2_bit.py` (<1 s). + +### P3. Helper exchange rate + +**Statement.** Removing one helper of width w in all 72 calls (its climbs leave, w returns to the idle cover) changes b of +#649 by, in % (exact mean over all helper registers of that width in the ck and jp8 words): + +| w | shapes | no merge | merged into 48-bins | +|---|---|---|---| +| 9 | 504 | 0.070 | 0.140 | +| 8 | 204 | 0.051 | 0.118 | +| 7 | 104 | 0.038 | 0.101 | +| 5 | 96 | 0.031 | 0.084 | +| 4 | 60 | 0.026 | 0.072 | + +This explains the earlier spread 0.027 / 0.043 / 0.068 / 0.143: it is width (4–9) times the merge rule. The 48-merge column is +an upper bound that needs a re-pack the shipped words do not realise; #646 realises about the no-merge hosting. The profile roots +reproduce kappa of #649, #645, #646, #635 and #626 to 16 digits. (An earlier random-draw table gave 0.0725 / 0.141 for w9; it is withdrawn, and the check now asserts the table above.) +**Scope.** Climb-neutral removal at the #626 shapes on the #649 base profile. **Status.** CHECKED. **Depends on.** #649, #645, +#646, #635, #626. **Check.** `python3 -I -B checks/p3_rate.py` (2 s). Notes: `evidence/P3/B66-NOTES.md`. + +### P4. Stage count s = 9 → 7 gains nothing + +**Statement.** With the geometry m = 1 + 8(2P + 1), W = 2PTv, D = T[2Pv − (2P + 1)cst] and the P = 4 local profile unchanged: +at s = 7 (56 calls) the idle cover is 200,704 against 218,248 of hosted helper residual, an overflow of 17,544 (8.7% of the cover); +fitting needs k = 34.6 w9 helpers cut per call (R 492 → about 457). With the cut, b₇ is only +0.21% / +0.20% / +0.13% above b₉ +at the same R for k = 35 / 40 / 60, while the same cut at s = 9 is worth +5.04% / +5.80% / +8.96%; at k = 234, 300, 480 the order is +s = 9 > 7 > 5 (b·10³: 2.412 / 2.395 / 2.303; 2.783 / 2.749 / 2.611; 4.793 / 4.611 / 4.108). +**Scope.** Model on the #626 per-call profile (P = 4 reproduced exactly); the P = 3 local program was not built, so a lighter +unit-climb profile there is not excluded. **Status.** CHECKED (model). **Depends on.** #626. +**Check.** `python3 -I -B checks/p4_s7.py` (<1 s). Notes: `evidence/P4/B54-NOTES.md`. + +### P5. The climb mass is a forced cover + +**Statement.** The invoice asserts mass = mW − deficit with the deficit 2560 an asserted constant (= 64v − 4608); mass padding +is therefore illegal and moving mass only reshapes it (moving 1% of the unit-climb mass into width-9 climbs would be +0.26% b if +it were legal). Frame simulated annealing over legal frame assignments (fixed op order, 6M moves per run) gains 0.0% b; (#698 proves the same fixed-order frame optimality exactly for the selected CK supplier's B-phase frames, over all reassignments preserving the scalar circuit, gate order and end-of-B frames; the annealing here is the weaker, sampled statement and is kept only for the climb-mass reading.) about 96% of +the unit mid-chain climbs are blocked by one rule family (common frame at ADD, monotone chains, target end frame perp(port)); +the SSS hourglass word has climb mass 1976 against 6186 shipped, yet "fewer helpers" is not a gain. +**Scope.** Shipped ck/jp8, fixed op order, frame choice only. **Status.** CHECKED (mass identity, local mass per call, the ++0.26% arithmetic); the SA outcome, the blocking histogram and the hourglass comparison are RECORDED (`evidence/P5/B11-NOTES.md`, +`evidence/P5/B3R-NOTES.md`). **Depends on.** #626, #656. **Check.** `python3 -I -B checks/p5_cover.py` (<1 s). + +## 3. Censuses of the frontier word (#656) + +*Sections 3-4: commands run from `s3-4-census-gauges/`.* + +All commands run from this directory; `verify.sh` runs everything below in about 3 s. The words used are +rebuilt artifacts that no PR commits as files; each is vendored with the hash its PR pins (`SOURCES.json`, step 0). + +### C1. Provenance census of #656 (status: CHECKED; allocation tags: CHECKED given `g44-TAGS.json`, whose regeneration is RECORDED) +**Statement.** All 492 helpers of the shipped gauge44 word are born at 3 allocation classes (4 `alloc()` sites): S1 block scratch 224 +(221 + 3 centres), S3 packet copy 156, S4 slot copy 112. Local profile {1:2542, 2:414, 3:434, 4:154, 5:56, 8:8}; the PLAN profile is exactly +72 x local profile + extras {2:4, 3:4, 5:1, 7:1, 16:2, 32:1, 48:2398}; mass 520704 = 73*7168 - 2560; root b = 0.0016568491378023079809..., +kappa = b/(1+b) = 1.654108529511355e-3 (the published value). Narrow mass per call (sum r ln(73/r) over climbs): S1 6902, S3 4430, S4 2754; +helpers 14085 = 68% of register narrow mass (X/Y registers 6637). Shares depend on the metric: 32.3 / 20.7 / 12.9 % of the global narrow +mass (which also holds 31.0% X/Y climbs and 3.1% idle windows), 47.9 / 31.4 / 19.5 % of the helper narrow mass (S1 without centres). +**Scope.** #656 head 0805e78f, shipped layered gauge44 word; the narrow-mass measure is a proxy for price, not a design claim. +**Depends on.** #656, #635. **Check.** `python3 -B checks/c1_census_656.py`. Existing run records: `evidence/C1/` (rebuild step exit codes, ledger tables). +The kappa identity and the local profile use only PR files and the hash-pinned word; the site split uses the tag file from the 9-minute tagged rebuild (not rerun here). + +### C2. The shipped word is a dirty-borrow program, not a clean SLP (status: CHECKED) +**Statement.** On the #626 ck provider word (v = 112, 492 helpers): the 2056 distinct row values that are ever read each have readers forming a +single chain (frame inclusion, time order), so the minimum chain cover is 2056 (2483 value-holder pairs; 259 values held by two registers at different times, never redundantly +live: peak simultaneous redundant live helpers 0, sampled every 20 ops). 268 of the 422 helpers read in B have an all-zero row on the 112 source columns +(pure dirt scratch); the zero-ancilla map is t_p = s_p, while the real target rows have 36-97 terms over the 716 coordinates, so clean-SLP/count models +(BP synthesis, Dilworth, fill) do not describe it. On the #656 gauge44 word the same 268 helpers are, as a set, exactly the S3 + S4 allocation sites of C1 +(previously only the counts 156 + 112 = 268 were known to agree). +**Scope.** fixed op order and values (exact rationals); frames by subspace inclusion; the jp8 provider and the dirt-register model of the B-phase legality rule are RECORDED only (not vendored). +**Depends on.** #626, #656. **Check.** `python3 -B checks/c2_dirty_borrow.py`. + +### C3. The 112 ports form a cap in F2^9 (status: CHECKED for the cap; the dimension corollary ARGUED) +**Statement.** No three ports XOR to 0 and every hyperplane misses at least 48 of them (equality attained). Corollary: k readers' ports span rank r with k <= 2^(r-1) +(a cap of F2^r has at most 2^(r-1) points), so a frame inside their common perp has dim <= 9 - r <= 8 - ceil(log2 k); eight-port blocks sit at dim <= 5 +(sampled: 8-subsets of ports always have rank >= 4). +**Scope.** ck ports of #626. **Depends on.** #626. **Check.** `python3 -B checks/c3_cap_f2_9.py`. + +## 4. Cold ends and gauges + +### G1. Gauge-free cold-end bound (status: CHECKED on #645; the 504 / K480 values RECORDED) +**Statement.** The gauge permutes which registers end low, never how many: N_cold <= sum_b(|Q_b| - rank C[Q_b]) with rank C >= 4 (the 4 pinned totals), +a rank-nullity bound. #645 attains 44: six blocks with |I| = 6 and eight with |I| = 8 (sum |I| = 100), rank Clean = rank M[I, protected] = 4 in every block, +attained pairing rank 2 (short blocks) / 4 (the others). The 504 factory gives 56 (sum |I| = 112) and K480 gives 32 (sum |I| = 88): RECORDED (x646 rebuild, not rerun). +**Scope.** #645 FULL-WORD, exact rationals, frames of dim <= 7, home-first legality unchecked. **Depends on.** #645, #646, #604, #531 (Hamming inputs). +**Check.** `python3 -B checks/g1_gauge_bound.py` (0.4 s). + +### G2. Gauge44 is gauge-optimal for its frame schedule (status: CHECKED for the 44 = bound part; the ceilings RECORDED) +**Statement.** Rank is 4 in all 14 blocks and the attained 44 equals the bound, so more ends need a larger |I| (a different frame schedule). RECORDED from +cards B58/B60/B61/B56: the real read-order ceiling is 48 (+0.13-0.16% b), the 88 of the gauge count is unreachable, six short blocks cannot reach 56 (K-reads lift +locations), the home-first legal ceiling is 46. **Check.** the G1 script (G2 line); `evidence/G2/rep1.log` is the existing log of the #645 rebuild (all steps PASS). + +### G3. Necessary condition for a cold hyperplane end (status: ARGUED; Lean on #593's package RECORDED, none added) +**Theorem.** In the monotone-frame model (no descents), fixed forward word with state map M, cleanup any gate sequence with G M = I: a helper h can end at a +hyperplane U only if supp(row_h M^-1) and supp(col_h M) both lie in Q_U = {registers whose end-of-B frame is inside U}. +**Proof sketch.** Every gate touching h has frame inside U; a gate whose frame is not inside U shares no register with a later h-gate, so it commutes after it. Hence +G = R_h P_h with P_h acting only on Q_U and R_h fixing h; row_h(G) = row_h(P_h) and M e_h = P_h^-1 e_h. This covers every reordering, toggling and relay strategy +(only the factorisation of M^-1 is free). Conversely a biorthogonal family supported in Q_{U_i} is realised by block elimination followed by a FULL-frame cleanup. +The column (dirt) condition corrects all earlier row-only counts. Multi-gate cold wrappers are covered by `HyperplaneEnd/Multi.lean` on #593's package (existing, not rerun). +**Scope.** monotone frames and a fixed forward word; the "14 at d <= 5" cap of the fixed-content premix analysis is superseded by G1 and must not be quoted. +**Depends on.** #593, #591, #604, #617. **Check.** none (argument); no solver evidence exists for this row. + +Evidence note: rows C1-C3 and G1-G3 used no SAT, CP-SAT or DRAT; the only shipped logs are the rebuild records under `evidence/`, pinned by sha256 in `SOURCES.json`. + +## 5. Decoder floors + +*Sections 5-6: commands run from `s5-6-decoders-spec/`.* + +Model for D1-D4 (checks/e8model.py): P112 = the 120 E8 root lines minus the 8 frame lines e_{2a} +- e_{2a+1}; each line has a label in F2^9; a decoder is a set of terms (d_k, t_k) with sum_k d_k t_k^T = M4 = 2G on the kept lines (G the integer E8 inner products); the cost of a term with row support R and column support A is the F2 rank of the label pairing U(R) x U(A) (the Theorem C pairing rank of #595 C.3), and cst is the sum over terms. The coordinate decoder (8 stars) has cst 64. + +### D1. Complex decoder floor on P112 +- **Statement.** (a) Reduction: a term with R x A inside the label-orthogonal pairs (N = 0) costs 0, and all 5824 such entries of M4 are nonzero, so they are fixed for free; exactness only constrains the E-graph (N = 1, 60 per row, diagonal included): x_i . y_j = 0 on even-inner-product pairs, x_i . y_i = 4. (b) With exactly 8 costly terms (rank_Q K = 8) every term is supported on the complement of a hyperplane flat; the 440,880 distinct such supports have only 9 distinct label spans (eight of dimension 8, one of dimension 9), every pair has pairing rank >= 8, so cst >= 64, attained by the coordinate decoder. (c) THEOREM (trivial): if every costly term has beta >= 8 and n >= 9 then cst >= 72. (d) The n = 8 system is infinitesimally rigid at the coordinate point up to gauge (tangent nullity 175 = 64 + 112 - 1). (e) The frame-substitution bound cannot prune mixed-beta decoders: the E-graph has exactly 1260 cliques of size 8 (none of size 9); the best (fraction of frames hit)/beta over the searched label-span pairs is 1/8 at beta 8 but 0.1825 at beta 4, 1/6 at beta 6 (a beta-6 pair hits all 1260 frames) and 1/7 at beta 7, so the covering bound is only 8/0.1825 = 43.8 < 64. +- **Prior work.** #620 (GamingPuzzled) already states a complex P112 frame decoder of cost 64 (`cxp.py`) and that deeper punctures were worse in a search (not exhaustive). New here: the 8-term hyperplane-flat census, the rigidity (d), and the beta >= 8 bound (c). +- **Scope.** P112, linear pairing-rank model, real coefficients. (b)-(c) cover exactly the decoders all of whose costly terms are hyperplane-flat supports. Open: decoders with n >= 9 mixing beta <= 7 terms (a cost < 64 would have to live there); the rigidity in (d) is the tangent space at one point (global rigidity was only sampled: 10 of 12 random-start solves converge, all to gauge-equivalent solutions; RECORDED, not shipped); the maximum in (e) is over hyperplane and random codim <= 3 pairs (sampled, not exhaustive over subspace pairs, and the bound only falls if a larger ratio exists). +- **Status.** CHECKED for (a), (b) support/span counts and minimum rank, (d), (e); (b)'s step "supports of an 8-term decoder are hyperplane flats = W(E8) orbits of the fundamental weights" is ARGUED (rigidity (d) plus the orbit census); (c) is ARGUED (one line). CHECKED (log): the shipped flip-walk logs on P112 (three walkers, ~1.5e8 iterations) found no state below cost 64 and no state with n > 8 at cost <= 64 (evidence/D2/d1-d3.out). No SAT/CP-SAT proof exists for the n >= 9 hole: both attempted runs (B14 CP-SAT symmetric ternary lift; B72 CaDiCaL support relaxation, 23,904 variables, 1,540,851 clauses) were killed without a result (exit 143; evidence/D1/); no UNSAT claim and no DRAT file are made. +- **Depends on.** #595 (C.3, Theorem C), #446. +- **Check.** `cd checks && python3 -B d1_decoder_floor.py` (15 s), `python3 -B d1_frames.py` (20 s), `python3 -B log_checks.py` (<1 s). + +### D2. An n = 8 exact P112 decoder extends uniquely, at +1 per absorbed line +- **Statement.** Any exact n = 8 decoder of P112 is D = XA, T = X A^{-T} with X the coordinate decoder and A in GL8 (rank-8 factorisation rigidity, D1(d)); hence its extension to a frame line j is unique (new entries d_k[j] = 2A[j,k], t_k[j] = 2(A^{-T})[j,k]), so absorbing a line is a pure cost question. Over 33,981 sampled cost-64 plateau states of three walks: absorbing one frame line costs exactly +1 (271,848 cases) and absorbing a pair costs exactly +2 (951,468 cases), always integer-valued and exact. So P113 = 65 and P114 = 66 at n = 8; the walk on P113 (two walkers, ~2e8 iterations each) never went below 65. +- **Scope.** n = 8 states; census sampled on the walk's plateau (not a proof of gauge invariance of the +1); P115/P116 not run. +- **Status.** ARGUED (uniqueness) + CHECKED (log) for the census and the P113 walks (evidence/D2/cen1-3.out, w1-2.out). The state dumps and the census script are not shipped. +- **Depends on.** D1. +- **Check.** `python3 -B checks/log_checks.py`. + +### D3. Non-star complex decoders exist on P111 and P104 +- **Statement.** (a) For each of six single-line punctures of P112 (lines 0, 1, 30 of D8 type; 48, 70, 111 of half-spin type) there is an exact 8-term decoder of cost 63: seven terms of cost 8 and one of cost 7, coefficients up to 3; for punctures 0 and 111 also with coefficients in {-2..2}. With coefficients in {-1,0,1} the same walk stays at 64 (60 s, may be walker-limited). (b) For P104 = P112 minus the 8-clique drawn by `numpy.random.default_rng(1)` (lines 9, 15, 24, 46, 52, 66, 94, 104; pairwise label-nonorthogonal) there are exact 8-term decoders of cost 56 (eight terms of cost 7), found by three independent walkers. (c) Flip-walk logs: on P111 the walks also visit states with n up to 11 at cost <= 64, unlike P112 where none exists (D1). +- **Scope.** The decoder model above; no word is built from these decoders. Their buildability price is RECORDED, not shipped: the parity cost of unpaired centre reads (>= 78), 96 pair-split conflicts and net -0.1..-10% b, and the emitter hard-wires the coordinate decoder. +- **Status.** CHECKED (exactness, n, per-term costs of 8 + 3 hit files); CHECKED (log) for the walks (evidence/D3/); price RECORDED. Bit-side P111 63 is #620's result and is not repeated. Relation to prior work: #620's sampled search found deeper complex punctures worse; the exact cst 56 on P104 (56/104 < 64/112) here contradicts that sampled statement on the complex side. #631 proves that no puncture of up to 35 lines improves the star ratio 63/111; the P104 decoder is non-star, so the two do not conflict. +- **Depends on.** D1, #595 (C.3), #531. +- **Check.** `cd checks && python3 -B d3_punctures.py` (<1 s). + +### D4. Structured classical decoders cost more than the coordinate decoder +- **Statement.** In the copy-cost model on P112: coordinate 64; D2-butterfly pairs (2a,2a+1), halves (j,j+4), D4 Hadamard, permuted pairs and the full Walsh-Hadamard transform all 72; the D8 / half-spin coset 4-split is n = 32 terms of beta 6 each, cst 192. On all 112 single-puncture P111s the values are constantly 64, 72, 72 and 192. +- **Scope.** These linear front ends only (Conway-Sloane / Forney / trellis decoders are non-quadratic; the model sees only which functionals feed the quadratic form). No bit-unit run. +- **Status.** CHECKED. +- **Depends on.** D1. +- **Check.** `cd checks && python3 -B d4_structured.py` (3 s). + +## 6. What the spec and verifier actually require + +### S1. In-place elimination is dead under the shipped frame rules +- **Statement.** In the ck word of #622/#626 the end frame of target t is perp(port_t) and no port lies in its own end frame (0/112). Hence a cross-port in-place operation t_a += l t_b (common frame span{port_a, port_b, port_a ^ port_b} inside both end frames) is legal for 0 of the 12,432 ordered pairs; the legal target-from-source reads are exactly 5824 (port_b in perp(port_a)), none diagonal. The content map M (112 x 112, rank 112, 9072 nonzeros) recomputed by exact replay of the A, B and cut phases has 5264 of its 8960 off-diagonal entries inside the legal read mask; every row needs exactly 33 illegal reads (3696 = 41.2% of the off-diagonal support). So PMH/Gauss/lifting/Steiner/Tellegen-type eliminations, which need in-place or direct reads of the whole support of M, reduce to this wall. +- **Scope.** The ck canonical word, frames as F2^9 subspaces, monotone nested per register, one common frame per ADD. **Erratum to the candidate note:** an earlier figure, 4164 of 8960 legal (54% illegal, 35-52 illegal reads per row), came from a port-indexing mismatch: the content map of the #656 FULL-WORD was read through the ck word's port mask. With its own ports that FULL-WORD also gives 5264 legal and 33 illegal reads per row, the same as ck. The figure is not a property of any word and is withdrawn. The qualitative statement (0 in-place edges, every row needs illegal reads, M of full rank on both sides) is unchanged. +- **Status.** CHECKED. +- **Depends on.** #626, #595 (Lemma N). +- **Check.** `cd checks && python3 -B s1_inplace.py` (<1 s). Input inputs/pr626/ck-CANONICAL-WORD.json.gz (blob 58cd1be8 of #656 head 0805e78f). + +### S2. The spec dependencies of the sink wall +- **Statement.** (i) The shear contract M_out(rho(w)) - M_in(w) = I_m must hold on every role including scratch roles (04-swap.tex:117-121, 183-187), with rho a permutation (105-109); so a target sink is determined by its partner's source and sinks cannot be shared among targets. (ii) For the projection motif the source is -P_{U_a} and the sink P_{U_a^perp} (03-motifs.tex:469-473, 519-525), so a FULL sink forces M_in(X_a) = 0 for idempotent labels; for general rational labels the saving per pair is still <= m (floor rank(I+T-S)+rank(I+S-T) >= m), a pair that saves pays its whole saving on a direct self-read, and excess is integer per wire, but the sink charge >= 1 is NOT proved for non-projection labels (toy over F_3, m <= 3: only a two-class design reads cheaper, <= ~25% of pairs, priced 0.0% for the two-class design). (iii) Nesting is essential only for the premise of Theorem A; other uses (edge ranks, deficit identity, Lean exactness) are replaceable by a non-nested step priced d(f,g) = dim f + dim g - 2 dim(f cap g); the cheapest non-nested step is a rank-1 descent plus re-climb = 2 mass per call (-5.6% b at the 2.81% per unit invoice). (iv) Calls equal the sum of edge ranks, each on one role stream (04-swap.tex:197-199), so corrections on different roles do not share a call. +- **Scope.** Motifs with projection or subspace labels; non-projection rational labels are neither excluded nor realised. Open problem: a lower bound for arbitrary contract-satisfying circuits. +- **Status.** ARGUED; the quoted lines are CHECKED by checks/anchors.py (spec files of main at 66849e1, vendored under inputs/main/ and pinned by blob id). The charge arithmetic (2.81% per unit) is row P1. +- **Depends on.** #595 (B, C.1, C.7). +- **Check.** `python3 -B checks/anchors.py`. + +### S3. Rule R2 is specification, and a relaxed R2 is not a drop-in +- **Statement.** R2 (one identical exact representative on all registers incident to a scalar gate; notes/general-clifford-frames.tex:61-65) is what makes the word compute M tensor I; the verifier mirrors it at label level (hpe_audit_local.py:75, `assert cur[r[1]]==f`) and the Lean tree does not encode it. Relaxing it to representatives differing by a right logical permutation from a fixed finite set is unsound as a drop-in: in the h = 3 exact-Clifford toy the gate's logical effect is a permutation with 4 of 8 addresses moved instead of the identity; a sideways label gives a non-monomial map moving 8 of 8; the group-ring span of S3 on 3 qubits has dimension 5 of 64, so cancellations are not available. +- **Scope.** The toy is h = 3, a single physical add; the general soundness failure (non-uniform twists) is ARGUED in the cited paper rule, not exhibited for a full word. +- **Status.** CHECKED (toy); citations CHECKED by anchors.py. +- **Depends on.** #595 (B, C.6). +- **Check.** `cd checks && python3 -B s3_r2_toy.py` (<1 s). + +### S4. Centre descents exist only for the 8 barrier centres +- **Statement.** The shipped verifier (inputs/pr622/coupled_frames_base.py) accepts a frame descent only for the registers declared `centers`: they are barrier nodes at the A/B cut (lines 95-99), each descends through a strictly nested chain of the frames of its cut readers (:144-148, error `center descent not nested`), billed one counter entry per rank step; every other register chain must be monotone (:163, `nonmonotone`) and a change at a barrier node is refused (:164-165, `unbilled cut transition`); end-of-B finals are FULL (non-port) or the fixed hyperplane perp(port) (ports) (:100-108). Consequences: hubs/helpers cannot use descents (they are dirty and read in phase B); the premise "a descent is paid once per word, 72x cheaper" is false, since the local program runs in every call (centre -1 = +22.6% b in the invoice calculus, section 2, P1); promoting hubs to centres fails on the role (clean private scratch, no B events). The count 8 is a convention; the role is the obstacle. +- **Scope.** The shipped verifier and the #622/#623 words; a Lean statement for a hoisted descent does not exist. +- **Status.** ARGUED; file:line citations CHECKED by anchors.py. +- **Depends on.** #622, #623, #595 (C.7). +- **Check.** `python3 -B checks/anchors.py`. + +## 7. Centre barrier + +*Sections 7-9: commands run from `s7-9-centre-fragmentation/`.* + +Object: the 112 D8-root lines of the complex unit (blocks = 8 consecutive lines on one octad), `R` = `root_lines` and `M` = exact replay of the A, B and cut phases of the #656 word (`inputs/pr656-FULL-WORD.json.gz`); `M` is equal up to port relabelling to the content map of the #623 `ck` provider (eigenvalues and row multisets agree; only 52 port labels are shared, so it is not elementwise equal). + +### Y1. Cut ranks, centre supports, totals (CHECKED, with one caveat) +- rank G = rank RᵀR = 8; matched-order cut ranks of M at sizes 14/28/56/84 are 6/7/7/8 (prefixes, not a smaller state). +- Random 56|56 bipartitions (2000, seeded): off-diagonal rank at most 8 (a sample). Of the 1716 splits of the 14 blocks into 7|7, **1708 have off-diagonal rank 8 and 8 have rank 7**; the 8 exceptions are the coordinate splits (lines with R[:,j]=0 versus not). So "rank 8 at every cut" is false as stated: rank 7 occurs at those 8 splits, and the argument that no centre is saved rests on Y2's price argument, not on rank. +- The centre code R mod 2 has nonzero F2 weights exactly {56 (128 vectors), 64 (112 vectors)} and a 4-dimensional kernel (15 of the 255 nonzero coefficient vectors map to 0, so there are 16 distinct codewords: 8 of weight 56 and 7 of weight 64 plus 0; the counts 128 and 112 count coefficient vectors). Over Q the minimum support of a centre combination is 53 among 20000 seeded hyperplane normals (an upper bound on the true minimum); ARGUED lower bound: the 120 lines (112 rows plus the 8 lines 2e_i, a reflection-closed set; closure is checked here only partly, with the first 60 of the 240 roots as reflectors) have at most 63 lines in any hyperplane (the largest proper root subsystem of E8 is E7, 126 roots), so every nonzero centre combination has support at least 49 > 4. Hence no weight-4 cross-block total lies in the span of the centres; each such total adds exactly +1 rank (300 seeded totals). +- Scope: M on these 112 lines with the coordinate decoder. Totals defined target-side or in another basis are not covered (the span of the centres and a block's 8 target rows does contain the block's local forms: RECORDED, `evidence/Y1/B10-NOTES.md`). +- Depends on: #656 (word), #626, #595. Check: `y1_centre_cut.py`. Records: `evidence/Y1/`. + +### Y2. Full centre delivery and a 7+1 time-split barrier (partly CHECKED, mostly RECORDED/ARGUED) +- CHECKED: for the 8 coordinate 56|56 splits, rank (G_AB, G_AA, G_BB) = (7, 7, 8). The recorded claim "on all 56|56 splits" was only run on these 8 splits and is stated as such. +- ARGUED (`evidence/Y2/B106-NOTES.md`): a time-shared 7+1 schedule is algebraically fine but keeps 8 decoder terms (cst 64 = 8 x beta 8), so the invoice saving is 0 unless the extra term has beta < 8; a second descent epoch is a new skeleton role (descents are legal only at the barrier node before B, row S4), against the price of at least 5.6% b per rank-1 descent (#595 C.7). +- RECORDED, NOT reproduced: frame-illegality of full centre delivery (448 of 456 (target, centre) reads violate; a centre read is legal only for t = f_i, the shipped cut). The script (`B101 gate.py`) needs PROTOTYPE.json of the #656 rebuild, which was not found; the record is `evidence/Y2/B101-NOTES.md`. +- Depends on: Y1, S4. Check: `y1_centre_cut.py` (the y2 line). + +## 8. Fragmentation and rigidity of the shipped word + +### F1. Target fragmentation is forced at the shipped op order (CHECKED for the stated parts) +Overlap: #698 (thakrarsagar) certifies exactly that the selected CK supplier's B-phase frames minimise the paid moment over all frame reassignments preserving the scalar circuit, gate order and end-of-B frames (474 of 1930 B gates have freedom). The fixed-order frame-ceiling statements below are cited to #698; what is distinct here is the target end-frame cascade, the S3/S4 reader-chain and carrier counts, and the format-level bound. +Provenance correction: the frame-level checks use the `ck` (8 calls) and `jp8` (64 calls) K-triangle provider words of #622/#623 (copies inside #656 at `research/community-k492-audit/pr622/replay/*-local/CANONICAL-WORD.json.gz`), not #656's own layered word (their local profiles differ). The S3/S4 packet checks use a record of the rebuilt #656 word. +- CHECKED (`f1_frag.py`, both providers): 1096 target-touching ops, 950 already at the legal reverse-closure ceiling U, 146 with one dimension of slack. Setting every op to U is legal and costs +520 (ck) / +700 (jp8) psi per call. Setting only the target ops to U is **not** a legal assignment (50 non-monotone climbs); its model value is -5.6 psi per call (T +2.7, helpers -5.5, sources -2.8), far below the 65 psi GO line, and is indicative only. The earlier phrase "legal ceiling, net -5.6" should be read this way. +- CHECKED (ck): target fragmentation 1342 psi/call; the port-cap ceiling (direct ports of an operand's unserved readers, shipped reader order) would allow 614 psi/call, a loose bound that ignores all other constraints on the operand ("70 percent of target ops are held below the port cap by helper and source partners" is a recorded figure, not checked here). +- CHECKED (`f1_pack.py`): the format-level bound. Each target that reads some operand as a non-last reader has a stop at dimension d < 8 and pays at least 3.014 psi. The largest set of targets that can be last readers of all their operands is an independent set of 112 vertices; HiGHS proves the maximum is **36**, so the bound is 3.014 x 76 = 229.08 psi/call (the earlier time-capped search found the same 36 without proof). Loose: it uses only SPEC plus cap geometry. +- CHECKED (`f1_s3s4.py`, from the derived record `inputs/b82-rec.json`; the derivation is RECORDED, not re-run): the 156 S3 packets (8 readers, rank 5) and 112 S4 slots (4 readers, rank 3) are all dependent reader sets; none admits a maximal chain of modular flats (0/156, 0/112; S4 is U(3,4)). At copy time the copy frame is orthogonal to all reader ports (268/268), so the obstruction is the later reads (0/124 legal at first read: RECORDED, `evidence/F1/B82-NOTES.md`). +- CHECKED (`f1_carriers.py`): the 112 ports form a cap in F2^9; each source has 52 readers; cap-aware greedy coverings by port quads need 14.29 carriers per source (14 to 15; lower bound 13), 1601 in all. The comparison with the saving (carriers cost about 12.5 psi hosting each, at most 905 psi/call to gain) uses booked rates: RECORDED. +- RECORDED: format-level loose bound gap at least 1004 psi/call (at most about +5.5% b); order-free loose bound 2478 psi/call (uncalibrated); no skeleton-free bound. +- Scope: fixed op order and DAG, A+B+tail ops; other orders open. Depends on: #622, #623, #656, #659. #661 treats a different object (bit R420), cited. Records: `evidence/F1/`. + +### F2. Tight-frames wall (ARGUED; instances RECORDED) +Fixed-order frame optimality of a single supplier is #698's exact certificate (cited); the wall below is the word-level statement across ops, and the instances are about deleting or moving ops, which #698's domain excludes. +The minimal frame G(r,t) is the join of start frames over time-respecting undirected journeys and the cap U is the meet of locked frames forward; a frame assignment is legal iff G is inside U. Adding ops only grows G and shrinks U, so slack arises only by deleting ops, time shifts, descents (8 barrier centres) or re-threading at equal value. Instances (RECORDED, `evidence/F2/`): one extra dimension on any helper frame pushes 2 to 8 target end frames from 8 to 9 (#656, #659, #646 words); early uncompute or reuse of A-only S1 scratch is blocked by the single common frame of the uncompute ADD (0/67 legal, #656; 0/67 on #659); dyadic S1 programs, rematerialisation, equal-value re-threading and scaled swap-back windows (up to 58,961) lower no frame. Lesson recorded in B107: a frames-only deletion price (-176 mass/call) was not value-exact, so every deletion card must replay values first. Scope: shipped #656/#659 at fixed order and DAG. Depends on: #656, #659, #664. #665 (rehosting boundary) is a different instance. + +### F3. S1 block scratch is not shareable or shortenable inside the format (RECORDED) +The 16 scratch per block are distinct sparse forms (rank 8 to 9 of an overcomplete 24-form Haar/Walsh frame); gauge-exchangeable copies g2 = 0; the 16 equal twins are value-forced (0 of 16 retireable); block frames meet pairwise in dimension 2 (91/91) but 80 of 132 registers have frame dimension 3 to 4, so no cross-block mix has a common frame; the 154 required forms are distinct and none is a 2-term combination. Scope: #656 S1, exact value replay (cards B90-B97; no scripts are kept for B92/B94/B97). Not re-run. Depends on: #656. Records: `evidence/F3/`. + +### F4. Twin substitution does not remove the frame-insulator helpers (RECORDED negative) +**Statement.** On #656, at every read of 73 helpers (62 S3 copies and 11 S1 scratch) another register holds a multiple of the helper's value. Replacing each read by a read of that twin gives 111 twin reads, all value-exact; 0 of 111 are frame-legal one at a time, and each substitution raises 2–6 final caps. So 0 of 73 helpers can be deleted this way. +**Scope.** #656 at its shipped op order, one substitution at a time; the exact whole-word oracle (values, frames, κ; 0.04 s per evaluation). Joint or reordered substitutions are not covered (F2). +**Status.** RECORDED: the oracle and its run are not shipped in this package. **Depends on.** #656. + +### F5. Meet-frame reads of read-only S3 copies are not legal (RECORDED negative) +**Statement.** 116 of the 156 S3 copies are read-only after the copy; each face's frame lies inside the orthogonal of exactly its 8 readers (meet of dimension 5). For about 27 of the 32 structurally clean faces, every B slot from the face's last write to its copy slot (window about 740–860 ops) was tried, in the given and in reversed reader order: 0 legal reads. +**Scope.** #656 shipped word, the 27 faces tried, the stated orders. **Status.** RECORDED (exact oracle, not shipped). **Depends on.** #656, row F1. + +### F6. The opening miner finds no register-reuse opening on #664 (CHECKED (log) negative) +**Statement.** On the rebuilt #664 word the miner (the #656 miner of F2) lists 2534 disjoint-lifetime helper pairs. All 2534 need frame growth (`grow` 2534) and none is frame-nested, so there are 0 register-reuse openings. This is the same rigidity as on #656, although #664 spends entrance G < U slack on three promotion groups. +**Scope.** Disjoint-lifetime helper pairs of #664 only; the other miner categories (one-dimension-growth renames, idle-gap hosting, equal-content pairs) are not part of the shipped log. +**Status.** CHECKED (log): `evidence/F6/miner664_run1.out` and the job summary `evidence/F6/B105_miner664.log` are sha256-pinned; the miner and the rebuilt #664 word are not shipped, so the run is not repeated. **Depends on.** #664, #656, F2. + +## 9. Ledgers for skeleton changes + +### O1. Cross-block totals ("X4" faces) (faces CHECKED; ledger RECORDED) +- CHECKED (`o1_faces.py`): over all 1001 x 4096 quads of lines in four distinct blocks, exactly 2688 faces have effective reach 10 (own-block readers excluded, sign-consistent) and none exceeds 10; all span 4 blocks. Their 2688 forms span Q^112, and 56 random faces have rank 56 beyond the 8 centres. A greedy pair-sharing supply of 56 random faces needs 103 to 112 distinct pair registers (seeded; recorded 105 to 112); a clustered choice of 56 faces needs 30 but is not available for a real cover. +- RECORDED (`evidence/O1/`, quads with fewer than 4 blocks and raw reach): raw reach at least 10 gives 24192 faces, all spanning 4 blocks; the legal block partition is unique (14 extended-Hamming octads for the 8-frame deleted); a best unconstrained partition leaves 20681 of 24192 faces spanning 3 or more blocks; overlapping cells confine at most 32 percent at the extra-copy budget. +- RECORDED ledger (J21-K model, hypothetical design, no shipped word): charge 12.21 percent b = S-type 4.2 + totals/cut timing 8.01 (56 totals x 0.143; arithmetic checked, rates booked); best-case net below 0; the 0.143 rate is about 1 times the merged w9 rate of row P3 (0.140) and 2 times its no-merge rate (0.070); it is 3 times only O2's 0.043. +- Depends on: #531, #626. + +### O2. #617 to #622 K-triangle ledger (RECORDED) +Priced with the package's moment engine (b617 reproduced): ideal gross +0.52 percent b for 12 helpers (0.043 percent each), climbs of 48 rewired reads -0.2, 6 lost second cold ends -0.19, net +0.0146 percent; atom-family ceiling about +0.4 percent; per incidence a triangle trades 3 helpers for 3 cold ends. Consistent with #646's own measurement. Not re-run (`evidence/O2/B2-NOTES.md`). Depends on: #617, #622, #646. + +## Open problems + +1. **Mixed-β decoders with n ≥ 9** (D1): a cst below 64 on P112 would have to mix terms with β ≤ 7; no proof and no counterexample. +2. **An order-free fragmentation ceiling** (F1, F2): the order-free loose bound (2478 psi/call) is uncalibrated; no skeleton-free bound exists. +3. **Non-projection rational labels** (S2): the sink charge ≥ 1 is not proved for them. +4. **A frame schedule with |I| > 8 per block** (G1, G2): more cold ends need a larger |I|, i.e. a different schedule. +5. **Value-exact re-threading beyond the fixed order and DAG** (F2): a frames-only deletion price is not value-exact; every deletion must be replayed on values first. + +## Appendix: Conditional candidates (unverified: could work IF…) + +None of these is a result. Each item has a measured fact behind it and exactly one blocking condition. If the condition holds, the gain follows from numbers already measured. Every number is from an exact replay of #656 unless noted otherwise. Prices use the settled helper rate of row P3 (+0.070% b per width-9 helper removed, or +0.140% if its width is merged; the earlier 0.0725 / 0.141 is withdrawn). We are not pursuing these. Two earlier candidates (twin substitution, meet-frame reads) were tested and failed; they are rows F4 and F5. + +1. **Drop the never-read S1 scratch (≈ +2% b, est.).** + - Measured: in 9 of 14 blocks, 2–4 S1 scratch registers are never read after phase A. Dyadic A-programs with 12–14 scratch reproduce the end-of-A rows exactly. + - This works IF there is such a program whose 8 lines end phase A at frame dim ≤ 2–3, their shipped frames. The current dyadic programs leave the lines at frame 4, which forces all 112 target end frames from 8 to 9. + - Check: frames range over only 67 subspaces of a 4-dim label space per block, so a frame-bounded search per block (one value solve per frame schedule) settles it. + +2. **Single-packet S4 via coefficient reads (≤ 112 helpers, net ≤ +1.96% b).** + - Measured: all 28 S4 four-cycles admit one-packet coefficient reads if the targets are still empty. Coefficient ADDs into targets are SPEC-legal. (Related: #683 prices a mixed K/M face bypass and finds four carriers are forced; a different object.) + - This works IF the ~252 target adds can be deferred past M-ready while polluting only sources whose caps already contain the key frames. Deferring them all naively gives 619 illegal ops. + - Check: choose deferrals per source, interleaved, and run the oracle. + +3. **Order-free frame slack on #656 (reordering of commuting ops; up to a few % b, nominal bound ≈ 8% is an over-report).** + - Measured: the order-free dimension relaxation allows 2478 psi/call against shipped fragmentation 20,337. At the fixed shipped order the exact legal gain is 0 (supported by #698 for the CK B phase and by row F1: 950 of 1096 target ops at ceiling and an all-at-U assignment costing +520, not gaining). The relaxation could not be calibrated (its fixed-order value is 568 psi where the exact one is 0). Random topological re-creations of three blocks' S3/S4 threading (19 runs) all landed on exactly the shipped cost, so the open part is the S1 / phase-A order. + - This works IF the exact frame-level model over the word's 1041 frames (row F2: G(r,t) = join of start frames over time-respecting journeys, legal iff G ⊆ U) gives nonzero slack for some topological order. + - Check: the exact per-op minimal-frame bound over the dependency DAG with earliest-possible-time order, compared with the fixed-order ceiling 0; report the first order-free increment in psi per block. + +4. **Radix-4 / wide first climb for S1 scratch (≤ +3.4% b gross; net likely 0 to +1.5%).** + - Measured: a register owed to k targets sits at dim ≤ 8 − ⌈log₂ k⌉ (row C3). A w1 → w2 climb is worth about 745 psi and w1 → w3 about 1180 psi gross, against a cap of about 980 psi (≈ +4.72% b). Unit pieces are 34.8% of D on #649. Break-even is about 47 extra width-9-equivalent births. + - This works IF a radix-4 step for S1 scratch costs fewer births than it saves. On the face ladder, fused rungs lost sharing (+168 births, −12 to −24% b); S1 scratch is not shared across keys, so that loss may not apply. + - Check: take one S1 block, replace one binary pair of unit climbs by a single w1 → w3 jump with the extra registers the geometry needs, price with the exact root on #649's profile, count births. + +5. **Partner-merge of pure-dirt helpers into idle hosts, under op reordering (≈ +0.2 to +1.1% b, loose).** + - Measured: of the 268 pure-dirt helpers (row C2), 216 pass semantic exactness under a host swap and 96 have a source idle for their whole life. A static parity census passes 495 of 1668 pairs (near chance: 417 expected), covering 71 of the 96 helpers. At the fixed order all 96 violate G ⊆ U. + - This works IF some op order (the same reordering as item 3) makes the host swap frame-legal. + - Check: run item 3's order-free G / U computation restricted to the 71 candidate pairs and count the legal ones exactly. + +## Notes + +- **Base:** this branch is cut from main (`66849e14`) and touches only `research/format-limits-2/`. +- **Inputs:** vendored inputs are pinned by PR blob id (and sha256) in `SOURCES.json`: byte copies from PRs #531, #555, #595, #622, #626, #635, #645, #646, #649 and #656, three spec files of main, and rebuilt words pinned by the hashes their PRs publish. Existing run logs and card records are shipped unchanged under `evidence/` (sha256-pinned), except that absolute local paths, a personal name or CRLF line endings were removed from six of them (listed in `SOURCES.json`, `scrubbed`). Requirements are pinned. No SAT, CP-SAT or DRAT artefact exists for these rows (two CP-SAT / CaDiCaL attempts on the D1 hole were killed without a result; no UNSAT claim is made); the one solver run (HiGHS MILP, F1) is re-run in `verify.sh`. No Lean was added. +- **Errata found in our own earlier claims:** + - E1: #595's "schedule/ρ family" reading (census item 8, open problem 3; the A.7 table itself already says "rule dropped") is withdrawn. + - S1: the earlier figure "4164 of 8960 off-diagonal entries legal, 35–52 illegal reads per row" came from a port-indexing mismatch (the #656 FULL-WORD content map read through the ck word's port mask) and is withdrawn; with its own ports that word also gives 5264 legal and exactly 33 illegal reads per row, as the ck word does. + - Y1: "rank 8 at every cut" is false as stated; rank 7 occurs at the 8 coordinate splits. + - Y2: "on all 56|56 splits" was run only on the 8 coordinate splits. + - F1: the frame-level checks use the ck / jp8 provider words of #622 / #623, not #656's own layered word; "legal ceiling, net −5.6" is a model value of an illegal assignment and is indicative only. + - P3: an earlier random-draw rate table (0.0725 / 0.141 for w9) is replaced by exact means (0.070 / 0.140). + - G3: the "14 at d ≤ 5" cap of an earlier fixed-content premix analysis is superseded by G1 and must not be quoted. + - C1/C2: allocation classes are 3 (4 `alloc()` sites); the 268 pure-dirt helpers are now shown equal, as a set, to the S3 + S4 sites. +- **Not reproduced here (RECORDED only):** word-level knob tables (P2), the Y2 frame-illegality gate (needs a rebuilt prototype file), the 9-minute tagged rebuild of the #656 word (C1), the S1 scratch notes of F3, and the oracle runs of F4 / F5. +- **Overlap check:** #698 (thakrarsagar) certifies fixed-order, fixed-end-frame optimality of the selected CK supplier's B-phase frames; P5 (frame annealing), F1 and F2 cite it and keep only what is distinct (target end-frame cascade, word-level rigidity under +1 dimension, the #664 miner F6, insulators F4). #697 is a RAM-model construction and does not overlap. #683 (partial K/M face bypass needs four carriers) and #687 (a K-triangle single-read relocation neighbourhood) study different objects from every row here (O2 is a pricing ledger of #617 → #622; appendix item 2 is only related to #683); they are credited in `NOTICE.md` and no row was dropped. #620 and #631 are cited in D1 and D3, #661 and #665 where related (F1, F2). Newer PRs checked for overlap, none duplicates a row: #703 (Mister-Meeseeks; asymmetric Hurwitz E8 copy cost exactly 10) is a scoped negative on #620's quaternionic copy geometry, related to D1/D3 (decoder floors) but a different object; #705 (littleBro; determinant obstruction for rank-homogeneous register paths) is related to S2 and F2 (what the format forces on register paths), proved by a different argument; #711 (thakrarsagar; R420 adjacent A swaps force both frames) is on the bit side and an order change in phase A, related to F2's "time shifts" and to #661. + +## Files + +- `s1-2-erratum-invoice/`, `s3-4-census-gauges/`, `s5-6-decoders-spec/`, `s7-9-centre-fragmentation/`: per section group: `checks/` (one script per claim group), `inputs/` (vendored files), `evidence/` (existing logs and notes), `verify.part.sh`. Commands in the sections run from the group directory. +- `scripts/provenance.py`: step 0 (`--write-manifest` regenerates the manifest). +- `SOURCES.json`: pins of every vendored input and evidence file. `MANIFEST.sha256`: every file of the package. `requirements.txt`, `LICENSE`, `NOTICE.md`. + +## Credits + +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code; Apache-2.0. See `NOTICE.md` for the PRs whose words, pipelines and results are used. diff --git a/research/format-limits-2/SOURCES.json b/research/format-limits-2/SOURCES.json new file mode 100644 index 0000000000..e732d03b2f --- /dev/null +++ b/research/format-limits-2/SOURCES.json @@ -0,0 +1,808 @@ +{ + "description": "Pins for research/format-limits-2. files = byte copies of files of open/merged PRs of CrocSwap/integer-mult-bounds (or of main at base_commit): blob = git blob id of the source file at the cited commit (of the decompressed content for a gzip copy of a non-gz source), sha256 = of the file as stored here. derived = rebuilt words that are not files of any PR (pinned by the hashes their PRs publish; content_sha256 = sha256 of the canonical JSON). evidence = existing run logs and outputs shipped unchanged, except that absolute local paths, a personal name or CRLF line endings were removed from the 6 files listed in scrubbed (sha256 is of the scrubbed file). scripts/provenance.py checks every entry.", + "base_commit": "66849e1475c930fd7732b1a0067ffee7e1e95f60", + "scrubbed": [ + "s3-4-census-gauges/evidence/C1/ledger_helpers.csv", + "s3-4-census-gauges/evidence/G2/rep1.log", + "s5-6-decoders-spec/evidence/D3/B14_flip_3.log", + "s7-9-centre-fragmentation/evidence/F3/B90-NOTES.md", + "s7-9-centre-fragmentation/evidence/O1/B74-NOTES.md", + "s7-9-centre-fragmentation/evidence/Y1/B74-NOTES.md" + ], + "files": [ + { + "file": "s1-2-erratum-invoice/inputs/pr555/EXPECTED.json.gz", + "pr": 555, + "commit": "65a6bc19f820c8b1873f65a517bcf70cd6887223", + "source_path": "research/e8-bit-p111/EXPECTED.json", + "blob": "c8ad4439e83f07bcda437598d6a4c31f4e65f2a9", + "used_for": "P2: nine-stage bit profile, live, shipped c", + "sha256": "0465a38c683c9a8cfcc11ebdf5bb48013c50982629d43911be792c1011afad50", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr595/a5_scope_multipliers.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/a5_scope_multipliers.py", + "blob": "e45f8882ec6793868c75088810c47e041eb7e4e2", + "used_for": "E1: scope-multiplier script re-run unchanged", + "sha256": "6479c189696f53cc505febb2c81c4b69a5bf54f211ee4ae64ff841041244b060", + "stored": "verbatim" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr595/cert.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/cert.py", + "blob": "351fbd107c86a233a91eb915f88612c9f9ad6c26", + "used_for": "E1: imported by skel", + "sha256": "cab1c055cf4dbad6a89b4527e2ef3d138131b6742eaf21bd8b4338a9ee2febf4", + "stored": "verbatim" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr595/report.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/report.py", + "blob": "5593062527d6dbba99c7b1992390a3bf4f330a54", + "used_for": "E1: imported by a5", + "sha256": "96fbb236eb58bd471be33ccafbd128cd0590e5dc6f160ad9b9e85bcc2680b437", + "stored": "verbatim" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr595/skel.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/skel.py", + "blob": "e3c6c815b604dd41d3807c78917806ae4a5c08a7", + "used_for": "E1: imported by a5", + "sha256": "9cfbc1316389a46922765cdae85fdde2042f7681986d1c97a19174c4922ea29c", + "stored": "verbatim" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr626/PLAN.json.gz", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair/data/PLAN.json", + "blob": "434a431937757def4e496301e3d33106f0026fa3", + "used_for": "P1,P3,P4: profile {width: count}, m = 73, live 7168, deficit 2560", + "sha256": "57dc869171300e4a7600fc82f8ff5063644c59423731890d2a391f2dc6402972", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr626/README.md.gz", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair/README.md", + "blob": "58722c1a496f0c806e77c9d762eb00b0c53254f0", + "used_for": "P1: conditional kappa literal 0.001635527380375392", + "sha256": "6b8b4ca567ad0bc88e59eaef98373fb86da2368c57cf5fd16abf66be77fb0279", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr635/PLAN.json.gz", + "pr": 635, + "commit": "a6895a69f8ad98ab45777b03e9e6f48888c39f6f", + "source_path": "research/complex-571-cold14-st2/data/PLAN.json", + "blob": "d7794713ddf9c1325d4a2142ad130b2395d27ae7", + "used_for": "P3: profile reproduced", + "sha256": "81b4a28573e75b93ddda542cf4cc6d5fda42ba6698c2ad2e7d3fcf6bda803125", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr645/PLAN.json.gz", + "pr": 645, + "commit": "638a5171dd1aca89ff50d07dcbe288b567769804", + "source_path": "research/gauge44-global/data/PLAN.json", + "blob": "d561080e0f5f1570e095405b9e8a243150823896", + "used_for": "P3: profile reproduced", + "sha256": "67af127042dffb51aff75dc0e905a17cc48dcc1156f7f3e42920543c13c653ea", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr646/PLAN.json.gz", + "pr": 646, + "commit": "cdfe8273bb5054e0a837a3594309c6262e995b1f", + "source_path": "research/signed-root-k480/data/PLAN.json", + "blob": "28355d12849ced4c36c4d4534cabca47d92fa831", + "used_for": "P3: profile reproduced", + "sha256": "2912579e14d72946244afa82cc8fec3bc2460a6fb6e0534bf1bed6ca2b50d60e", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s1-2-erratum-invoice/inputs/pr649/PLAN.json.gz", + "pr": 649, + "commit": "1b931ee055d738753778e1051300140c16ae219d", + "source_path": "research/gauge44-bit589/data/PLAN.json", + "blob": "9d5be193ad6a74a83d494e37ca2c43c43598ab84", + "used_for": "P3: base profile of the rate table", + "sha256": "30fea10ec468f0b280d2e19815ee97e8d3f6faf065467c9a91321cf8372a7430", + "stored": "gzip of the source file (blob id is of the decompressed content)" + }, + { + "file": "s3-4-census-gauges/inputs/pr531/PACKET-PROGRAMS.json.gz", + "pr": 531, + "commit": "e07a8a3f9f79c22113398a0c5dbbc7601f489b3e", + "source_path": "research/direct-delivery504-global/inputs/hamming/PACKET-PROGRAMS.json.gz", + "blob": "e98ce5d879e99427347acd725efc3b0c96fe5c13", + "stored": "verbatim", + "used_for": "G1, G2: Hamming block source lines", + "sha256": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9" + }, + { + "file": "s3-4-census-gauges/inputs/pr531/PROTOTYPE.json.gz", + "pr": 531, + "commit": "e07a8a3f9f79c22113398a0c5dbbc7601f489b3e", + "source_path": "research/direct-delivery504-global/inputs/hamming/PROTOTYPE.json", + "blob": "9efe30ee107b9c67f15f1c726e1a1cb5cef03929", + "stored": "gzip of the source file (blob id is of the decompressed content)", + "used_for": "G1, G2: binary_ports", + "sha256": "ca11de0e8f9291e93e9434c47c8ef6993a364b865b2550f9618d68c19cd60ee0" + }, + { + "file": "s3-4-census-gauges/inputs/pr626/GENERATED-IDENTITY-CONTROLS.json", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair-validation/linux/GENERATED-IDENTITY-CONTROLS.json", + "blob": "901387218f1b2251016cbb5f2d487c923a29a1a3", + "stored": "verbatim", + "used_for": "C2, C3: pins (raw and canonical-content sha256) of the ck provider word", + "sha256": "afe02dd6e947847f7d8cd44d1b730702269a68c3adb30fc858c3816b1ac084e5" + }, + { + "file": "s3-4-census-gauges/inputs/pr645/FULL-WORD.json.gz", + "pr": 645, + "commit": "638a5171dd1aca89ff50d07dcbe288b567769804", + "source_path": "research/gauge44-global/evidence/local/FULL-WORD.json.gz", + "blob": "447d45d08bf4b054d2fa76a0dc00a3b0f168fe91", + "stored": "verbatim", + "used_for": "G1, G2: the #645 Gauge44 forward word", + "sha256": "0ad202612f010df4ab66432a628247b37ad8b497dd6b27595b1685cbd7eb119e" + }, + { + "file": "s3-4-census-gauges/inputs/pr656/PLAN.json.gz", + "pr": 656, + "commit": "0805e78f5fecc700804d4766d7e3e1d7d7e6a2ba", + "source_path": "research/gauge44-layered-b/data/PLAN.json", + "blob": "b7d894d3fe98606587a72eee97f2dbb25a0072d3", + "stored": "gzip of the source file (blob id is of the decompressed content)", + "used_for": "C1: profile, M=73, W=7168, deficit 2560; provider pins of the shipped gauge44 word", + "sha256": "f0297cd10da2ee01facf2192f26b3ea699b17ea60c0caf214a8aac19643679fd" + }, + { + "file": "s5-6-decoders-spec/inputs/main/notes/general-clifford-frames.tex", + "pr": null, + "origin": "main", + "commit": "66849e1475c930fd7732b1a0067ffee7e1e95f60", + "source_path": "notes/general-clifford-frames.tex", + "blob": "0367eeb005298601f28a673861d6f71bf1d0ebbb", + "sha256": "c9bb9655b594583c6b4bab8cb485233f1d1e588f83858cf1e4c3530cee8fed54", + "stored": "verbatim", + "used_for": "S3: rule R2 (line anchors)" + }, + { + "file": "s5-6-decoders-spec/inputs/main/upstream/build/sections/03-motifs.tex", + "pr": null, + "origin": "main", + "commit": "66849e1475c930fd7732b1a0067ffee7e1e95f60", + "source_path": "upstream/build/sections/03-motifs.tex", + "blob": "cdb0ba527aa8df5d57c151183fd3893c1a7e21ab", + "sha256": "ed76761194988a01af77ead0ea6469cb5dcd29690ab985a0b5a4006b0f2b69bb", + "stored": "verbatim", + "used_for": "S2: frame identity, motif sources, interface proof (line anchors)" + }, + { + "file": "s5-6-decoders-spec/inputs/main/upstream/build/sections/04-swap.tex", + "pr": null, + "origin": "main", + "commit": "66849e1475c930fd7732b1a0067ffee7e1e95f60", + "source_path": "upstream/build/sections/04-swap.tex", + "blob": "951e792b1768e6509561380b8bbfb1d1ccb64c08", + "sha256": "412b170ccaab38dba96e95e3cbfae09f4876a9818f8d278776a746b0f8044906", + "stored": "verbatim", + "used_for": "S2: shear contract, endpoint operator on every role, call count (line anchors)" + }, + { + "file": "s5-6-decoders-spec/inputs/pr622/coupled_frames_base.py", + "pr": 622, + "commit": "f69477f4f6d3c7eb1f740b166881bffed4ffa9f6", + "source_path": "research/complex-joint-prefix/code/coupled_frames_base.py", + "used_for": "S4 anchors (identical blob in #622, #623, #626, #656)", + "blob": "90a01f0641c9929515d7fcd9b004a99164bdff50", + "sha256": "b6033cd2959297a624b557f3d04665c8fbb680a4c0987daf0704ef93711700bd", + "stored": "verbatim" + }, + { + "file": "s5-6-decoders-spec/inputs/pr626/ck-CANONICAL-WORD.json.gz", + "pr": 656, + "commit": "0805e78f5fecc700804d4766d7e3e1d7d7e6a2ba", + "source_path": "research/community-k492-audit/pr626/replay/mixed-global/base/providers/ck/CANONICAL-WORD.json.gz", + "used_for": "S1 (ck word of #622/#626; the same blob is vendored in #622/#623/#626 audit trees of the #656 head)", + "blob": "58cd1be8f28b74bea83c435eee1f52b36a274281", + "sha256": "ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45", + "stored": "verbatim" + }, + { + "file": "s5-6-decoders-spec/inputs/pr626/hpe_audit_local.py", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-571-cold14-b3/code/hpe_audit_local.py", + "used_for": "S3 anchor (:75 common-frame assert)", + "blob": "17bccb64fdca54f329a3ce16e369449cb76c2802", + "sha256": "6bd9a1e279c9c9e4f3767d9f82e537b559292906feb2ddab02f380fb6523a810", + "stored": "verbatim" + }, + { + "file": "s7-9-centre-fragmentation/inputs/pr656-FULL-WORD.json.gz", + "pr": 656, + "commit": "0805e78f5fecc700804d4766d7e3e1d7d7e6a2ba", + "source_path": "research/gauge44-layered-b/evidence/local/FULL-WORD.json.gz", + "blob": "447d45d08bf4b054d2fa76a0dc00a3b0f168fe91", + "sha256": "0ad202612f010df4ab66432a628247b37ad8b497dd6b27595b1685cbd7eb119e", + "used_for": "root_lines R and exact replay of A+B+cut (M) : Y1, Y2, O1, F1 carriers", + "stored": "verbatim" + }, + { + "file": "s7-9-centre-fragmentation/inputs/pr656-k492audit-pr622-ck-CANONICAL-WORD.json.gz", + "pr": 656, + "commit": "0805e78f5fecc700804d4766d7e3e1d7d7e6a2ba", + "source_path": "research/community-k492-audit/pr622/replay/ck-local/CANONICAL-WORD.json.gz", + "blob": "58cd1be8f28b74bea83c435eee1f52b36a274281", + "sha256": "ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45", + "used_for": "ck/jp8 K-triangle provider words of #622/#623 (audit copy inside #656): F1 frames, ports", + "stored": "verbatim" + }, + { + "file": "s7-9-centre-fragmentation/inputs/pr656-k492audit-pr622-jp8-CANONICAL-WORD.json.gz", + "pr": 656, + "commit": "0805e78f5fecc700804d4766d7e3e1d7d7e6a2ba", + "source_path": "research/community-k492-audit/pr622/replay/jp8-local/CANONICAL-WORD.json.gz", + "blob": "7fd7cd1fefbb8b0e12397b355d9f6e227813bd58", + "sha256": "7a3fec1022d3b2b1bd986302a327735ec521d17b043f4a5acb96253a56f6193c", + "used_for": "ck/jp8 K-triangle provider words of #622/#623 (audit copy inside #656): F1 frames, ports", + "stored": "verbatim" + } + ], + "derived": [ + { + "file": "s1-2-erratum-invoice/inputs/derived/k492_registers.json", + "kind": "derived", + "sha256": "e67e9158ae8bcf485c499b2e5e744016938605aff9848ca9e6106a685f5df2ee", + "used_for": "P1-P5: per-register climb widths of the ck / jp8 local words of #626, from tools/derive_registers.py applied to the CANONICAL-WORD.json.gz files of the k492b rebuild (r40/base/work/k492b/{ck,jp8}-local; rebuild from research/complex-k492-owner-repair code of #626 is RECORDED, not repeated). Binding: the invoice built from it reproduces the PLAN profile of #626 exactly (P1.gate-profile) and kappa to 18 digits" + }, + { + "file": "s3-4-census-gauges/inputs/derived/ck-CANONICAL-WORD.json.gz", + "kind": "derived (rebuilt, not a file of any PR)", + "sha256": "ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45", + "content_sha256": "9bbc75dede090cfd7a0a0252424ea9d9f6211e2350d2a801d4e4f2f0784167c7", + "pinned_in": "PR 626 @660de893 research/complex-k492-owner-repair-validation/linux/GENERATED-IDENTITY-CONTROLS.json source_providers.ck.raw / .semantic", + "rebuilt_by": "the k492b ck provider chain of PR 626 (research/complex-k492-owner-repair-validation)", + "used_for": "C2, C3: the ck provider word of #626 (8 calls)" + }, + { + "file": "s3-4-census-gauges/inputs/derived/g44-CANONICAL-WORD.json.gz", + "kind": "derived (rebuilt, not a file of any PR)", + "sha256": "72a4952751383e2a5e84b967f1e76fdfda003fe5592df357a599232e586817e3", + "content_sha256": "94fc985d6ab90967bfe995de41581690bcdb6dbade69e594b0130ef3da0c6314", + "pinned_in": "PR 656 @0805e78f data/PLAN.json provider_registry.gauge44.artifact_sha256 (bytes) and artifact_semantic_sha256 (content: sha256 of json.dumps(sort_keys, compact separators))", + "rebuilt_by": "PR 656 construction/reproduce.py --until word, then construction/layers/reproduce_layers.py (about 9 min; pinned #635 a6895a69 checkout)", + "used_for": "C1: shipped #656 gauge44 canonical word" + }, + { + "file": "s3-4-census-gauges/inputs/derived/g44-TAGS.json", + "kind": "derived (annotation, NOT pinned by any PR)", + "sha256": "0977be8f1226d678c941cd61597621c47f4ed1193bfc1f15456c53fe75dd37f2", + "rebuilt_by": "copy of construction/construct_gauge_xcentre.py with a tag argument at each of its 4 alloc() sites; its raw FULL-WORD output was compared by hash with the pinned one (card B76); register id = key - 16; the tagged rebuild's raw FULL-WORD (decompressed bytes) has sha256 0ac47f92fc2e..., equal to word_content_sha256.raw in #656 construction/INPUTS.json (re-verified at packaging)", + "used_for": "C1: allocation site of each of the 492 helpers" + } + ], + "evidence": [ + { + "file": "s1-2-erratum-invoice/evidence/E2/R39-S-NOTES.md", + "kind": "evidence", + "sha256": "3f3200cccd72d16795175c79b8edbade34e21a07935cab732253b43b6d9a83a5", + "used_for": "R39-S card notes: gate, measurement, scope" + }, + { + "file": "s1-2-erratum-invoice/evidence/E2/rho01_P2.txt", + "kind": "evidence", + "sha256": "507f8ce06658c64a8c2013a9017849bbccb11b85f48ded217b8c0e0485b88ff8", + "used_for": "output of rho01 2 (also regenerated by verify)" + }, + { + "file": "s1-2-erratum-invoice/evidence/E2/rho01_P3.txt", + "kind": "evidence", + "sha256": "38c5267c8f558adcf0bfeaf253c15b0fa5c38bbc05686c2f4542771472f9060a", + "used_for": "output of rho01 3 (also regenerated by verify)" + }, + { + "file": "s1-2-erratum-invoice/evidence/E2/rho_bfs_P2.txt", + "kind": "evidence", + "sha256": "4ef341812bdf47cc66b803c40b5b04f03d50bb5f374424086f78ce3c82dc416a", + "used_for": "output of rho_bfs.py 2" + }, + { + "file": "s1-2-erratum-invoice/evidence/P1/B15-NOTES.md", + "kind": "evidence", + "sha256": "350ea8a44a147f9cdcb8ac6ae323b7d8b10a969d3a889247ec79e7fb4e451e77", + "used_for": "B15 card notes: invoice chain and knob table" + }, + { + "file": "s1-2-erratum-invoice/evidence/P2/B26-NOTES.md", + "kind": "evidence", + "sha256": "88c7651b092292d27a071bb22ff850258c2fb97c4efa592bf304e620f16fa240", + "used_for": "B26 card notes: bit knob table (word-level rows RECORDED)" + }, + { + "file": "s1-2-erratum-invoice/evidence/P3/B66-NOTES.md", + "kind": "evidence", + "sha256": "dc5016c8407eeeb5fae073eace2fcd718a5bef486f53d290c8819f8e7834381c", + "used_for": "B66 card notes: rate table and #646 decomposition" + }, + { + "file": "s1-2-erratum-invoice/evidence/P4/B54-NOTES.md", + "kind": "evidence", + "sha256": "9c37ae11c3ab6273c66e18e8da3ca0adf61d26c53ae28be0fa71ccab70d3703c", + "used_for": "B54 card notes: s = 7 invoice and economics" + }, + { + "file": "s1-2-erratum-invoice/evidence/P5/B11-NOTES.md", + "kind": "evidence", + "sha256": "f79344262d5748660e41d5f0bcf0d47ba2d5116d36423197eeeff97be94a4415", + "used_for": "B11 card notes: frame-SA outcome, blocking histogram" + }, + { + "file": "s1-2-erratum-invoice/evidence/P5/B3R-NOTES.md", + "kind": "evidence", + "sha256": "ae42a7642a0e550b7bb8837fa71dd1c6c0d34a5438d584807e606e403d7ff625", + "used_for": "B3R card notes: SSS hourglass climb mass" + }, + { + "file": "s1-2-erratum-invoice/inputs/r39s/rho01.cpp", + "kind": "tool", + "sha256": "238de79583ebe03625e6c4074a212acf4fb3087ebc78771afa0b33562753e552", + "used_for": "E2: 0-1 BFS over F2 bank matrices (R39-S), run by checks/e2_rho.py" + }, + { + "file": "s1-2-erratum-invoice/inputs/r39s/rho_bfs.py", + "kind": "tool", + "sha256": "cbe468c4718f20cb1b2b05b980ea23309b65a7699617a4847245a7a1713eacbd", + "used_for": "E2: independent Python Dijkstra at P = 2" + }, + { + "file": "s3-4-census-gauges/evidence/C1/STEPS.json", + "sha256": "e2a8a53212979de70e0f9e9fbd457736d167819e97d455ea3ccc2f1b6356fb0d", + "what": "card B76 rebuild of the #656 word: step exit codes (pivot-swap ... wrappers), all 0", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "s3-4-census-gauges/evidence/C1/ledger_by_step.csv", + "sha256": "4916e77c90696678cc3cb4e320a1fbec622e9d6bd4ca4b3e2a84ad1844ce5518", + "what": "card B76 output of the C1 ledger (per allocation site)", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "s3-4-census-gauges/evidence/C1/ledger_helpers.csv", + "sha256": "71469db91a3c5672312dde85a9e463d5a6c4527b7cb6f2e2a03594eb59add409", + "what": "card B76 output of the C1 ledger (492 helpers: site, block|slot, climbs, mass)", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "s3-4-census-gauges/evidence/C1/ledgers.log", + "sha256": "171c61ffe5eb12bb2704ba6a1b576c587e0068da750d5cc33e47e7abe9924a85", + "what": "card B76 rebuild: ledgers step log", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "s3-4-census-gauges/evidence/G2/rep1.log", + "sha256": "7839c5dc45631b9e6012b138ed62cf3d2a1c2e0f900a3872bfb19c214545205b", + "what": "card B58 rebuild of the #645 cold44 word (shadow-early ... cold44-exact all PASS; 5.9 s); command: nice -n19 timeout 1500 python3 construction/reproduce.py", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/B14_satlift.exit", + "sha256": "9d9b18720961e9b4689fd763b85e7b6f36160ccd3a8a1c9ddc5103bb0f66c396", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/B14_satlift.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/B14_satlift.py", + "sha256": "3ba038c2a2a2d766f6a2687e132d6eecbd1efa120cb423b30e8b992f49df6113", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/B72_sat.py", + "sha256": "2254f42c0a2b025cb345baf7b22af15c400b0a6fb6abd49d41a5881365845414", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/B72_sat_n9_o3.exit", + "sha256": "9d9b18720961e9b4689fd763b85e7b6f36160ccd3a8a1c9ddc5103bb0f66c396", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/B72_sat_n9_o3.log", + "sha256": "8d3091ee1f4d11a1a3efbfcf5f89d10d7e4db4220f23a6ae009c15673eddcc22", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D1/satlift46.py", + "sha256": "dcf96c239888a7eb3d6b5354a97bb557308e8e94d3a75b828e23969e1777215b", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/cen1.out", + "sha256": "46d763a1e87c309d82765070df94c51e36de45e64a27d47f40606946a62cbcf6", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/cen2.out", + "sha256": "71314b4f28079348527f8ee9efb24309ad72fd5ea6934c927457722fb2751ef8", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/cen3.out", + "sha256": "48ac142440860e6ed5fccd96f5a6aa31538e555f17f878501b537e444c31984e", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/d1.out", + "sha256": "56dd5e20ecb02fbbf1dfee37f2c019bc160a7d136dd8ae8a7bb16688d042ce00", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/d2.out", + "sha256": "0e19ae1ec5e7d86a9eed9621571af9eaa00abfe165fc8dcd146b5085b520f77c", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/d3.out", + "sha256": "5414c014b669ab8475eb1c39fbf297c2dce9f539242d0320fd8b9cd4267b0a61", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/w1.out", + "sha256": "cf41e3e53127c5229014618b55fefa0f262d1f250b9f9fbb2963bea558de795b", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D2/w2.out", + "sha256": "07330ddc5d4f0793df4231d28dae3e8ccc96473a1cfe83be0b84e4b6c97665cd", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/B14_flip_3.log", + "sha256": "ca31495070ef57979df4effad8c93d3836ac16d3c9a19fb4abe2d9e7c2e3df42", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/B14_flip_3a.out", + "sha256": "e29f3165c0e6b855b0079301a04b15b8a066906c9b0e9df7030cd90572944ae4", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/B14_flip_3b.out", + "sha256": "17f1bcc4b4bfd5ec0ca20d3b89c68e441d78b3befd68663d475108aaa1c98874", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/B14_flip_3c.out", + "sha256": "e9ef041b1a76dc94d1f661bf383ac89f285faaff6f17f6a8896e73e660712975", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/c1_0.out", + "sha256": "21c0953a5592dea290c4dfa0aceb425cbf7d06e2456c45101c6b5e6db6ab2606", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/c1_111.out", + "sha256": "7768e0fb8bf8386886b348ede4b8d1090dfd9231d1727c340fad0c7ded4e4156", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/c2_0.out", + "sha256": "f80e4becb4ffd0dbd9f32a3950698d668125450ed43e3f0f0579e2663a5edc72", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/c2_111.out", + "sha256": "5518d576d091ead48e6ff96dbcf33e4096e6108e289957c26ac8b69a5e496b35", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/g0.out", + "sha256": "136aeac659db958a4008b54c24d3921efc149741b8ff065b4ea2b3f1514e3337", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/g1.out", + "sha256": "a3624c2da333fc8e4123a9ed3b2e9ace654895d54c623d258b9eb2a3def81289", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/g111.out", + "sha256": "0442032f2c0d932ac798e494b385e7987199ae37db27278f117f3b3d04bda026", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/g30.out", + "sha256": "b2e69115fa90a5b9a9691c403aeba26b871a15be4a92cf923cee11aa26f21150", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/g48.out", + "sha256": "035d6ddc47f510f4b4fe3eed8c634a1447a0d5ffd4a2b635f32f2acfb52c37c6", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/evidence/D3/g70.out", + "sha256": "9458e545c91b0ff346235473ae192651f29723400a2b81f77522772467acafae", + "origin": "local run logs / scripts of the same walks, shipped as evidence; read by checks/log_checks.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3a.txt", + "sha256": "8e0178db02c14e1b29058cdbdbd50aac22f2b55a1ba21dc82f417610c9932526", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3b.txt", + "sha256": "d27a8e2d14a2dcbb574995aa9ab82b3b107355faf48ad56f45c6dd5e051d252c", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P104/HIT_flip_3c.txt", + "sha256": "f3edfb771a76fc57d034b1cddba9de7b97a7d13409817879579eadb03381092e", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_c2_0.txt", + "sha256": "0af2b4b42cac05f21794013623f9955bd05cf48374a7e0a1badc29e441a027b7", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_c2_111.txt", + "sha256": "816768175d2b47ebabfd0f09180d95862bc7e84685f78dc616d9746ebf762a63", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_g0.txt", + "sha256": "c06d83ede44258b7250fe1df62a82011687f704c7f879ce4c91040ebbe2ef6b4", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_g1.txt", + "sha256": "9a8e8ee205cf3e69e2872c461844232df764a016a8c7e2741a02aeae9cdfc323", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_g111.txt", + "sha256": "8d5528362385dfc0c19cda625e5b2894d777d9405fc167c4c6723e99baa8db56", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_g30.txt", + "sha256": "a667c3f13d28828cb0a41b681e08fa6e4c07a1f3270f77555d3a1be29308a1d0", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_g48.txt", + "sha256": "521a618922d426573a1e808a6f7562eec5cd6ab09538d43b13c4dd79b1597aa7", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s5-6-decoders-spec/inputs/local-hits/P111/HIT_g70.txt", + "sha256": "b803b2c2621061b9d2b4b31f4137e02c1342d288282a4ee92b7e2f50b2bd9fb3", + "origin": "local run output (not in any PR): exact decoder hits of the B14/B40 flip walks; re-verified exactly by checks/d3_punctures.py" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B80-NOTES.md", + "sha256": "c95c492b9b94cf16fd0eaa68b7e1a41c0082de78f33c6059cc2c9a00761184a3", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B80/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B81-NOTES.md", + "sha256": "e3c1e6aa548c6af09c6cdde68d7b1aeb44e874ff8cc8499d8153483bd6287f62", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B81/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B82-DISCOVERY.json", + "sha256": "ba6767bc74e7e91330d27026fa81875d2b116f7a34b818a037d94f1bd519b778", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B82/DISCOVERY.json (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B82-NOTES.md", + "sha256": "9cbf48e3c0932ce286826b3a5807432a193275a5f4a6830a52401cbdacde0d54", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B82/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B82-run.log", + "sha256": "ba6767bc74e7e91330d27026fa81875d2b116f7a34b818a037d94f1bd519b778", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B82/run.log (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B85-NOTES.md", + "sha256": "c131f3bc7dd229cfc67fc53bd9b79b6a5266f667d9c65c8b335f9df48ca35e70", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B85/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F1/B89-NOTES.md", + "sha256": "85b10b7d8adfcbad634b2e219e2336563324dfd02647282b512d5235e1dcf170", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B89/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F2/B103-NOTES.md", + "sha256": "44d900dd87450634eeb81f7d87bdd67cbd918a80e92ae091c66b57dbcf0c6b98", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B103/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F2/B105-NOTES.md", + "sha256": "b41ddcb848a7f3ecbb75f93e281627cc112b85175b937f4c275f6d3f89242ce9", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B105/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F2/B107-NOTES.md", + "sha256": "357bcdf2dc6f27518a2b9dc14337fd86f00a8d8d3f3b0a1e61de1cae4893fddf", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B107/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F2/B108-NOTES.md", + "sha256": "42bc59cc85492f96abed7c0cb75048b418eb4d2730077db827ebb71e88dcd31f", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B108/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F2/B98c-NOTES.md", + "sha256": "d9a258b3e70ecc982395869018bd7b27872ea83c3273f1ee3c50e53fc127c2d2", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B98c/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F2/B99b-NOTES.md", + "sha256": "72917a21ab58fbd99012dc65410a32b27d5966a9e3ee7a3e01289d4bb01f4404", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B99b/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F3/B90-NOTES.md", + "sha256": "96adc6297ab3c0a5406b46c49ce828f596eab28c6d421a72b3e5bb349ea206ab", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B90/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F3/B92-NOTES.md", + "sha256": "dbccb5c0d44b1ba04b52f26083adbec1fdd40cbbdcc57dbd5f119496ed5ed8b5", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B92/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F3/B92b-NOTES.md", + "sha256": "adb7cefda46501d2769718ef2374554b68722d759eacce1e37030859d3ecbdea", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B92b/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F3/B93-NOTES.md", + "sha256": "3dc9d03ab314eb047e90b1d4b94e5245f0769c7eeebd4a939a26c643339422d8", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B93/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F3/B94-NOTES.md", + "sha256": "a08b06c423e298313be7b7a5101d3b37ce98ab1dae91627a4b77d877bd641659", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B94/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F3/B97-NOTES.md", + "sha256": "1c7d4c83ed133b698169ca2be7708ea50d0ab4506e80e58e1a97bb330d9025b7", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B97/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F6/B105_miner664.log", + "sha256": "3ac09349702214e0ac6db0a6fddb327a83d99e7246d504cd4fb3c4f824268df3", + "origin": "local run output (not in any PR)", + "what": "F6: job summary of the miner run (rc=0; empty frame-nested category)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/F6/miner664_run1.out", + "sha256": "5eb9295206f270b9d61c0b9af5de6a58438e12a0cb727b2b7e9ce6e756cc32fe", + "origin": "local run output (not in any PR)", + "what": "F6: output of the opening miner on the rebuilt #664 word (cards/B105/work664/run1_664.out)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O1/B68-NOTES.md", + "sha256": "390e5ea80e1da33988c17532dab42b74ac1ffd2262f07c03e04021c7f529f29c", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B68/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O1/B68-faces.c", + "sha256": "6c230a05a0dbac13188068dad42dcd0ace52a1c7c11a90ad60c53b2c54b92a84", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B68/faces.c (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O1/B7-NOTES.md", + "sha256": "a13c0cf567e7cbac3d5a1d59ad041e7ce0d13fb2518171badcbd4425d4a0a213", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B7/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O1/B73-NOTES.md", + "sha256": "1be2fafbefc53ac40d63497fbf4af8b1549bd10a3fc83c55f4d49254e38c9afe", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B73/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O1/B74-NOTES.md", + "sha256": "8491770d60e8234c289ffc9c3342bf2dec4274d6f6658c9c163ad621e19f3aa5", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B74/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O1/B74-dump.c", + "sha256": "6e52b14e8f0c352dee5d54e84c4fcbd52399a9d15e27d0375249a7b6ab4d0a34", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B74/dump.c (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/O2/B2-NOTES.md", + "sha256": "a7b37cc232f220aedcb586e45312232e44347e619e985fd509978a9ec455571e", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B2/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/Y1/B10-NOTES.md", + "sha256": "21c3838e9bfa4b451facc9fe2c6063b1cd3f497e6ad0a2576c42a91b090c1f97", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B10/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/Y1/B16-NOTES.md", + "sha256": "3d6c34d60c9fe1d5a3d1af36c7aa9bcaa75dbe56814f1accfea4c546c890dc42", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B16/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/Y1/B74-NOTES.md", + "sha256": "8491770d60e8234c289ffc9c3342bf2dec4274d6f6658c9c163ad621e19f3aa5", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B74/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/Y2/B101-NOTES.md", + "sha256": "6070ff15252c51783e289a66c389c06da0ca1dd480a7218f151e70b4220cb7e1", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B101/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/evidence/Y2/B106-NOTES.md", + "sha256": "049906ed7bb49c66205f643638a99393905525e8008b23617b060dc05eeabb4a", + "used_for": "evidence (existing card record; no SAT/DRAT/CP-SAT artefacts exist for these rows)", + "origin": "local card record cards/B106/NOTES.md (not in any PR)" + }, + { + "file": "s7-9-centre-fragmentation/inputs/b82-rec.json", + "sha256": "5aaa5bc98240b6b346fe046f1993d68bc4a9abd63acb4c65cac98c34a3a2b55f", + "used_for": "F1 S3/S4 packet records (RECORDED derivation, CHECKED consumer)", + "origin": "local card record DERIVED (not a PR file): cards/B82/work/out/rec.pkl converted to JSON; producer cards/B82/work/c82.py run on the rebuilt #656 word (inputs PROTOTYPE.json etc. not re-run here) (not in any PR)" + } + ] +} diff --git a/research/format-limits-2/requirements.txt b/research/format-limits-2/requirements.txt new file mode 100644 index 0000000000..afa7ae5542 --- /dev/null +++ b/research/format-limits-2/requirements.txt @@ -0,0 +1,5 @@ +# Tested set: sections 5-9 need only these three (sections 1-4 and step 0 use the standard library). +# Same pins as research/format-limits (#595); also passing on numpy 2.5.4 / scipy 1.18.1 / sympy 1.14.0 with Python 3.14.7. +numpy==2.4.6 +scipy==1.17.1 +sympy==1.14.0 diff --git a/research/format-limits-2/s1-2-erratum-invoice/SOURCES.part.json b/research/format-limits-2/s1-2-erratum-invoice/SOURCES.part.json new file mode 100644 index 0000000000..b67bafbf0e --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/SOURCES.part.json @@ -0,0 +1,171 @@ +{ + "description": "PR files are copied unchanged (or gzip-compressed with mtime 0): blob = git blob id of the file at the cited commit (for a .gz copy: of the decompressed content). kind=derived/tool/evidence files are local and pinned by sha256.", + "files": [ + { + "file": "inputs/pr595/a5_scope_multipliers.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/a5_scope_multipliers.py", + "blob": "e45f8882ec6793868c75088810c47e041eb7e4e2", + "used_for": "E1: scope-multiplier script re-run unchanged" + }, + { + "file": "inputs/pr595/skel.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/skel.py", + "blob": "e3c6c815b604dd41d3807c78917806ae4a5c08a7", + "used_for": "E1: imported by a5" + }, + { + "file": "inputs/pr595/cert.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/cert.py", + "blob": "351fbd107c86a233a91eb915f88612c9f9ad6c26", + "used_for": "E1: imported by skel" + }, + { + "file": "inputs/pr595/report.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/report.py", + "blob": "5593062527d6dbba99c7b1992390a3bf4f330a54", + "used_for": "E1: imported by a5" + }, + { + "file": "inputs/pr626/PLAN.json.gz", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair/data/PLAN.json", + "blob": "434a431937757def4e496301e3d33106f0026fa3", + "used_for": "P1,P3,P4: profile {width: count}, m = 73, live 7168, deficit 2560" + }, + { + "file": "inputs/pr626/README.md.gz", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair/README.md", + "blob": "58722c1a496f0c806e77c9d762eb00b0c53254f0", + "used_for": "P1: conditional kappa literal 0.001635527380375392" + }, + { + "file": "inputs/pr649/PLAN.json.gz", + "pr": 649, + "commit": "1b931ee055d738753778e1051300140c16ae219d", + "source_path": "research/gauge44-bit589/data/PLAN.json", + "blob": "9d5be193ad6a74a83d494e37ca2c43c43598ab84", + "used_for": "P3: base profile of the rate table" + }, + { + "file": "inputs/pr645/PLAN.json.gz", + "pr": 645, + "commit": "638a5171dd1aca89ff50d07dcbe288b567769804", + "source_path": "research/gauge44-global/data/PLAN.json", + "blob": "d561080e0f5f1570e095405b9e8a243150823896", + "used_for": "P3: profile reproduced" + }, + { + "file": "inputs/pr646/PLAN.json.gz", + "pr": 646, + "commit": "cdfe8273bb5054e0a837a3594309c6262e995b1f", + "source_path": "research/signed-root-k480/data/PLAN.json", + "blob": "28355d12849ced4c36c4d4534cabca47d92fa831", + "used_for": "P3: profile reproduced" + }, + { + "file": "inputs/pr635/PLAN.json.gz", + "pr": 635, + "commit": "a6895a69f8ad98ab45777b03e9e6f48888c39f6f", + "source_path": "research/complex-571-cold14-st2/data/PLAN.json", + "blob": "d7794713ddf9c1325d4a2142ad130b2395d27ae7", + "used_for": "P3: profile reproduced" + }, + { + "file": "inputs/pr555/EXPECTED.json.gz", + "pr": 555, + "commit": "65a6bc19f820c8b1873f65a517bcf70cd6887223", + "source_path": "research/e8-bit-p111/EXPECTED.json", + "blob": "c8ad4439e83f07bcda437598d6a4c31f4e65f2a9", + "used_for": "P2: nine-stage bit profile, live, shipped c" + }, + { + "file": "inputs/derived/k492_registers.json", + "kind": "derived", + "sha256": "e67e9158ae8bcf485c499b2e5e744016938605aff9848ca9e6106a685f5df2ee", + "used_for": "P1-P5: per-register climb widths of the ck / jp8 local words of #626, from tools/derive_registers.py applied to the CANONICAL-WORD.json.gz files of the k492b rebuild (r40/base/work/k492b/{ck,jp8}-local; rebuild from research/complex-k492-owner-repair code of #626 is RECORDED, not repeated). Binding: the invoice built from it reproduces the PLAN profile of #626 exactly (P1.gate-profile) and kappa to 18 digits" + }, + { + "file": "inputs/r39s/rho01.cpp", + "kind": "tool", + "sha256": "238de79583ebe03625e6c4074a212acf4fb3087ebc78771afa0b33562753e552", + "used_for": "E2: 0-1 BFS over F2 bank matrices (R39-S), run by checks/e2_rho.py" + }, + { + "file": "inputs/r39s/rho_bfs.py", + "kind": "tool", + "sha256": "cbe468c4718f20cb1b2b05b980ea23309b65a7699617a4847245a7a1713eacbd", + "used_for": "E2: independent Python Dijkstra at P = 2" + }, + { + "file": "evidence/E2/R39-S-NOTES.md", + "kind": "evidence", + "sha256": "3f3200cccd72d16795175c79b8edbade34e21a07935cab732253b43b6d9a83a5", + "used_for": "R39-S card notes: gate, measurement, scope" + }, + { + "file": "evidence/E2/rho01_P2.txt", + "kind": "evidence", + "sha256": "507f8ce06658c64a8c2013a9017849bbccb11b85f48ded217b8c0e0485b88ff8", + "used_for": "output of rho01 2 (also regenerated by verify)" + }, + { + "file": "evidence/E2/rho01_P3.txt", + "kind": "evidence", + "sha256": "38c5267c8f558adcf0bfeaf253c15b0fa5c38bbc05686c2f4542771472f9060a", + "used_for": "output of rho01 3 (also regenerated by verify)" + }, + { + "file": "evidence/E2/rho_bfs_P2.txt", + "kind": "evidence", + "sha256": "4ef341812bdf47cc66b803c40b5b04f03d50bb5f374424086f78ce3c82dc416a", + "used_for": "output of rho_bfs.py 2" + }, + { + "file": "evidence/P1/B15-NOTES.md", + "kind": "evidence", + "sha256": "350ea8a44a147f9cdcb8ac6ae323b7d8b10a969d3a889247ec79e7fb4e451e77", + "used_for": "B15 card notes: invoice chain and knob table" + }, + { + "file": "evidence/P2/B26-NOTES.md", + "kind": "evidence", + "sha256": "88c7651b092292d27a071bb22ff850258c2fb97c4efa592bf304e620f16fa240", + "used_for": "B26 card notes: bit knob table (word-level rows RECORDED)" + }, + { + "file": "evidence/P3/B66-NOTES.md", + "kind": "evidence", + "sha256": "dc5016c8407eeeb5fae073eace2fcd718a5bef486f53d290c8819f8e7834381c", + "used_for": "B66 card notes: rate table and #646 decomposition" + }, + { + "file": "evidence/P4/B54-NOTES.md", + "kind": "evidence", + "sha256": "9c37ae11c3ab6273c66e18e8da3ca0adf61d26c53ae28be0fa71ccab70d3703c", + "used_for": "B54 card notes: s = 7 invoice and economics" + }, + { + "file": "evidence/P5/B11-NOTES.md", + "kind": "evidence", + "sha256": "f79344262d5748660e41d5f0bcf0d47ba2d5116d36423197eeeff97be94a4415", + "used_for": "B11 card notes: frame-SA outcome, blocking histogram" + }, + { + "file": "evidence/P5/B3R-NOTES.md", + "kind": "evidence", + "sha256": "ae42a7642a0e550b7bb8837fa71dd1c6c0d34a5438d584807e606e403d7ff625", + "used_for": "B3R card notes: SSS hourglass climb mass" + } + ] +} \ No newline at end of file diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/e1_scope_multipliers.py b/research/format-limits-2/s1-2-erratum-invoice/checks/e1_scope_multipliers.py new file mode 100644 index 0000000000..a913b701b4 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/e1_scope_multipliers.py @@ -0,0 +1,73 @@ +"""E1 (erratum to #595): the x1.15-2.15 "schedule/rho family" multipliers of #595 A.7 are the effect of DROPPING idle-frame +rules from the scope, not a rho family. Default (fast, two processes): recompute idlefree, idle_onechild and nosplit for +the two units with #595's own skel.X (vendored, inputs/pr595) and compare with the multipliers a5 prints. +E1_FULL=1: run #595's a5_scope_multipliers.py unchanged (all 7 variants, about 56 s).""" +import contextlib +import io +import os +import re +import runpy +import sys +from fractions import Fraction as Fr +from multiprocessing import Pool + +HERE = os.path.dirname(os.path.abspath(__file__)) +SRC = os.path.join(os.path.dirname(HERE), 'inputs', 'pr595') +sys.path.insert(0, SRC) +S_LIST = (3, 5, 7, 9, 11, 13) +UNITS = {'cx-112/64': (9, 64, 112), 'bit-111/63': (8, 63, 111)} +EXP = {'cx-112/64': {'idlefree': (1.68, 2.15), 'idle_onechild': (1.20, 1.55), 'nosplit': (1.15, 1.18)}, + 'bit-111/63': {'idlefree': (1.67, 2.14), 'idle_onechild': (1.19, 1.55), 'nosplit': (1.15, 1.18)}} + + +def roots(h, x, var): + from skel import X + out = {} + for s in S_LIST: + r = X(s, h, 1, x, var) + out[s] = r['hi'] if r else Fr(0) + return out + + +def unit(name): + h, cst, v = UNITS[name] + x = Fr(cst, v) + base = roots(h, x, 'thm') + res = {} + for var in EXP[name]: + rr = roots(h, x, var) + res[var] = (float(max(rr.values()) / max(base.values())), float(rr[9] / base[9]), max(rr, key=rr.get)) + return name, res + + +def fast(): + with Pool(2) as p: + out = dict(p.map(unit, list(UNITS))) + fail = False + for name in UNITS: + for var, (best, at9, sb) in out[name].items(): + e = EXP[name][var] + ok = abs(best - e[0]) <= 0.006 and abs(at9 - e[1]) <= 0.006 + fail |= not ok + print('%s E1.%s.%s best s=%d: x%.2f; s = 9: x%.2f (#595 A.7: x%.2f / x%.2f)' + % ('PASS' if ok else 'FAIL', name, var, sb, best, at9, e[0], e[1]), flush=True) + return fail + + +def full(): + buf = io.StringIO() + code = 0 + with contextlib.redirect_stdout(buf): + try: + runpy.run_path(os.path.join(SRC, 'a5_scope_multipliers.py'), run_name='__main__') + except SystemExit as e: + code = e.code or 0 + lines = [l for l in buf.getvalue().splitlines() if l.startswith(('PASS', 'FAIL'))] + bad = [l for l in lines if l.startswith('FAIL')] + print('%s E1.a5-rerun %d claim lines from #595 a5_scope_multipliers.py (all 7 variants, both units), %d FAIL' + % ('PASS' if lines and not bad and not code else 'FAIL', len(lines), len(bad))) + return bool(bad or code or not lines) + + +if __name__ == '__main__': + sys.exit(1 if (full() if os.environ.get('E1_FULL') else fast()) else 0) diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/e2_rho.py b/research/format-limits-2/s1-2-erratum-invoice/checks/e2_rho.py new file mode 100644 index 0000000000..28205b6bfd --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/e2_rho.py @@ -0,0 +1,44 @@ +"""E2: scalar-layer enumeration of ALL pair-preserving monomial rho (P = 2, 3 pairs) over F2. +Builds inputs/r39s/rho01.cpp (0-1 BFS over bank matrices; generators: pair-local shears Y+=X / X+=Y, bridges +X_d+=X_s, Y_s+=Y_d) with the system C++ compiler, runs it, compares the output byte-for-byte with the shipped +evidence/E2/rho01_P{2,3}.txt, and checks the claims. Without a compiler only the shipped evidence is parsed.""" +import hashlib, os, re, shutil, subprocess, sys, tempfile +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +ok_all = True +def check(cid, ok, detail=''): + global ok_all + ok_all &= bool(ok) + print(('PASS ' if ok else 'FAIL ') + cid + (' ' + detail if detail else ''), flush=True) +cxx = shutil.which('c++') or shutil.which('g++') or shutil.which('clang++') +exe = None +if cxx: + tmp = tempfile.mkdtemp() + exe = os.path.join(tmp, 'rho01') + subprocess.run([cxx, '-O2', '-std=c++17', '-o', exe, os.path.join(ROOT, 'inputs', 'r39s', 'rho01.cpp')], check=True) +for P, states in ((2, 720), (3, 1451520)): + ev = open(os.path.join(ROOT, 'evidence', 'E2', 'rho01_P%d.txt' % P)).read() + if exe: + out = subprocess.run([exe, str(P)], capture_output=True, text=True, check=True).stdout + check('E2.rerun-P%d' % P, out == ev, 'fresh run identical to shipped evidence (sha256 %s)' % hashlib.sha256(ev.encode()).hexdigest()[:16]) + else: + out = ev + m = re.search(r'^states (\d+)$', out, re.M) + check('E2.reachable-P%d' % P, m and int(m.group(1)) == states, 'reachable set %s = |Sp(%d,2)|' % (m.group(1), 2 * P)) + rows = re.findall(r'perm=(\d+) swapmask=(\d+) : locals=(\d+) bridges=(\d+)', out) + import math + check('E2.targets-P%d' % P, len(rows) == math.factorial(P) * 2 ** P, '%d pair-preserving targets, none unreached' % len(rows)) + good = True; ratios = [] + for perm, mask, loc, br in rows: + k = bin(int(mask)).count('1'); loc = int(loc); br = int(br) + good &= (loc == (0 if k == 0 else 2 * k + 1)) + if k: ratios.append((loc / k, perm, mask)) + check('E2.locals=2k+1-P%d' % P, good, 'locals = 0 if k=0 else 2k+1, k = number of exchanged pairs, every target') + full = [(l, b) for p, mk, l, b in rows if p == ''.join(map(str, range(P))) and int(mk) == 2 ** P - 1][0] + check('E2.B_K-P%d' % P, full == {2: ('5', '3'), 3: ('7', '6')}[P], 'full exchange (identity perm) = %s locals, %s bridges' % (full[0], full[1])) + best = min(r[0] for r in ratios) + check('E2.no-rho-beats-B_K-P%d' % P, abs(best - (2 * P + 1) / P) < 1e-12, 'min locals per exchanged pair %.4f = (2P+1)/P = B_K; multiplier 1.000' % best) +# python BFS cross-check at P = 2 (independent implementation) +ev = open(os.path.join(ROOT, 'evidence', 'E2', 'rho_bfs_P2.txt')).read() +py = subprocess.run([sys.executable, '-I', '-B', os.path.join(ROOT, 'inputs', 'r39s', 'rho_bfs.py'), '2'], capture_output=True, text=True, check=True).stdout +check('E2.python-P2', py == ev and len(ev.splitlines()) == 8, 'rho_bfs.py 2 reproduces the shipped output (8 targets)') +sys.exit(0 if ok_all else 1) diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/invoice.py b/research/format-limits-2/s1-2-erratum-invoice/checks/invoice.py new file mode 100644 index 0000000000..48b04e1f7a --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/invoice.py @@ -0,0 +1,75 @@ +"""Shared invoice-calculus code for the complex (#626-type) and bit (#555-type) moment roots. +root(): b is the root a of sum_r (r n_r / (m W)) (m / r)^a = 1 (Decimal, Newton from the left: the function is convex and +increasing, so the iteration is monotone). Inputs are read from ../inputs relative to the package root.""" +import gzip, json, os, sys +from collections import Counter, defaultdict +from decimal import Decimal as D, localcontext + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +INP = os.path.join(ROOT, 'inputs') +_failed = [] + + +def check(cid, ok, detail=''): + print(('PASS ' if ok else 'FAIL ') + cid + (' ' + str(detail) if detail != '' else ''), flush=True) + if not ok: + _failed.append(cid) + return ok + + +def finish(): + sys.exit(1 if _failed else 0) + + +def load(rel): + p = os.path.join(INP, rel) + return json.load(gzip.open(p, 'rt') if p.endswith('.gz') else open(p)) + + +def root(H, m, W, prec=50, start=None): + with localcontext() as c: + c.prec = prec + terms = [(D(r) * D(n) / D(m * W), (D(m) / D(r)).ln()) for r, n in H.items() if n] + a = D(0) if start is None else start + for _ in range(100): + f = sum(p * (a * l).exp() for p, l in terms) - 1 + df = sum(p * l * (a * l).exp() for p, l in terms) + na = a - f / df + if abs(na - a) < D(10) ** (-(prec - 5)): + return na + a = na + raise RuntimeError('no convergence') + + +def profile(plan): + return {int(k): v for k, v in plan['profile'].items()} + + +def hmass(H): + return sum(r * n for r, n in H.items()) + + +M, W0, CALLS = 73, 7168, {'ck': 8, 'jp8': 64} + + +class Word626: + """Per-register climb widths of the ck / jp8 local words of #626 (inputs/derived/k492_registers.json).""" + def __init__(self): + d = load('derived/k492_registers.json') + self.d = d + self.H = Counter() + for p, c in CALLS.items(): + for r in d[p]['regs']: + for w in r: + self.H[w] += c + self.plan = load('pr626/PLAN.json.gz') + self.prof = profile(self.plan) + self.idle = Counter(self.prof) + for w, n in self.H.items(): + self.idle[w] -= n + self.idle = Counter({w: n for w, n in self.idle.items() if n}) + self.B0 = Counter(self.H) + Counter(self.idle) + + def helpers(self, prov, width): + d = self.d[prov]; v, R = d['v'], d['R'] + return [d['regs'][r] for r in range(2 * v, 2 * v + R) if r not in d['centers'] and sum(d['regs'][r]) == width] diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/p1_knobs.py b/research/format-limits-2/s1-2-erratum-invoice/checks/p1_knobs.py new file mode 100644 index 0000000000..c98a2ddbc8 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/p1_knobs.py @@ -0,0 +1,90 @@ +"""P1 (complex invoice calculus, exact knobs on #626) and P3 w9 row. Also P4 gate lives in p4_s7.py. +Gate: b of the word-built invoice = b of the PLAN profile of #626, and kappa = b/(1+b) equals the README literal to +16+ digits. Knobs are finite differences of the exact (Decimal, 50 digits) root.""" +from decimal import Decimal as D +from fractions import Fraction +import gzip, re, statistics as S +from collections import Counter +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from invoice import * + +w = Word626() +b0 = root(w.B0, M, W0) +check('P1.gate-profile', dict(w.B0) == w.prof and hmass(w.B0) == M * W0 - 2560 and w.plan['deficit'] == 2560 and w.plan['live'] == W0, + 'word climbs + idle remainder {1:123, 37:1, 48:2215} = PLAN profile of #626; mass %d = mW - 2560' % hmass(w.B0)) +check('P1.gate-idle', dict(w.idle) == {1: 123, 37: 1, 48: 2215}, 'idle remainder = I - Hz = 387072 - 280592 = 106480 = 2215*48 + 123 + 37') +kappa = b0 / (1 + b0) +txt = gzip.decompress(open(os.path.join(INP, 'pr626/README.md.gz'), 'rb').read()).decode() +lit = re.search(r'Conditional kappa = \*\*([0-9.]+)\*\*', txt).group(1) +exact = Fraction(51110230636731, 31250000000000000) +check('P1.gate-kappa', str(kappa)[:20] == lit and 0 <= kappa - D(exact.numerator) / D(exact.denominator) < D('1e-18'), + 'kappa = b/(1+b) = %s... vs README %s (exact 51110230636731/31250000000000000), b = %s' % (str(kappa)[:22], lit, str(b0)[:22])) + + +def pct(H, W=W0, m=M): + return float((root(H, m, W, start=b0 * D('0.9')) / b0 - 1) * 100) + + +def mass_ok(H, dM): + return hmass(H) - (M * W0 - 2560) == dM + + +# centre: remove (climbs [1,1,1,1,4,8,1] = 17, host -9 -> idle child 9), per call +ctr = Counter() +for p in CALLS: + d = w.d[p] + for c in d['centers']: + ctr[tuple(d['regs'][c])] += 1 +check('P1.centre-shape', set(ctr) == {(1, 1, 1, 1, 4, 8, 1)} and sum(ctr.values()) == 16, 'all 8 centres of both words have climbs (1,1,1,1,4,8,1), mass 17') +H = Counter(w.B0) +for p, c in CALLS.items(): + for x in (1, 1, 1, 1, 4, 8, 1): + H[x] -= c + H[9] += c +check('P1.centre', mass_ok(H, -576) and abs(pct(H) - 22.598) < 0.0006, 'remove 1 centre: %+.3f%% b (local -17, host -9, deficit +576)' % pct(H)) +# cst unit: centre cut climb 8 -> 7 in every call (and: one unit climb dropped) +H = Counter(w.B0); H[8] -= 72; H[7] += 72 +c1 = pct(H) +H2 = Counter(w.B0); H2[1] -= 72 +check('P1.cst-unit', mass_ok(H, -72) and abs(c1 - 2.8099) < 0.0006 and abs(pct(H2) - 2.8242) < 0.0006, + '1 cst unit per call: cut climb 8->7 %+.4f%%, one unit climb dropped %+.4f%%' % (c1, pct(H2))) +# source end FULL->8 (shape 1,1,1,5 -> 1,1,1,4) and target end 8->7 (4 -> 3), one register, all calls +srcs = Counter(tuple(r) for p in CALLS for r in w.d[p]['regs'][:w.d[p]['v']]) +tgts = Counter(tuple(r) for p in CALLS for r in w.d[p]['regs'][w.d[p]['v']:2 * w.d[p]['v']]) +check('P1.src-tgt-shape', all(sum(k) == 8 for k in list(srcs) + list(tgts)) and srcs[(1, 1, 1, 5)] == 140 and tgts[(1, 1, 4, 1, 1)] == 104, + 'every source and target register has climb mass 8; modal shapes (1,1,1,5) x140 of 224 sources and (1,1,4,1,1) x104 of 224 targets are the ones priced') +Hs = Counter(w.B0); Ht = Counter(w.B0) +for p, c in CALLS.items(): + Hs[5] -= c; Hs[4] += c; Ht[4] -= c; Ht[3] += c +check('P1.src-tgt-end', abs(pct(Hs) - 2.8123) < 0.0006 and abs(pct(Ht) - 2.8135) < 0.0006, + 'source end FULL->8: %+.4f%% /unit; target end 8->7: %+.4f%% /unit' % (pct(Hs), pct(Ht))) +# port: v -> v-1 (one source + one target gone per call; idle 48-bins -72; live W -64) +Hp = Counter(w.B0) +for p, c in CALLS.items(): + for x in (1, 1, 1, 5, 1, 1, 4, 1, 1): + Hp[x] -= c +Hp[48] -= 72 +Wn = W0 - 64 +check('P1.port', hmass(Hp) == M * Wn - 2496 and abs(pct(Hp, Wn) + 2.153998) < 0.0006, + 'v-1: %+.4f%% b (deficit 2496, mass residual 0), so one port = +2.15%%' % pct(Hp, Wn)) +# w9 helper removed in all 72 calls: mean over the helper registers of each word, ck + jp8 +tot = {'narrow': 0.0, 'merge48': 0.0} +for p, c in CALLS.items(): + regs = w.helpers(p, 9) + for rule in tot: + vals = [] + for cl in regs: + H = Counter(w.B0) + for x in cl: + H[x] -= c + if rule == 'narrow': + H[9] += c + else: + H[48] += D(9 * c) / 48 + assert abs(hmass(H) - (M * W0 - 2560)) < 1e-6 + vals.append(pct(H)) + tot[rule] += S.mean(vals) +check('P1.w9-helper', abs(tot['narrow'] - 0.0676) < 0.0006 and abs(tot['merge48'] - 0.1371) < 0.0006, + 'one w9 helper removed in all 72 calls (ck mean + jp8 mean): %+.4f%% narrow, %+.4f%% with 48-merge' % (tot['narrow'], tot['merge48'])) +finish() diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/p2_bit.py b/research/format-limits-2/s1-2-erratum-invoice/checks/p2_bit.py new file mode 100644 index 0000000000..fd66b3fb96 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/p2_bit.py @@ -0,0 +1,49 @@ +"""P2: bit invoice of the #555 R439 word (nine stages, m = 64, L = 9, K = 4, T = 32, live 28416). +c is the root a of sum_r (r n_r / (m W)) (m/r)^a + 32 m (sum n) / (1e16 W) m^a = 1 (the moment root with its bad term). +CHECKED here: c to 24 digits, the mass identity, and the profile-level cst-unit knobs (a child r -> r-1 on all 288 calls). +The word-level knobs (port with idle repack, helper by pattern) need the per-register climbs and the idle-packing model of +the unpublished card B26/knobs.py (> 120 s) and are RECORDED in the README, not checked.""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from invoice import * + +E = load('pr555/EXPECTED.json.gz')['nine'] +P = {int(r): n for r, n in E['profile'].items()} +m, W = 64, E['bit']['live'] +N = 288 + + +def c_of(P, W_=W, prec=60): + with localcontext() as ctx: + ctx.prec = prec + terms = [(D(r * n) / D(m * W_), (D(m) / D(r)).ln()) for r, n in P.items() if n] + terms.append((D(32 * m * sum(P.values())) / D(10 ** 16 * W_), D(m).ln())) + a = D(0) + for _ in range(100): + f = sum(p * (a * l).exp() for p, l in terms) - 1 + df = sum(p * l * (a * l).exp() for p, l in terms) + na = a - f / df + if abs(na - a) < D(10) ** -(prec - 5): + return na + a = na + raise RuntimeError + + +c0 = c_of(P) +lit = D(E['bit_lower_decimal']) +check('P2.root', abs(c0 / lit - 1) < D('2e-22'), 'c = %s vs shipped %s (rel %.1e, 24-digit grid)' % (str(c0)[:28], lit, float(c0 / lit - 1))) +check('P2.mass', hmass(P) == 1808352 == E['bit']['rank_mass'] and m * W - hmass(P) == 10272 == 256 * 111 - 288 * 63, + 'mass %d = rank_mass; deficit mW - mass = 10272 = 256 v - 288 cst (v = 111, cst = 63)' % hmass(P)) +d = lambda Q: float((c_of(Q) / c0 - 1) * 100) +def edit(*ch): + Q = Counter(P) + for r, n in ch: + Q[r] += n * N + return Q +unit = {r: d(edit((r, -1), (r - 1, 1))) for r in range(2, 8)} +unit[1] = d(edit((1, -1))) +check('P2.cst-unit', abs(unit[7] - 2.8017) < 0.0006 and abs(d(edit((7, -2), (6, 2))) - 5.603) < 0.003, + '1 cst unit (copy 7->6, all 288 calls): %+.4f%% c; 2nd unit: %+.3f%% cumulative' % (unit[7], d(edit((7, -2), (6, 2))))) +check('P2.unit-any-rank', all(2.80 <= unit[r] <= 2.817 for r in range(1, 8)) and abs(unit[1] - 2.816) < 0.001, + 'a child r->r-1 on any rank costs %s%% c (width irrelevant)' % ' '.join('r%d %.4f' % (r, unit[r]) for r in range(1, 8))) +finish() diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/p3_rate.py b/research/format-limits-2/s1-2-erratum-invoice/checks/p3_rate.py new file mode 100644 index 0000000000..a6712ca849 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/p3_rate.py @@ -0,0 +1,42 @@ +"""P3: helper exchange rate on #649 (% of b per helper removed in all 72 calls: its climbs leave the local profile and its +width w returns to the idle cover, either as one narrow w-child or merged into 48-wide idle children). +Shapes = the climb lists of the helper registers of width w in the #626 ck and jp8 words (exact mean over all of them). +Gate: b (hence kappa = b/(1+b)) reproduced from the PLAN profile of #649, #645, #646, #635 and #626.""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from invoice import * +import statistics as S + +KAPPA = {649: '0.001652528731617094', 645: '0.001649483702558979', 646: '0.001627103256702062', + 635: '0.001636241501576388', 626: '0.001635527380375392'} +PLAN = {649: 'pr649/PLAN.json.gz', 645: 'pr645/PLAN.json.gz', 646: 'pr646/PLAN.json.gz', 635: 'pr635/PLAN.json.gz', 626: 'pr626/PLAN.json.gz'} +prof = {} +for n, rel in PLAN.items(): + pl = load(rel); H = profile(pl); prof[n] = H + live, dfc, m = pl['live'], pl['deficit'], pl['M'] + b = root(H, m, live); k = b / (1 + b) + lit = D(KAPPA[n]) + ok = hmass(H) == m * live - dfc and abs(k - lit) <= D('1e-18') + check('P3.gate-%d' % n, ok, 'kappa = b/(1+b) = %s vs published %s (m=%d, live=%d, deficit=%d)' % (str(k)[:20], KAPPA[n], m, live, dfc)) +w = Word626() +BASE = Counter(prof[649]); b649 = root(BASE, M, W0) +def price(width, rule): + pool = [cl for p in CALLS for cl in w.helpers(p, width)] + vals = [] + for cl in pool: + H = Counter(BASE) + for x in cl: + H[x] -= 72 + if rule == 'narrow': + H[width] += 72 + else: + H[48] += D(width * 72) / 48 + assert abs(hmass(H) - hmass(BASE)) < 1e-6 + vals.append(float((root(H, M, W0, start=b649 * D('0.9')) / b649 - 1) * 100)) + return S.mean(vals), len(pool) +TABLE = {9: (0.070, 0.140), 8: (0.051, 0.118), 7: (0.038, 0.101), 5: (0.031, 0.084), 4: (0.026, 0.072)} # README P3 table (3 decimals) +for wd, (tn, tm) in TABLE.items(): + (n, cnt), (g, _) = price(wd, 'narrow'), price(wd, 'merge48') + check('P3.rate-w%d' % wd, abs(n - tn) <= 0.0005 and abs(g - tm) <= 0.0005, + 'w%d helper (%d shapes): %.4f%% b narrow, %.4f%% merged into 48-bins (table %.4g / %.4g)' % (wd, cnt, n, g, tn, tm)) +finish() diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/p4_s7.py b/research/format-limits-2/s1-2-erratum-invoice/checks/p4_s7.py new file mode 100644 index 0000000000..017747a728 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/p4_s7.py @@ -0,0 +1,58 @@ +"""P4: stage count s = 9 -> 7 (P = 4 -> 3 bank pairs) on the #626 invoice. Geometry by P: m = 1 + 8(2P+1), W = 2 P T v, +deficit D = T[2Pv - (2P+1) cst], calls = T(2P+1), idle cover I = calls * 8 (s-3) v, v = 112, cst = 64, T = 8. The per-call +local profile (ck 3858 / jp8 3902 + 1856) is the P = 4 one: the P = 3 local program was NOT built, so s = 7 is a model. +A cut of k w9 helpers per call (all calls) returns the average w9 climb profile of the provider; the freed width is +hosted idle mass. Scope: the #626 local words only.""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from invoice import * + +w = Word626() +V, CST, T = 112, 64, 8 +def geom(P): + return dict(m=1 + 8 * (2 * P + 1), W=2 * P * T * V, D=T * (2 * P * V - (2 * P + 1) * CST), calls=T * (2 * P + 1)) +Pk = {p: Counter(x for r in w.d[p]['regs'] for x in r) for p in CALLS} +sumw = {p: sum(a * n for a, n in Pk[p].items()) - 1856 for p in CALLS} +w9 = {} +for p in CALLS: + regs = w.helpers(p, 9); c = Counter(x for r in regs for x in r) + w9[p] = {a: D(n) / len(regs) for a, n in c.items()} +g9 = geom(4) +check('P4.gate-geometry', (g9['m'], g9['W'], g9['D'], g9['calls']) == (73, 7168, 2560, 72), 'P=4 reproduces m=73, W=7168, D=2560, 72 calls') +def build(s, k): + P = (s - 1) // 2; g = geom(P); ck = g['calls'] // 9; cnt = {'ck': ck, 'jp8': g['calls'] - ck} + H = Counter(); hz = D(0) + for p, c in cnt.items(): + for a, n in Pk[p].items(): H[a] += n * c + for a, n in w9[p].items(): H[a] -= n * D(str(k)) * c + hz += c * (sumw[p] - 9 * D(str(k))) + I = g['calls'] * (s - 3) * 8 * V; left = I - hz; cw = (s - 3) * 8 + H[cw] += left / cw + return g, H, left, hz, I, sum(a * n for a, n in H.items()) - (g['m'] * g['W'] - g['D']) +for s in (9, 7): + g, H, left, hz, I, res = build(s, 0) + check('P4.mass-identity-s%d' % s, abs(res) < D('1e-9'), 's=%d: mass = mW - D (residual %s), idle I=%d, hosted Hz=%d, leftover %s' % (s, res, I, hz, left)) +g7, H7, l7, hz7, I7, _ = build(7, 0) +check('P4.overflow-s7', I7 == 200704 and hz7 == 218248 and l7 == -17544, + 's=7 (56 calls, 8 ck + 48 jp8): I=%d, Hz=%d, hosting overflow %d = %.1f%% of the idle cover I' % (I7, hz7, -l7, float(-l7 / I7) * 100)) +for p in CALLS: + print('INFO k needed (%s alone) = %.1f' % (p, float((sumw[p] - 3584) / 9))) +kneed = (sumw['jp8'] * 48 + sumw['ck'] * 8 - 3584 * 56) / D(9) / 56 +check('P4.k-fit', 34 < kneed < 36, 'fit at s=7 needs k = %.1f w9 helpers cut per call (R 492 -> %.0f)' % (kneed, 492 - kneed)) +ref = root(build(9, 0)[1], 73, 7168) +rows = [] +for k in (35, 40, 60): + g9_, H9, l9, *_ = build(9, k); g7_, H7_, l7_, *_ = build(7, k) + b9 = root(H9, g9_['m'], g9_['W']); b7 = root(H7_, g7_['m'], g7_['W']) + rows.append((k, float((b9 / ref - 1) * 100), float(b7 * 1000), float((b7 / b9 - 1) * 100), float(l7_))) + check('P4.worse-k%d' % k, l7_ >= 0 and b7 > b9 and 0.1 < rows[-1][3] < 0.3, + 'k=%d: b9 %+.2f%% vs k=0 (same cut at s=9); b7 = %.4e; b7/b9 at the same R = %+.2f%% (the cut buys s=7 admission only)' % (k, rows[-1][1], b7, rows[-1][3])) +deep = [] +for k in (234, 300, 480): + row = [] + for s in (9, 7, 5): + g, H, l, *_ = build(s, k) + row.append(float(root(H, g['m'], g['W']) * 1000) if l >= 0 else None) + deep.append(row) + check('P4.deep-k%d' % k, row[0] > row[1] > row[2] if None not in row else False, 'b x1e3 at s=9/7/5: %s (s=9 largest at every k)' % ['%.3f' % x for x in row]) +finish() diff --git a/research/format-limits-2/s1-2-erratum-invoice/checks/p5_cover.py b/research/format-limits-2/s1-2-erratum-invoice/checks/p5_cover.py new file mode 100644 index 0000000000..a2a75ade8f --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/checks/p5_cover.py @@ -0,0 +1,21 @@ +"""P5 (profile-level part): the climb mass of the #626 invoice is a forced cover: mass = mW - deficit exactly, so padding +mass is not an option, and reshaping mass is priced by the shape alone. Checked: the mass identity from the word and the PLAN, +and the arithmetic bound 'moving 1% of the unit-climb mass into width-9 climbs gives +0.26% b'. The frame-SA outcome (0.0% b over +legal assignments), the ~96% blocking histogram and the SSS-hourglass comparison are RECORDED (evidence/P5).""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from invoice import * + +w = Word626(); b0 = root(w.B0, M, W0) +check('P5.cover', hmass(w.B0) == M * W0 - w.plan['deficit'] == 520704 and w.plan['deficit'] == 2560 == 64 * 112 - 4608, + 'mass %d = 73 * 7168 - 2560 (deficit 2560 = 64 v - 4608 at v = 112, an asserted constant of the invoice)' % hmass(w.B0)) +local = sum(a * n for a, n in w.H.items()) - 0 +per_call = {p: sum(a * n for a, n in Counter(x for r in w.d[p]['regs'] for x in r).items()) for p in CALLS} +check('P5.local-mass', per_call == {'ck': 5714, 'jp8': 5758}, 'local mass per call: ck 5714, jp8 5758 (= sum of helper widths + 1856)') +H = Counter(w.B0); u = H[1] - w.idle.get(1, 0) # unit climbs of the 72 local words +mv = D(u) / 100 +H[1] -= mv; H[9] += mv / 9 +assert abs(hmass(H) - hmass(w.B0)) < D('1e-9') +g = float((root(H, M, W0) / b0 - 1) * 100) +check('P5.padding-bound', abs(g - 0.26) < 0.01, 'moving 1%% of the unit-climb mass into width-9 climbs (mass conserved): %+.3f%% b' % g) +finish() diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/R39-S-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/R39-S-NOTES.md new file mode 100644 index 0000000000..f439397069 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/R39-S-NOTES.md @@ -0,0 +1,17 @@ +# R39-S notes (coordinator: Sonnet; no swarm used, nothing parallelisable) +Plan: (1) gate: quote the schedule/rho item, map to spec, legality; (2) if rho is a real input, sweep verify; (3) else bound rho at the scalar layer; (4) re-price the six LOCAL-PRICE kills under the measured multiplier. +Repo: repo/ (branches pr595, pr622, pr623). Tools: tools/rho_bfs.py (small), tools/rho01.cpp (+ binary rho01). + +## Gate result (stage 1): rho is NOT a verify input -> a 5-7 point kappa(rho) sweep is impossible as posed +- Item: #595 research/format-limits/README.md B.2 row 5 ("rho = signed exchange of X_a and Y_a, pairwise: C, any permutation rho is legal; never varied") and "schedule/rho family (rows 5,12,13)" (B.3 item 8, L349; open-problem 3, L783). Spec side: U/04-swap.tex:105-123 (gates induce a permutation rho; M_out(rho(w)) - M_in(w) = I_m). +- Legal in the paper's spec; but #623's verifier chain (witness-spec-tools spec.py/verify.py; k492b code/) has no rho/schedule parameter. rho is hard-coded in the scalar checks (columns_k.cpp:56 final bank swap; bit_global.py:49-55; Lean Work__Bridge__Net). A non-exchange rho needs new provider words and checker edits, not a parameter. +- Hypothesis check: the multipliers x1.15..2.15 in #595 A.7 are idle-frame-change terms (B_K idle free x2.14, one idle child x1.55, no split x1.18 at s=9), obtained by DROPPING rules. They are not a rho family. The cold/HPE ends (hyperplane_end, cold_end steps) are post-skeleton helper-end frames and do not depend on rho. So "rho scales the cold/HPE family" has no support. +## Measurement (stage 2 substitute): scalar-layer enumeration over ALL pair-preserving monomial rho +Tool: rho01 (0-1 BFS over F2 bank matrices; generators = pair-local shears Y+=X / X+=Y, elementary bridges X_d+=X_s,Y_s+=Y_d). Reachable set = Sp(2P,2) exactly (720 at P=2, 1,451,520 at P=3). Recipe replayed: full exchange P=2 -> (5 locals, 3 bridges), P=3 -> (7, 6): equals B_K. +Result, P=2 and P=3, every target: locals = 2k+1 where k = number of exchanged pairs (0 locals if k=0), bridges >= 3(k-1) and strictly more once pairs are permuted (e.g. P=3 cyclic perms 6-8). Unexchanged pairs are idle wires (no deficit). No rho beats B_K per served pair: multiplier = 1.000, same as J1-E's 1.000 (J1-E fixed rho = exchange; this removes that fixing). F2 reduction is a necessary condition, so this is a lower bound on cost, not a model artefact. Scope: P<=3, one pair per local, port-uniform rho; port-dependent rho = multi-bank locals (J22-B kill). +## Verdict: PROVEN (scope above) NO-GO for the rho half; kappa(rho) at best legal rho = #623's 1.635490664920455e-3 (no change; I did not re-run the 500 s verify since no rho input exists). +## Re-pricing (stage 3): multiplier 1.000 -> no LOCAL-PRICE kill crosses zero. Factor each would need: J23-F ~x40 (-5.5% per use vs +0.14%/copy), J24-C1 ~x15, J38-U x4-8 (gross +1.0% vs net -3..-7%), J36-B/J32-U/J37-D: negative at unit scale, no scope term to scale. No stack. Owner run not triggered (< +0.2%). +Escapes (>=3): (E1) non-symplectic/multi-bank locals (J22-B, P>=4 hybrids unenumerated); (E2) port-dependent rho (wire-level, needs a local that mixes ports); (E3) K>=4 bridge-graph search with cycles; (E4) signed-Z target when F2 target is not reachable is irrelevant (F2 necessary). Rescue lemma: a local whose emit changes bank pairing (X_a with Y_b) at equal window cost, or a bridge commuting with advances. + +## Coordinator synthesis (wave 1 empty, no wave 2) +Core work was done in-card: rho is not a verify input; scalar-layer enumeration over all pair-preserving rho (P<=3) shows no rho beats B_K (multiplier 1.000). Verdict NO-GO for rho; kappa stays at #623's 1.635490664920455e-3 (below GO bar 1.64040e-3). No LOCAL-PRICE kill (J23-F, J24-C1, J38-U, J36-B, J32-U, J37-D) crosses zero; no stack; owner run not triggered. Escapes E1-E3 remain. No parallelization needed. diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P2.txt b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P2.txt new file mode 100644 index 0000000000..7b26af8d5d --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P2.txt @@ -0,0 +1,9 @@ +perm=01 swapmask=0 : locals=0 bridges=0 +perm=01 swapmask=1 : locals=3 bridges=0 +perm=01 swapmask=2 : locals=3 bridges=0 +perm=01 swapmask=3 : locals=5 bridges=3 +perm=10 swapmask=0 : locals=0 bridges=3 +perm=10 swapmask=1 : locals=3 bridges=3 +perm=10 swapmask=2 : locals=3 bridges=3 +perm=10 swapmask=3 : locals=5 bridges=4 +states 720 diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P3.txt b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P3.txt new file mode 100644 index 0000000000..89331c84f0 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho01_P3.txt @@ -0,0 +1,49 @@ +perm=012 swapmask=0 : locals=0 bridges=0 +perm=012 swapmask=1 : locals=3 bridges=0 +perm=012 swapmask=2 : locals=3 bridges=0 +perm=012 swapmask=3 : locals=5 bridges=3 +perm=012 swapmask=4 : locals=3 bridges=0 +perm=012 swapmask=5 : locals=5 bridges=3 +perm=012 swapmask=6 : locals=5 bridges=3 +perm=012 swapmask=7 : locals=7 bridges=6 +perm=021 swapmask=0 : locals=0 bridges=3 +perm=021 swapmask=1 : locals=3 bridges=3 +perm=021 swapmask=2 : locals=3 bridges=3 +perm=021 swapmask=3 : locals=5 bridges=6 +perm=021 swapmask=4 : locals=3 bridges=3 +perm=021 swapmask=5 : locals=5 bridges=6 +perm=021 swapmask=6 : locals=5 bridges=4 +perm=021 swapmask=7 : locals=7 bridges=7 +perm=102 swapmask=0 : locals=0 bridges=3 +perm=102 swapmask=1 : locals=3 bridges=3 +perm=102 swapmask=2 : locals=3 bridges=3 +perm=102 swapmask=3 : locals=5 bridges=4 +perm=102 swapmask=4 : locals=3 bridges=3 +perm=102 swapmask=5 : locals=5 bridges=6 +perm=102 swapmask=6 : locals=5 bridges=6 +perm=102 swapmask=7 : locals=7 bridges=7 +perm=120 swapmask=0 : locals=0 bridges=6 +perm=120 swapmask=1 : locals=3 bridges=6 +perm=120 swapmask=2 : locals=3 bridges=6 +perm=120 swapmask=3 : locals=5 bridges=7 +perm=120 swapmask=4 : locals=3 bridges=6 +perm=120 swapmask=5 : locals=5 bridges=7 +perm=120 swapmask=6 : locals=5 bridges=7 +perm=120 swapmask=7 : locals=7 bridges=8 +perm=201 swapmask=0 : locals=0 bridges=6 +perm=201 swapmask=1 : locals=3 bridges=6 +perm=201 swapmask=2 : locals=3 bridges=6 +perm=201 swapmask=3 : locals=5 bridges=7 +perm=201 swapmask=4 : locals=3 bridges=6 +perm=201 swapmask=5 : locals=5 bridges=7 +perm=201 swapmask=6 : locals=5 bridges=7 +perm=201 swapmask=7 : locals=7 bridges=8 +perm=210 swapmask=0 : locals=0 bridges=3 +perm=210 swapmask=1 : locals=3 bridges=3 +perm=210 swapmask=2 : locals=3 bridges=3 +perm=210 swapmask=3 : locals=5 bridges=6 +perm=210 swapmask=4 : locals=3 bridges=3 +perm=210 swapmask=5 : locals=5 bridges=4 +perm=210 swapmask=6 : locals=5 bridges=6 +perm=210 swapmask=7 : locals=7 bridges=7 +states 1451520 diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho_bfs_P2.txt b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho_bfs_P2.txt new file mode 100644 index 0000000000..b098c235e4 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/E2/rho_bfs_P2.txt @@ -0,0 +1,8 @@ +((0, 1), (0, 0)) (0, 0) +((1, 0), (0, 0)) (0, 3) +((0, 1), (0, 1)) (3, 0) +((0, 1), (1, 0)) (3, 0) +((1, 0), (0, 1)) (3, 3) +((1, 0), (1, 0)) (3, 3) +((0, 1), (1, 1)) (5, 3) +((1, 0), (1, 1)) (5, 4) diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/P1/B15-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/P1/B15-NOTES.md new file mode 100644 index 0000000000..b196a00c51 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/P1/B15-NOTES.md @@ -0,0 +1,37 @@ +# B15: invoice calculus (exact word -> b map). VERDICT: PROVEN-MAP (gate passed). ship=false +Scope: #626 (pr626 extracted to ./pr626), providers ck(8 calls)/jp8(64) CANONICAL-WORD replay (B11 coarse.py + reg.py), profile model of check_moment. Tools: reg.py (per-register climbs), calc.py (gate), knobs.py (all derivatives). Run: ../../venv/bin/python3 knobs.py (~2 min). + +## Gate (PASSED, exact) +b(#626) = 0.00163820671230808686 -> kappa=b/(1+b)=0.001635527380375392 = PR626 README to all 16 digits. #623 profile (12:1,21:1) gives kappa 0.001635490664920455 (exact). Built from the words alone, no PLAN profile. + +## Chain: word -> b (all verified numerically) +1. v=112, h=9, m=73=8h+1, DATA=live=W=8*T*v=7168 (K=4 blocks x T=8 replicas x 2v). W is PER WORD-SET (all 72 calls, one cover), NOT 4v+R: R never enters W in the complex invoice (physical=W+R+8+2 only enters finite inequalities). B12's "W=4v+R" is the five-stage moment.py price(), not this engine. +2. Per-register paid mass (climb widths of the monotone frame replay): source 8 (1,1,1,5), target 8 (end perp(port) dim 8), helper = EXACTLY its residual width w=|U|-|E| (4/5/7/8/9), centre = 9 + 8 (cut climb 8) = 17 (centres are 8 of the R=492 helper columns). +3. Local mass per call L = sum(w_helpers) + 1856, 1856 = 2v*8 + 64 (64 = 8 centres x cut 8; =16v+64). ck: 5714 = 3858+1856; jp8: 5758 = 3902+1856 (checked). +4. Idle cover: fixed geometry I = 72*48*v = 387072 (48-wide idle children). Hosted helper residuals Hz = sum_w*calls (280592) occupy windows, leftover = I - Hz (2215 x 48 + 123 x 1 + 1 x 37 in #626) is paid as children. +5. Total mass = L + I - Hz = 72*(16v+64) + 72*48v = ... = m*W - deficit; deficit = 64v - 4608 = 2560 (derived, linear in v; NOT a free literal: it is the constant L-Hz=1856 per call). So deficit is fixed by 3, and total mass 520704 is invariant under helper changes. +6. b = root of F(a)=sum_r (r n_r/(mW)) (m/r)^a = 1 over H = 64*jp8 + 8*ck local children + idle leftovers; kappa = b/(1+b). b ~ (deficit/(mW))/mean ln(m/r): MORE deficit = bigger b; wider climbs cheaper. + +## Knob map (exact finite differences, Decimal root; % of b) +| knob | exact dB | structural move | register status | +|---|---|---|---| +| remove 1 centre (cut rank 7) | +22.60% (add one: -22.56%) | local -17, host -9, deficit +576 | rank-8 cut forced (B3/B10); "more centres" closed | +| 1 cst unit (L-Hz 1856->1855: -1 mass/call) | +2.81% (+2.82% as one unit climb/call) | e.g. cut climb 8->7, source end FULL->8, target end 8->7, one register 1 unit lower | decoder cst 72->71 registered (+2.7%); register-level END-FRAME form NOT registered (below) | +| v-1 (112->111 columns, geometry) | -2.15% (deficit 2496) | not a move: v is the problem size | n/a | +| remove 1 w9 helper, ALL 72 calls (jp8 +ck) | +0.068% narrow idle (freed w returns as one w-child); +0.137% if freed w merges into 48-chunks | mass-conserving: its climbs leave, w freed in host window | count ledger 0.143% = best case; B2 0.043% gross is BELOW even narrow exact (B2 probably includes read-climb loss) | +| remove 1 helper by width, jp8 only (64 calls), narrow / 48-merge | w9 0.060/0.122; w8 0.043/0.102; w7 0.035/0.090; w5 0.027/0.074; w4 (cold unit) 0.023/0.064 | same | ck adds ~13% on top (8 calls) | +| merge 2 unit climbs -> 1 width-2 (72 calls) | +0.0064% (jp8-only 0.0057) | frame coarsening | B11: blocked 96% | +| merge r unit -> width r, per unit absorbed | r=3 .0051, 4 .0064, 5 .0074, 9 .0102 % | | | +| all jp8 unit pairs merged (bound) | +8.8% | | B11 SA: 0% legal | +| mass unit moved width r->48, per 1000 units | r=1 .249%, 2 .204, 3 .178, 4 .159, 5 .145, 8 .115 | | price of any reshaping | +| helper end FULL->d (w9, jp8): d=8/7/6/5/4 | narrow -.003/-.001/+.004/+.007/+.014; 48-merge +.013/+.025/+.038/+.048/+.060 | trailing climbs dropped, hosted width freed equally (deficit unchanged) | cold/hyperplane ends already in word (22+34) | + +## Reading +- Helpers are cheap per unit, the CONSTANT is expensive: one mass unit/call in the 1856 is worth 2.8% b = 20-40 helpers. The 1856 is src 8 x 112 + tgt 8 x 112 + 64 centre-cut mass. Helper changes are mass-neutral (climb mass = hosted width); only END FRAMES of non-hosted registers (sources, targets, centres) change the deficit. +- Count-ledger 0.143%/helper is the optimistic 48-merge bound; realistic narrow = 0.068% (w9, all calls); w4-5 helpers 0.02-0.03%. B2's 0.043% is within a factor 1.6 of narrow: consistent, not contradicted. +- Sources/targets/centres are 224*8+136 = 1928 mass per call and carry no hosting counterpart: each unit saved is +2.8% b. + +## Unregistered >=1% path (knowledge, UNVERIFIED legality) +Source END frame below FULL (or target below perp(port) dim 8): each saved unit on ONE register (all 72 calls) = +2.81% exactly, 112 sources/targets available. Not in BLOCKED-IDEAS (grep: sources end at FULL appears only as assumption (f) in archive/r13/G_walls, and as taint W4 at r13/Y_synergy). Likely blocker: sources/targets must be restored to the exact frame the next stage reads (taint W4); helpers escape via hyperplane/cold ends because they carry no data. Rescue check (~30 min): for ONE source register, test whether the final climb 4->9 can stop at a hyperplane U that contains the next role's first frame (Y_synergy rule: end(role1) inside U(first event role2)). +## Escapes/limits +1. Freed-w merge fraction (narrow vs 48) is owner-MIP dependent; reported both. 2. face/key/host helper classes of J21-K ledger not separable from register roles here; classes given by width. 3. v and centre knobs are priced on the invoice only (word not rebuilt). ship=false. diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/P2/B26-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/P2/B26-NOTES.md new file mode 100644 index 0000000000..ccceecf980 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/P2/B26-NOTES.md @@ -0,0 +1,36 @@ +# B26: bit invoice calculus (exact word -> c map). VERDICT: PROVEN-MAP (gate passed). ship=false +Scope: #555 R439 word (pr head 65a6bc1, work/pr; research/e8-bit-p111), nine-stage chain (m=64, L=9, K=4, T=32). Files: gate.py (c from profile), reg.py (per-register climbs of the word via export_records), knobs.py/k2.py (all derivatives). Run: ../../venv/bin/python3 knobs.py (~1 min). Full verify.sh NOT run (heavy slots busy; not needed: EXPECTED.json carries the profile). + +## Gate (PASSED) +c = root a of sum_r (r n_r/(m W)) (m/r)^a + 32 m (sum n)/(1e16 W) m^a = 1 (moment.certify, bad=True), P = EXPECTED nine.profile {1:380448,2:400416,3:23040,4:27744,5:29376,6:17088,7:26496,42:288}, m=64, W=28416. +Result 0.001733052823330162099157209 = shipped 1733052823330162099157/1e24 (agrees to the 24-digit grid, rel 1.2e-22). Mass 1808352, deficit 10272. + +## Chain: word -> c +1. W = 2 K v T = 256 v = 28416 (live data), PER WORD-SET; R never enters W (R<=4v only gates hosting). m = 1+7L = 64. +2. Local children per invocation = the forward replay's climbs (op 0 ranks) + 9 centre copies of rank 7 (cst 63). 288 = L*T invocations, each the same: H = {1:1321,2:1342,3:80,4:47,5:102,6:10,7:18}; local mass 8R+cst+14v = 5129. Registers: 111 sources (mass 7 each, patterns (1,2,2,1,1)x98,(3,2,1,1)x10,(1,2,4)x3), 111 targets (7 each: (2,5)x92,(1,6)x10,(7,)x9 = the 9 totals), 439 helpers (8 each, ALL width 8, 10 climb patterns). +3. Idle cover (fixed geometry, 2vT windows per type): ranks 14,28,42 (128v windows each) and 7 (192v). Whole helper residuals (width 8) are hosted: 14-window 1 slot, 28 -> 3, 42 -> 5; slots 4v=444 per (stage,replica). Leftovers: 14->6, 28->4, 42->2, plus the 5 free slots per stage-replica = ONE empty rank-42 window (288 r42 children, tight at R=439). Rebuilt P = 288*H + {2:13920,4:14208,6:14208,7:21312,42:288} EXACTLY. +4. Total mass = 288(cst+14v) + I(v) is independent of R; deficit = T(2KV - L cst) = 256v - 288 cst (=10272). Helpers are mass-neutral (8 local + 8 hosted cancel); only sources/targets/copies (cst) move mass. c rises with deficit, falls with mean ln(m/r). + +## Knob table (exact, Decimal root, % of c; ALL 288 calls unless noted; one call = 1/288 of it) +| knob | exact dc | notes | +|---|---|---| +| 1 cst unit (copy 7->6; deficit +288) | +2.8017% (2nd unit +5.603%) | any child r->r-1 on a source/target/copy: 2.8017 (r7) .. 2.816 (r1); width irrelevant | +| lose 1 cst unit | -2.8011% | 2 units = -5.63% (the descent price) | +| whole source / target register (7 units) | +19.7% / +19.7% | just 7 units; not a move | +| one retained total (target (7,) + its copy, 14 units) | +39.3% | cst 63->56 | +| 1 port (v-1; src+tgt gone, W-256, idle -128 windows each) | -2.13..-2.16% (so +1 port at same cst = +2.15%) | break-even: +0.77 cst unit per added port; +1 cst/port = -0.65% | +| 1 helper removed (R-1), best idle repack | +0.085..0.114% | pattern (1,1,2,2,1,1) .114, (2,2,2,2) .101, (1,3,4) .085; free slot goes to a 14-window | +| same, narrow (slot stays in its original window) | +0.062..0.092% | | +| remove 2 / 5 / 10 helpers (best) | +0.238 / +0.694 / +1.398% | 5 free slots make a 2nd empty 42-window: superlinear | +| add 1 helper (R+1) | -0.166% | breaks the empty 42-window (r42 -> r8) | +| merge 2 unit climbs -> width 2 (all calls) | +0.0068% | 1+2->3 .0093, 2+2->4 .0135, 1+5->6 .0132 | +Largest per structural change: (1) cst unit +2.80%; (2) port +2.15% (cst-neutral); (3) one helper +0.06..0.11% (merge 0.007%). cst/descent are the only >=1% bit levers; ~25-45 helpers = 1 cst unit. + +## Misprice check vs registered bit mechanisms +- Oct 11 rmdec "+2.70% c per cst unit": exact 2.80% (1.04x). OK. +- J24-C1 / ledger "descent = 2 cst units = -5.8..-6.3% c": exact -5.63% (1.03-1.12x). OK. +- Count ledger "0.047-0.125% c per register": exact 0.062-0.114% (narrow .062-.092). Within 1.3x. OK. +- B16 "ports -1% at cst 65": exact is -3.45% at cst +2/port (+2.15 -5.60) and -0.65% at +1; the "-1%" does not match either; the 63->65 reading is a ~3.5x gap (or the ledger meant +1 cst: 1.5x). Re-read B16 before reuse. +- NO >=2x misprice of a registered bit mechanism on the helper/cst/descent lines. Bit B8/B17 proxies stand. +## Escapes/limits +1. Hosting repack (best vs narrow) is a bound: stage-level window availability and the owner MIP are not rebuilt; the 5-free-slot structure at R439 is exact. 2. Per-register classes by climb pattern only (line/cell/keeper provenance not separated). 3. Port/helper knobs priced on the invoice, word not rebuilt. 4. #589 tuned word (c +0.0216%) not used; same chain, shifts knobs <0.1%. ship=false. diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/P3/B66-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/P3/B66-NOTES.md new file mode 100644 index 0000000000..0202f76e8f --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/P3/B66-NOTES.md @@ -0,0 +1,28 @@ +# B66 NOTES: exchange rate of a helper (SETTLED). ship=false. Tools: work/b66prof.py, rate.py, dec.py, dec2.py (short single-process runs, no heavy job) +Scope: PLAN.json profiles of PR heads (#649, #645, #646, #635, #626) + B15 invoice root + B15 per-register climb shapes (#626 canonical word, same helper skeleton as #649). Base = #649. +## Gate (PASSED, exact) +b(#649)=0.00165526410310589141 (=README to 21 digits), #645 kappa 1.649483702558979e-3, #646 kappa 1.627103256702062e-3, #635 1.636241501576388e-3: all reproduced from PLAN profile {r:n} via root of sum r n_r/(mW) (m/r)^a = 1. +## Rate table: % b per helper removed (all 72 calls, climbs leave, width w returns to idle), on #649; linear in k (k=1,5,12,35 within 3%) +| w | no merge (narrow w-child) | merge into 48-bins | k=35 w9 (narrow / merge48) | +| 9 | 0.0725 | 0.141 | +2.48% / +5.11% | +| 8 | 0.050 | 0.119 | | +| 7 | 0.038 | 0.101 | | +| 5 | 0.031 | 0.084 | | +| 4 | 0.026 | 0.072 | | +(re-pack with own packer = the merge48 column is its upper bound; see #646 below: realised ~ narrow.) +## #646 decomposition (vs #635, its true parent; #645 is NOT its parent: #646 has 22 ends, no gauge) +Realised db = -0.559% (kappa 1.636242 -> 1.627103e-3). Per-call width inventory change: w4 -6, w7 -14, w8 +6, w9 +2 (net -12 helpers; sum width -55.7/call). +- Pure helper-count/width effect, priced at B15 shapes: +0.31% (narrow) / +1.00% (merge48). POSITIVE. +- Realised minus predicted profile: +4100 unit, +4973 width-2 children, -1458 w5, -796 w4, -930 w7 (mass pushed into 1/2-wide climbs: surviving helpers' transported residuals climb more) => residual -0.87% (narrow) / -1.54% (merge48). +- Packing: realised 48-window count +9 vs +97 needed for full merge: #646 realised ~ NO-MERGE (narrow) hosting. +So helper-removal is not negative; -0.9% is the climb/shape cost of the #646 transport, an unpriced side effect (loses cheap early endings), not a negative rate. +## Why the register disagreed +B15 0.068 = w9 narrow; 0.137-0.143 = w9 merge48 (best case, needs re-packing that #646 did not realise); B2 0.043 gross/0.027 net = mostly width-7 helpers (narrow w7 = 0.038) minus lost cold ends and read climbs; #646 negative = a different package-wide climb change, not the rate. All consistent once width and merge rule are stated. +## Settled rate +Per w9 helper: 0.072% b (realised/no-merge), 0.14% only with perfect 48-merge. Realised rates incl. side costs of triangle-style removals: ~0.0 to 0.03% (B2 net, #646 -0.56%/12). Use 0.07% as the GO-bar rate for a clean (climb-neutral) removal; 0.027% for triangle-type removals. +## Re-priced GO helper counts (cap +4.72% b, GO ~ +0.3% kappa) +- 35 w9 helpers: +2.5% b (clean, narrow), +5.1% only with merge (B54's +5% is the merge case). Cap reached at ~65 w9 (narrow), ~33 (merge48). +- GO (+0.3%): ~4-5 w9 clean; ~11 at triangle-type net 0.027%. +- 56 cross-block totals (B7/X4 are a hypothetical skeleton per judge, not a shipped word; width unknown): at w9 = +4.1% (narrow) / +7.9% (merge); at w7 = +2.1% / +5.7%; i.e. about half the register's 8% figure when no-merge. +- Un-triangled 504 Gauge56 (SYN-2 vs B56): helper axis alone is +0.31% .. +1.0% for the 12 helpers back or forth; sign hinges on the climb residual (-0.9% for 8 triangles); SYN-2's + side needs the climb cost to be avoided. Not resolved by rate alone; the rate is positive, B56's "net negative" is the transport residual. +Not done: #656 profile; true re-pack with a package packer (merge-vs-narrow bracketed, #646 shows near-narrow). diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/P4/B54-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/P4/B54-NOTES.md new file mode 100644 index 0000000000..3246edb4b1 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/P4/B54-NOTES.md @@ -0,0 +1,27 @@ +# B54: complex s=9 -> 7 joint with R. VERDICT: KILLED at the gate. ship=false +Tools: work/s7.py (+ B15 calc.py/reg.py copies; B15 files untouched). Model: #626 words (ck/jp8 canonical replay), geometry parametrised by P: +m=1+8(2P+1), W=2PTv, D=T[2Pv-(2P+1)cst], calls=T(2P+1), idle I=calls*8(s-3)*v, per-call local = 1856 + sum w (unchanged by P). +## Gate (tooling): PASSED +P=4 gives 73/7168/2560/72; B15 calc.py reproduces b(#626)=0.0016382067123080868626 (mass identity residual 0.0 at s=9 and s=7). +Own fractional-idle s9 baseline is 1.63872e-3 (+0.03% vs exact B0, idle shape only); all ratios below use the same convention at both s. +## s=7 invoice (56 calls, 8 ck + 48 jp8, m=57, W=5376, D=1792) +- I(7)=200,704. Hz(7)=8*3858+48*3902=218,248. Overflow 17,544 (8.7% of Hz). Per call: ck 3858 / jp8 3902 vs 3584 allowed. +- Cheapest legal treatment = minimal helper cut (mass-neutral). The v4 "unhosted slots" convention is the same b with R unchanged, so it is not a separate price. +- Fit needs k=34.6 w9 helpers cut per call (all calls), R 492 -> ~457 (-7.1%). R* = 0.93 R(#626/#643), so inside the 0.85 line. +- ck alone needs 30.4, jp8 alone 35.3 (ck is the lighter provider; the gain is the 4 helpers, ~0.5% b; #643 moved the other way). +## Gate (economics): KILL +| k cut (R) | b9 vs b9(k=0) | b7 | b7 / b9 same R | +| 35 (457) | +5.04% | 1.7249e-3 | +0.21% | +| 40 (452) | +5.80% | 1.7371e-3 | +0.20% | +| 60 (432) | +8.96% | 1.7877e-3 | +0.13% | +Required b7 >= +3% over b9 at R*: got +0.21%. The decay with k continues: helper-free s7 loses. +Deep k (b x1e3, ovf = hosting overflow impossible, all feasible): k=234 s9 2.412 / s7 2.395 / s5 2.303; k=300 2.783/2.749/2.611; k=480 4.793/4.611/4.108. +So in this model the descent is worse than s9 at every R: D/(mW) +19.5% is eaten by mean ln(m/r) (m 73 -> 57, unit climbs dominate), net -0.7..-3.8%. The "+11.7% helper-free ceiling" is not realised with the #626 local profile; it would need the P=3 local program to have a different (fewer-unit) profile, which is the unpriced template risk. +## Joint table (per w9 helper cut, all calls) +s=9 alone: ~0.14%/helper (+5.0% for 35, matches B15 48-merge 0.137%). s=7: the same 35 cut only buys admission (hosting fits), final b7 = b9 + 0.21%. The switch adds ~nothing beyond the cut; the 35 helpers are worth the same +5% at s=9 with no descent. There is no 3x multiplier. +## s=5 line +I(5)=40*16*v=71,680, Sum w <= 1792 per call, i.e. ~234 w9 helpers cut (R ~258); b5/b9 = 0.955 there, 0.857 at k=480. Dead on this model; B20 skeleton prize does NOT gain from the s descent. +## Caps and credit +Capped at +5.72% (B53, #555): b7 tight (1.7249e-3 vs frontier b 1.6392e-3) is +5.2% only because of the 35 helper cut, which is delivered by nothing; the same cut at s9 gives +5.0%. Without the cut: s=7 infeasible (overflow). Uncapped marginal of s=7 over s=9: +0.2%. Credit from the descent itself: 0. +## Not done +Bank legality in the complex verifier (moot after the gate; verifier pins m=73/D=2560/72 calls). P=3 local program not built; the sign could change only if its local profile is far lighter in unit climbs (rescue: build a P=3 template, owner MIP; not worth it at a 0.2% margin vs a -3.8% model slope). diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B11-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B11-NOTES.md new file mode 100644 index 0000000000..8554b8c560 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B11-NOTES.md @@ -0,0 +1,29 @@ +# B11: climb-width economics, legal frame coarsening. VERDICT: LOCAL-PRICE (fast kill gate hit; gain 0.0%). ship=false + +Scope: the shipped #623 providers ck (8 calls) and jp8 (64 calls), CANONICAL-WORD.json.gz of r40/base/work/k492b/{ck,jp8}-local, A+B+tail op frames, fixed scalar word, fixed op ORDER, fixed start/final/centre frames. Tools in work/ (coarse.py opt.py opt3.py upper.py hist*.py lower.py). + +## Model (all from the checkers, hpe_emit_local.py / gk_word.profile / hpe_audit_local.py) +A climb is paid only when a register's frame changes between touches. Legal frame assignment = per-register monotone nested chain, ONE common frame per ADD, start <= first, last <= final (targets end at perp(port), dim 8; U-ended helpers at U), centre frame == cf at the A/B boundary, tail/cleanup as given. Profile reproduced exactly: ck {1:2596,2:552,3:304,4:160,5:70,6:8,8:8} (3698 climbs, mass 5714), jp8 {1:2512,2:400,3:448,4:160,5:70,6:8,8:8}. Frame choice does not change mass, only shape (b ~ 1/mass-weighted ln(m/r); S=sum r ln r is the objective). + +## Gate +(a) Bounds per op: lazy lower bound G (join of start frames along chains) and eager upper bound U (caps, reverse closure). F0(shipped) == G on 4201/4507 (ck) and 3837/4471 (jp8) ops; G==U (zero freedom) on 3581/4507 and 3133/4471. Only ~926 / 1338 ops have any slack. + - All-eager (U) assignment: ck climbs 3972, jp8 3972; global b ratio 0.9695 (WORSE, -3.0%). All-lazy (G): 3860 climbs, worse. + - Hill-climb with raise-cascades (opt.py): 28 of 43k candidate merges even feasible, 0 improving. + - SA with bidirectional cascade moves inside [G,U] (opt3.py), ck and jp8, T0 0.3 and 1.0, 6M moves each: best dS = 0 for all four runs. Shipped frames are a local optimum for this neighbourhood: 0.0% b (<0.3% gate). +(b) Blocking histogram for the 2081 (ck) / 1993 (jp8) unit mid-chain climbs (no cheaper merge): transitive cap via partner chain 77.5%, direct target perp(port) cap 17.7-18.5%, lowerable 3.2-3.5% (SA shows still no gain), raisable 0.7%, U-end helper 0.5%, centre cf 0.2%. One SPEC rule family (common frame at ADD + monotone chain + target-end frame perp(port) + support from source start frames) blocks >= 96%. => KILL criteria met (gain < 0.3% and rule share >= 90%). Cold-end widths / FULL-lock / owner charts are NOT the binding rules; the audit_allcold owner/dirt layer is never reached. +(c) Deficit: emit_allcold.py asserts M*DATA - sum(paid) == 2560 literal (also assemble.py, invoice_allcold.py, audit_allcold.py). paid = per-call local profiles (64 jp8 + 8 ck) + idle remainders (rank-hosted). It is a literal re-pinned constant: invariant under mass-conserving coarsening, but any change of local mass changes it by 72 per unit per call (and breaks the pins). Not free to scale. + +## Escape 2, mass padding +Dummy wide climbs would ADD mass; the engine needs mass = mW - deficit exactly (assertion), so dummy mass must displace real mass, which is a forced cover. Arithmetic upper bound if it could: moving 1% of unit-climb mass into width-9 climbs gives only +0.26% b (so +1% needs about 4% of unit mass). Adding mass beyond the cover lowers the deficit and the bound. Not legal and not useful. + +## Verdict: LOCAL-PRICE. Not proven globally; scope above (fixed op order). +Escapes (>=3): +1. Reorder gates: commuting adds (dst1!=src2, dst2!=src1) in A/B change the chains; gate_move_coalesce used only 2 moves. Search op ORDER jointly with frames (per order the optimal F needs a DP/ILP). Largest untested lever. +2. Change target end frame (perp(port), dim 8) or the ports/geometry: targets' cap is the root cap (about 96% of blocks); a geometry with looser target ends would unlock coarsening. +3. Pre-climb sources (1->9 at start, 112 width-8 climbs, same mass) needs source ops to avoid target-touching ops (cap perp(p_t)); would need a K-triangle schedule where source reads precede target caps. +4. Re-derive the owner/idle layer so deficit grows with geometry (not done). +Rescue check (not run): SA over adjacent commuting swaps in A/B/tail with the opt3 frame SA as inner loop; if S gain >= ~170/word-equivalent (+1% b) reopen escape 1. +Queued CPU jobs: none (gate killed). Shape bounds +22%/+40% from B3R are unreachable by frame choice at fixed order. + +## Rescue-check job (queued) +Jobs B11_reorder_ck, B11_reorder_jp8 (cpuq/pending; logs jobs/B11_reorder_*.log). work/reorder.py: SA over adjacent commuting swaps within A/B/tail (adds commute iff dst1!=src2 and dst2!=src1; B_K-legality NOT separately modelled; cleanup would need regeneration) plus local frame moves; objective S, price = float root b. Log lines: "HH:MM:SS NEWBEST b ratio S .. swaps .. it .." and final "END b .. ratio ..". Best (order, frames, profile, b) pickled to work/reorder_{ck,jp8}.pkl. 90 s test: ratio 1.0 (no gain yet). Only a ratio >1 reopens escape 1 (then audit and exact-replay required). diff --git a/research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B3R-NOTES.md b/research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B3R-NOTES.md new file mode 100644 index 0000000000..a97ea917bf --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/evidence/P5/B3R-NOTES.md @@ -0,0 +1,28 @@ +# B3R: rank-8 SSS (hourglass) word, priced. VERDICT: LOCAL-PRICE (word built + exact; engine pricing ill-posed at fixed cover). ship=false + +Scope: #623 ck provider word content map M (112x112, exact replay of ck-step7-cold_end A+B+cut), moment engine complex-allcold/engines/moment.py, m=73, W=7168. Files here: m.py hr.py fit.py sss.py build.py price.py price2.py clmb.py (B3 tools copied, not edited). + +## Gate (passed, not killed) +Shipped word climb mass (monotone frame replay, clmb.py): A+B+cut 4932 (3364 climbs, widths 1:2420 2:536 3:200 4:200 5:8); with cleanup to FULL 6186. 716 registers. +SSS word: 8 helpers, mass 1976 (0.32x of 6186). Gate ratio << 1.15 -> proceed. + +## Structure found (key fact) +- M has Hankel rank <=8 at every cut, and EXACTLY: for every row i, M[i,ji] = P_i . R_j with R_j the integer D8 root vectors (root_lines), O_i,P_i 8-vectors with ~3 nonzeros, entries in {0,+-1/8,+-1/4,+-3/8,+-1/2} (a few early-row pinv artifacts, rationalised to /64 with exact check), D = diag(+-1/2). So SSS order 8 with A_k = I, B_j = R_j (entries 0,+-1): no mixing generators, no LR basis change needed (state basis already integer, minimal-span LR form irrelevant). +- Word (sss.py/build.py): 8 centre helpers c; sweep i: y_i += (O_i-P_i).c, then c += R_i u_i; second pass y_i += P_i.c (c=total) and y_i += (D_i - P_i.R_i) u_i; uncompute c. 1372 adds. EXACT replay: max err 0.0, centres return to 0, sources untouched. +- Frames (ports from word, minimal union frames, all regs end FULL=9): climbs 414, mass 1976, widths {1:152 2:20 3:19 4:6 5:12 6:18 7:42 8:64 9:81}. Centres all FULL immediately (ports of any 9 sources span F2^9). Frame is NOT the wall: mass is just the mandatory end-climb floor (sources 8, targets 9, helpers 9). +- Not done: transposed orientation (Tellegen transpose of the op list gives M^T, itself SSS-8; trivial but not emitted), local-program events (wrappers/centre events), cleanup-phase refactor, owner-map MIP. + +## Pricing (engine facts, the real finding) +- check_moment/invoice assert m*W - sum(r*n) == deficit (2560): paid climb mass is a FORCED COVER of the live families, not a cost to minimise. Helpers are the rank SUPPLIERS (4428 of 6186 mass/call). b solves sum_r p_r (m/r)^a = 1 with p_r = r n_r/(mW): b ~ (deficit fraction)/(mass-weighted mean ln(m/r)). Wider climbs are cheaper per unit mass. +- SSS x72 at W=7168: mass 142,272 vs 520,704 required (27%): deficit 380,992 != 2560; certify() fails its bracket (root a>0.003; a=0.51 unbracketed) -> the word cannot occupy the shipped cover; price undefined/invalid. Thus 'fewer helpers' is not a gain on this metric by itself. +- Shape-only bounds (same total mass 520,704, counts rescaled, NOT realizable as stated): shipped profile b=0.0016382 (reproduced); SSS-shaped profile b=0.0020048 (+22%); shipped word with every register climbing once (max coalescing) b=0.0022888 (+40%). Mean ln(m/r): shipped 2.99, SSS 2.44. + Caveat: these require supplying the same mass in wide climbs; legality of coarse frames (PR583 frame_coalesce / frame_regroup already exploit it) and of padding mass is unverified. Treat as an upper-bound lens, not a result. No incremental verified gain found. + +## Verdict: LOCAL-PRICE +Scope: fixed-W (7168), fixed-deficit cover, word-level profile; SSS-8 word is valid/exact but supplies 27% of required cover mass, so it prices as infeasible on the shipped cover. Not proven that no SSS-based cover exists. +Escapes (>=3): +1. Re-solve the cover: shrink W (live) so m*W - mass = deficit with the SSS profile (new geometry, fewer data families per call or more calls per word); needs owner/window MIP, ~hours. +2. Mass padding: supply the missing ~5256 mass/call in few WIDE climbs (cold dummy/idle children climbing 0->9, or hosted-residual banks) -> engine says wide mass is cheaper (shape bound b up to 0.0020). Needs legality check of idle/dummy climbs vs owner charts. +3. Hybrid: keep shipped K-triangle helpers for mass/ownership but replace pair/quad helper network by SSS centres in the A/B body; or merge width-1 climbs in the shipped word toward the max-coalescing profile (shape bound +40%): check what frame legality forbids beyond PR583. +4. Different cover interpretation of deficit (2560 fixed constant in emit_allcold.py): derive it; if deficit can scale with geometry, fewer climbs is a gain. +Rescue check (not run, ~40 min): take shipped ck word, compute the max legal coarsening of frames per register (union frames at first touch subject to the owner/dirt audit in audit_allcold.py) and rerun price2.py on the real resulting profile; if b rises >=1% with audits passing, reopen escape 3; also determine in emit_allcold.py/audit_allcold.py why deficit==2560. diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/derived/k492_registers.json b/research/format-limits-2/s1-2-erratum-invoice/inputs/derived/k492_registers.json new file mode 100644 index 0000000000..d5ca0fc75b --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/inputs/derived/k492_registers.json @@ -0,0 +1 @@ +{"ck":{"word_sha256_decompressed":"9bbc75dede090cfd7a0a0252424ea9d9f6211e2350d2a801d4e4f2f0784167c7","v":112,"R":492,"centers":[229,224,227,225,243,241,259,257],"local_profile":{"1":2596,"2":552,"3":304,"4":160,"5":70,"6":8,"8":8},"regs":[[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,4,2],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,3],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,1,2,2],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,4,2],[1,1,3,1,1,1],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,5],[1,1,3,3],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,2,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[2,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[2,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,1,1,1,2,1],[2,1,1,1,2,1],[1,1,1,1,1,2,1],[2,1,1,1,2,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[2,1,1,1,2,1],[2,2,3,1],[1,1,4,1,1],[2,4,1,1],[1,1,1,1,1,2,1],[2,1,1,1,2,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[2,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[2,1,1,1,2,1],[2,2,3,1],[1,1,4,1,1],[2,4,1,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[2,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,1,1,4,8,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,8,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,8,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1,2,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1,2,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,8,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,8,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1,2,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1,2,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,4,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,2,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,1,2,1,1,1],[1,1,1,6],[1,1,1,1,2,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[1,2,2,1,1,1],[2,2,2,1,1,1],[1,2,2,1,1,1],[2,2,2,1,1,1],[1,2,2,1,1,1],[2,2,2,1,1,1],[1,2,2,1,1,1],[2,2,2,1,1,1],[2,3,1,1],[2,3,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[2,3,1,1],[2,4,2],[2,4,2],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[1,2,2,1,1,1],[2,2,2,1,1,1],[1,2,2,1,1,1],[2,2,2,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,1],[2,4,1],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,2],[2,4,2],[2,3,3],[1,2,3,3],[2,3,3],[1,2,3,3],[1,2,2,1,1,1],[2,2,2,1,1,1],[1,2,2,1,1,1],[2,2,2,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,1],[2,4,1],[1,2,3,3],[1,2,3,3],[1,2,3,3],[1,2,3,3],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[1,1,2,2,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,2],[2,4,2],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[1,2,1,1,4],[1,2,1,1,4],[2,4,1],[2,4,1],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[1,2,1,1,4],[1,2,1,1,4],[2,4,2],[2,4,2],[1,2,3,3],[1,2,3,3],[1,2,3,3],[1,2,3,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[1,2,1,1,4],[1,2,1,1,4],[2,4,1],[2,4,1],[1,2,3,3],[2,3,3],[1,2,3,3],[2,3,3],[2,2,3],[2,2,3],[2,2,3],[2,2,3],[1,2,1,1,4],[1,2,1,1,4],[2,3,1,1],[1,2,3,3],[2,3,3],[1,2,3,3],[2,3,3],[2,3,3],[1,2,3,3],[2,3,3],[1,2,3,3],[2,3,1,1],[2,3,1,1],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,3,3],[1,2,3,3],[1,2,3,3],[1,2,3,3],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[3,1,1,2,1],[3,1,1,2,1],[3,1,1,2,1],[1,1,2,1],[3,1,1,2,1],[1,1,2,1],[1,1,2,1],[1,1,2,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[1,1,1,1],[4,1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[1,1,1,1],[4,1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,1,1,2,1],[3,1,1,2,1],[3,1,1,2,1],[1,1,2,1],[3,1,1,2,1],[1,1,2,1],[1,1,2,1],[1,1,2,1]]},"jp8":{"word_sha256_decompressed":"fb4a8d14ed2a8048698bea6ae16f86163a1aa6c80f2eb622222eee5cdbce9b3b","v":112,"R":492,"centers":[229,224,227,225,243,241,259,257],"local_profile":{"1":2512,"2":400,"3":448,"4":160,"5":70,"6":8,"8":8},"regs":[[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,4,2],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,3],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,1,2,2],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,1,3,1],[1,1,1,5],[1,1,4,2],[1,1,3,1,1,1],[1,1,1,5],[1,1,3,1,1,1],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,1,2,2],[1,1,1,1,2,1,1],[1,1,1,5],[1,1,4,2],[1,1,1,5],[1,1,1,5],[1,1,3,3],[1,1,1,5],[1,1,1,5],[1,1,1,5],[1,1,3,1,1,1],[1,1,1,5],[1,1,1,5],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[2,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[2,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,1,1,1,2,1],[2,1,1,1,2,1],[1,1,1,1,1,2,1],[2,1,1,1,2,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[2,1,1,1,2,1],[2,2,3,1],[1,1,4,1,1],[2,4,1,1],[1,1,1,1,1,2,1],[2,1,1,1,2,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[2,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,4,1,1],[2,1,1,1,2,1],[2,2,3,1],[1,1,4,1,1],[2,4,1,1],[1,1,4,1,1],[1,1,1,1,1,2,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[2,1,1,1,2,1],[1,1,4,1,1],[2,2,3,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,4,1,1],[1,1,1,1,4,8,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,8,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,2,1,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1,1,3,1],[1,1,1,3,1,1,1],[1,1,1,6],[1,1,1,3,1,1,1],[1,1,1,4,2],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,1,4,1],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,1,1,2,2],[1,1,1,3,3],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,1,4,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,1,1,2,2],[1,1,1,3,1,1,1],[1,1,1,3,1,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[2,3,1,1],[2,3,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[2,3,1,1],[2,4,2],[2,4,2],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,1],[2,4,1],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,2],[2,4,2],[3,3,3],[3,3,3],[3,3,3],[3,3,3],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,1],[2,4,1],[3,3,3],[3,3,3],[3,3,3],[3,3,3],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[1,2,3,1,1,1],[2,1,1,2,1,1],[2,1,1,2,1,1],[2,4,2],[2,4,2],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,1,1,4],[1,2,1,1,4],[2,4,1],[2,4,1],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,1,1,4],[1,2,1,1,4],[2,4,2],[2,4,2],[1,2,3,3],[1,2,3,3],[1,2,3,3],[1,2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,1,1,4],[1,2,1,1,4],[2,4,1],[2,4,1],[1,2,3,3],[2,3,3],[1,2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[1,2,1,1,4],[1,2,1,1,4],[2,3,1,1],[1,2,3,3],[2,3,3],[1,2,3,3],[2,3,3],[3,3,3],[3,3,3],[3,3,3],[3,3,3],[2,3,1,1],[2,3,1,1],[2,3,3],[2,3,3],[2,3,3],[2,3,3],[3,3,3],[3,3,3],[3,3,3],[3,3,3],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[2,3,1,1],[3,1,1,2,1],[3,1,1,2,1],[3,1,1,2,1],[1,1,2,1],[3,1,1,2,1],[1,1,2,1],[1,1,2,1],[1,1,2,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[1,1,1,1],[4,1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[4,1,1,1,1],[1,1,1,1],[4,1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[3,2,1,1,1],[2,1,1,1],[3,2,1,1,1],[2,1,1,1],[2,1,1,1],[2,1,1,1],[3,1,1,2,1],[3,1,1,2,1],[3,1,1,2,1],[1,1,2,1],[3,1,1,2,1],[1,1,2,1],[1,1,2,1],[1,1,2,1]]}} \ No newline at end of file diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr555/EXPECTED.json.gz b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr555/EXPECTED.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..dedbf29ea04347f2b144cb64390f45bb5a50a1ee GIT binary patch literal 1862 zcmV-M2f6qkiwFn+00002|3z3(MMG3YL@sJ`Z*BnXSX*!8wiSN&uMnmWNdfPg_sb%A z*sKc#?Mo3LeJKip5~&%*8cCHj_Ra?R?>!_Xjb=Qv+n@#VvW8(wJa?YUNBP&gZ1d9g zZu2ht^)AacWmS84-Z(qjhrAm9qV|XJO@}dl`^(TaZ?~T|_cNavc9w7v*l}Laf>XzG zTQW^#AuK`#rP^DnCFfW$i7it|GRK?_bmy$|j#%atS4nBnHluIGm0pKjNeiW|S4=Bi zGQ@apu~67@PrNP*S6ZsPLlogc*}UXfaZV-XyvRLGdb`>-Yo)v(OtT!E1-%GkMiJ8< zOX6~hXbuKF;Sc~A0ADe;*h%e*oH)sf+1bwac0a7uIxy?86Q$=;AW{-WG(kC6#22i< zl=>1hJI^cxQ#y&TEi}qyDLgnm`T7j1;I!lOPw>pBPUa3xF&=s!GWAc`$S}H(3y%xO zX`yKmaS>^eBrZxP0gPe!S5(^j(N>LjW^6}W51?94iRg}|x6RWqTa)*{^Y3EA`J#2c zH;~+6w9N<_Mf7sBwWA-V!pk;~r@*t#dw3y8rf4=lz?;M=ip_^W;*!A2Z&3|s9Zzcf z$FaAjuzg?oK5S3twE5-GJeilOk0z(RzIZleU3H0X(O9>ItSWVzZC#DW#aIvL*1O;tk%Y1&RJ8kj+n5r( z^5*^HV7<51pAB74`%2f zTj%`Dd@!)-dnleBLh1)^EI4wg>vKkK{$VNylP={uP?k(Vn-uk7sM=-;>t~ZgMLwCb z?e}Mj{(7k;ZU4>qe;=To&Ewhj2U88^XHzxNvrD`2d~0u?t7f}c{$yg0n)7xX+CyJ> z^U_x{Z7S)RJ@hNn`Wkm6sYy{f^)(5Lwa@^^7>EE0iHg)T5Fjs6YU%`6?UyP@?MGE& zoq8_LycB7YZo#l^oO!Amw-QYrefK79J*K06Vu=@1aTC(m)HEA>^Ryvr+O=(UYkQ_W+0hiVHz1>FwN7Vt2$q&_s!pb z%KpSL%DxQ`OwcSazKP=}8~q+`3!}f!D9L&cOHF%dn%Vy8nci(52pe#RT0SX_iv)!n>x7{&8K8!k3w=ePNHds;^ z=R^?-D;5N4jk$cl=*G{53IlLk?QIx18}t^T>*}T(Oy5q|y%W4qg&0#OfMW=;xhVt0 z5x6R?P>x8+*a_%}rc$h+PNJy|Bia$c^h9MrH&G|}%i}Oje$;?Rk-S*$cEs++@1ie>@ew)IxGCkroVNPN~9@;|Kn^vX6DsxDZ=V*ET8iS@&i&$U zlKFi=(*8cP2Um?5TqrWQ=CxJfUqRO^hyqlKfXMha!wR3SqZ1=ia6;hZ2;-1sp{Tsp zH2)qv2wR31;i_~@KVGGnQIGm5W+5M7Qq6>o?qer>P*qaroRb4Q%=CG(JdT^5!yR!EU! zEx7lj^ip}sykrgw$GGx 0 (non-star totals with no pairing-rank floor; star scope broken); + idlefree the B_K idle frame changes cost nothing; + idle_onechild all idle frame changes of one copy batched into one child (cross-stretch batching); + nosplit bridges moved off the idle stretches (no split pre-stretch); + loc_h data local climbs batched up to the window h (cross-register batching inside a stage); + idlefree_loch idle free and local batching to h at once; + window w-1 a family whose stage window is one smaller at the same copy ratio x. +Multiplier = (best-s root of the variant) / (best-s root of the theorem), and the same at s = 9. +These are the multipliers quoted in the rule table of README section B. +""" +from fractions import Fraction as Fr + +from report import check, finish, near +from skel import X + +S_LIST = (3, 5, 7, 9, 11, 13) +UNITS = {'bit-111/63': (8, 63, 111), 'cx-112/64': (9, 64, 112)} +VARIANTS = ('copyfree', 'idlefree', 'idle_onechild', 'nosplit', 'loc_h', 'idlefree_loch', 'window-1') +# (best-s multiplier, s = 9 multiplier), two decimals +EXPECTED = { + 'bit-111/63': {'copyfree': (6.77, 2.79), 'idlefree': (1.67, 2.14), 'idle_onechild': (1.19, 1.55), + 'nosplit': (1.15, 1.18), 'loc_h': (1.12, 1.03), 'idlefree_loch': (1.79, 2.28), + 'window-1': (1.16, 1.16)}, + 'cx-112/64': {'copyfree': (6.91, 2.83), 'idlefree': (1.68, 2.15), 'idle_onechild': (1.20, 1.55), + 'nosplit': (1.15, 1.18), 'loc_h': (1.08, 1.02), 'idlefree_loch': (1.79, 2.27), + 'window-1': (1.14, 1.14)}, +} + + +def roots(h, x, variant): + out = {} + for s in S_LIST: + r = X(s, h, 1, x, variant) + out[s] = r['hi'] if r else Fr(0) + return out + + +for name, (h, cst, v) in UNITS.items(): + x = Fr(cst, v) + base = roots(h, x, 'thm') + b_best = max(base.values()) + for var in VARIANTS: + rr = roots(h - 1, x, 'thm') if var == 'window-1' else roots(h, x, var) + best = max(rr.values()) + sb = max(rr, key=rr.get) + mult = (float(best / b_best), float(rr[9] / base[9])) + exp = EXPECTED[name][var] + check('A5.%s.%s' % (name, var), near(mult[0], exp[0], 2) and near(mult[1], exp[1], 2), + 'best %.4e (s = %d): x%.2f; s = 9: x%.2f' % (best, sb, mult[0], mult[1])) +finish() diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/cert.py b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/cert.py new file mode 100644 index 0000000000..351fbd107c --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/cert.py @@ -0,0 +1,133 @@ +"""Certified (rational interval) pressure-root tools. +g_q(r) = r*((m/r)^q - 1). Root of sum_i z_i g_q(r_i) = D (increasing in q). +All transcendental values are enclosed by rational intervals (Fraction endpoints, outward rounding).""" +from fractions import Fraction as Fr +import math + +DEN = 10**45 # outward rounding grid + + +def rd(x): # round down to grid + return Fr(math.floor(x * DEN), DEN) + + +def ru(x): + return Fr(math.ceil(x * DEN), DEN) + + +def ln_iv(x): + """enclosure of ln(x), x = Fraction > 0, via ln x = 2 atanh(z), z=(x-1)/(x+1); reduce by powers of 2.""" + x = Fr(x) + assert x > 0 + if x == 1: + return (Fr(0), Fr(0)) + # reduce: x = 2^e * y, y in [1/sqrt2, sqrt2] (use [2/3, 4/3]-ish via loop) + e = 0 + while x > Fr(4, 3): + x /= 2; e += 1 + while x < Fr(2, 3): + x *= 2; e -= 1 + lo2, hi2 = LN2 + lo, hi = _atanh2(x) + return (rd(lo + e * (lo2 if e >= 0 else hi2)), ru(hi + e * (hi2 if e >= 0 else lo2))) + + +def _atanh2(x): + z = (x - 1) / (x + 1) + az = abs(z) + s = Fr(0); t = z; k = 0 + N = 40 + for k in range(N): + s += t / (2 * k + 1) + t *= z * z + # tail bound: |sum_{k>=N} z^(2k+1)/(2k+1)| <= |z|^(2N+1)/((2N+1)(1-z^2)) + tail = az ** (2 * N + 1) / ((2 * N + 1) * (1 - z * z)) + s = 2 * s; tail = 2 * tail + return (rd(s - tail), ru(s + tail)) + + +def _ln2(): + # ln 2 = 2 atanh(1/3) + z = Fr(1, 3); s = Fr(0); t = z + N = 60 + for k in range(N): + s += t / (2 * k + 1); t *= z * z + tail = z ** (2 * N + 1) / ((2 * N + 1) * (1 - z * z)) + return (rd(2 * s - 2 * tail), ru(2 * s + 2 * tail)) + + +LN2 = _ln2() + + +def expm1_iv(lo, hi): + """enclosure of e^y - 1 for y in [lo,hi], 0 <= lo <= hi <= 1.""" + assert 0 <= lo <= hi <= 2 + N = 30 + + def ser(y): + s = Fr(0); t = Fr(1) + for i in range(1, N + 1): + t = t * y / i; s += t + return s + slo = ser(lo) # all terms >= 0 -> lower bound + shi = ser(hi) + 8 * hi ** (N + 1) / math.factorial(N + 1) # tail <= y^(N+1)/(N+1)! * e^y, e^y<=8 (y<=2) + return (rd(slo), ru(shi)) + + +def g_iv(r, m, q): + """enclosure of r*((m/r)^q - 1), q Fraction >= 0.""" + if r >= m: + return (Fr(0), Fr(0)) if r == m else None + l_lo, l_hi = ln_iv(Fr(m) / r) + lo, hi = expm1_iv(q * l_lo, q * l_hi) + return (r * lo, r * hi) + + +def F_iv(prof, m, q): + """prof: dict rank -> count (Fractions/ints allowed), returns enclosure of sum z g_q(r).""" + lo = Fr(0); hi = Fr(0) + for r, z in prof.items(): + if z == 0: + continue + a, b = g_iv(Fr(r), Fr(m), Fr(q)) + lo += z * a; hi += z * b + return (rd(lo), ru(hi)) + + +def root_bracket(prof, m, D, lo=Fr(0), hi=Fr(1, 10), iters=60): + """returns (qlo, qhi) with F(qlo) < D (certified via upper enclosure) and F(qhi) >= D (via lower enclosure): + the true root lies in [qlo, qhi]. qhi is a certified UPPER bound of the root.""" + D = Fr(D) + assert F_iv(prof, m, hi)[0] >= D, 'hi too small' + for _ in range(iters): + mid = rd((lo + hi) / 2) + flo, fhi = F_iv(prof, m, mid) + if flo >= D: + hi = mid + elif fhi < D: + lo = mid + else: + break + return lo, hi + + +def cost_iv(prof, m): + """enclosure of Cost = sum z r ln(m/r).""" + lo = Fr(0); hi = Fr(0) + for r, z in prof.items(): + if z == 0 or r >= m: + continue + a, b = ln_iv(Fr(m) / r) + lo += z * r * a; hi += z * r * b + return lo, hi + + +if __name__ == '__main__': + # self-test against floats + for x in (Fr(64, 7), Fr(73, 8), Fr(100, 3), Fr(3, 2), Fr(1, 5)): + lo, hi = ln_iv(x) + assert lo <= Fr(math.log(x)) + Fr(1, 10**12) and hi >= Fr(math.log(x)) - Fr(1, 10**12), x + assert hi - lo < Fr(1, 10**40), (x, float(hi - lo)) + print('ln ok', float(LN2[1] - LN2[0])) + lo, hi = expm1_iv(Fr(1, 100), Fr(1, 100)) + print('expm1(0.01)', float(lo), math.expm1(0.01), float(hi - lo)) diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/report.py b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/report.py new file mode 100644 index 0000000000..5593062527 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/report.py @@ -0,0 +1,60 @@ +"""Shared paths and PASS/FAIL reporting for the checks of research/format-limits. + +Every check prints one line per claim: 'PASS ' or 'FAIL ', and finish() exits +with status 1 if any claim failed. Paths: PKG is this package, DATA its data/ directory, REPO the repository root +(the package lives at REPO/research/format-limits; files of main are read from REPO and pinned in DEPENDS.json). +""" +import gzip +import json +import os +import pathlib +import sys + +HERE = pathlib.Path(__file__).resolve().parent +PKG = HERE.parent +DATA = PKG / 'data' +VENDOR = DATA / 'vendor' +REPO = pathlib.Path(os.environ.get('FORMAT_LIMITS_REPO', PKG.parent.parent)).resolve() + +_failed = [] + + +def check(cid, ok, detail=''): + print(('PASS ' if ok else 'FAIL ') + cid + (' ' + str(detail) if detail != '' else ''), flush=True) + if not ok: + _failed.append(cid) + return ok + + +def near(x, expected, places): + """x agrees with a value printed to `places` decimals: |x - expected| <= 0.6 * 10^-places (half a unit of the last + printed digit plus slack, so a float computed with a different library build cannot flip a rounding boundary).""" + return abs(float(x) - float(expected)) <= 0.6 * 10.0 ** (-places) + + +def near_all(xs, expected, places): + xs, expected = list(xs), list(expected) + return len(xs) == len(expected) and all( + (x == e) if isinstance(e, int) and not isinstance(e, bool) and p is None else near(x, e, p) + for x, e, p in zip(xs, expected, places)) + + +def finish(): + if _failed: + print('FAILED CLAIMS: ' + ' '.join(_failed), flush=True) + sys.exit(1) + + +def load_json(path): + path = pathlib.Path(path) + if path.suffix == '.gz': + return json.loads(gzip.decompress(path.read_bytes())) + return json.loads(path.read_text()) + + +def main_file(rel): + """a file of the repository's main branch (pinned by sha256 in DEPENDS.json).""" + p = REPO / rel + if not p.exists(): + sys.exit('missing file of main: %s (run from a checkout of the whole repository)' % rel) + return p diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/skel.py b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/skel.py new file mode 100644 index 0000000000..e3c6c815b6 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr595/skel.py @@ -0,0 +1,85 @@ +"""R-free skeleton bound for the B_K compressed-window format (per port, v=1; v cancels). +Slots (per replica / v): + active : s stages x 2 wires (X,Y banks of the active pair) x one climb of a = h-k, child cap a + copies : s stages x cst/v = x (mass), child cap beta_max <= h (use h; E8: beta = 8 = h exactly) + idle : 2 copies-per-port x idle stretches of the B_K schedule, slot rank r, child cap max(r, h) +D/v = (s-1) k - s x ; m = k + s (h-k). +Variants switch individual scope assumptions off (see NOTES).""" +from fractions import Fraction as Fr +from cert import root_bracket, cost_iv, F_iv +import sys + + +def idle_slots(K, a, split=True): + sl = [] + if K >= 1 and 2 * K - 2 > 0: + sl.append(a * (2 * K - 2)) # pair 0 tail + for p in range(1, K): + if split: + sl += [2 * p * a, a] # pre-stretch split by the bridge + else: + sl += [(2 * p + 1) * a] + if 2 * K - 2 * p - 2 > 0: + sl.append(a * (2 * K - 2 * p - 2)) + return sl + + +def profile(s, h, k, x, variant='thm'): + """returns (prof, m, D) per port. prof: rank -> (fractional) count; mass at cap c entered as count mass/c at rank c.""" + assert s % 2 == 1 and s >= 3 + K = (s - 1) // 2 + a = h - k + m = k + s * a + x = Fr(x) + prof = {} + + def add(cap, mass): + if mass == 0: + return + cap = Fr(cap) + if cap >= m: # child of rank m costs nothing + return + prof[cap] = prof.get(cap, 0) + Fr(mass) / cap + loc_cap = h if variant in ('loc_h', 'idlefree_loch') else a + add(loc_cap, 2 * s * a) # active data climbs + xx = Fr(0) if variant == 'copyfree' else x + add(h, s * xx) # copies + if variant not in ('idlefree', 'idlefree_loch'): + for r in idle_slots(K, a, split=(variant != 'nosplit')): + if variant == 'idle_onechild': + continue + cap = r if variant == 'nohostcap' else max(r, h) + add(cap, 2 * r) + if variant == 'idle_onechild': # all idle of a copy in one child (cross-stretch batching) + for tot in idle_per_pair(K, a): + add(max(tot, h), 2 * tot) + D = (s - 1) * k - s * xx + return prof, m, D + + +def idle_per_pair(K, a): + out = [] + if 2 * K - 2 > 0: + out.append(a * (2 * K - 2)) + for p in range(1, K): + out.append(a * (2 * K - 1)) + return out + + +def X(s, h, k, x, variant='thm'): + prof, m, D = profile(s, h, k, x, variant) + if D <= 0: + return None + lo, hi = root_bracket(prof, m, D, hi=Fr(1, 2)) + clo, chi = cost_iv(prof, m) + return dict(s=s, m=m, D=D, lo=lo, hi=hi, DoverCost=D / clo, cost=clo) + + +if __name__ == '__main__': + h, k, x = int(sys.argv[1]), int(sys.argv[2]), Fr(sys.argv[3]) + variant = sys.argv[4] if len(sys.argv) > 4 else 'thm' + for s in range(3, 32, 2): + r = X(s, h, k, x, variant) + if r is None: + print(s, 'D<=0'); continue + print('s=%2d m=%3d D/v=%6.3f root in [%.9e, %.9e] D/Cost=%.9e' % (s, r['m'], float(r['D']), r['lo'], r['hi'], float(r['DoverCost'])), flush=True) diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr626/PLAN.json.gz b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr626/PLAN.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..946f686425d608f7e763d7fb83eb43853d55ed08 GIT binary patch literal 8195 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 literal 0 HcmV?d00001 diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr635/PLAN.json.gz b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr635/PLAN.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3c9c938b24d3734d767f9142dafef76f5b926793 GIT binary patch literal 8235 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 literal 0 HcmV?d00001 diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/pr645/PLAN.json.gz b/research/format-limits-2/s1-2-erratum-invoice/inputs/pr645/PLAN.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..90d4d8457208ff89dc9281012587c2c8be014b11 GIT binary patch literal 7175 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 literal 0 HcmV?d00001 diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho01.cpp b/research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho01.cpp new file mode 100644 index 0000000000..f051ce74aa --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho01.cpp @@ -0,0 +1,31 @@ +// 0-1 BFS: min #locals to reach each pair-preserving monomial target rho over F2. bridges cost 0 (counted separately: second value = min bridges among min-local words via lexicographic cost nl*1000+nb). +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef unsigned long long u64; +int P,NB; +u64 pack(const vector&r){u64 x=0;for(int i=0;i unpack(u64 x){vectorr(NB);for(int i=0;i>(i*NB))&((1<2?atoi(argv[2]):2*P+2; + vector> loc; for(int p=0;p> br; for(int d=0;d id(NB);for(int i=0;i dist; dist.reserve(4000000); + priority_queue,vector>,greater<>> pq; // cost=nl*1000+nb + u64 s0=pack(id);dist[s0]=0;pq.push({0,s0}); + while(!pq.empty()){auto [c,x]=pq.top();pq.pop();if(dist[x]!=c)continue; if(c/1000>maxnl)break; + auto r=unpack(x); + for(auto&l:loc){auto q=r;q[l.first]^=q[l.second];int nc=c+1000;u64 y=pack(q);auto it=dist.find(y);if(it==dist.end()||it->second>nc){dist[y]=nc;pq.push({nc,y});}} + for(auto&b:br){auto q=r;q[b[0]]^=q[b[1]];q[b[2]]^=q[b[3]];int nc=c+1;u64 y=pack(q);auto it=dist.find(y);if(it==dist.end()||it->second>nc){dist[y]=nc;pq.push({nc,y});}} + } + vector perm(P);iota(perm.begin(),perm.end(),0); + do{for(int m=0;m<(1<t(NB);for(int p=0;p>p)&1))); + auto it=dist.find(pack(t));printf("perm=");for(int p:perm)printf("%d",p);printf(" swapmask=%d : ",m);if(it==dist.end())printf("unreached<=%d locals\n",maxnl);else printf("locals=%d bridges=%d\n",it->second/1000,it->second%1000);} + }while(next_permutation(perm.begin(),perm.end())); + printf("states %zu\n",dist.size());} diff --git a/research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho_bfs.py b/research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho_bfs.py new file mode 100644 index 0000000000..4cda99695c --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/inputs/r39s/rho_bfs.py @@ -0,0 +1,49 @@ +# Scalar-layer (F2) search: min #locals (then #bridges) for each pair-preserving monomial target rho. +# banks: X_p=2p, Y_p=2p+1 ; state = tuple of row bitmasks (bank i = XOR of inputs). Chain: locals alternate with bridge groups. +import sys, itertools +from collections import deque +P=int(sys.argv[1]); NB=2*P +def apply_add(st,d,s): + l=list(st); l[d]^=l[s]; return tuple(l) +ident=tuple(1< bank + t[2*p+e]=1<<(2*q+(e^sw[p])) + targets[(perm,sw)]=tuple(t) +locals_=[] # (d,s): forward Y_p+=X_p ; backward X_p+=Y_p +for p in range(P): + locals_.append((2*p+1,2*p)); locals_.append((2*p,2*p+1)) +bridges=[] +for d in range(P): + for s in range(P): + if d!=s: bridges.append(((2*d,2*s),(2*s+1,2*d+1))) # X_d+=X_s ; Y_s+=Y_d +# Dijkstra-ish lexicographic over (nlocals, nbridges): BFS by nlocals layers w/ bridge closure (bridges free-cost count) +import heapq +best={} +start=(ident,-1) +pq=[(0,0,ident,-1)] +seen={} +res={} +while pq: + nl,nb,st,last=heapq.heappop(pq) + if (st,last) in seen: continue + seen[(st,last)]=(nl,nb) + for k,t in targets.items(): + if st==t and k not in res: res[k]=(nl,nb) + if nl>=2*P+2 and len(res)==len(targets): break + if nl>2*P+2: continue + for (d,s) in locals_: + p=d//2 + heapq.heappush(pq,(nl+1,nb,apply_add(st,d,s),p)) + for (a,b) in bridges: + st2=apply_add(apply_add(st,*a),*b) + heapq.heappush(pq,(nl,nb+1,st2,-1)) + if nb>6*(P-1)+2: pass +for k,v in sorted(res.items(),key=lambda x:x[1]): + print(k,v) diff --git a/research/format-limits-2/s1-2-erratum-invoice/tools/derive_registers.py b/research/format-limits-2/s1-2-erratum-invoice/tools/derive_registers.py new file mode 100644 index 0000000000..3fd48e85e9 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/tools/derive_registers.py @@ -0,0 +1,39 @@ +"""Derivation of inputs/derived/k492_registers.json (NOT run by verify.part.sh; it needs the rebuilt CANONICAL-WORD files). +usage: derive_registers.py + +Replays the monotone frame climbs of a CANONICAL-WORD (parts A, centers, B, tail, final) exactly as the hub's emit() does +(same logic as cards/B15/reg.py) and writes, per provider, the list of climb widths of every register, the class sizes +and the word's own local_profile. Widths are |frame after| - |frame before| (centre cut climbs are the descents to +level 0). The input words are the ck / jp8 local words rebuilt from the research/complex-k492-owner-repair code of #626.""" +import gzip, hashlib, json, sys + +def climbs(d): + F = {(p, i): e[-1] for p in ('A', 'B', 'tail') for i, e in enumerate(d[p])} + fr = d['frames']; cur = list(d['start']); out = [] + L = lambda f: len(fr[f]) + def climb(r, f): + if cur[r] == f: return + out.append((r, L(f) - L(cur[r]))); cur[r] = f + for part in ('A', 'centers', 'B', 'tail', 'final'): + if part in ('A', 'B', 'tail'): + for i, e in enumerate(d[part]): + for r in [e[1]] + ([e[2]] if e[0] == 'add' else []): climb(r, F[part, i]) + elif part == 'centers': + for k, r in enumerate(d['centers']): + cf = d['center_frames'][k] + terms = [e for e in d['cut'] if e[2] == r] + path = [cf] + sorted({0 for e in terms} - {cf}, key=lambda x: -L(x)) + for a in range(1, len(path)): out.append((r, L(path[a - 1]) - L(path[a]))) + else: + for r, f in enumerate(d['final']): climb(r, f) + return out + +res = {} +for prov in ('ck', 'jp8'): + path = '%s/%s-local/CANONICAL-WORD.json.gz' % (sys.argv[1], prov) + raw = gzip.open(path).read(); d = json.loads(raw) + n = 2 * d['v'] + d['R']; regs = [[] for _ in range(n)] + for r, w in climbs(d): regs[r].append(w) + res[prov] = {'word_sha256_decompressed': hashlib.sha256(raw).hexdigest(), 'v': d['v'], 'R': d['R'], + 'centers': d['centers'], 'local_profile': d['local_profile'], 'regs': regs} +json.dump(res, open(sys.argv[2], 'w'), separators=(',', ':')) diff --git a/research/format-limits-2/s1-2-erratum-invoice/tools/mksources.py b/research/format-limits-2/s1-2-erratum-invoice/tools/mksources.py new file mode 100644 index 0000000000..31a4444d39 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/tools/mksources.py @@ -0,0 +1,20 @@ +"""Writes SOURCES.part.json: vendored PR files (from tools/vendor.out.json) plus local (non-PR) files with sha256 pins.""" +import hashlib, json, os, sys +pkg = sys.argv[1] +files = json.load(open(os.path.join(pkg, 'tools', 'vendor.out.json'))) +local = [ + ('inputs/derived/k492_registers.json', 'derived', 'P1-P5: per-register climb widths of the ck / jp8 local words of #626, from tools/derive_registers.py applied to the CANONICAL-WORD.json.gz files of the k492b rebuild (r40/base/work/k492b/{ck,jp8}-local; rebuild from research/complex-k492-owner-repair code of #626 is RECORDED, not repeated). Binding: the invoice built from it reproduces the PLAN profile of #626 exactly (P1.gate-profile) and kappa to 18 digits'), + ('inputs/r39s/rho01.cpp', 'tool', 'E2: 0-1 BFS over F2 bank matrices (R39-S), run by checks/e2_rho.py'), + ('inputs/r39s/rho_bfs.py', 'tool', 'E2: independent Python Dijkstra at P = 2'), +] +ev = [(os.path.join('evidence', r, f), 'evidence') for r in sorted(os.listdir(os.path.join(pkg, 'evidence'))) for f in sorted(os.listdir(os.path.join(pkg, 'evidence', r)))] +desc = {'E2/rho01_P2.txt': 'output of rho01 2 (also regenerated by verify)', 'E2/rho01_P3.txt': 'output of rho01 3 (also regenerated by verify)', + 'E2/rho_bfs_P2.txt': 'output of rho_bfs.py 2', 'E2/R39-S-NOTES.md': 'R39-S card notes: gate, measurement, scope', + 'P1/B15-NOTES.md': 'B15 card notes: invoice chain and knob table', 'P2/B26-NOTES.md': 'B26 card notes: bit knob table (word-level rows RECORDED)', + 'P3/B66-NOTES.md': 'B66 card notes: rate table and #646 decomposition', 'P4/B54-NOTES.md': 'B54 card notes: s = 7 invoice and economics', + 'P5/B11-NOTES.md': 'B11 card notes: frame-SA outcome, blocking histogram', 'P5/B3R-NOTES.md': 'B3R card notes: SSS hourglass climb mass'} +out = list(files) +for rel, kind, used in [(a, b, c) for a, b, c in local] + [(p, k, desc.get(p[len('evidence/'):], '')) for p, k in ev]: + data = open(os.path.join(pkg, rel), 'rb').read() + out.append({'file': rel, 'kind': kind, 'sha256': hashlib.sha256(data).hexdigest(), 'used_for': used}) +json.dump({'description': 'PR files are copied unchanged (or gzip-compressed with mtime 0): blob = git blob id of the file at the cited commit (for a .gz copy: of the decompressed content). kind=derived/tool/evidence files are local and pinned by sha256.', 'files': out}, open(os.path.join(pkg, 'SOURCES.part.json'), 'w'), indent=1) diff --git a/research/format-limits-2/s1-2-erratum-invoice/tools/vendor.out.json b/research/format-limits-2/s1-2-erratum-invoice/tools/vendor.out.json new file mode 100644 index 0000000000..4bfe10f7c5 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/tools/vendor.out.json @@ -0,0 +1,90 @@ +[ + { + "file": "inputs/pr595/a5_scope_multipliers.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/a5_scope_multipliers.py", + "blob": "e45f8882ec6793868c75088810c47e041eb7e4e2", + "used_for": "E1: scope-multiplier script re-run unchanged" + }, + { + "file": "inputs/pr595/skel.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/skel.py", + "blob": "e3c6c815b604dd41d3807c78917806ae4a5c08a7", + "used_for": "E1: imported by a5" + }, + { + "file": "inputs/pr595/cert.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/cert.py", + "blob": "351fbd107c86a233a91eb915f88612c9f9ad6c26", + "used_for": "E1: imported by skel" + }, + { + "file": "inputs/pr595/report.py", + "pr": 595, + "commit": "39112c2577452fa278489fb9fd77a9aecb2cdc24", + "source_path": "research/format-limits/scripts/report.py", + "blob": "5593062527d6dbba99c7b1992390a3bf4f330a54", + "used_for": "E1: imported by a5" + }, + { + "file": "inputs/pr626/PLAN.json.gz", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair/data/PLAN.json", + "blob": "434a431937757def4e496301e3d33106f0026fa3", + "used_for": "P1,P3,P4: profile {width: count}, m = 73, live 7168, deficit 2560" + }, + { + "file": "inputs/pr626/README.md.gz", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair/README.md", + "blob": "58722c1a496f0c806e77c9d762eb00b0c53254f0", + "used_for": "P1: conditional kappa literal 0.001635527380375392" + }, + { + "file": "inputs/pr649/PLAN.json.gz", + "pr": 649, + "commit": "1b931ee055d738753778e1051300140c16ae219d", + "source_path": "research/gauge44-bit589/data/PLAN.json", + "blob": "9d5be193ad6a74a83d494e37ca2c43c43598ab84", + "used_for": "P3: base profile of the rate table" + }, + { + "file": "inputs/pr645/PLAN.json.gz", + "pr": 645, + "commit": "638a5171dd1aca89ff50d07dcbe288b567769804", + "source_path": "research/gauge44-global/data/PLAN.json", + "blob": "d561080e0f5f1570e095405b9e8a243150823896", + "used_for": "P3: profile reproduced" + }, + { + "file": "inputs/pr646/PLAN.json.gz", + "pr": 646, + "commit": "cdfe8273bb5054e0a837a3594309c6262e995b1f", + "source_path": "research/signed-root-k480/data/PLAN.json", + "blob": "28355d12849ced4c36c4d4534cabca47d92fa831", + "used_for": "P3: profile reproduced" + }, + { + "file": "inputs/pr635/PLAN.json.gz", + "pr": 635, + "commit": "a6895a69f8ad98ab45777b03e9e6f48888c39f6f", + "source_path": "research/complex-571-cold14-st2/data/PLAN.json", + "blob": "d7794713ddf9c1325d4a2142ad130b2395d27ae7", + "used_for": "P3: profile reproduced" + }, + { + "file": "inputs/pr555/EXPECTED.json.gz", + "pr": 555, + "commit": "65a6bc19f820c8b1873f65a517bcf70cd6887223", + "source_path": "research/e8-bit-p111/EXPECTED.json", + "blob": "c8ad4439e83f07bcda437598d6a4c31f4e65f2a9", + "used_for": "P2: nine-stage bit profile, live, shipped c" + } +] \ No newline at end of file diff --git a/research/format-limits-2/s1-2-erratum-invoice/tools/vendor.py b/research/format-limits-2/s1-2-erratum-invoice/tools/vendor.py new file mode 100644 index 0000000000..35298b6d77 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/tools/vendor.py @@ -0,0 +1,32 @@ +"""Builds inputs/ (gz copies of PR files) and SOURCES.part.json from a clone of CrocSwap/integer-mult-bounds. +usage: vendor.py . Needs the PR heads fetched as refs/kpr2/pr (git fetch origin pull/N/head:refs/kpr2/prN). +For a .gz copy of a non-.gz source the blob id is that of the decompressed content (as in #595 SOURCES.json).""" +import gzip, hashlib, json, os, subprocess, sys +clone, pkg = sys.argv[1:3] +def git(*a): return subprocess.check_output(('git', '-C', clone) + a) +PRS = [ + (595, 'research/format-limits/scripts/a5_scope_multipliers.py', 'inputs/pr595/a5_scope_multipliers.py', 0, 'E1: scope-multiplier script re-run unchanged'), + (595, 'research/format-limits/scripts/skel.py', 'inputs/pr595/skel.py', 0, 'E1: imported by a5'), + (595, 'research/format-limits/scripts/cert.py', 'inputs/pr595/cert.py', 0, 'E1: imported by skel'), + (595, 'research/format-limits/scripts/report.py', 'inputs/pr595/report.py', 0, 'E1: imported by a5'), + (626, 'research/complex-k492-owner-repair/data/PLAN.json', 'inputs/pr626/PLAN.json.gz', 1, 'P1,P3,P4: profile {width: count}, m = 73, live 7168, deficit 2560'), + (626, 'research/complex-k492-owner-repair/README.md', 'inputs/pr626/README.md.gz', 1, 'P1: conditional kappa literal 0.001635527380375392'), + (649, 'research/gauge44-bit589/data/PLAN.json', 'inputs/pr649/PLAN.json.gz', 1, 'P3: base profile of the rate table'), + (645, 'research/gauge44-global/data/PLAN.json', 'inputs/pr645/PLAN.json.gz', 1, 'P3: profile reproduced'), + (646, 'research/signed-root-k480/data/PLAN.json', 'inputs/pr646/PLAN.json.gz', 1, 'P3: profile reproduced'), + (635, 'research/complex-571-cold14-st2/data/PLAN.json', 'inputs/pr635/PLAN.json.gz', 1, 'P3: profile reproduced'), + (555, 'research/e8-bit-p111/EXPECTED.json', 'inputs/pr555/EXPECTED.json.gz', 1, 'P2: nine-stage bit profile, live, shipped c'), +] +files = [] +for pr, src, dst, gz, used in PRS: + commit = git('rev-parse', 'refs/kpr2/pr%d' % pr).decode().strip() + data = git('show', '%s:%s' % (commit, src)) + blob = git('rev-parse', '%s:%s' % (commit, src)).decode().strip() + out = os.path.join(pkg, dst); os.makedirs(os.path.dirname(out), exist_ok=True) + if gz: + with open(out, 'wb') as f: + with gzip.GzipFile(fileobj=f, mode='wb', mtime=0) as g: g.write(data) + else: + open(out, 'wb').write(data) + files.append({'file': dst, 'pr': pr, 'commit': commit, 'source_path': src, 'blob': blob, 'used_for': used}) +json.dump(files, open(os.path.join(pkg, 'tools', 'vendor.out.json'), 'w'), indent=1) diff --git a/research/format-limits-2/s1-2-erratum-invoice/verify.part.sh b/research/format-limits-2/s1-2-erratum-invoice/verify.part.sh new file mode 100644 index 0000000000..d4025e7299 --- /dev/null +++ b/research/format-limits-2/s1-2-erratum-invoice/verify.part.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Bundle A (sections 1-2: Erratum and scope E1-E2; Invoice calculus and prices P1-P5). Prints one PASS/FAIL line per +# assertion; exit status 0 only if all pass. Standard library only (python >= 3.11); a C++ compiler is used by E2 if present +# (otherwise E2 parses the shipped evidence). About 20 s. usage: bash verify.part.sh (PYTHON=... to choose python) +# E1_FULL=1 bash verify.part.sh also runs #595's a5_scope_multipliers.py unchanged (all 7 variants, +56 s). +set -uo pipefail +HERE=$(cd "$(dirname "$0")" && pwd) +PY="${PYTHON:-python3}" +export PYTHONDONTWRITEBYTECODE=1 +status=0 +run() { "$PY" -I -B "$HERE/checks/$1" || status=1; } +echo "== A.1 erratum and scope"; run e1_scope_multipliers.py; run e2_rho.py +echo "== A.2 invoice calculus and prices"; run p1_knobs.py; run p2_bit.py; run p3_rate.py; run p4_s7.py; run p5_cover.py +if [ $status -eq 0 ]; then echo "== bundle A: all PASS"; else echo "== bundle A: FAILURES"; fi +exit $status diff --git a/research/format-limits-2/s3-4-census-gauges/SOURCES.part.json b/research/format-limits-2/s3-4-census-gauges/SOURCES.part.json new file mode 100644 index 0000000000..8bd76fb8dc --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/SOURCES.part.json @@ -0,0 +1,109 @@ +{ + "description": "Vendored inputs of bundle B. files = copied from open PRs of CrocSwap/integer-mult-bounds (blob = git blob id of the source file at the cited commit; verified by checks/b_provenance.py). derived = rebuilt words that are not files of any PR; they are checked against the hashes their PR pins.", + "files": [ + { + "file": "inputs/pr656/PLAN.json.gz", + "pr": 656, + "commit": "0805e78f5fecc700804d4766d7e3e1d7d7e6a2ba", + "source_path": "research/gauge44-layered-b/data/PLAN.json", + "blob": "b7d894d3fe98606587a72eee97f2dbb25a0072d3", + "stored": "gzip of the source file (blob id is of the decompressed content)", + "used_for": "C1: profile, M=73, W=7168, deficit 2560; provider pins of the shipped gauge44 word" + }, + { + "file": "inputs/pr626/GENERATED-IDENTITY-CONTROLS.json", + "pr": 626, + "commit": "660de893d27bb7abd1d5b01b1640207528a5c851", + "source_path": "research/complex-k492-owner-repair-validation/linux/GENERATED-IDENTITY-CONTROLS.json", + "blob": "901387218f1b2251016cbb5f2d487c923a29a1a3", + "stored": "unchanged copy", + "used_for": "C2, C3: pins (raw and canonical-content sha256) of the ck provider word" + }, + { + "file": "inputs/pr645/FULL-WORD.json.gz", + "pr": 645, + "commit": "638a5171dd1aca89ff50d07dcbe288b567769804", + "source_path": "research/gauge44-global/evidence/local/FULL-WORD.json.gz", + "blob": "447d45d08bf4b054d2fa76a0dc00a3b0f168fe91", + "stored": "unchanged copy", + "used_for": "G1, G2: the #645 Gauge44 forward word" + }, + { + "file": "inputs/pr531/PACKET-PROGRAMS.json.gz", + "pr": 531, + "commit": "e07a8a3f9f79c22113398a0c5dbbc7601f489b3e", + "source_path": "research/direct-delivery504-global/inputs/hamming/PACKET-PROGRAMS.json.gz", + "blob": "e98ce5d879e99427347acd725efc3b0c96fe5c13", + "stored": "unchanged copy", + "used_for": "G1, G2: Hamming block source lines" + }, + { + "file": "inputs/pr531/PROTOTYPE.json.gz", + "pr": 531, + "commit": "e07a8a3f9f79c22113398a0c5dbbc7601f489b3e", + "source_path": "research/direct-delivery504-global/inputs/hamming/PROTOTYPE.json", + "blob": "9efe30ee107b9c67f15f1c726e1a1cb5cef03929", + "stored": "gzip of the source file (blob id is of the decompressed content)", + "used_for": "G1, G2: binary_ports" + } + ], + "derived": [ + { + "file": "inputs/derived/g44-CANONICAL-WORD.json.gz", + "kind": "derived (rebuilt, not a file of any PR)", + "sha256": "72a4952751383e2a5e84b967f1e76fdfda003fe5592df357a599232e586817e3", + "content_sha256": "94fc985d6ab90967bfe995de41581690bcdb6dbade69e594b0130ef3da0c6314", + "pinned_in": "PR 656 @0805e78f data/PLAN.json provider_registry.gauge44.artifact_sha256 (bytes) and artifact_semantic_sha256 (content: sha256 of json.dumps(sort_keys, compact separators))", + "rebuilt_by": "PR 656 construction/reproduce.py --until word, then construction/layers/reproduce_layers.py (about 9 min; pinned #635 a6895a69 checkout)", + "used_for": "C1: shipped #656 gauge44 canonical word" + }, + { + "file": "inputs/derived/g44-TAGS.json", + "kind": "derived (annotation, NOT pinned by any PR)", + "sha256": "0977be8f1226d678c941cd61597621c47f4ed1193bfc1f15456c53fe75dd37f2", + "rebuilt_by": "copy of construction/construct_gauge_xcentre.py with a tag argument at each of its 4 alloc() sites; its raw FULL-WORD output was compared by hash with the pinned one (card B76); register id = key - 16; the tagged rebuild's raw FULL-WORD (decompressed bytes) has sha256 0ac47f92fc2e..., equal to word_content_sha256.raw in #656 construction/INPUTS.json (re-verified at packaging)", + "used_for": "C1: allocation site of each of the 492 helpers" + }, + { + "file": "inputs/derived/ck-CANONICAL-WORD.json.gz", + "kind": "derived (rebuilt, not a file of any PR)", + "sha256": "ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45", + "content_sha256": "9bbc75dede090cfd7a0a0252424ea9d9f6211e2350d2a801d4e4f2f0784167c7", + "pinned_in": "PR 626 @660de893 research/complex-k492-owner-repair-validation/linux/GENERATED-IDENTITY-CONTROLS.json source_providers.ck.raw / .semantic", + "rebuilt_by": "the k492b ck provider chain of PR 626 (research/complex-k492-owner-repair-validation)", + "used_for": "C2, C3: the ck provider word of #626 (8 calls)" + } + ], + "evidence": [ + { + "file": "evidence/C1/STEPS.json", + "sha256": "e2a8a53212979de70e0f9e9fbd457736d167819e97d455ea3ccc2f1b6356fb0d", + "what": "card B76 rebuild of the #656 word: step exit codes (pivot-swap ... wrappers), all 0", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "evidence/C1/ledger_by_step.csv", + "sha256": "4916e77c90696678cc3cb4e320a1fbec622e9d6bd4ca4b3e2a84ad1844ce5518", + "what": "card B76 output of the C1 ledger (per allocation site)", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "evidence/C1/ledger_helpers.csv", + "sha256": "16ce8ff00f35e5b88bf82aebf56ad1ddeded5fdb7897829b6e1ab3595786c16b", + "what": "card B76 output of the C1 ledger (492 helpers: site, block|slot, climbs, mass)", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "evidence/C1/ledgers.log", + "sha256": "171c61ffe5eb12bb2704ba6a1b576c587e0068da750d5cc33e47e7abe9924a85", + "what": "card B76 rebuild: ledgers step log", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + }, + { + "file": "evidence/G2/rep1.log", + "sha256": "109af7d78dd5fc77b75b77ee9b575d72b1d2a4835bc0168be59525f88db7d228", + "what": "card B58 rebuild of the #645 cold44 word (shadow-early ... cold44-exact all PASS; 5.9 s); command: nice -n19 timeout 1500 python3 construction/reproduce.py", + "kind": "existing run log/output, shipped unchanged; no solver (SAT/CP-SAT/DRAT) was used by rows C1-C3, G1-G3" + } + ] +} \ No newline at end of file diff --git a/research/format-limits-2/s3-4-census-gauges/checks/b_pins.py b/research/format-limits-2/s3-4-census-gauges/checks/b_pins.py new file mode 100644 index 0000000000..e1b440d990 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/checks/b_pins.py @@ -0,0 +1,16 @@ +"""Cross-pins of bundle B: the rebuilt (derived) words against the hashes their PRs publish. (The vendored files themselves are checked +by scripts/provenance.py, step 0 of verify.sh.)""" +import json, os +from common import * +S = json.load(open(os.path.join(ROOT, '..', 'SOURCES.json'))) +PFX = os.path.basename(ROOT) + '/' +D = {e['file'][len(PFX):]: e for e in S['derived'] if e['file'].startswith(PFX)} +plan = load_json('pr656', 'PLAN.json.gz'); g = plan['provider_registry']['gauge44'] +d = D['inputs/derived/g44-CANONICAL-WORD.json.gz'] +check('B.0 pin: #656 PLAN.json gauge44 CANONICAL-WORD bytes', g['artifact_sha256']['CANONICAL-WORD.json.gz'] == d['sha256']) +check('B.0 pin: #656 PLAN.json gauge44 CANONICAL-WORD content', g['artifact_semantic_sha256']['CANONICAL-WORD.json.gz'] == d['content_sha256']) +gi = load_json('pr626', 'GENERATED-IDENTITY-CONTROLS.json')['source_providers']['ck'] +d = D['inputs/derived/ck-CANONICAL-WORD.json.gz'] +check('B.0 pin: #626 identity controls ck CANONICAL-WORD bytes', gi['raw']['CANONICAL-WORD.json.gz'] == d['sha256']) +check('B.0 pin: #626 identity controls ck CANONICAL-WORD content', gi['semantic']['CANONICAL-WORD.json.gz'] == d['content_sha256']) +finish() diff --git a/research/format-limits-2/s3-4-census-gauges/checks/c1_census_656.py b/research/format-limits-2/s3-4-census-gauges/checks/c1_census_656.py new file mode 100644 index 0000000000..9d7f69032c --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/checks/c1_census_656.py @@ -0,0 +1,83 @@ +"""C1: provenance census of the shipped #656 gauge44 word (492 helpers, 4 allocation sites) and the exact kappa identity. +Inputs: PR 656 data/PLAN.json (blob-checked), the rebuilt canonical word (hash-pinned by that PLAN), TAGS.json (rebuilt annotation, NOT pinned).""" +import math +from collections import Counter, defaultdict +from decimal import Decimal as D, localcontext +from common import * + +plan = load_json('pr656', 'PLAN.json.gz'); d = load_json('derived', 'g44-CANONICAL-WORD.json.gz') +M, W, deficit = plan['M'], plan['live'], plan['deficit'] +H = {int(k): v for k, v in plan['profile'].items()} + +def root(H): + with localcontext() as c: + c.prec = 50 + terms = [(D(r) * D(n) / D(M * W), (D(M) / D(r)).ln()) for r, n in H.items() if n] + lo, hi = D(0), D('0.01') + for _ in range(300): + a = (lo + hi) / 2 + if sum(p * (a * l).exp() for p, l in terms) < 1: lo = a + else: hi = a + return (lo + hi) / 2 + +# ---- kappa identity (needs only the PR file) +check('C1 PLAN mass = M*W - deficit', sum(r * n for r, n in H.items()) == M * W - deficit, '%d = 73*7168-2560' % (M * W - deficit)) +b = root(H); kappa = b / (1 + b) +check('C1 root(PLAN profile): b = 0.00165684913780230798', str(b).startswith('0.00165684913780230798'), str(b)[:26]) +check('C1 kappa = b/(1+b) = 1.654108529511355e-3', str(kappa).startswith('0.001654108529511355'), str(kappa)[:24]) + +# ---- per-register climbs of the word (port of the replay used by the cards; climb = frame-dimension increase on first use or at the end) +def climbs(d): + F = {(p, i): e[-1] for p in ('A', 'B', 'tail') for i, e in enumerate(d[p])} + fr = d['frames']; cur = list(d['start']); out = [] + L = lambda f: len(fr[f]) + def climb(r, f): + if cur[r] == f: return + out.append((r, L(f) - L(cur[r]))); cur[r] = f + for part in ('A', 'centers', 'B', 'tail', 'final'): + if part in ('A', 'B', 'tail'): + for i, e in enumerate(d[part]): + for r in [e[1]] + ([e[2]] if e[0] == 'add' else []): climb(r, F[part, i]) + elif part == 'centers': + for k, r in enumerate(d['centers']): + cf = d['center_frames'][k] + terms = [e for e in d['cut'] if e[2] == r] + path = [cf] + sorted({0 for e in terms} - {cf}, key=lambda x: -L(x)) + for a in range(1, len(path)): out.append((r, L(path[a - 1]) - L(path[a]))) + else: + for r, f in enumerate(d['final']): climb(r, f) + return out +out = climbs(d); v, R = d['v'], d['R'] +prof = Counter(w for r, w in out) +lp = {int(k): n for k, n in d['local_profile'].items()} +check('C1 word local_profile {1:2542,2:414,3:434,4:154,5:56,8:8}', lp == {1: 2542, 2: 414, 3: 434, 4: 154, 5: 56, 8: 8}, lp) +check('C1 replayed climb profile == local_profile (3608 climbs)', dict(prof) == lp and sum(prof.values()) == 3608, sum(prof.values())) +ex = Counter(H) +for r, n in lp.items(): ex[r] -= 72 * n +ex = {r: n for r, n in ex.items() if n} +check('C1 PLAN profile = 72 x local profile + non-register extras {2:4,3:4,5:1,7:1,16:2,32:1,48:2398}', ex == {2: 4, 3: 4, 5: 1, 7: 1, 16: 2, 32: 1, 48: 2398}, ex) + +# ---- allocation sites (TAGS.json: rebuilt annotation, not pinned by the PR) +T = load_json('derived', 'g44-TAGS.json'); tag = {int(k) - 16: x for k, x in T.items()} +check('C1 TAGS cover exactly the 492 helper ids', R == 492 and set(tag) == set(range(2 * v, 2 * v + R)) and v == 112, (v, R)) +cen = set(d['centers']); phi = lambda r: r * math.log(73 / r) +per = defaultdict(list) +for r, w in out: per[r].append(w) +site = {r: tag[r][0][0] for r in tag} +cnt = Counter(site.values()) +check('C1 helpers born at 4 sites: S1 block scratch 224, S3 packet copy 156, S4 slot copy 112 (sum 492)', + len(cnt) == 3 and sum(cnt.values()) == 492 and sorted(cnt.values()) == [112, 156, 224], dict(cnt)) +s1c = sorted(r for r in cen if r in tag) +check('C1 S1 = 221 + 3 centres (the 3 centres among helper ids are S1 slots 224, 240, 256)', s1c == [224, 240, 256] and all(site[r].startswith('S1') for r in s1c) and sum(1 for r in tag if site[r].startswith('S1') and r not in cen) == 221, s1c) +mass = {s: sum(phi(w) for r in tag if site[r] == s for w in per[r]) for s in cnt} +S1, S3, S4 = [next(s for s in cnt if s.startswith(p)) for p in ('S1', 'S3', 'S4')] +hel = sum(mass.values()); xy = sum(phi(w) for r, w in out if r < 2 * v) +glob = sum(phi(r) * n for r, n in H.items()) / 72 +check('C1 narrow mass per call (sum r ln(73/r) over climbs): S1 6902, S3 4430, S4 2754', all(abs(mass[s] - x) < 0.6 for s, x in zip((S1, S3, S4), (6902, 4430, 2754))), [round(mass[s], 1) for s in (S1, S3, S4)]) +check('C1 helpers 14085, X/Y registers 6637; helpers = 68% of register narrow mass', round(hel) == 14085 and round(xy) == 6637 and round(100 * hel / (hel + xy)) == 68, (round(hel), round(xy))) +check('C1 share of global narrow mass 32.3 / 20.7 / 12.9 % (global incl. 3.1% idle windows, 31.0% X/Y)', [round(100 * mass[s] / glob, 1) for s in (S1, S3, S4)] == [32.3, 20.7, 12.9] and round(100 * xy / glob, 1) == 31.0 and round(100 * (glob - hel - xy) / glob, 1) == 3.1, round(glob)) +sh = [100 * mass[s] / hel for s in (S1, S3, S4)] +c3 = sum(phi(w) for r in tag if r in cen for w in per[r]) +check('C1 share of helper narrow mass (S1 without centres) 47.9 / 31.4 / 19.5 %', [round(100 * (mass[S1] - c3) / hel, 1), round(sh[1], 1), round(sh[2], 1)] == [47.9, 31.4, 19.5], [round(100 * (mass[S1] - c3) / hel, 1), round(sh[1], 1), round(sh[2], 1)]) +check('C1 S3 + S4 = 268 helpers (numerical equality with the pure-dirt count of C2)', cnt[S3] + cnt[S4] == 268) +finish() diff --git a/research/format-limits-2/s3-4-census-gauges/checks/c2_dirty_borrow.py b/research/format-limits-2/s3-4-census-gauges/checks/c2_dirty_borrow.py new file mode 100644 index 0000000000..8714b9da16 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/checks/c2_dirty_borrow.py @@ -0,0 +1,110 @@ +"""C2: the shipped complex word is a dirty-borrow program, not a clean SLP. Exact rational replay of the ck provider word of #626 +(A + cut + B events; value = a register's exact row up to scale, frames by subspace inclusion), and the same dirt count on the #656 gauge44 word.""" +import sys +from fractions import Fraction as Q +from collections import Counter, defaultdict +from common import * + +def ap(e, rows): + if e[0] == 'scale': + _, t, a, b = e[:4]; q = Q(a, b); rows[t] = {j: q * x for j, x in rows[t].items()} + else: + _, t, s, a, b = e[:5]; q = Q(a, b) + for j, x in list(rows[s].items()): + z = rows[t].get(j, Q(0)) + q * x + if z: rows[t][j] = z + else: rows[t].pop(j, None) +def norm(r): + if not r: return None + k = min(r); c = r[k]; return tuple(sorted((j, x / c) for j, x in r.items())) + +def cover_census(d): + V = d['v']; n = len(d['start']); fr = d['frames'] + ss = [] + for f in fr: + s = {0} + for b in f: s |= {x ^ b for x in s} + ss.append(frozenset(s)) + FULL = frozenset(range(1024)) + S = lambda f: FULL if f is None else ss[f] + rows = [{r: Q(1)} for r in range(n)] + cur = [norm(rows[r]) for r in range(n)] + holders = defaultdict(set); readers = defaultdict(list) + for r in range(n): holders[cur[r]].add(r) + seq = d['A'] + d['cut'] + d['B'] + for T, e in enumerate(seq): + if e[0] == 'add': readers[cur[e[2]]].append((T, e[-1])) + ap(e, rows); t = e[1]; cur[t] = norm(rows[t]); holders[cur[t]].add(t) + nvals = totH = totC = over = 0 + for val, hs in holders.items(): + rd = readers.get(val, []) + if not rd or val is None: continue + nvals += 1 + # min chain cover of the readers (order: time, then frame inclusion) = #readers - max bipartite matching (Dilworth/Fulkerson) + adj = [[b for b in range(len(rd)) if b != a and (rd[a][0], a) < (rd[b][0], b) and S(rd[a][1]) <= S(rd[b][1])] for a in range(len(rd))] + match = {} + def aug(a, seen): + for b in adj[a]: + if b in seen: continue + seen.add(b) + if b not in match or aug(match[b], seen): match[b] = a; return True + return False + m = sum(1 for a in range(len(rd)) if aug(a, set())) + totH += len(hs); totC += len(rd) - m + if len(hs) > len(rd) - m: over += 1 + return nvals, totH, totC, over + +def peak_redundant(d): + V = d['v']; n = len(d['start']) + rows = [{r: Q(1)} for r in range(n)] + seq = d['A'] + d['cut'] + d['B'] + lastread = [-1] * n + for T, e in enumerate(seq): + if e[0] == 'add': lastread[e[2]] = T + cur = [norm(rows[r]) for r in range(n)]; peak = 0 + for T, e in enumerate(seq): + ap(e, rows); cur[e[1]] = norm(rows[e[1]]) + if T % 20 == 0: + live = set(r for r in range(2 * V, n) if lastread[r] > T and cur[r] is not None) + vals = {} + for r in range(n): + if r in live or r < V: vals.setdefault(cur[r], []).append(r) + red = 0 + for v, rs in vals.items(): + hs = [r for r in rs if r >= 2 * V] + if hs: red += len(hs) - (0 if [r for r in rs if r < V] else 1) + peak = max(peak, red) + return peak + +def dirt(d): + V = d['v']; n = len(d['start']) + rows = [{r: Q(1)} for r in range(n)] + for e in d['A'] + d['cut']: ap(e, rows) + pre = [dict(r) for r in rows] + readers = {e[2] for e in d['B'] if e[0] == 'add' and e[2] >= 2 * V} + zero = {s for s in readers if not any(j < V for j in pre[s])} # clean row = columns of the 112 source registers + for e in d['B']: ap(e, rows) + cl = lambda r: {j: x for j, x in r.items() if j < V} + tclean = all(cl(rows[V + p]) == {p: Q(1)} for p in range(V)) + lens = [len(rows[t]) for t in range(V, 2 * V)] + return readers, zero, tclean, min(lens), max(lens) + +ck = load_json('derived', 'ck-CANONICAL-WORD.json.gz'); V = ck['v'] +check('C2 ck word: v = 112, R = 492 helpers, 716 registers', V == 112 and ck['R'] == 492 and len(ck['start']) == 716) +nv, th, tc, ov = cover_census(ck) +check('C2 ck: 2056 distinct read values; every value\'s readers form ONE chain (min chain cover 2056)', nv == 2056 and tc == 2056, (nv, tc)) +check('C2 ck: 2483 (value, holder) pairs, 259 values held by >1 register at some time (sequential reuse)', th == 2483 and ov == 259, (th, ov)) +pk = peak_redundant(ck) +check('C2 ck: peak simultaneous redundant live helpers = 0 (sampled every 20 ops)', pk == 0, pk) +rd, zero, tclean, lo, hi = dirt(ck) +check('C2 ck: 422 helpers are read in B; 268 of them have an all-zero clean (source-column) row: pure dirt scratch', len(rd) == 422 and len(zero) == 268, (len(rd), len(zero))) +check('C2 ck: clean (zero-ancilla) map is t_p = s_p for all 112 targets; the real target rows have 36-97 terms over the 716 coordinates', tclean and lo == 36 and hi == 97, (lo, hi)) + +# the same dirt count on the #656 gauge44 word, and the join with C1's allocation sites +g = load_json('derived', 'g44-CANONICAL-WORD.json.gz') +rd, zero, tclean, lo, hi = dirt(g) +T = load_json('derived', 'g44-TAGS.json'); site = {int(k) - 16: x[0][0][:2] for k, x in T.items()} +s34 = {r for r, s in site.items() if s in ('S3', 'S4')} +check('C2 #656 gauge44 word: B-read helpers with an all-zero clean row (count, and equal as a SET to the S3 + S4 allocation sites of C1)', + zero == s34 and len(s34) == 268, (len(rd), len(zero), len(zero & s34))) +finish() diff --git a/research/format-limits-2/s3-4-census-gauges/checks/c3_cap_f2_9.py b/research/format-limits-2/s3-4-census-gauges/checks/c3_cap_f2_9.py new file mode 100644 index 0000000000..a5444f1d84 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/checks/c3_cap_f2_9.py @@ -0,0 +1,23 @@ +"""C3: the 112 ports of the ck provider word form a cap in F2^9 (no three XOR to 0) and every hyperplane misses at least 48 of them.""" +import math +from common import * +P = load_json('derived', 'ck-CANONICAL-WORD.json.gz')['ports']; S = set(P) +check('C3 112 distinct nonzero ports in F2^9', len(P) == 112 and len(S) == 112 and 0 not in S and max(P) < 512) +trip = sum(1 for i in range(112) for j in range(i + 1, 112) if (P[i] ^ P[j]) in S) +check('C3 cap: no three ports XOR to 0', trip == 0, trip) +miss = min(sum(1 for p in P if bin(p & h).count('1') & 1) for h in range(1, 512)) +check('C3 every hyperplane (511) misses at least 48 ports, and some hyperplane misses exactly 48', miss == 48, miss) +# consequence used in the notes (ARGUED, short proof in README): k readers' ports have rank r with k <= 2^(r-1) (a cap of F2^r has <= 2^(r-1) points), +# so an operand frame inside the common perp has dim <= 9 - r <= 8 - ceil(log2 k). Numerical instance: rank of 8 ports of a cap is >= 4. +def rank(vs): + b = {} + for x in vs: + for p in sorted(b, reverse=True): + if x >> p & 1: x ^= b[p] + if x: b[x.bit_length() - 1] = x + return len(b) +import random +random.seed(1) +mn = min(rank(random.sample(P, 8)) for _ in range(20000)) +check('C3 sampled 8-subsets of ports (20000): rank >= 4, so dim of the common perp <= 5', mn >= 4, mn) +finish() diff --git a/research/format-limits-2/s3-4-census-gauges/checks/common.py b/research/format-limits-2/s3-4-census-gauges/checks/common.py new file mode 100644 index 0000000000..d713fcc863 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/checks/common.py @@ -0,0 +1,21 @@ +"""Shared helpers of bundle B checks (standard library only). Inputs are read from ../inputs relative to the package root.""" +import gzip, hashlib, json, os, sys +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +INP = os.path.join(ROOT, 'inputs') +FAILS = [] +def path(*p): return os.path.join(INP, *p) +def load_json(*p): + f = path(*p) + with (gzip.open(f) if f.endswith('.gz') else open(f, 'rb')) as h: return json.load(h) +def raw(*p): + f = path(*p) + with open(f, 'rb') as h: b = h.read() + return gzip.decompress(b) if f.endswith('.gz') else b +def blob_id(b): return hashlib.sha1(b'blob %d\0' % len(b) + b).hexdigest() +def content_sha(obj): return hashlib.sha256(json.dumps(obj, sort_keys=True, separators=(',', ':')).encode()).hexdigest() +def check(name, ok, detail=''): + print(('PASS ' if ok else 'FAIL ') + name + (' | ' + str(detail) if detail != '' else ''), flush=True) + if not ok: FAILS.append(name) +def finish(): + if FAILS: + print('FAILED: %d' % len(FAILS)); sys.exit(1) diff --git a/research/format-limits-2/s3-4-census-gauges/checks/g1_gauge_bound.py b/research/format-limits-2/s3-4-census-gauges/checks/g1_gauge_bound.py new file mode 100644 index 0000000000..6759cb1c03 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/checks/g1_gauge_bound.py @@ -0,0 +1,129 @@ +"""G1/G2: gauge-free cold-end bound per block on the frozen #645 Gauge44 word (SYN-2 tool, adapted: inputs from ../inputs, no output file). +bound_b = |Q_b| - rank Clean[Q_b] (clean = source columns); Lfix = |Q_b| - rank M[Q_b, protected]; LK = rank of the attained cold-unit pairing (exact rationals).""" +import sys, json, gzip +from common import * +from fractions import Fraction as Q +w = load_json('pr645', 'FULL-WORD.json.gz'); v = w['report']['v']; n = 2*v + w['report']['R'] +N = list(range(v)) + list(range(2*v, n)); ix = {x: i for i, x in enumerate(N)} +def basis(vs): + d = {} + for a in vs: + for k in sorted(d, reverse=True): + if a >> k & 1: a ^= d[k] + if a: + k = a.bit_length()-1 + for j in d: + if d[j] >> k & 1: d[j] ^= a + d[k] = a + return tuple(d[k] for k in sorted(d, reverse=True)) +inside = lambda a, b: basis(list(a)+list(b)) == b +regs = lambda e: e[1:3] if e[0] == 'add' else e[1:2] +def apply(e, M): + t = ix[e[1]] + if e[0] == 'add': + s = ix[e[2]]; q = Q(e[3], e[4]) + for j, a in list(M[s].items()): + x = M[t].get(j, Q(0)) + q*a + if x: M[t][j] = x + else: M[t].pop(j, None) + else: + q = Q(e[2], e[3]); M[t] = {j: q*a for j, a in M[t].items()} +def rank(rows): + rows = [dict(r) for r in rows if r]; r = 0; piv = {} + for row in rows: + row = {k: x for k, x in row.items() if x} + for c, prow in piv.items(): + if c in row: + q = row[c] + for k, x in prow.items(): + y = row.get(k, Q(0)) - q*x + if y: row[k] = y + else: row.pop(k, None) + if row: + c = min(row); q = row[c]; row = {k: x/q for k, x in row.items()} + for c2, prow in piv.items(): + if c in prow: + q2 = prow[c] + for k, x in row.items(): + y = prow.get(k, Q(0)) - q2*x + if y: prow[k] = y + else: prow.pop(k, None) + piv[c] = row; r += 1 + return r +ntail = 34 +tail = [w['cleanup'][i][:-1]+[list(f)] for i, f in w.get('early_cleanup', [])][:ntail] +mainN = [e for e in w['A']+w['B'] if not v <= e[1] < 2*v] +M = [{i: Q(1)} for i in range(len(N))] +for e in mainN+tail: apply(e, M) +cur = {x: (w['ports'][x],) if x < v else basis(w.get('start_extra', {}).get(str(x), [])) for x in N} +for e in w['A']+w['B']+tail: + for x in regs(e): + if x in cur: cur[x] = basis(e[-1]) +enter = set(map(int, w.get('start_extra', {}))) +src = set(range(v)); prot = set(ix[x] for x in N if x < v or x in enter); srci = set(ix[x] for x in src) +mods = load_json('pr531', 'PACKET-PROGRAMS.json.gz'); proto = load_json('pr531', 'PROTOTYPE.json.gz') +def inverse(e): + e=list(e) + if e[0]=='add': e[3]=-e[3] + else: e[2],e[3]=e[3],e[2] + return e +MI = [{i: Q(1)} for i in range(len(N))] +for e in reversed(mainN+tail): apply(inverse(e), MI) +def nullsp(A, nc): + # A: list of dict rows over 0..nc-1 ; return basis of right kernel as list of dict columns + piv = {} + for row in A: + row = {k: x for k, x in row.items() if x} + for c, prow in piv.items(): + if c in row: + q = row[c] + for k, x in prow.items(): + y = row.get(k, Q(0)) - q*x + if y: row[k] = y + else: row.pop(k, None) + if row: + c = min(row); q = row[c]; row = {k: x/q for k, x in row.items()} + for c2, prow in piv.items(): + if c in prow: + q2 = prow[c] + for k, x in row.items(): + y = prow.get(k, Q(0)) - q2*x + if y: prow[k] = y + else: prow.pop(k, None) + piv[c] = row + free = [j for j in range(nc) if j not in piv] + out = [] + for f in free: + col = {f: Q(1)} + for c, prow in piv.items(): + if prow.get(f): col[c] = -prow[f] + out.append(col) + return out +tot = dict(Q=0, Lfix=0, Lgauge=0, LK=0) +out = [] +for b, mod in enumerate(mods): + ss = mod['receipt']['source_lines']; F = basis([proto['binary_ports'][s] for s in ss]) + I = [ix[x] for x in N if inside(cur[x], F)] + rp = rank([{j: a for j, a in M[i].items() if j in prot} for i in I]) + rs = rank([{j: a for j, a in M[i].items() if j in srci} for i in I]) + regsI = sorted(N[i] for i in I) + pl = sorted(prot) + Ct = [{k: M[I[k]][j] for k in range(len(I)) if M[I[k]].get(j)} for j in pl] # C^T rows -> left kernel of C + Lb = nullsp(Ct, len(I)) + Ab = [{k: MI[j].get(I[k]) for k in range(len(I)) if MI[j].get(I[k])} for j in pl] + Kb = nullsp([r for r in Ab if r], len(I)) + LK = rank([{c: sum((l.get(k, Q(0))*kc.get(k, Q(0)) for k in range(len(I))), Q(0)) for c, kc in enumerate(Kb)} for l in Lb]) if Lb and Kb else 0 + tot['LK'] += LK + LKb = LK + # near-miss registers: end frame inside F + one extra dim + near = sorted(x for x in N if not inside(cur[x], F) and len(basis(list(cur[x])+list(F))) == len(F)+1) + tot['Q'] += len(I); tot['Lfix'] += len(I)-rp; tot['Lgauge'] += len(I)-rs + out.append(dict(LK=LKb, block=b, rankF=len(F), Q=len(I), rank_prot=rp, rank_src=rs, Lfix=len(I)-rp, Lgauge=len(I)-rs, regs=regsI, near=near)) + if 0: print(b, 'dimL', len(Lb), 'dimK', len(Kb), 'rankLK', LK, 'rkF', len(F), '|Q|', len(I), 'rk prot', rp, 'rk src', rs, 'Q:', regsI, 'near(+1 dim):', near, flush=True) + +sI = sorted(o['Q'] for o in out) +check('G1 14 blocks: 6 with |I| = 6, 8 with |I| = 8; sum |I| = 100 (K492 factory)', sI == [6]*6 + [8]*8 and tot['Q'] == 100, sI) +check('G1 rank of the 4 pinned totals: rank Clean[I_b] = rank M[I_b, protected] = 4 in all 14 blocks', all(o['rank_src'] == 4 and o['rank_prot'] == 4 and o['rankF'] == 4 for o in out)) +check('G1 gauge-free bound N_cold <= sum_b(|I_b| - 4) = 44 (fixed-content value Lfix = gauge value = 44)', tot['Lgauge'] == 44 and tot['Lfix'] == 44 and sum(o['Q'] - 4 for o in out) == 44, tot) +check('G2 attained cold units (rank LK) = 44 = the bound: 2 in each short block, 4 in each |I| = 8 block', tot['LK'] == 44 and sorted(o['LK'] for o in out) == [2]*6 + [4]*8, [o['LK'] for o in out]) +finish() diff --git a/research/format-limits-2/s3-4-census-gauges/evidence/C1/STEPS.json b/research/format-limits-2/s3-4-census-gauges/evidence/C1/STEPS.json new file mode 100644 index 0000000000..9ce1efc0a1 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/evidence/C1/STEPS.json @@ -0,0 +1,37 @@ +[ + { + "step": "pivot-swap", + "exit_code": 0, + "seconds": 7.934 + }, + { + "step": "cold44-exact", + "exit_code": 0, + "seconds": 1.709 + }, + { + "step": "layer-end-controls", + "exit_code": 0, + "seconds": 45.082 + }, + { + "step": "native", + "exit_code": 0, + "seconds": 1.139 + }, + { + "step": "ledgers", + "exit_code": 0, + "seconds": 0.772 + }, + { + "step": "local-replay", + "exit_code": 0, + "seconds": 4.834 + }, + { + "step": "wrappers", + "exit_code": 0, + "seconds": 2.201 + } +] diff --git a/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_by_step.csv b/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_by_step.csv new file mode 100644 index 0000000000..bf20ff2051 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_by_step.csv @@ -0,0 +1,6 @@ +step,helpers,climb_mass_per_call,narrow_mass_per_call,share_of_global_narrow_mass,narrow_mass_per_helper +S1_block_scratch,221,1766,6749.5,0.3155,30.54 +S3_packet_copy,156,1263,4429.7,0.2071,28.40 +S4_slot_copy,112,720,2753.5,0.1287,24.58 +S1_block_scratch_centre,3,51,152.3,0.0071,50.76 +XY_registers,0,,6636.8,0.3102, diff --git a/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_helpers.csv b/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_helpers.csv new file mode 100644 index 0000000000..fca828d2b8 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledger_helpers.csv @@ -0,0 +1,493 @@ +reg,site,detail,centre,nclimb,climb_mass,psi,resid_width,widths +224,S1_block_scratch,"(0, 1, 2, 3)|8",1,7,17,50.7571007216044,9,8 4 1 1 1 1 1 +225,S1_block_scratch,"(0, 1, 2, 3)|9",0,4,4,17.161837764593564,4,1 1 1 1 +226,S1_block_scratch,"(0, 1, 2, 3)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +227,S1_block_scratch,"(0, 1, 2, 3)|11",0,4,4,17.161837764593564,4,1 1 1 1 +228,S1_block_scratch,"(0, 1, 2, 3)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +229,S1_block_scratch,"(0, 1, 2, 3)|13",0,5,9,30.56694540816502,9,5 1 1 1 1 +230,S1_block_scratch,"(0, 1, 2, 3)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +231,S1_block_scratch,"(0, 1, 2, 3)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +232,S1_block_scratch,"(0, 1, 2, 3)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +233,S1_block_scratch,"(0, 1, 2, 3)|17",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +234,S1_block_scratch,"(0, 1, 2, 3)|18",0,5,9,30.56694540816502,9,5 1 1 1 1 +235,S1_block_scratch,"(0, 1, 2, 3)|19",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +236,S1_block_scratch,"(0, 1, 2, 3)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +237,S1_block_scratch,"(0, 1, 2, 3)|21",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +238,S1_block_scratch,"(0, 1, 2, 3)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +239,S1_block_scratch,"(0, 1, 2, 3)|23",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +240,S1_block_scratch,"(0, 1, 4, 5)|8",1,7,17,50.7571007216044,9,8 4 1 1 1 1 1 +241,S1_block_scratch,"(0, 1, 4, 5)|9",0,4,4,17.161837764593564,4,1 1 1 1 +242,S1_block_scratch,"(0, 1, 4, 5)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +243,S1_block_scratch,"(0, 1, 4, 5)|11",0,4,4,17.161837764593564,4,1 1 1 1 +244,S1_block_scratch,"(0, 1, 4, 5)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +245,S1_block_scratch,"(0, 1, 4, 5)|13",0,5,9,30.56694540816502,9,5 1 1 1 1 +246,S1_block_scratch,"(0, 1, 4, 5)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +247,S1_block_scratch,"(0, 1, 4, 5)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +248,S1_block_scratch,"(0, 1, 4, 5)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +249,S1_block_scratch,"(0, 1, 4, 5)|17",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +250,S1_block_scratch,"(0, 1, 4, 5)|18",0,5,9,30.56694540816502,9,5 1 1 1 1 +251,S1_block_scratch,"(0, 1, 4, 5)|19",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +252,S1_block_scratch,"(0, 1, 4, 5)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +253,S1_block_scratch,"(0, 1, 4, 5)|21",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +254,S1_block_scratch,"(0, 1, 4, 5)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +255,S1_block_scratch,"(0, 1, 4, 5)|23",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +256,S1_block_scratch,"(0, 1, 6, 7)|8",1,7,17,50.7571007216044,9,8 4 1 1 1 1 1 +257,S1_block_scratch,"(0, 1, 6, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +258,S1_block_scratch,"(0, 1, 6, 7)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +259,S1_block_scratch,"(0, 1, 6, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +260,S1_block_scratch,"(0, 1, 6, 7)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +261,S1_block_scratch,"(0, 1, 6, 7)|13",0,5,9,30.56694540816502,9,5 1 1 1 1 +262,S1_block_scratch,"(0, 1, 6, 7)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +263,S1_block_scratch,"(0, 1, 6, 7)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +264,S1_block_scratch,"(0, 1, 6, 7)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +265,S1_block_scratch,"(0, 1, 6, 7)|17",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +266,S1_block_scratch,"(0, 1, 6, 7)|18",0,5,9,30.56694540816502,9,5 1 1 1 1 +267,S1_block_scratch,"(0, 1, 6, 7)|19",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +268,S1_block_scratch,"(0, 1, 6, 7)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +269,S1_block_scratch,"(0, 1, 6, 7)|21",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +270,S1_block_scratch,"(0, 1, 6, 7)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +271,S1_block_scratch,"(0, 1, 6, 7)|23",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +272,S1_block_scratch,"(0, 2, 4, 6)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +273,S1_block_scratch,"(0, 2, 4, 6)|9",0,4,4,17.161837764593564,4,1 1 1 1 +274,S1_block_scratch,"(0, 2, 4, 6)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +275,S1_block_scratch,"(0, 2, 4, 6)|11",0,4,4,17.161837764593564,4,1 1 1 1 +276,S1_block_scratch,"(0, 2, 4, 6)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +277,S1_block_scratch,"(0, 2, 4, 6)|13",0,4,4,17.161837764593564,4,1 1 1 1 +278,S1_block_scratch,"(0, 2, 4, 6)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +279,S1_block_scratch,"(0, 2, 4, 6)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +280,S1_block_scratch,"(0, 2, 4, 6)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +281,S1_block_scratch,"(0, 2, 4, 6)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +282,S1_block_scratch,"(0, 2, 4, 6)|18",0,4,4,17.161837764593564,4,1 1 1 1 +283,S1_block_scratch,"(0, 2, 4, 6)|19",0,8,9,37.227840609215626,9,2 1 1 1 1 1 1 1 +284,S1_block_scratch,"(0, 2, 4, 6)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +285,S1_block_scratch,"(0, 2, 4, 6)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +286,S1_block_scratch,"(0, 2, 4, 6)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +287,S1_block_scratch,"(0, 2, 4, 6)|23",0,5,9,31.682663164736066,9,4 2 1 1 1 +288,S1_block_scratch,"(0, 2, 5, 7)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +289,S1_block_scratch,"(0, 2, 5, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +290,S1_block_scratch,"(0, 2, 5, 7)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +291,S1_block_scratch,"(0, 2, 5, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +292,S1_block_scratch,"(0, 2, 5, 7)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +293,S1_block_scratch,"(0, 2, 5, 7)|13",0,4,4,17.161837764593564,4,1 1 1 1 +294,S1_block_scratch,"(0, 2, 5, 7)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +295,S1_block_scratch,"(0, 2, 5, 7)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +296,S1_block_scratch,"(0, 2, 5, 7)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +297,S1_block_scratch,"(0, 2, 5, 7)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +298,S1_block_scratch,"(0, 2, 5, 7)|18",0,4,4,17.161837764593564,4,1 1 1 1 +299,S1_block_scratch,"(0, 2, 5, 7)|19",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +300,S1_block_scratch,"(0, 2, 5, 7)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +301,S1_block_scratch,"(0, 2, 5, 7)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +302,S1_block_scratch,"(0, 2, 5, 7)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +303,S1_block_scratch,"(0, 2, 5, 7)|23",0,5,9,31.682663164736066,9,4 2 1 1 1 +304,S1_block_scratch,"(0, 3, 4, 7)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +305,S1_block_scratch,"(0, 3, 4, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +306,S1_block_scratch,"(0, 3, 4, 7)|10",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +307,S1_block_scratch,"(0, 3, 4, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +308,S1_block_scratch,"(0, 3, 4, 7)|12",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +309,S1_block_scratch,"(0, 3, 4, 7)|13",0,4,4,17.161837764593564,4,1 1 1 1 +310,S1_block_scratch,"(0, 3, 4, 7)|14",0,5,8,29.641544302062908,8,3 2 1 1 1 +311,S1_block_scratch,"(0, 3, 4, 7)|15",0,5,8,29.641544302062908,8,3 2 1 1 1 +312,S1_block_scratch,"(0, 3, 4, 7)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +313,S1_block_scratch,"(0, 3, 4, 7)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +314,S1_block_scratch,"(0, 3, 4, 7)|18",0,4,4,17.161837764593564,4,1 1 1 1 +315,S1_block_scratch,"(0, 3, 4, 7)|19",0,8,9,37.227840609215626,9,2 1 1 1 1 1 1 1 +316,S1_block_scratch,"(0, 3, 4, 7)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +317,S1_block_scratch,"(0, 3, 4, 7)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +318,S1_block_scratch,"(0, 3, 4, 7)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +319,S1_block_scratch,"(0, 3, 4, 7)|23",0,5,9,31.682663164736066,9,4 2 1 1 1 +320,S1_block_scratch,"(0, 3, 5, 6)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +321,S1_block_scratch,"(0, 3, 5, 6)|9",0,4,4,17.161837764593564,4,1 1 1 1 +322,S1_block_scratch,"(0, 3, 5, 6)|10",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +323,S1_block_scratch,"(0, 3, 5, 6)|11",0,4,4,17.161837764593564,4,1 1 1 1 +324,S1_block_scratch,"(0, 3, 5, 6)|12",0,5,9,32.02246123832686,9,3 3 1 1 1 +325,S1_block_scratch,"(0, 3, 5, 6)|13",0,4,4,17.161837764593564,4,1 1 1 1 +326,S1_block_scratch,"(0, 3, 5, 6)|14",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +327,S1_block_scratch,"(0, 3, 5, 6)|15",0,5,8,29.641544302062908,8,3 2 1 1 1 +328,S1_block_scratch,"(0, 3, 5, 6)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +329,S1_block_scratch,"(0, 3, 5, 6)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +330,S1_block_scratch,"(0, 3, 5, 6)|18",0,4,4,17.161837764593564,4,1 1 1 1 +331,S1_block_scratch,"(0, 3, 5, 6)|19",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +332,S1_block_scratch,"(0, 3, 5, 6)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +333,S1_block_scratch,"(0, 3, 5, 6)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +334,S1_block_scratch,"(0, 3, 5, 6)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +335,S1_block_scratch,"(0, 3, 5, 6)|23",0,5,9,31.682663164736066,9,4 2 1 1 1 +336,S1_block_scratch,"(1, 2, 4, 7)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +337,S1_block_scratch,"(1, 2, 4, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +338,S1_block_scratch,"(1, 2, 4, 7)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +339,S1_block_scratch,"(1, 2, 4, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +340,S1_block_scratch,"(1, 2, 4, 7)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +341,S1_block_scratch,"(1, 2, 4, 7)|13",0,4,4,17.161837764593564,4,1 1 1 1 +342,S1_block_scratch,"(1, 2, 4, 7)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +343,S1_block_scratch,"(1, 2, 4, 7)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +344,S1_block_scratch,"(1, 2, 4, 7)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +345,S1_block_scratch,"(1, 2, 4, 7)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +346,S1_block_scratch,"(1, 2, 4, 7)|18",0,4,4,17.161837764593564,4,1 1 1 1 +347,S1_block_scratch,"(1, 2, 4, 7)|19",0,8,9,37.227840609215626,9,2 1 1 1 1 1 1 1 +348,S1_block_scratch,"(1, 2, 4, 7)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +349,S1_block_scratch,"(1, 2, 4, 7)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +350,S1_block_scratch,"(1, 2, 4, 7)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +351,S1_block_scratch,"(1, 2, 4, 7)|23",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +352,S1_block_scratch,"(1, 2, 5, 6)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +353,S1_block_scratch,"(1, 2, 5, 6)|9",0,4,4,17.161837764593564,4,1 1 1 1 +354,S1_block_scratch,"(1, 2, 5, 6)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +355,S1_block_scratch,"(1, 2, 5, 6)|11",0,4,4,17.161837764593564,4,1 1 1 1 +356,S1_block_scratch,"(1, 2, 5, 6)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +357,S1_block_scratch,"(1, 2, 5, 6)|13",0,4,4,17.161837764593564,4,1 1 1 1 +358,S1_block_scratch,"(1, 2, 5, 6)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +359,S1_block_scratch,"(1, 2, 5, 6)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +360,S1_block_scratch,"(1, 2, 5, 6)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +361,S1_block_scratch,"(1, 2, 5, 6)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +362,S1_block_scratch,"(1, 2, 5, 6)|18",0,4,4,17.161837764593564,4,1 1 1 1 +363,S1_block_scratch,"(1, 2, 5, 6)|19",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +364,S1_block_scratch,"(1, 2, 5, 6)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +365,S1_block_scratch,"(1, 2, 5, 6)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +366,S1_block_scratch,"(1, 2, 5, 6)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +367,S1_block_scratch,"(1, 2, 5, 6)|23",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +368,S1_block_scratch,"(1, 3, 4, 6)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +369,S1_block_scratch,"(1, 3, 4, 6)|9",0,4,4,17.161837764593564,4,1 1 1 1 +370,S1_block_scratch,"(1, 3, 4, 6)|10",0,5,9,32.02246123832686,9,3 3 1 1 1 +371,S1_block_scratch,"(1, 3, 4, 6)|11",0,4,4,17.161837764593564,4,1 1 1 1 +372,S1_block_scratch,"(1, 3, 4, 6)|12",0,5,9,32.02246123832686,9,3 3 1 1 1 +373,S1_block_scratch,"(1, 3, 4, 6)|13",0,4,4,17.161837764593564,4,1 1 1 1 +374,S1_block_scratch,"(1, 3, 4, 6)|14",0,5,9,32.02246123832686,9,3 3 1 1 1 +375,S1_block_scratch,"(1, 3, 4, 6)|15",0,5,9,32.02246123832686,9,3 3 1 1 1 +376,S1_block_scratch,"(1, 3, 4, 6)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +377,S1_block_scratch,"(1, 3, 4, 6)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +378,S1_block_scratch,"(1, 3, 4, 6)|18",0,4,4,17.161837764593564,4,1 1 1 1 +379,S1_block_scratch,"(1, 3, 4, 6)|19",0,8,9,37.227840609215626,9,2 1 1 1 1 1 1 1 +380,S1_block_scratch,"(1, 3, 4, 6)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +381,S1_block_scratch,"(1, 3, 4, 6)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +382,S1_block_scratch,"(1, 3, 4, 6)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +383,S1_block_scratch,"(1, 3, 4, 6)|23",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +384,S1_block_scratch,"(1, 3, 5, 7)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +385,S1_block_scratch,"(1, 3, 5, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +386,S1_block_scratch,"(1, 3, 5, 7)|10",0,5,9,32.02246123832686,9,3 3 1 1 1 +387,S1_block_scratch,"(1, 3, 5, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +388,S1_block_scratch,"(1, 3, 5, 7)|12",0,5,9,32.02246123832686,9,3 3 1 1 1 +389,S1_block_scratch,"(1, 3, 5, 7)|13",0,4,4,17.161837764593564,4,1 1 1 1 +390,S1_block_scratch,"(1, 3, 5, 7)|14",0,5,9,32.02246123832686,9,3 3 1 1 1 +391,S1_block_scratch,"(1, 3, 5, 7)|15",0,5,9,32.02246123832686,9,3 3 1 1 1 +392,S1_block_scratch,"(1, 3, 5, 7)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +393,S1_block_scratch,"(1, 3, 5, 7)|17",0,5,9,30.56694540816502,9,5 1 1 1 1 +394,S1_block_scratch,"(1, 3, 5, 7)|18",0,4,4,17.161837764593564,4,1 1 1 1 +395,S1_block_scratch,"(1, 3, 5, 7)|19",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +396,S1_block_scratch,"(1, 3, 5, 7)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +397,S1_block_scratch,"(1, 3, 5, 7)|21",0,5,9,30.56694540816502,9,5 1 1 1 1 +398,S1_block_scratch,"(1, 3, 5, 7)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +399,S1_block_scratch,"(1, 3, 5, 7)|23",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +400,S1_block_scratch,"(2, 3, 4, 5)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +401,S1_block_scratch,"(2, 3, 4, 5)|9",0,4,4,17.161837764593564,4,1 1 1 1 +402,S1_block_scratch,"(2, 3, 4, 5)|10",0,5,9,32.02246123832686,9,3 3 1 1 1 +403,S1_block_scratch,"(2, 3, 4, 5)|11",0,4,4,17.161837764593564,4,1 1 1 1 +404,S1_block_scratch,"(2, 3, 4, 5)|12",0,5,9,32.02246123832686,9,3 3 1 1 1 +405,S1_block_scratch,"(2, 3, 4, 5)|13",0,5,9,30.56694540816502,9,5 1 1 1 1 +406,S1_block_scratch,"(2, 3, 4, 5)|14",0,5,9,32.02246123832686,9,3 3 1 1 1 +407,S1_block_scratch,"(2, 3, 4, 5)|15",0,5,9,32.02246123832686,9,3 3 1 1 1 +408,S1_block_scratch,"(2, 3, 4, 5)|16",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +409,S1_block_scratch,"(2, 3, 4, 5)|17",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +410,S1_block_scratch,"(2, 3, 4, 5)|18",0,5,9,30.56694540816502,9,5 1 1 1 1 +411,S1_block_scratch,"(2, 3, 4, 5)|19",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +412,S1_block_scratch,"(2, 3, 4, 5)|20",0,5,9,32.02246123832686,9,3 3 1 1 1 +413,S1_block_scratch,"(2, 3, 4, 5)|21",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +414,S1_block_scratch,"(2, 3, 4, 5)|22",0,5,9,32.02246123832686,9,3 3 1 1 1 +415,S1_block_scratch,"(2, 3, 4, 5)|23",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +416,S1_block_scratch,"(2, 3, 6, 7)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +417,S1_block_scratch,"(2, 3, 6, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +418,S1_block_scratch,"(2, 3, 6, 7)|10",0,5,9,32.02246123832686,9,3 3 1 1 1 +419,S1_block_scratch,"(2, 3, 6, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +420,S1_block_scratch,"(2, 3, 6, 7)|12",0,5,9,32.02246123832686,9,3 3 1 1 1 +421,S1_block_scratch,"(2, 3, 6, 7)|13",0,5,9,30.56694540816502,9,5 1 1 1 1 +422,S1_block_scratch,"(2, 3, 6, 7)|14",0,5,9,32.02246123832686,9,3 3 1 1 1 +423,S1_block_scratch,"(2, 3, 6, 7)|15",0,5,9,32.02246123832686,9,3 3 1 1 1 +424,S1_block_scratch,"(2, 3, 6, 7)|16",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +425,S1_block_scratch,"(2, 3, 6, 7)|17",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +426,S1_block_scratch,"(2, 3, 6, 7)|18",0,5,9,30.56694540816502,9,5 1 1 1 1 +427,S1_block_scratch,"(2, 3, 6, 7)|19",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +428,S1_block_scratch,"(2, 3, 6, 7)|20",0,5,9,32.02246123832686,9,3 3 1 1 1 +429,S1_block_scratch,"(2, 3, 6, 7)|21",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +430,S1_block_scratch,"(2, 3, 6, 7)|22",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +431,S1_block_scratch,"(2, 3, 6, 7)|23",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +432,S1_block_scratch,"(4, 5, 6, 7)|8",0,6,9,33.06895752585596,9,4 1 1 1 1 1 +433,S1_block_scratch,"(4, 5, 6, 7)|9",0,4,4,17.161837764593564,4,1 1 1 1 +434,S1_block_scratch,"(4, 5, 6, 7)|10",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +435,S1_block_scratch,"(4, 5, 6, 7)|11",0,4,4,17.161837764593564,4,1 1 1 1 +436,S1_block_scratch,"(4, 5, 6, 7)|12",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +437,S1_block_scratch,"(4, 5, 6, 7)|13",0,5,9,30.56694540816502,9,5 1 1 1 1 +438,S1_block_scratch,"(4, 5, 6, 7)|14",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +439,S1_block_scratch,"(4, 5, 6, 7)|15",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +440,S1_block_scratch,"(4, 5, 6, 7)|16",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +441,S1_block_scratch,"(4, 5, 6, 7)|17",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +442,S1_block_scratch,"(4, 5, 6, 7)|18",0,5,9,30.56694540816502,9,5 1 1 1 1 +443,S1_block_scratch,"(4, 5, 6, 7)|19",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +444,S1_block_scratch,"(4, 5, 6, 7)|20",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +445,S1_block_scratch,"(4, 5, 6, 7)|21",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +446,S1_block_scratch,"(4, 5, 6, 7)|22",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +447,S1_block_scratch,"(4, 5, 6, 7)|23",0,7,9,35.31829810433119,9,3 1 1 1 1 1 1 +448,S3_packet_copy,"(0, 1, 2, 3)|((0, 1), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +449,S3_packet_copy,"(0, 1, 2, 3)|((0, 2), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +450,S3_packet_copy,"(0, 1, 2, 3)|((0, 2), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +451,S3_packet_copy,"(0, 1, 2, 3)|((0, 3), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +452,S3_packet_copy,"(0, 1, 2, 3)|((0, 3), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +453,S3_packet_copy,"(0, 1, 2, 3)|((1, 2), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +454,S3_packet_copy,"(0, 1, 2, 3)|((1, 2), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +455,S3_packet_copy,"(0, 1, 2, 3)|((1, 3), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +456,S3_packet_copy,"(0, 1, 2, 3)|((1, 3), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +457,S3_packet_copy,"(0, 1, 2, 3)|((2, 3), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +458,S3_packet_copy,"(0, 1, 4, 5)|((0, 1), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +459,S3_packet_copy,"(0, 1, 4, 5)|((0, 4), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +460,S3_packet_copy,"(0, 1, 4, 5)|((0, 4), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +461,S3_packet_copy,"(0, 1, 4, 5)|((0, 5), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +462,S3_packet_copy,"(0, 1, 4, 5)|((0, 5), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +463,S3_packet_copy,"(0, 1, 4, 5)|((1, 4), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +464,S3_packet_copy,"(0, 1, 4, 5)|((1, 4), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +465,S3_packet_copy,"(0, 1, 4, 5)|((1, 5), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +466,S3_packet_copy,"(0, 1, 4, 5)|((1, 5), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +467,S3_packet_copy,"(0, 1, 4, 5)|((4, 5), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +468,S3_packet_copy,"(0, 1, 6, 7)|((0, 1), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +469,S3_packet_copy,"(0, 1, 6, 7)|((0, 6), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +470,S3_packet_copy,"(0, 1, 6, 7)|((0, 6), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +471,S3_packet_copy,"(0, 1, 6, 7)|((0, 7), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +472,S3_packet_copy,"(0, 1, 6, 7)|((0, 7), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +473,S3_packet_copy,"(0, 1, 6, 7)|((1, 6), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +474,S3_packet_copy,"(0, 1, 6, 7)|((1, 6), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +475,S3_packet_copy,"(0, 1, 6, 7)|((1, 7), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +476,S3_packet_copy,"(0, 1, 6, 7)|((1, 7), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +477,S3_packet_copy,"(0, 1, 6, 7)|((6, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +478,S3_packet_copy,"(0, 2, 4, 6)|((0, 2), -1)",0,3,8,26.005909362467786,8,4 2 2 +479,S3_packet_copy,"(0, 2, 4, 6)|((0, 2), 1)",0,3,8,26.005909362467786,8,4 2 2 +480,S3_packet_copy,"(0, 2, 4, 6)|((0, 4), -1)",0,3,8,26.34570743605858,8,3 3 2 +481,S3_packet_copy,"(0, 2, 4, 6)|((0, 4), 1)",0,3,8,26.34570743605858,8,3 3 2 +482,S3_packet_copy,"(0, 2, 4, 6)|((0, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +483,S3_packet_copy,"(0, 2, 4, 6)|((0, 6), 1)",0,3,8,26.34570743605858,8,3 3 2 +484,S3_packet_copy,"(0, 2, 4, 6)|((2, 4), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +485,S3_packet_copy,"(0, 2, 4, 6)|((2, 4), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +486,S3_packet_copy,"(0, 2, 4, 6)|((2, 6), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +487,S3_packet_copy,"(0, 2, 4, 6)|((2, 6), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +488,S3_packet_copy,"(0, 2, 4, 6)|((4, 6), -1)",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +489,S3_packet_copy,"(0, 2, 4, 6)|((4, 6), 1)",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +490,S3_packet_copy,"(0, 2, 5, 7)|((0, 2), -1)",0,3,7,23.101744282439284,7,4 2 1 +491,S3_packet_copy,"(0, 2, 5, 7)|((0, 2), 1)",0,3,7,23.101744282439284,7,4 2 1 +492,S3_packet_copy,"(0, 2, 5, 7)|((0, 5), -1)",0,3,8,26.34570743605858,8,3 3 2 +493,S3_packet_copy,"(0, 2, 5, 7)|((0, 5), 1)",0,3,8,26.34570743605858,8,3 3 2 +494,S3_packet_copy,"(0, 2, 5, 7)|((0, 7), -1)",0,3,8,26.34570743605858,8,3 3 2 +495,S3_packet_copy,"(0, 2, 5, 7)|((0, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +496,S3_packet_copy,"(0, 2, 5, 7)|((2, 5), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +497,S3_packet_copy,"(0, 2, 5, 7)|((2, 5), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +498,S3_packet_copy,"(0, 2, 5, 7)|((2, 7), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +499,S3_packet_copy,"(0, 2, 5, 7)|((2, 7), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +500,S3_packet_copy,"(0, 2, 5, 7)|((5, 7), -1)",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +501,S3_packet_copy,"(0, 2, 5, 7)|((5, 7), 1)",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +502,S3_packet_copy,"(0, 3, 4, 7)|((0, 3), -1)",0,3,8,26.005909362467786,8,4 2 2 +503,S3_packet_copy,"(0, 3, 4, 7)|((0, 3), 1)",0,3,8,26.005909362467786,8,4 2 2 +504,S3_packet_copy,"(0, 3, 4, 7)|((0, 4), -1)",0,3,8,26.34570743605858,8,3 3 2 +505,S3_packet_copy,"(0, 3, 4, 7)|((0, 4), 1)",0,4,9,30.63616687720697,9,3 3 2 1 +506,S3_packet_copy,"(0, 3, 4, 7)|((0, 7), -1)",0,3,8,26.34570743605858,8,3 3 2 +507,S3_packet_copy,"(0, 3, 4, 7)|((0, 7), 1)",0,4,9,30.63616687720697,9,3 3 2 1 +508,S3_packet_copy,"(0, 3, 4, 7)|((3, 4), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +509,S3_packet_copy,"(0, 3, 4, 7)|((3, 4), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +510,S3_packet_copy,"(0, 3, 4, 7)|((3, 7), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +511,S3_packet_copy,"(0, 3, 4, 7)|((3, 7), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +512,S3_packet_copy,"(0, 3, 4, 7)|((4, 7), -1)",0,6,8,31.551086806947346,8,2 2 1 1 1 1 +513,S3_packet_copy,"(0, 3, 4, 7)|((4, 7), 1)",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +514,S3_packet_copy,"(0, 3, 5, 6)|((0, 3), -1)",0,3,7,23.101744282439284,7,4 2 1 +515,S3_packet_copy,"(0, 3, 5, 6)|((0, 3), 1)",0,3,7,23.101744282439284,7,4 2 1 +516,S3_packet_copy,"(0, 3, 5, 6)|((0, 5), -1)",0,3,8,26.34570743605858,8,3 3 2 +517,S3_packet_copy,"(0, 3, 5, 6)|((0, 5), 1)",0,4,9,30.63616687720697,9,3 3 2 1 +518,S3_packet_copy,"(0, 3, 5, 6)|((0, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +519,S3_packet_copy,"(0, 3, 5, 6)|((0, 6), 1)",0,3,9,28.726624372322533,9,3 3 3 +520,S3_packet_copy,"(0, 3, 5, 6)|((3, 5), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +521,S3_packet_copy,"(0, 3, 5, 6)|((3, 5), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +522,S3_packet_copy,"(0, 3, 5, 6)|((3, 6), -1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +523,S3_packet_copy,"(0, 3, 5, 6)|((3, 6), 1)",0,6,9,33.9320037432113,9,3 2 1 1 1 1 +524,S3_packet_copy,"(0, 3, 5, 6)|((5, 6), -1)",0,6,8,31.551086806947346,8,2 2 1 1 1 1 +525,S3_packet_copy,"(0, 3, 5, 6)|((5, 6), 1)",0,7,9,35.84154624809574,9,2 2 1 1 1 1 1 +526,S3_packet_copy,"(1, 2, 4, 7)|((1, 2), -1)",0,3,8,26.005909362467786,8,4 2 2 +527,S3_packet_copy,"(1, 2, 4, 7)|((1, 2), 1)",0,3,8,26.005909362467786,8,4 2 2 +528,S3_packet_copy,"(1, 2, 4, 7)|((1, 4), -1)",0,3,8,26.34570743605858,8,3 3 2 +529,S3_packet_copy,"(1, 2, 4, 7)|((1, 4), 1)",0,3,8,26.34570743605858,8,3 3 2 +530,S3_packet_copy,"(1, 2, 4, 7)|((1, 7), -1)",0,3,8,26.34570743605858,8,3 3 2 +531,S3_packet_copy,"(1, 2, 4, 7)|((1, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +532,S3_packet_copy,"(1, 2, 4, 7)|((2, 4), -1)",0,3,8,26.34570743605858,8,3 3 2 +533,S3_packet_copy,"(1, 2, 4, 7)|((2, 4), 1)",0,3,8,26.34570743605858,8,3 3 2 +534,S3_packet_copy,"(1, 2, 4, 7)|((2, 7), -1)",0,3,8,26.34570743605858,8,3 3 2 +535,S3_packet_copy,"(1, 2, 4, 7)|((2, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +536,S3_packet_copy,"(1, 2, 4, 7)|((4, 7), -1)",0,5,9,31.682663164736066,9,4 2 1 1 1 +537,S3_packet_copy,"(1, 2, 4, 7)|((4, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +538,S3_packet_copy,"(1, 2, 5, 6)|((1, 2), -1)",0,3,7,23.101744282439284,7,4 2 1 +539,S3_packet_copy,"(1, 2, 5, 6)|((1, 2), 1)",0,3,7,23.101744282439284,7,4 2 1 +540,S3_packet_copy,"(1, 2, 5, 6)|((1, 5), -1)",0,3,8,26.34570743605858,8,3 3 2 +541,S3_packet_copy,"(1, 2, 5, 6)|((1, 5), 1)",0,3,8,26.34570743605858,8,3 3 2 +542,S3_packet_copy,"(1, 2, 5, 6)|((1, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +543,S3_packet_copy,"(1, 2, 5, 6)|((1, 6), 1)",0,3,8,26.34570743605858,8,3 3 2 +544,S3_packet_copy,"(1, 2, 5, 6)|((2, 5), -1)",0,3,8,26.34570743605858,8,3 3 2 +545,S3_packet_copy,"(1, 2, 5, 6)|((2, 5), 1)",0,3,8,26.34570743605858,8,3 3 2 +546,S3_packet_copy,"(1, 2, 5, 6)|((2, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +547,S3_packet_copy,"(1, 2, 5, 6)|((2, 6), 1)",0,3,8,26.34570743605858,8,3 3 2 +548,S3_packet_copy,"(1, 2, 5, 6)|((5, 6), -1)",0,5,9,31.682663164736066,9,4 2 1 1 1 +549,S3_packet_copy,"(1, 2, 5, 6)|((5, 6), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +550,S3_packet_copy,"(1, 3, 4, 6)|((1, 3), -1)",0,3,8,26.005909362467786,8,4 2 2 +551,S3_packet_copy,"(1, 3, 4, 6)|((1, 3), 1)",0,3,8,26.005909362467786,8,4 2 2 +552,S3_packet_copy,"(1, 3, 4, 6)|((1, 4), -1)",0,4,9,30.63616687720697,9,3 3 2 1 +553,S3_packet_copy,"(1, 3, 4, 6)|((1, 4), 1)",0,4,9,30.63616687720697,9,3 3 2 1 +554,S3_packet_copy,"(1, 3, 4, 6)|((1, 6), -1)",0,4,9,30.63616687720697,9,3 3 2 1 +555,S3_packet_copy,"(1, 3, 4, 6)|((1, 6), 1)",0,4,9,30.63616687720697,9,3 3 2 1 +556,S3_packet_copy,"(1, 3, 4, 6)|((3, 4), -1)",0,3,8,26.34570743605858,8,3 3 2 +557,S3_packet_copy,"(1, 3, 4, 6)|((3, 4), 1)",0,3,8,26.34570743605858,8,3 3 2 +558,S3_packet_copy,"(1, 3, 4, 6)|((3, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +559,S3_packet_copy,"(1, 3, 4, 6)|((3, 6), 1)",0,3,8,26.34570743605858,8,3 3 2 +560,S3_packet_copy,"(1, 3, 4, 6)|((4, 6), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +561,S3_packet_copy,"(1, 3, 4, 6)|((4, 6), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +562,S3_packet_copy,"(1, 3, 5, 7)|((1, 3), -1)",0,3,7,23.101744282439284,7,4 2 1 +563,S3_packet_copy,"(1, 3, 5, 7)|((1, 3), 1)",0,3,7,23.101744282439284,7,4 2 1 +564,S3_packet_copy,"(1, 3, 5, 7)|((1, 5), -1)",0,4,9,30.63616687720697,9,3 3 2 1 +565,S3_packet_copy,"(1, 3, 5, 7)|((1, 5), 1)",0,3,8,26.34570743605858,8,3 3 2 +566,S3_packet_copy,"(1, 3, 5, 7)|((1, 7), -1)",0,4,9,30.63616687720697,9,3 3 2 1 +567,S3_packet_copy,"(1, 3, 5, 7)|((1, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +568,S3_packet_copy,"(1, 3, 5, 7)|((3, 5), -1)",0,3,8,26.34570743605858,8,3 3 2 +569,S3_packet_copy,"(1, 3, 5, 7)|((3, 5), 1)",0,3,8,26.34570743605858,8,3 3 2 +570,S3_packet_copy,"(1, 3, 5, 7)|((3, 7), -1)",0,3,8,26.34570743605858,8,3 3 2 +571,S3_packet_copy,"(1, 3, 5, 7)|((3, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +572,S3_packet_copy,"(1, 3, 5, 7)|((5, 7), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +573,S3_packet_copy,"(1, 3, 5, 7)|((5, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +574,S3_packet_copy,"(2, 3, 4, 5)|((2, 3), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +575,S3_packet_copy,"(2, 3, 4, 5)|((2, 4), -1)",0,4,9,30.63616687720697,9,3 3 2 1 +576,S3_packet_copy,"(2, 3, 4, 5)|((2, 4), 1)",0,3,8,26.34570743605858,8,3 3 2 +577,S3_packet_copy,"(2, 3, 4, 5)|((2, 5), -1)",0,4,9,30.63616687720697,9,3 3 2 1 +578,S3_packet_copy,"(2, 3, 4, 5)|((2, 5), 1)",0,3,8,26.34570743605858,8,3 3 2 +579,S3_packet_copy,"(2, 3, 4, 5)|((3, 4), -1)",0,3,8,26.34570743605858,8,3 3 2 +580,S3_packet_copy,"(2, 3, 4, 5)|((3, 4), 1)",0,3,9,28.726624372322533,9,3 3 3 +581,S3_packet_copy,"(2, 3, 4, 5)|((3, 5), -1)",0,3,9,28.726624372322533,9,3 3 3 +582,S3_packet_copy,"(2, 3, 4, 5)|((3, 5), 1)",0,3,9,28.726624372322533,9,3 3 3 +583,S3_packet_copy,"(2, 3, 4, 5)|((4, 5), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +584,S3_packet_copy,"(2, 3, 6, 7)|((2, 3), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +585,S3_packet_copy,"(2, 3, 6, 7)|((2, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +586,S3_packet_copy,"(2, 3, 6, 7)|((2, 6), 1)",0,3,8,26.34570743605858,8,3 3 2 +587,S3_packet_copy,"(2, 3, 6, 7)|((2, 7), -1)",0,3,8,26.34570743605858,8,3 3 2 +588,S3_packet_copy,"(2, 3, 6, 7)|((2, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +589,S3_packet_copy,"(2, 3, 6, 7)|((3, 6), -1)",0,3,8,26.34570743605858,8,3 3 2 +590,S3_packet_copy,"(2, 3, 6, 7)|((3, 6), 1)",0,3,9,28.726624372322533,9,3 3 3 +591,S3_packet_copy,"(2, 3, 6, 7)|((3, 7), -1)",0,3,9,28.726624372322533,9,3 3 3 +592,S3_packet_copy,"(2, 3, 6, 7)|((3, 7), 1)",0,3,8,26.34570743605858,8,3 3 2 +593,S3_packet_copy,"(2, 3, 6, 7)|((6, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +594,S3_packet_copy,"(4, 5, 6, 7)|((4, 5), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +595,S3_packet_copy,"(4, 5, 6, 7)|((4, 6), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +596,S3_packet_copy,"(4, 5, 6, 7)|((4, 6), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +597,S3_packet_copy,"(4, 5, 6, 7)|((4, 7), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +598,S3_packet_copy,"(4, 5, 6, 7)|((4, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +599,S3_packet_copy,"(4, 5, 6, 7)|((5, 6), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +600,S3_packet_copy,"(4, 5, 6, 7)|((5, 6), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +601,S3_packet_copy,"(4, 5, 6, 7)|((5, 7), -1)",0,4,7,25.35108486091452,7,3 2 1 1 +602,S3_packet_copy,"(4, 5, 6, 7)|((5, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +603,S3_packet_copy,"(4, 5, 6, 7)|((6, 7), 1)",0,4,7,25.35108486091452,7,3 2 1 1 +604,S4_slot_copy,"((0, 1, 2, 3), (0, 2), -1)|8",0,5,8,29.641544302062908,8,3 2 1 1 1 +605,S4_slot_copy,"((0, 1, 2, 3), (0, 2), 1)|9",0,5,8,29.641544302062908,8,3 2 1 1 1 +606,S4_slot_copy,"((0, 1, 2, 3), (0, 3), -1)|10",0,5,8,29.641544302062908,8,3 2 1 1 1 +607,S4_slot_copy,"((0, 1, 2, 3), (0, 3), 1)|11",0,4,5,20.066002844622066,5,2 1 1 1 +608,S4_slot_copy,"((0, 1, 2, 3), (1, 2), -1)|11",0,5,8,29.641544302062908,8,3 2 1 1 1 +609,S4_slot_copy,"((0, 1, 2, 3), (1, 2), 1)|10",0,4,5,20.066002844622066,5,2 1 1 1 +610,S4_slot_copy,"((0, 1, 2, 3), (1, 3), -1)|9",0,4,5,20.066002844622066,5,2 1 1 1 +611,S4_slot_copy,"((0, 1, 2, 3), (1, 3), 1)|8",0,4,5,20.066002844622066,5,2 1 1 1 +612,S4_slot_copy,"((0, 1, 4, 5), (0, 4), -1)|20",0,5,8,29.641544302062908,8,3 2 1 1 1 +613,S4_slot_copy,"((0, 1, 4, 5), (0, 4), 1)|21",0,5,8,29.641544302062908,8,3 2 1 1 1 +614,S4_slot_copy,"((0, 1, 4, 5), (0, 5), -1)|22",0,5,8,29.641544302062908,8,3 2 1 1 1 +615,S4_slot_copy,"((0, 1, 4, 5), (0, 5), 1)|23",0,4,5,20.066002844622066,5,2 1 1 1 +616,S4_slot_copy,"((0, 1, 4, 5), (1, 4), -1)|23",0,5,8,29.641544302062908,8,3 2 1 1 1 +617,S4_slot_copy,"((0, 1, 4, 5), (1, 4), 1)|22",0,4,5,20.066002844622066,5,2 1 1 1 +618,S4_slot_copy,"((0, 1, 4, 5), (1, 5), -1)|21",0,4,5,20.066002844622066,5,2 1 1 1 +619,S4_slot_copy,"((0, 1, 4, 5), (1, 5), 1)|20",0,4,5,20.066002844622066,5,2 1 1 1 +620,S4_slot_copy,"((0, 1, 6, 7), (0, 6), -1)|32",0,5,8,29.641544302062908,8,3 2 1 1 1 +621,S4_slot_copy,"((0, 1, 6, 7), (0, 6), 1)|33",0,5,8,29.641544302062908,8,3 2 1 1 1 +622,S4_slot_copy,"((0, 1, 6, 7), (0, 7), -1)|34",0,5,8,29.641544302062908,8,3 2 1 1 1 +623,S4_slot_copy,"((0, 1, 6, 7), (0, 7), 1)|35",0,4,5,20.066002844622066,5,2 1 1 1 +624,S4_slot_copy,"((0, 1, 6, 7), (1, 6), -1)|35",0,5,8,29.641544302062908,8,3 2 1 1 1 +625,S4_slot_copy,"((0, 1, 6, 7), (1, 6), 1)|34",0,4,5,20.066002844622066,5,2 1 1 1 +626,S4_slot_copy,"((0, 1, 6, 7), (1, 7), -1)|33",0,4,5,20.066002844622066,5,2 1 1 1 +627,S4_slot_copy,"((0, 1, 6, 7), (1, 7), 1)|32",0,4,5,20.066002844622066,5,2 1 1 1 +628,S4_slot_copy,"((0, 2, 4, 6), (0, 4), -1)|44",0,5,8,28.778498084707564,8,4 1 1 1 1 +629,S4_slot_copy,"((0, 2, 4, 6), (0, 4), 1)|45",0,5,8,28.778498084707564,8,4 1 1 1 1 +630,S4_slot_copy,"((0, 2, 4, 6), (0, 6), -1)|46",0,5,8,28.778498084707564,8,4 1 1 1 1 +631,S4_slot_copy,"((0, 2, 4, 6), (0, 6), 1)|47",0,4,4,17.161837764593564,4,1 1 1 1 +632,S4_slot_copy,"((0, 2, 4, 6), (2, 4), -1)|47",0,5,8,28.778498084707564,8,4 1 1 1 1 +633,S4_slot_copy,"((0, 2, 4, 6), (2, 4), 1)|46",0,4,4,17.161837764593564,4,1 1 1 1 +634,S4_slot_copy,"((0, 2, 4, 6), (2, 6), -1)|45",0,4,4,17.161837764593564,4,1 1 1 1 +635,S4_slot_copy,"((0, 2, 4, 6), (2, 6), 1)|44",0,4,4,17.161837764593564,4,1 1 1 1 +636,S4_slot_copy,"((0, 2, 5, 7), (0, 5), -1)|56",0,5,8,29.641544302062908,8,3 2 1 1 1 +637,S4_slot_copy,"((0, 2, 5, 7), (0, 5), 1)|57",0,5,8,29.641544302062908,8,3 2 1 1 1 +638,S4_slot_copy,"((0, 2, 5, 7), (0, 7), -1)|58",0,5,8,29.641544302062908,8,3 2 1 1 1 +639,S4_slot_copy,"((0, 2, 5, 7), (0, 7), 1)|59",0,4,5,20.066002844622066,5,2 1 1 1 +640,S4_slot_copy,"((0, 2, 5, 7), (2, 5), -1)|59",0,5,8,29.641544302062908,8,3 2 1 1 1 +641,S4_slot_copy,"((0, 2, 5, 7), (2, 5), 1)|58",0,4,5,20.066002844622066,5,2 1 1 1 +642,S4_slot_copy,"((0, 2, 5, 7), (2, 7), -1)|57",0,4,5,20.066002844622066,5,2 1 1 1 +643,S4_slot_copy,"((0, 2, 5, 7), (2, 7), 1)|56",0,4,5,20.066002844622066,5,2 1 1 1 +644,S4_slot_copy,"((0, 3, 4, 7), (0, 4), -1)|68",0,5,8,29.641544302062908,8,3 2 1 1 1 +645,S4_slot_copy,"((0, 3, 4, 7), (0, 4), 1)|69",0,5,8,29.641544302062908,8,3 2 1 1 1 +646,S4_slot_copy,"((0, 3, 4, 7), (0, 7), -1)|70",0,5,8,29.641544302062908,8,3 2 1 1 1 +647,S4_slot_copy,"((0, 3, 4, 7), (0, 7), 1)|71",0,4,5,20.066002844622066,5,2 1 1 1 +648,S4_slot_copy,"((0, 3, 4, 7), (3, 4), -1)|71",0,5,8,29.641544302062908,8,3 2 1 1 1 +649,S4_slot_copy,"((0, 3, 4, 7), (3, 4), 1)|70",0,4,5,20.066002844622066,5,2 1 1 1 +650,S4_slot_copy,"((0, 3, 4, 7), (3, 7), -1)|69",0,4,5,20.066002844622066,5,2 1 1 1 +651,S4_slot_copy,"((0, 3, 4, 7), (3, 7), 1)|68",0,4,5,20.066002844622066,5,2 1 1 1 +652,S4_slot_copy,"((0, 3, 5, 6), (0, 5), -1)|80",0,5,8,29.641544302062908,8,3 2 1 1 1 +653,S4_slot_copy,"((0, 3, 5, 6), (0, 5), 1)|81",0,5,8,29.641544302062908,8,3 2 1 1 1 +654,S4_slot_copy,"((0, 3, 5, 6), (0, 6), -1)|82",0,5,8,29.641544302062908,8,3 2 1 1 1 +655,S4_slot_copy,"((0, 3, 5, 6), (0, 6), 1)|83",0,4,5,20.066002844622066,5,2 1 1 1 +656,S4_slot_copy,"((0, 3, 5, 6), (3, 5), -1)|83",0,5,8,29.641544302062908,8,3 2 1 1 1 +657,S4_slot_copy,"((0, 3, 5, 6), (3, 5), 1)|82",0,4,5,20.066002844622066,5,2 1 1 1 +658,S4_slot_copy,"((0, 3, 5, 6), (3, 6), -1)|81",0,4,5,20.066002844622066,5,2 1 1 1 +659,S4_slot_copy,"((0, 3, 5, 6), (3, 6), 1)|80",0,4,5,20.066002844622066,5,2 1 1 1 +660,S4_slot_copy,"((1, 2, 4, 7), (1, 4), -1)|92",0,5,8,28.778498084707564,8,4 1 1 1 1 +661,S4_slot_copy,"((1, 2, 4, 7), (1, 4), 1)|93",0,5,8,28.778498084707564,8,4 1 1 1 1 +662,S4_slot_copy,"((1, 2, 4, 7), (1, 7), -1)|94",0,5,8,28.778498084707564,8,4 1 1 1 1 +663,S4_slot_copy,"((1, 2, 4, 7), (1, 7), 1)|95",0,4,4,17.161837764593564,4,1 1 1 1 +664,S4_slot_copy,"((1, 2, 4, 7), (2, 4), -1)|95",0,5,8,28.778498084707564,8,4 1 1 1 1 +665,S4_slot_copy,"((1, 2, 4, 7), (2, 4), 1)|94",0,4,4,17.161837764593564,4,1 1 1 1 +666,S4_slot_copy,"((1, 2, 4, 7), (2, 7), -1)|93",0,4,4,17.161837764593564,4,1 1 1 1 +667,S4_slot_copy,"((1, 2, 4, 7), (2, 7), 1)|92",0,4,4,17.161837764593564,4,1 1 1 1 +668,S4_slot_copy,"((1, 2, 5, 6), (1, 5), -1)|104",0,5,8,29.641544302062908,8,3 2 1 1 1 +669,S4_slot_copy,"((1, 2, 5, 6), (1, 5), 1)|105",0,5,8,29.641544302062908,8,3 2 1 1 1 +670,S4_slot_copy,"((1, 2, 5, 6), (1, 6), -1)|106",0,5,8,29.641544302062908,8,3 2 1 1 1 +671,S4_slot_copy,"((1, 2, 5, 6), (1, 6), 1)|107",0,4,5,20.066002844622066,5,2 1 1 1 +672,S4_slot_copy,"((1, 2, 5, 6), (2, 5), -1)|107",0,5,8,29.641544302062908,8,3 2 1 1 1 +673,S4_slot_copy,"((1, 2, 5, 6), (2, 5), 1)|106",0,4,5,20.066002844622066,5,2 1 1 1 +674,S4_slot_copy,"((1, 2, 5, 6), (2, 6), -1)|105",0,4,5,20.066002844622066,5,2 1 1 1 +675,S4_slot_copy,"((1, 2, 5, 6), (2, 6), 1)|104",0,4,5,20.066002844622066,5,2 1 1 1 +676,S4_slot_copy,"((1, 3, 4, 6), (1, 4), -1)|116",0,5,8,29.641544302062908,8,3 2 1 1 1 +677,S4_slot_copy,"((1, 3, 4, 6), (1, 4), 1)|117",0,5,8,29.641544302062908,8,3 2 1 1 1 +678,S4_slot_copy,"((1, 3, 4, 6), (1, 6), -1)|118",0,5,8,29.641544302062908,8,3 2 1 1 1 +679,S4_slot_copy,"((1, 3, 4, 6), (1, 6), 1)|119",0,4,5,20.066002844622066,5,2 1 1 1 +680,S4_slot_copy,"((1, 3, 4, 6), (3, 4), -1)|119",0,5,8,29.641544302062908,8,3 2 1 1 1 +681,S4_slot_copy,"((1, 3, 4, 6), (3, 4), 1)|118",0,4,5,20.066002844622066,5,2 1 1 1 +682,S4_slot_copy,"((1, 3, 4, 6), (3, 6), -1)|117",0,4,5,20.066002844622066,5,2 1 1 1 +683,S4_slot_copy,"((1, 3, 4, 6), (3, 6), 1)|116",0,4,5,20.066002844622066,5,2 1 1 1 +684,S4_slot_copy,"((1, 3, 5, 7), (1, 5), -1)|128",0,5,8,29.641544302062908,8,3 2 1 1 1 +685,S4_slot_copy,"((1, 3, 5, 7), (1, 5), 1)|129",0,5,8,29.641544302062908,8,3 2 1 1 1 +686,S4_slot_copy,"((1, 3, 5, 7), (1, 7), -1)|130",0,5,8,29.641544302062908,8,3 2 1 1 1 +687,S4_slot_copy,"((1, 3, 5, 7), (1, 7), 1)|131",0,4,5,20.066002844622066,5,2 1 1 1 +688,S4_slot_copy,"((1, 3, 5, 7), (3, 5), -1)|131",0,5,8,29.641544302062908,8,3 2 1 1 1 +689,S4_slot_copy,"((1, 3, 5, 7), (3, 5), 1)|130",0,4,5,20.066002844622066,5,2 1 1 1 +690,S4_slot_copy,"((1, 3, 5, 7), (3, 7), -1)|129",0,4,5,20.066002844622066,5,2 1 1 1 +691,S4_slot_copy,"((1, 3, 5, 7), (3, 7), 1)|128",0,4,5,20.066002844622066,5,2 1 1 1 +692,S4_slot_copy,"((2, 3, 4, 5), (2, 4), -1)|140",0,5,8,29.641544302062908,8,3 2 1 1 1 +693,S4_slot_copy,"((2, 3, 4, 5), (2, 4), 1)|141",0,5,8,29.641544302062908,8,3 2 1 1 1 +694,S4_slot_copy,"((2, 3, 4, 5), (2, 5), -1)|142",0,5,8,29.641544302062908,8,3 2 1 1 1 +695,S4_slot_copy,"((2, 3, 4, 5), (2, 5), 1)|143",0,4,5,20.066002844622066,5,2 1 1 1 +696,S4_slot_copy,"((2, 3, 4, 5), (3, 4), -1)|143",0,5,8,29.641544302062908,8,3 2 1 1 1 +697,S4_slot_copy,"((2, 3, 4, 5), (3, 4), 1)|142",0,4,5,20.066002844622066,5,2 1 1 1 +698,S4_slot_copy,"((2, 3, 4, 5), (3, 5), -1)|141",0,4,5,20.066002844622066,5,2 1 1 1 +699,S4_slot_copy,"((2, 3, 4, 5), (3, 5), 1)|140",0,4,5,20.066002844622066,5,2 1 1 1 +700,S4_slot_copy,"((2, 3, 6, 7), (2, 6), -1)|152",0,5,8,29.641544302062908,8,3 2 1 1 1 +701,S4_slot_copy,"((2, 3, 6, 7), (2, 6), 1)|153",0,5,8,29.641544302062908,8,3 2 1 1 1 +702,S4_slot_copy,"((2, 3, 6, 7), (2, 7), -1)|154",0,5,8,29.641544302062908,8,3 2 1 1 1 +703,S4_slot_copy,"((2, 3, 6, 7), (2, 7), 1)|155",0,4,5,20.066002844622066,5,2 1 1 1 +704,S4_slot_copy,"((2, 3, 6, 7), (3, 6), -1)|155",0,5,8,29.641544302062908,8,3 2 1 1 1 +705,S4_slot_copy,"((2, 3, 6, 7), (3, 6), 1)|154",0,4,5,20.066002844622066,5,2 1 1 1 +706,S4_slot_copy,"((2, 3, 6, 7), (3, 7), -1)|153",0,4,5,20.066002844622066,5,2 1 1 1 +707,S4_slot_copy,"((2, 3, 6, 7), (3, 7), 1)|152",0,4,5,20.066002844622066,5,2 1 1 1 +708,S4_slot_copy,"((4, 5, 6, 7), (4, 6), -1)|164",0,5,8,29.641544302062908,8,3 2 1 1 1 +709,S4_slot_copy,"((4, 5, 6, 7), (4, 6), 1)|165",0,5,8,29.641544302062908,8,3 2 1 1 1 +710,S4_slot_copy,"((4, 5, 6, 7), (4, 7), -1)|166",0,5,8,29.641544302062908,8,3 2 1 1 1 +711,S4_slot_copy,"((4, 5, 6, 7), (4, 7), 1)|167",0,4,5,20.066002844622066,5,2 1 1 1 +712,S4_slot_copy,"((4, 5, 6, 7), (5, 6), -1)|167",0,5,8,29.641544302062908,8,3 2 1 1 1 +713,S4_slot_copy,"((4, 5, 6, 7), (5, 6), 1)|166",0,4,5,20.066002844622066,5,2 1 1 1 +714,S4_slot_copy,"((4, 5, 6, 7), (5, 7), -1)|165",0,4,5,20.066002844622066,5,2 1 1 1 +715,S4_slot_copy,"((4, 5, 6, 7), (5, 7), 1)|164",0,4,5,20.066002844622066,5,2 1 1 1 diff --git a/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledgers.log b/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledgers.log new file mode 100644 index 0000000000..934a7fb78c --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/evidence/C1/ledgers.log @@ -0,0 +1,2 @@ +PASS emitted forward 25250 events +PASS emitted backward 25250 events diff --git a/research/format-limits-2/s3-4-census-gauges/evidence/G2/rep1.log b/research/format-limits-2/s3-4-census-gauges/evidence/G2/rep1.log new file mode 100644 index 0000000000..fd0242bdb4 --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/evidence/G2/rep1.log @@ -0,0 +1,18 @@ +RUN shadow-early +PASS shadow-early +RUN shadow-prefix +PASS shadow-prefix +RUN gauge-forward +PASS gauge-forward +RUN port0 +PASS port0 +RUN port1 +PASS port1 +RUN port2 +PASS port2 +RUN port3 +PASS port3 +RUN cold44-exact +PASS cold44-exact +PASS exact frozen scalar word cards/B58/work/rep1/cold44/FULL-WORD.json.gz +nice -n19 timeout 1500 venv/bin/python3 4.62s user 0.22s system 81% cpu 5.901 total diff --git a/research/format-limits-2/s3-4-census-gauges/inputs/derived/ck-CANONICAL-WORD.json.gz b/research/format-limits-2/s3-4-census-gauges/inputs/derived/ck-CANONICAL-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..58cd1be8f28b74bea83c435eee1f52b36a274281 GIT binary patch literal 92137 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 e_dI=Q!mvEyb>itsJ&hCYEuGCa0~GBqV3XSi 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 literal 0 HcmV?d00001 diff --git a/research/format-limits-2/s3-4-census-gauges/inputs/pr626/GENERATED-IDENTITY-CONTROLS.json b/research/format-limits-2/s3-4-census-gauges/inputs/pr626/GENERATED-IDENTITY-CONTROLS.json new file mode 100644 index 0000000000..901387218f --- /dev/null +++ b/research/format-limits-2/s3-4-census-gauges/inputs/pr626/GENERATED-IDENTITY-CONTROLS.json @@ -0,0 +1,300 @@ +{ + "status": "PASS_GENERATED_ARTIFACT_RECOMPRESSION_AND_REBOUND_MUTATIONS", + "kappa": "51110230636731/31250000000000000", + "source_owner_sha256": "f4238b68cd31b8fc45e09b0fbde129e9f463fc0abab2f38121247cc5ef63f961", + "source_invoice_sha256": "feadbb688d8788c7e90f3852b0d3faaea3d5dd702896cea5eff7d19550b5acf9", + "source_providers": { + "ck": { + "raw": { + "CANONICAL-WORD.json.gz": "ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45", + "LOCAL-PROGRAMS.json.gz": "b5da54e049cc127a1065190a647cb71cac0c6ba03d9ccdb71719f4fcbfa886f3", + "LOCAL-CHECKS.json": "059c4e59142bdf5c19dc7c0afebcddfec28e6e60cbc7299b8bdcc624afbc0cbe", + "INDEPENDENT-LOCAL-REPLAY.json": "ecefb9e661301d8081522be68bbe6640e175c011eb1177f643383d193c6fb2f0", + "CLIFFORD-RECIPES.json": "dfb64e71409a395f9375d9cc2258365d462bab2d28b707dcfba38994dd5aa0b9", + "CLIFFORD-REVIEW.json": "b232f53aebf777f55e713c327378ebcd9618f3b2297340aff8ed26ad584a2d3b", + "RESIDUAL-ADAPTERS.json": "4697965c1b466fd3eaf37fa1fbbd45bb06c78cb0fe0b3a253744efb4013581b9" + }, + "semantic": { + "CANONICAL-WORD.json.gz": "9bbc75dede090cfd7a0a0252424ea9d9f6211e2350d2a801d4e4f2f0784167c7", + "LOCAL-PROGRAMS.json.gz": "854f17274092263dc25e60367f4cd0d29f60a8446becd17cc1883ebed7a97900", + "LOCAL-CHECKS.json": "9e7be4f5eb567ffe886871b3fa434cc71f352e91cc9da07cb4e72c5742f24db4", + "INDEPENDENT-LOCAL-REPLAY.json": "ad854d9d15515cbcf7a2bee221d9c3cf0c7215770521866b12ce98aa777e310b", + "CLIFFORD-RECIPES.json": "dfb64e71409a395f9375d9cc2258365d462bab2d28b707dcfba38994dd5aa0b9", + "CLIFFORD-REVIEW.json": "dceebd0983fdfe94922323ae6499fc2d9bfbb7886c6843af5673b0266ec5b609", + "RESIDUAL-ADAPTERS.json": "8283dfa442fc7e7626f3356385bda8607b8d15eecfdc9515a6271c29da6caa7a" + } + }, + "jp8": { + "raw": { + "CANONICAL-WORD.json.gz": "7a3fec1022d3b2b1bd986302a327735ec521d17b043f4a5acb96253a56f6193c", + "LOCAL-PROGRAMS.json.gz": "fa0c196f65bd6ec1424fdf7d789f6972075c7bb02bf43f573ea85eafab31be98", + "LOCAL-CHECKS.json": "0fad744aa863eedb288a9f87b1c23225a36b316b6275cc3b1bcedd42afe28a67", + "INDEPENDENT-LOCAL-REPLAY.json": "cb2f99ed351925dd35434b73de16f4085884fe81a35a69e1c7ce2d5e96cb975b", + "CLIFFORD-RECIPES.json": "2799d73dd08c4435e5900ff2ae6ebc7f34535c153e173ab88d66d1f0b5e6dcde", + "CLIFFORD-REVIEW.json": "8024d96e5d7ed278066d8f7678fe483692d34f8f7038a59c5be99cb53c2fe136", + "RESIDUAL-ADAPTERS.json": "bdb44cf523636f307ebb3617da548f2e3a8af74321eabe24aef40186e280a917" + }, + "semantic": { + "CANONICAL-WORD.json.gz": "fb4a8d14ed2a8048698bea6ae16f86163a1aa6c80f2eb622222eee5cdbce9b3b", + "LOCAL-PROGRAMS.json.gz": "efe45ce7fb025a6f53cc9eb54e951ac2211a5ed927e689a049e4f68ca680654b", + "LOCAL-CHECKS.json": "e29bdcebdc2966979a9f5911f56b68c6f4942f6fdbeb6737e9db44e147d0193a", + "INDEPENDENT-LOCAL-REPLAY.json": "f31a73829f5de91fe98c3986bb2ad9b31e7b33881720029347051ab2b686af3c", + "CLIFFORD-RECIPES.json": "2799d73dd08c4435e5900ff2ae6ebc7f34535c153e173ab88d66d1f0b5e6dcde", + "CLIFFORD-REVIEW.json": "4231236ccc3bf45c469e4c98e3071a01ebf75f6366fb73b733e969fed65338b9", + "RESIDUAL-ADAPTERS.json": "99e1873464e8e718ea25fd80df5aaed0e5508b83e9bf2bdd094ea5c95fdf87c9" + } + } + }, + "recompression_changed_raw_hashes": { + "ck": { + "CANONICAL-WORD.json.gz": [ + "ae3018c0646be06f47d345bb8baf0e6ea9220096a949fa30a8f7656aa4ad6f45", + "596294d68a0f4bc1b6ec661f733fde4159a024014bf7ff2e708aa8f4c2374a2f" + ], + "LOCAL-PROGRAMS.json.gz": [ + "b5da54e049cc127a1065190a647cb71cac0c6ba03d9ccdb71719f4fcbfa886f3", + "2ddc2bd33320eed9de29a791d20e7d9622f01a9f2d368d95a83c151078a59cff" + ] + }, + "jp8": { + "CANONICAL-WORD.json.gz": [ + "7a3fec1022d3b2b1bd986302a327735ec521d17b043f4a5acb96253a56f6193c", + "1b22aeed987168c7a39d0bd62c050ad4a3000097cc52fdaaa26721dd5a5fd61f" + ], + "LOCAL-PROGRAMS.json.gz": [ + "fa0c196f65bd6ec1424fdf7d789f6972075c7bb02bf43f573ea85eafab31be98", + "3913c10ea6c5bd27aa61022891c5e627bb01c28ab89bafb6792f9a1f657f909e" + ] + } + }, + "accepted": [ + { + "provider": "ck", + "case": "recompressed_same_payloads", + "changed_raw_artifacts": [ + "CANONICAL-WORD.json.gz", + "LOCAL-PROGRAMS.json.gz" + ], + "all_seven_identities_unchanged": true, + "all_raw_links_rebound": true + }, + { + "provider": "jp8", + "case": "recompressed_same_payloads", + "changed_raw_artifacts": [ + "CANONICAL-WORD.json.gz", + "LOCAL-PROGRAMS.json.gz" + ], + "all_seven_identities_unchanged": true, + "all_raw_links_rebound": true + } + ], + "semantic_mutations_rejected": [ + { + "provider": "ck", + "case": "changed_actual_scalar", + "changed_identity": "LOCAL-PROGRAMS.json.gz", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "changed_actual_start_frame_same_rank", + "changed_identity": "CANONICAL-WORD.json.gz", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "native_false_restoration", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "native_wrong_column_count", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "native_changed_profile", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "phase_false_global_equality", + "changed_identity": "CLIFFORD-REVIEW.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "local_event_hash_is_not_a_container_reference", + "changed_identity": "LOCAL-CHECKS.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "unrelated_native_root_seconds_retained", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "ck", + "case": "nested_phase_seconds_retained", + "changed_identity": "CLIFFORD-REVIEW.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "changed_actual_scalar", + "changed_identity": "LOCAL-PROGRAMS.json.gz", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "changed_actual_start_frame_same_rank", + "changed_identity": "CANONICAL-WORD.json.gz", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "native_false_restoration", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "native_wrong_column_count", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "native_changed_profile", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "phase_false_global_equality", + "changed_identity": "CLIFFORD-REVIEW.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "local_event_hash_is_not_a_container_reference", + "changed_identity": "LOCAL-CHECKS.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "unrelated_native_root_seconds_retained", + "changed_identity": "INDEPENDENT-LOCAL-REPLAY.json", + "all_raw_and_semantic_links_rebound": true + }, + { + "provider": "jp8", + "case": "nested_phase_seconds_retained", + "changed_identity": "CLIFFORD-REVIEW.json", + "all_raw_and_semantic_links_rebound": true + } + ], + "invalid_references_or_metadata_rejected": [ + { + "provider": "ck", + "case": "stale_native_word_link", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "stale_native_program_link", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "stale_phase_word_link", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "stale_phase_recipe_link", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "invalid_phase_seconds_negative", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "invalid_phase_seconds_boolean", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "invalid_phase_seconds_string", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "invalid_phase_seconds_nan", + "rejected_before_projection": true + }, + { + "provider": "ck", + "case": "invalid_phase_seconds_infinity", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "stale_native_word_link", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "stale_native_program_link", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "stale_phase_word_link", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "stale_phase_recipe_link", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "invalid_phase_seconds_negative", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "invalid_phase_seconds_boolean", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "invalid_phase_seconds_string", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "invalid_phase_seconds_nan", + "rejected_before_projection": true + }, + { + "provider": "jp8", + "case": "invalid_phase_seconds_infinity", + "rejected_before_projection": true + } + ], + "counts": { + "recompression_accepted": 2, + "semantic_rejected": 18, + "reference_or_metadata_rejected": 18 + }, + "scope": "Actual copied gzip streams and receipt JSON are changed. All seven content identities, raw source links and owner/invoice digests are recomputed consistently before assembly. Only identical decompressed payloads are accepted; scalar, same-rank frame, native proof fields, global phase, event hashes and unrelated seconds remain pinned. Literal references and invalid phase timing are rejected before normalization. Full physical replay remains a separate prerequisite." +} diff --git a/research/format-limits-2/s3-4-census-gauges/inputs/pr645/FULL-WORD.json.gz b/research/format-limits-2/s3-4-census-gauges/inputs/pr645/FULL-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..447d45d08bf4b054d2fa76a0dc00a3b0f168fe91 GIT binary patch literal 126885 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