From c88769c350977d9ed4f90fe5c652d582cfe2782a Mon Sep 17 00:00:00 2001 From: Marius-Paul Dumitrean Date: Fri, 16 Oct 2026 22:31:38 -0400 Subject: [PATCH] research: prove the restore-only optimum for PR #3042's six-skip words Every exact restore-only rewrite of dcharb78's six-skip words (both providers; A/B, warps, cut, helper ends, start frames and buffers fixed; any restore gate sequence; all frames re-solved; exactness = PR2833's auditor) costs at least LB_forced + forced restore-phase visits = 10,867,765,164 + 337,923 = 10,868,103,087, the certified cost of the words, which attain it. No new kappa. The stdlib verifier recomputes the exact frame optimum (numpy-free port of the certified solver), the free-algebra restore-entry rows and the forced coordinates, the 88 entry caps and LB_forced, and the sound classification (dual-vector departure lemma; 42 blocked registers, 9 payer groups). It also checks the PR2979 calibration (29,976 = the six PR3042 skips), the per-block erratum of PR3042's README, the auditor-semantics and attainment controls, twelve rejection controls, and the deletion and tail-exchange censuses. --- .../rank7-skip-restore-optimum/.gitattributes | 2 + .../rank7-skip-restore-optimum/CREDITS.md | 27 + .../rank7-skip-restore-optimum/MANIFEST.json | 41 + research/rank7-skip-restore-optimum/NOTICE | 16 + research/rank7-skip-restore-optimum/PINS.json | 28 + research/rank7-skip-restore-optimum/README.md | 233 + .../rank7-skip-restore-optimum/SOURCES.json | 257 + research/rank7-skip-restore-optimum/TASK.json | 72 + .../rank7-skip-restore-optimum/VERIFY.json | 30 + research/rank7-skip-restore-optimum/census.py | 165 + .../certificates/BOUND-3042-base.json | 6018 +++++++++++++++++ .../certificates/BOUND-3042-extra.json | 6018 +++++++++++++++++ .../certificates/CALIBRATION-2979.json | 120 + .../certificates/CENSUS.json | 300 + .../certificates/CONTROLS.json | 378 ++ .../certificates/ERRATUM-3042.json | 77 + .../certificates/RESULT.json | 21 + .../data/EDITS-3042.json | 2984 ++++++++ .../data/WORD-2979-base.json.gz | Bin 0 -> 71422 bytes .../data/WORD-2979-extra.json.gz | Bin 0 -> 71419 bytes .../data/WORD-3042-base.json.gz | Bin 0 -> 72539 bytes .../data/WORD-3042-extra.json.gz | Bin 0 -> 72538 bytes .../evidence/laneK/AUDITOR-SEMANTICS.json | 28 + .../evidence/laneK/CROSSCHECK.json | 233 + .../evidence/laneK/FULLAB-SUMMARY.json | 108 + .../evidence/laneK/NEGATIVE-3042-base.json | 1441 ++++ .../evidence/laneK/NEGATIVE-3042-extra.json | 1441 ++++ .../evidence/laneK/bound.py | 259 + .../evidence/laneK/crosscheck_lanek.py | 42 + .../evidence/laneK/lbforced.py | 37 + .../TAIL-EXCHANGE-3042-base.jsonl.gz | Bin 0 -> 32643 bytes .../TAIL-EXCHANGE-3042-extra.jsonl.gz | Bin 0 -> 32643 bytes .../frames_exact.py | 510 ++ .../restore_bound.py | 562 ++ .../run_registered.py | 89 + .../vendor/audit_local.py | 501 ++ .../vendor/base_two_moment.py | 63 + .../vendor/gk_common.py | 94 + .../vendor/moment.py | 113 + research/rank7-skip-restore-optimum/verify.py | 555 ++ 40 files changed, 22863 insertions(+) create mode 100644 research/rank7-skip-restore-optimum/.gitattributes create mode 100644 research/rank7-skip-restore-optimum/CREDITS.md create mode 100644 research/rank7-skip-restore-optimum/MANIFEST.json create mode 100644 research/rank7-skip-restore-optimum/NOTICE create mode 100644 research/rank7-skip-restore-optimum/PINS.json create mode 100644 research/rank7-skip-restore-optimum/README.md create mode 100644 research/rank7-skip-restore-optimum/SOURCES.json create mode 100644 research/rank7-skip-restore-optimum/TASK.json create mode 100644 research/rank7-skip-restore-optimum/VERIFY.json create mode 100644 research/rank7-skip-restore-optimum/census.py create mode 100644 research/rank7-skip-restore-optimum/certificates/BOUND-3042-base.json create mode 100644 research/rank7-skip-restore-optimum/certificates/BOUND-3042-extra.json create mode 100644 research/rank7-skip-restore-optimum/certificates/CALIBRATION-2979.json create mode 100644 research/rank7-skip-restore-optimum/certificates/CENSUS.json create mode 100644 research/rank7-skip-restore-optimum/certificates/CONTROLS.json create mode 100644 research/rank7-skip-restore-optimum/certificates/ERRATUM-3042.json create mode 100644 research/rank7-skip-restore-optimum/certificates/RESULT.json create mode 100644 research/rank7-skip-restore-optimum/data/EDITS-3042.json create mode 100644 research/rank7-skip-restore-optimum/data/WORD-2979-base.json.gz create mode 100644 research/rank7-skip-restore-optimum/data/WORD-2979-extra.json.gz create mode 100644 research/rank7-skip-restore-optimum/data/WORD-3042-base.json.gz create mode 100644 research/rank7-skip-restore-optimum/data/WORD-3042-extra.json.gz create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/AUDITOR-SEMANTICS.json create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/CROSSCHECK.json create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/FULLAB-SUMMARY.json create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-base.json create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-extra.json create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/bound.py create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/crosscheck_lanek.py create mode 100644 research/rank7-skip-restore-optimum/evidence/laneK/lbforced.py create mode 100644 research/rank7-skip-restore-optimum/evidence/tail-exchange/TAIL-EXCHANGE-3042-base.jsonl.gz create mode 100644 research/rank7-skip-restore-optimum/evidence/tail-exchange/TAIL-EXCHANGE-3042-extra.jsonl.gz create mode 100644 research/rank7-skip-restore-optimum/frames_exact.py create mode 100644 research/rank7-skip-restore-optimum/restore_bound.py create mode 100644 research/rank7-skip-restore-optimum/run_registered.py create mode 100644 research/rank7-skip-restore-optimum/vendor/audit_local.py create mode 100644 research/rank7-skip-restore-optimum/vendor/base_two_moment.py create mode 100644 research/rank7-skip-restore-optimum/vendor/gk_common.py create mode 100644 research/rank7-skip-restore-optimum/vendor/moment.py create mode 100644 research/rank7-skip-restore-optimum/verify.py diff --git a/research/rank7-skip-restore-optimum/.gitattributes b/research/rank7-skip-restore-optimum/.gitattributes new file mode 100644 index 0000000000..d6664a7226 --- /dev/null +++ b/research/rank7-skip-restore-optimum/.gitattributes @@ -0,0 +1,2 @@ +# Keep vendored, data, certificate and evidence bytes exact (the repository default normalizes text). +* -text diff --git a/research/rank7-skip-restore-optimum/CREDITS.md b/research/rank7-skip-restore-optimum/CREDITS.md new file mode 100644 index 0000000000..f7bc8131a8 --- /dev/null +++ b/research/rank7-skip-restore-optimum/CREDITS.md @@ -0,0 +1,27 @@ +# Credits + +- **PR #3042, dcharb78**: the six-skip words (both providers) and the carrier/pivot routing that removes six restore-phase + visits (63, 54, 40, 22 in R1_E42; 73, 5 in R2_E7); the pinned exports in `data/` and the declared edits used for the + erratum and the calibration. +- **PR #3015, Jeremy Kothe (jeremykothe2)**: R1 and the declared restore-edit stage that PR #3042 extends; with PR #2894 / + #2833 the frame accounting and inverse-reverse cleanup conventions this lineage prices with. +- **Nick Petalas**: PR #3054 (T740 packing with the six skips; its words are these words), PR #3057 (restore-frame optimum) + and PR #3065 (joint A/B/restore frame optimum, whose 743-variable / 210-component frame graph `verify.py` reproduces), + PR #3056 and PR #3060 (the `restore[175:179]` replacements used here as attainment controls), PR #3044 (R2 shared + covector), PR #3024 / #3030 (T740 cap). +- **PR #2979 and its lineage, Marius-Paul Dumitrean**: joint rank-7 end frames, the paired extractions at normals 42 and 7 + and the composed words that PR #3015 and PR #3042 edit; the r12 BORROW-WORD harness and the #1186 frame toolkit ported in + `frames_exact.py`. +- **icekylinx**: PR #2833's exact free-operator auditor, vendored unchanged and used both for the restore-entry rows + (`walg_apply`) and for every exactness control. +- **Mason Hale (PR #2917)** and **Jeremy Diviney (PR #2908)**: the paired-extraction words and two-sided certificates that the + restored helpers and their private buffers come from. +- **DreamingOfClouds / chafreaky (research/frame-domain-ceiling)**: the moment engines and GF(2) helpers behind the integer + weights. +- **Sagar Thakrar (PR #3053)** for the frame-reassignment handoff that PR #3057/#3065 answered, and **Gareth Davidson + (PR #1995 / #2013)** for the earlier fixed-word monotone-frame bounds. +- **New here (Marius-Paul Dumitrean, with substantial AI assistance from Claude Code)**: the restore-only optimum theorem and + its proof (auditor semantics with the appended-gate control, forced coordinates and caps, the dual-vector departure + lemma, carriers and lifts, the classification and accounting), the stdlib verifier and port, the PR #2979 calibration, + the PR #3042 erratum and the controls. Lane K of our r15 round found the bound and its censuses; this package re-derives + it with sound lemmas and pins lane K's code and receipts in `evidence/laneK/`. diff --git a/research/rank7-skip-restore-optimum/MANIFEST.json b/research/rank7-skip-restore-optimum/MANIFEST.json new file mode 100644 index 0000000000..6bfbdacadb --- /dev/null +++ b/research/rank7-skip-restore-optimum/MANIFEST.json @@ -0,0 +1,41 @@ +{ + ".gitattributes": "1d90e85a978fc13a34fe1b1656bb61c1e02fb4dbf3babc00ce421d7686fb6e94", + "CREDITS.md": "ba3e64853367d19003bb30b1f7ceecbdffafd5cb433c33321594d5fd8aec8ebe", + "NOTICE": "713634fb82cc419ed93d75b4bce1f7c5f9663fe941442db648758c047577075f", + "PINS.json": "5d7607c539fe2112bd922c582258d94ea71e9256a1af1d5f9693d7b4259217ea", + "README.md": "ad0d76b90e806072ffc7593a50824eba45cf98d86e62b26869903308995047df", + "SOURCES.json": "068a00369827958f1dc155202e63de8c85f69c89bda602854bd90044c5b0723c", + "TASK.json": "e15dc093f8b12be9a56e3a66d375cf5dae28b99fa81d78c16a4bfd7402d4cfb4", + "VERIFY.json": "616f5639c740c32468639aba6be717e85f6a85659b742a89b8948155203469d9", + "census.py": "c7fbb879e7ef2af727207f0be761ac198be73714bdbd967f7b9cc8ebb311058e", + "certificates/BOUND-3042-base.json": "10922a932f51dac4021ea8d6a09b47b3bf0b8e278b77824a79bcf842d4929ebf", + "certificates/BOUND-3042-extra.json": "e75d625fede24fbc712f37f9f11269a418ef643703efc2e253a6005fd226a4db", + "certificates/CALIBRATION-2979.json": "68be5cf24d945ad0c16c7a55ccc655b0ea3c3ffc92c1d6a312200260247f4619", + "certificates/CENSUS.json": "bc983ddeb96d8d3e239bc0f2d919a88539d2414650c195a70c80975bf878bb5c", + "certificates/CONTROLS.json": "b6e91b1c67e425f3255874579b038e3c8ebb7ac926dae7f0e87e63d3db8748b2", + "certificates/ERRATUM-3042.json": "e2ac9e3af74a77574d2ec8afb4a5c2c0197c048f59bad1d2b8b4b65c613e0dd6", + "certificates/RESULT.json": "feadd89cec8dbdb95fa36df8b1c24b5a062a889ffe8d905d06edf58b91d1842a", + "data/EDITS-3042.json": "ebffcc1e57e59439b9678ff8d9be518c457af22ce77235c2fdb46540ab9b9b79", + "data/WORD-2979-base.json.gz": "abaf67bfcb257528658c906b612f57025617592bd7889828f92b97a5f4f4300d", + "data/WORD-2979-extra.json.gz": "e0eaf64c4d5d324693d43889bce1b9e53e8da00402105c8c978fd102f208bed7", + "data/WORD-3042-base.json.gz": "7e98f6f2a6c9ce9e7e04b515bd8ce4a4a533ff05f01ea265be2a1a994695260e", + "data/WORD-3042-extra.json.gz": "1396410de482883416fc7f534062ab005b484056b035fdcfa3b5cc065536ba35", + "evidence/laneK/AUDITOR-SEMANTICS.json": "a37ed5585bb6cb907e643a89c3f34d654712e7b70d79d786be313a9f1a960a5c", + "evidence/laneK/CROSSCHECK.json": "3f1b9eab7f55a6d7e4c61bf25be656cd92dfa801b093b7e099c057a86bf469fc", + "evidence/laneK/FULLAB-SUMMARY.json": "135bf24a943fbfae601aacdc30419707457f704dd78655a010f678fb7eb6df47", + "evidence/laneK/NEGATIVE-3042-base.json": "326ad05aa4f3b77a1cb45d669f21231aa69404b7d1f2cbba410e24e31c44abc9", + "evidence/laneK/NEGATIVE-3042-extra.json": "3555d9d59768ed727f4ec01db70a7bfb0e4acaf99b1875663f5dc57850df143b", + "evidence/laneK/bound.py": "6b1479b436c4f01bb32f771aa06af3d2260adee5dd5a5e2bf568b0192cee69d8", + "evidence/laneK/crosscheck_lanek.py": "6a60ea588244b70c2594b763d7d26d1af304ed06dd7968bc668af594c3ab5a92", + "evidence/laneK/lbforced.py": "bd81e3f4460f61ef81e15e76ab25be5f8a9d7b71bb7dcbbf7a87873ca5398341", + "evidence/tail-exchange/TAIL-EXCHANGE-3042-base.jsonl.gz": "7bfa6fee793b7c7732a21f9d24d6f67029d726b9e4bd646fd6e626ab58e5176d", + "evidence/tail-exchange/TAIL-EXCHANGE-3042-extra.jsonl.gz": "7bfa6fee793b7c7732a21f9d24d6f67029d726b9e4bd646fd6e626ab58e5176d", + "frames_exact.py": "69ce80fbe90e77ddc818260b96cebb3c533d8fbd42d111524f24ee84a3ad56bd", + "restore_bound.py": "538e4ea639c9791dc92bec42b284a497da071b5802890a46ff41cd8ffc431342", + "run_registered.py": "f9f244dfb63dd214bb15317de855549d8e34f80ed900feb38cf3edd979199ddb", + "vendor/audit_local.py": "a38940094f7d19cd6376aafdd4734fa68eabc9aff4c98c3c4a3e9540328b1c90", + "vendor/base_two_moment.py": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "vendor/gk_common.py": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "vendor/moment.py": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "verify.py": "2530cea57620a12f3512d4c2e0915054f6a2194bc60de60789dbd3e386eda565" +} diff --git a/research/rank7-skip-restore-optimum/NOTICE b/research/rank7-skip-restore-optimum/NOTICE new file mode 100644 index 0000000000..27bda92353 --- /dev/null +++ b/research/rank7-skip-restore-optimum/NOTICE @@ -0,0 +1,16 @@ +research/rank7-skip-restore-optimum +Copyright 2026 Marius-Paul Dumitrean. Licensed under the Apache License, Version 2.0. +Marius-Paul Dumitrean, with substantial AI assistance (Claude Code). + +This package retains, byte-identical, Apache-2.0 files from: PR #3042 (dcharb78, head +84cc406ad91ec53fff329a11a445d7effe564a77, research/rank7-restore-carrier-skips): data/WORD-3042-base.json.gz and +data/WORD-3042-extra.json.gz (its edits/FINAL-WORD-*.json.gz, also retained by PR #3054, Nick Petalas) and +data/EDITS-3042.json (its edits/EDITS.json); PR #2979 (Marius-Paul Dumitrean, head be191346391661f4d35fc0d1508d0a6029572576, +research/rank7-joint-endframes): data/WORD-2979-base.json.gz and data/WORD-2979-extra.json.gz; PR #2833's independent +exact auditor (icekylinx attribution, research/gmx-t74-borrow43-handoff/new/borrow/audit_local.py): vendor/audit_local.py; +research/frame-domain-ceiling: vendor/moment.py and vendor/base_two_moment.py (engines/) and vendor/gk_common.py +(vendor/static44/gk/, DreamingOfClouds). frames_exact.py ports the BORROW-WORD frame model of our r12 harness and the exact +elimination of research/exact-frame-toolkit (PR #1186); restore_bound.py and census.py re-derive lane K's (r15) bound and +censuses; evidence/laneK/ and evidence/tail-exchange/ hold lane K's unchanged receipts and code. The restore blocks of +PR #3056 and PR #3060 (Nick Petalas) are restated literally in verify.py as attainment controls. All original notices of +the retained predecessor files remain in force. diff --git a/research/rank7-skip-restore-optimum/PINS.json b/research/rank7-skip-restore-optimum/PINS.json new file mode 100644 index 0000000000..791a66e116 --- /dev/null +++ b/research/rank7-skip-restore-optimum/PINS.json @@ -0,0 +1,28 @@ +{ + "certificates/BOUND-3042-base.json": "10922a932f51dac4021ea8d6a09b47b3bf0b8e278b77824a79bcf842d4929ebf", + "certificates/BOUND-3042-extra.json": "e75d625fede24fbc712f37f9f11269a418ef643703efc2e253a6005fd226a4db", + "certificates/CALIBRATION-2979.json": "68be5cf24d945ad0c16c7a55ccc655b0ea3c3ffc92c1d6a312200260247f4619", + "certificates/CENSUS.json": "bc983ddeb96d8d3e239bc0f2d919a88539d2414650c195a70c80975bf878bb5c", + "certificates/CONTROLS.json": "b6e91b1c67e425f3255874579b038e3c8ebb7ac926dae7f0e87e63d3db8748b2", + "certificates/ERRATUM-3042.json": "e2ac9e3af74a77574d2ec8afb4a5c2c0197c048f59bad1d2b8b4b65c613e0dd6", + "certificates/RESULT.json": "feadd89cec8dbdb95fa36df8b1c24b5a062a889ffe8d905d06edf58b91d1842a", + "data/EDITS-3042.json": "ebffcc1e57e59439b9678ff8d9be518c457af22ce77235c2fdb46540ab9b9b79", + "data/WORD-2979-base.json.gz": "abaf67bfcb257528658c906b612f57025617592bd7889828f92b97a5f4f4300d", + "data/WORD-2979-extra.json.gz": "e0eaf64c4d5d324693d43889bce1b9e53e8da00402105c8c978fd102f208bed7", + "data/WORD-3042-base.json.gz": "7e98f6f2a6c9ce9e7e04b515bd8ce4a4a533ff05f01ea265be2a1a994695260e", + "data/WORD-3042-extra.json.gz": "1396410de482883416fc7f534062ab005b484056b035fdcfa3b5cc065536ba35", + "evidence/laneK/AUDITOR-SEMANTICS.json": "a37ed5585bb6cb907e643a89c3f34d654712e7b70d79d786be313a9f1a960a5c", + "evidence/laneK/CROSSCHECK.json": "3f1b9eab7f55a6d7e4c61bf25be656cd92dfa801b093b7e099c057a86bf469fc", + "evidence/laneK/FULLAB-SUMMARY.json": "135bf24a943fbfae601aacdc30419707457f704dd78655a010f678fb7eb6df47", + "evidence/laneK/NEGATIVE-3042-base.json": "326ad05aa4f3b77a1cb45d669f21231aa69404b7d1f2cbba410e24e31c44abc9", + "evidence/laneK/NEGATIVE-3042-extra.json": "3555d9d59768ed727f4ec01db70a7bfb0e4acaf99b1875663f5dc57850df143b", + "evidence/laneK/bound.py": "6b1479b436c4f01bb32f771aa06af3d2260adee5dd5a5e2bf568b0192cee69d8", + "evidence/laneK/crosscheck_lanek.py": "6a60ea588244b70c2594b763d7d26d1af304ed06dd7968bc668af594c3ab5a92", + "evidence/laneK/lbforced.py": "bd81e3f4460f61ef81e15e76ab25be5f8a9d7b71bb7dcbbf7a87873ca5398341", + "evidence/tail-exchange/TAIL-EXCHANGE-3042-base.jsonl.gz": "7bfa6fee793b7c7732a21f9d24d6f67029d726b9e4bd646fd6e626ab58e5176d", + "evidence/tail-exchange/TAIL-EXCHANGE-3042-extra.jsonl.gz": "7bfa6fee793b7c7732a21f9d24d6f67029d726b9e4bd646fd6e626ab58e5176d", + "vendor/audit_local.py": "a38940094f7d19cd6376aafdd4734fa68eabc9aff4c98c3c4a3e9540328b1c90", + "vendor/base_two_moment.py": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "vendor/gk_common.py": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "vendor/moment.py": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482" +} diff --git a/research/rank7-skip-restore-optimum/README.md b/research/rank7-skip-restore-optimum/README.md new file mode 100644 index 0000000000..bcb7dfb55c --- /dev/null +++ b/research/rank7-skip-restore-optimum/README.md @@ -0,0 +1,233 @@ +# Restore-only optimum for PR #3042's six-skip words: every exact restore costs at least 10,868,103,087 (no new κ) + +```text +Status / UTC update / priority revision: FINDING (scoped exact negative) · 2026-10-17 UTC · priority revision 6 · base main 18aacb21 +Concrete question and changed premise: PR #3042 (dcharb78) removed six restore-phase visits from PR #2979's words with two + declared restore edits; Nick Petalas's top claim PR #3054 uses the same six-skip words. PR #3057 and PR #3065 prove the + restore (and joint A/B/restore) FRAMES optimal for the fixed scalar order. Can a different restore gate sequence (more + carrier or pivot skips, any exact rewrite) lower the local frame bill when A/B, warps, cut, helper ends, start frames + and buffers stay fixed and all frames are re-solved? +Established result and evidence status: no. On both providers every exact restore-only rewrite costs at least + LB_forced + forced restore-phase visits = 10,867,765,164 + 337,923 = 10,868,103,087, the certified cost of PR #3042's + words, which attain it. The same bound on PR #2979's words leaves exactly dcharb78's realized 29,976. Author-checked + (AI-assisted), stdlib verifier; not maintainer-reviewed. Also corrects PR #3042's README attribution of the two edits. +Public artifact URL + exact commit: this package (see the PR). +Next useful task: A/B-phase re-synthesis (the 161,558 forced-cap units and the 192,384 kernel/preload visit units are + forced by A/B), or a changed target port interface; restore-only search on these words is exhausted. +Active claim / expiry: released. +``` + +## Result + +| word (both providers identical) | certified local cost | LB_forced (empty restore + 88 forced caps) | forced restore-phase visits | bound | gap | +|---|---:|---:|---:|---:|---:| +| PR #3042 six-skip words (`WORD-3042-{base,extra}`) | **10,868,103,087** | 10,867,765,164 | 337,923 | **10,868,103,087** | **0** | +| PR #2979 words (same A/B; calibration) | 10,868,133,063 | 10,867,765,164 | 337,923 | 10,868,103,087 | 29,976 | + +Costs are the certified frame solver's integer local costs in units of 2⁻⁴⁰ at the base saving b = 0.001703676387993676 +(c1 = 2,116,671, c2 = 4,228,346, c3 = 6,338,140, c4 = 8,446,713, c5 = 10,554,378). A visit that splits a climb of D ranks +into a + (D − a) costs c_a + c_{D−a} − c_D: 4,996 (1+1), 6,877 (1+2), 9,979 (2+2), 8,098 (1+3). The 51 visits of PR #3042's +literal frames are 20 × 4,996 + 23 × 6,877 + 8 × 9,979 = 337,923, and at profile level + +```text +{1:2433, 2:712, 3:232, 4:108, 5:18, 8:8} = LB_forced {1:2370, 2:693, 3:255, 4:116, 5:18, 8:8} + + 20 (2H1 - H2) + 23 (H1 + H2 - H3) + 8 (2H2 - H4). +``` + +The restore's total overhead over the unconstrained empty-restore optimum is 499,481 = 337,923 (forced visits) + 161,558 +(forced entry caps acting on A/B chains). Both parts are forced by A/B and by what the restored helpers must contain. + +## Theorem + +Let W be `WORD-3042-base` or `WORD-3042-extra` (PR #3042 head `84cc406a`, `edits/FINAL-WORD-*.json.gz`, byte-identical in +`data/`). A *restore-only rewrite* W′ keeps the initial corrections, precondition, compensation, A (with its prelude), cut, +warps, B, start frames, helper end frames, removed helpers and private buffers of W, and replaces the restore by any +finite sequence of scalar gates; all frames (A, B and restore) are re-solved. W′ is *exact* if PR #2833's auditor +(BORROW-WORD branch, `vendor/audit_local.py`, unchanged) passes forward and dual on W′ with its frames written back. The +proof uses only the auditor's forward end-of-restore requirements (Lemma 1), so the bound holds for every restore that +meets them. Then + +```text +cert(W') >= LB_forced(W) + 337,923 = 10,868,103,087 = cert(W), +``` + +where cert is the exact frame optimum of the BORROW-WORD frame model (monotone register chains, paid rank jumps, +fixed interfaces: start/end frames, cut equality, warp entry equality, fixed centre descents). The class contains every +restore-only edit considered so far on these words (carrier/pivot skips, R2-style shared covectors, the PR #3056 and +PR #3060 replacements of `restore[175:179]`, which tie) and, with R′ = R, the frame reassignments of PR #3057 and PR #3065 +(in this package's frame model). + +## Proof + +Write 𝓡 for the 91 restored helpers (end frames E_c, all below FULL), e_q for the restore-entry rows of the 632 live +registers in the auditor's free algebra, and F_r for register r's frame at its last vertex before the restore. L_r and +U_r are the solver's forward lower bound and the upper bound from r's other registers at that vertex, computed in the +capped empty-restore graph; they hold for every restore-only rewrite because A/B are unchanged. + +1. **Auditor semantics.** After the restore the auditor requires, in its forward replay, every restored helper c to hold + exactly its own input row x_c (`vendor/audit_local.py` line 444), no other live register to contain the variable c + (line 445) and the target map (line 442); the restore may not write a target (line 340), a non-target may not read a + target (line 335), and the restore holds no warps (line 323). These are the only facts the bound uses. They do not + constrain the other final rows, and the derived inverse-reverse cleanup inverts them. Control: appending `0 += 1` or + `62 += 70` at FULL to the restore changes two non-restored final rows; with frames re-solved the auditor passes forward + and dual at cost delta 0, while appending `249 += 251` fails (`certificates/CONTROLS.json`). Keeping every final row + identical is therefore sufficient for exactness but not necessary. +2. **Forced coordinates.** The 632 restore-entry rows are linearly independent (exact elimination, rank 632), so each + x_c has unique coordinates M[c] in them. A restore is a product of invertible scalar gates, so the final row of c is + Σ_q R′[c][q] e_q and exactness forces R′[c] = M[c] for every exact W′. The current restore realizes exactly these M. +3. **Forced caps.** If M[c][r] ≠ 0 (r ≠ c), the (c, r) entry of the product of elementary gates is a sum over gate paths + r → u₁ → … → c; on such a path consecutive gate frames are nested and the last is inside E_c, and the first gate reads r, + so F_r ⊆ E_c. Hence F_r ⊆ cap_r = ∩ E_c over r's restored receivers: **88 caps**. +4. **Merge.** In any feasible frame assignment φ of W′, replace every register's restore-phase climbs by one end climb. + The result is feasible for the capped empty-restore problem (Lemma 3) and cheaper by Σ_r ov_r(φ), where ov_r = + Σ c_{jᵢ} − c_{Σ jᵢ} ≥ 0 (weights are subadditive). So cert(W′) ≥ LB_forced + Σ_r ov_r(φ), with LB_forced = + 10,867,765,164 computed by exact elimination. +5. **Delivery and cleaning.** If M[c][r] ≠ 0, r is read at a restore-phase frame inside E_c by a register y with + L_y ⊆ that frame ⊆ E_y. If a non-restored r enters the restore holding a restored input variable, it must be written + below FULL: the span of restored-input parts of the registers at FULL never shrinks (FULL registers only meet FULL + registers) and must end at 0. +6. **Departure (dual vectors).** Suppose r stays inside a frame G until, at time t, it jumps to its end frame E_r. Let A_t + be the matrix of the restore prefix (rows = register rows in the e-basis) and d_r(t) = A_t⁻¹ e_r its dual vector, and + O = {c ∈ 𝓡 : c ≠ r, E_r ⊄ E_c}. Then d_r(t) ≠ 0 and ⟨M[c], d_r(t)⟩ = 0 for c ∈ O, since after t no gate path leads + from r to c. A gate `t += k·s` changes only d_s (by −k·d_t), so d_r changes only when r is read, by a register whose + frame is inside G, and recursively; hence d_r(t) is supported on Z = {r} ∪ {y : L_y ⊆ G}. **If M[O][Z] has full column + rank |Z|, r cannot stay inside G and then leave to E_r.** (This replaces lane K's partner-only rank test, whose columns + omitted the registers that can sit strictly inside G; on these words both exclude the same frames.) +7. **Carriers.** Content sitting at a frame F (or inside a restored source's end V) that must reach a receiver which + cannot sit there is carried upward by a register that sits there. A non-restored carrier then has two restore-phase + jumps (≥ 2c1 − c2 = 4,996); a restored carrier is free only if its end meets E_c above F (resp. outside V); a BLOCKED + register has no gate at its entry frame, so carrying needs a third jump, which costs at least β + 4,996 here. + +**Classification** (`restore_bound.py`, all frames enumerated exactly). A register r with restored receivers or leaks is +*BLOCKED* when some receiver c with E_r ⊄ E_c (or its leak) admits no partner s with L_r + L_s ⊆ U_r ∩ E_c ∩ E_s of +dimension < 9. Then r has no gate at F_r and at least two restore-phase jumps; β_r is the minimum overhead over every +admissible entry dimension, every two-jump first frame G (enumerated; a reader must sit at G and the departure test must +pass) and every chain of three or more jumps. Every *OPEN* non-restored register is tested at every admissible entry frame +F ∈ [L_r, U_r ∩ cap_r]: if no F admits a skip (reader + departure), r pays a visit; if every skip frame leaves a receiver +that needs a non-free carrier, the group {r} ∪ (non-restored registers that can sit at F) pays one visit (*zero-sum*). +Lifts out of a restored source's end are charged the same way. Overlapping groups are merged and charged once; BLOCKED +members are admitted only when carrying costs them ≥ β + 4,996. Result on both providers: **42 BLOCKED registers, +Σ β = 292,959; 9 disjoint payer groups, 9 × 4,996 = 44,964; bound = LB_forced + 337,923 = cert(W).** ∎ + +## The 51 visits of PR #3042's literal frames, all forced + +| restore block | visiting registers | units | verdict | +|---|---|---:|---| +| PR2857/PR2894 kernel-preload pairs | 3, 44, 46, 69, 105, 306, 308, 310, 322, 324, 326, 351, 367, 383, 399, 408, 412, 414, 424, 428, 430, 434, 436, 438, 439, 440, 444, 446, 475, 486 | 192,384 | 24 BLOCKED; 46/521, 367/496, 399/472, 446/545 zero-sum; 69, 444 departure-forced | +| stage-1 group gates (W_A..W_D) | 5, 7, 34, 54, 73, 226, 228, 230, 231, 232, 236, 238, 363, 395 | 103,043 | 14 BLOCKED | +| n45 (PR2942, pivots 249/251/265/267 at V45) | 2, 70, 71, 72 (6 → V45 → 9, 6,877 each) | 27,508 | 4 BLOCKED | +| PR2908/PR2917 extraction outputs | 23, 35 | 9,992 | zero-sum with 39, 77 | +| n42 (PR2979 + R1_E42) | 61 (V45 → E42 → 9) | 4,996 | forced lift | + +* **Normal 45.** The entry lower bounds of 2, 70, 71, 72 and of the pivots 249, 251, 265, 267 are eight pairwise-distinct + 6-dimensional subspaces inside V45 = ⟨256, 128, 64, 35, 16, 11, 5⟩ (they span it). For each visitor r and each of its + restored receivers c, U_r ∩ E_c = L_r and no other register s has L_s ⊆ L_r ⊆ E_s: no partner, entry frame forced to + L_r, first frame inside V45, hence the (1, 2) split 6 → V45 → 9 at 6,877. +* **The (2, 2) registers** 5, 34, 44, 54, 73, 105, 414, 430 would save 1,881 each with a (1, 3) split. Each has three + 6-dim candidate first frames: two admit no register at all, and at the third M[O][Z] has full column rank (|Z| = 6, 8 + or 10), so Lemma 6 excludes it. +* **Zero-sum** (23 and 39, 35 and 77, 46 and 521, 367 and 496, 399 and 472, 446 and 545): at every skip frame the receiver + (511, 499, 589, 543, 567, 591) cannot sit there, no restored register can carry the content above it inside the + receiver's end, and the only possible carrier is one non-restored register, so one of the pair visits. +* **Departure-forced** 69 and 444: every admissible entry frame either has no reader or fails Lemma 6 (|Z| = 2). +* **61's lift.** 230 (end E42 = ⟨256, 128, 64, 34, 16, 10, 4, 1⟩) needs the entry contents of the V45-ended pivots 249 and + 265 (M[230] has ±1/4 on 2, 34, 45, 54, 71, 92, 103, 228, 249, 265, 299, 331). No restored register can sit inside + V45 ∩ E42 and climb out of V45 inside E42, so a register of {0, 2, 61, 62, 63, 70, 71, 72, 76, 94, 233, 235} must make a + V45 → E42 → 9 visit (the blocked 2, 70, 71, 72 would need a third jump: 11,873 = 6,877 + 4,996). In PR #3042's words + 61 does it. + +## Calibration on PR #2979's words + +PR #2979 (same A/B, same caps, same LB_forced) costs 10,868,133,063 with 54 literal visits (367,899 units). Against the +same bound its unforced part is exactly 29,976 = 6 × 4,996: the BLOCKED 5, 54, 73 pay 14,975 instead of β = 9,979, 22 and +40 visit without any forcing, and the lift group pays twice (61 and 63). These are precisely dcharb78's six skips 63, 54, +40, 22, 73, 5 (PR #3042 keeps 61 as the lifter). The bound therefore predicted PR #3042's realized gain exactly, and +PR #3042 attains it; nothing further is available to restore-only rewrites. + +## Erratum to PR #3042's README (documentation only) + +Applying each declared block of PR #3042's `edits/EDITS.json` alone to PR #2979's words (exact splice, frames re-solved; +`certificates/ERRATUM-3042.json`, both providers): + +| block | certified delta | profile delta | registers that skip | PR #3042 README says | +|---|---:|---|---|---| +| R1_E42 (`restore[162:188]`) | **−19,984** | −8 H1 + 4 H2 | 63, 54, 40, **22** | −14,888 for 63, 54, 40 | +| R2_E7 (`restore[190:203]`) | **−9,992** | −4 H1 + 2 H2 | 73, 5 | −14,938 for 22, 73, 5 | +| both | **−29,976** | −12 H1 + 6 H2 | all six | −29,826 | + +Register 22 skips through R1_E42's gate `22 += −2·34`; R2_E7's gates touch only 5, 59, 73, 96, 363, 395. The declared +blocks replace 26 gates by 33 and 13 by 15 (the README lists 26 → 29 and 13 → 14; the restore grows from 203 to 212 +gates). Applying both blocks reproduces PR #3042's final words exactly, so its profile, allocation and κ are unaffected. + +## Verification + +```sh +python3 -B research/rank7-skip-restore-optimum/run_registered.py # ~70 s, Python standard library (3.12; 3.14 also runs) +python3 -B scripts/research_package.py --package research/rank7-skip-restore-optimum +``` + +`run_registered.py` checks the complete inventory (MANIFEST.json) and pins, reruns `verify.py` and `census.py` in a +temporary directory, requires their regenerated receipts to equal `certificates/` byte for byte, and binds lane K's stored +receipts (evidence/laneK/) to the recomputation. `verify.py` (13 s) recomputes per provider: the exact frame optimum +(10,868,103,087, the declared profile, 743 variables in 210 components, largest 94, as PR #3065 reports independently), +the free-algebra restore-entry rows (vendored PR2833 `walg_apply`), their rank, the forced coordinates and that the current +restore realizes them, the auditor on the word, the 88 caps, LB_forced, the classification and bound, the 51 literal +visits and their charges, the normal-45 facts; then the calibration, the erratum and the controls: + +* auditor semantics: two appended FULL gates pass at delta 0, a gate into a restored helper fails; +* attainment: PR #3056's three-ADD and PR #3060's four-gate words for `restore[175:179]` are exact and tie the bound; +* twelve rejections: mislabeled provider, flipped byte, a dropped cap (LB_forced falls to 10,867,757,066), a dropped + visit, a perturbed entry row, three cheaper restores that violate exactness (empty restore −499,481; deleting R44 + −6,877 leaves 498 in 475; deleting R82 −4,996 leaves 584 dirty; each rejected by Lemma 1 and by the auditor), a wrong + claimed cost, an optimality claim for PR #2979, the departure lemma restricted to receivers containing the frame (admits + the eight (1, 3) splits, bound 10,868,088,039), and caps read from the restore map of an emptied restore (0 caps). + +`frames_exact.py` is a numpy-free port of the certified solver used for every price in this lineage (our r12 BORROW-WORD +harness on the #1186 frame toolkit, `research/exact-frame-toolkit/frames.py`): same model, same exact elimination, same +weights from the vendored `research/frame-domain-ceiling` engines; it reproduces all four certified optima and LB_forced. +`evidence/laneK/CROSSCHECK.json` runs lane K's current `bound.py`/`lbforced.py` (the version that takes the supplied M, +pinned in `evidence/laneK/`) on the four words with their own and with an emptied restore: bound, LB_forced and caps agree +in all eight cases. This package derives M from the restore-entry rows, never from the restore. + +### Empirical controls (not part of the proof) + +* **Deletion census** (recomputed completely): of the 212 single-gate restore deletions per provider, 10 keep the Lemma 1 + conditions; all cost delta 0. +* **Tail-exchange census** (lane K; candidate list re-derived here, 1 in 25 records re-checked): 8,098 exchanges per + provider of a visiting register r with a non-restored s (exact swap at r's first restore touch or at R0, restore + relabelled); 6,378 exact, 990 frame-feasible, minimum delta 0, none negative. +* Lane K's A/B censuses scored by this bound (local evidence on the base provider, not re-run and not part of the + theorem; `evidence/laneK/FULLAB-SUMMARY.json`): 25,846 single-gate moves over all A/B gates, 6,387 read splits, 640 + write-sink variants, 99 merges and 350 commuting pairs, no positive gap. One move scored a gap of 9,992 only because it + lands a target write in the restore, which the auditor forbids; it is excluded. + +## Scope + +Covered: every restore gate sequence at fixed A/B scalar programs, with all frames re-solved, at the certified solver's +weights. PR #3057 fixes every scalar operation and changes restore frames only; PR #3065 changes A/B/restore frames jointly +for the fixed scalar order (uniformly in b, with a relaxation at fixed interfaces). This package changes the restore's +scalar program arbitrarily but keeps A/B fixed. Not covered: A/B gate changes (lane K's scored A/B censuses are local +evidence only), helper ends, entrances, warps, buffers, the width inventory, packing or allocation, physical or native +costs, and other words. No κ is changed; PR #3042's and PR #3054's admissions are untouched. + +## Open next questions + +* **A/B-phase re-synthesis.** The restore's 499,481-unit overhead over the unconstrained empty-restore optimum is forced + by A/B: 161,558 units of entry caps acting on A/B chains and 337,923 units of forced visits, of which 192,384 sit in the + 30 PR2857/PR2894 kernel/preload restore pairs. Only an A-phase (input block) or B-phase re-synthesis that changes the + forced coordinates M or the entry bounds L/U can move them. First step: recompute M, the caps and this bound for a + candidate A/B block before pricing it (`restore_bound.bound` takes any word). +* **Fixed target port hyperplanes.** Our r15 searches of A/B moves, start-frame raises and narrowing (lane reports, not + packaged) all stopped at the same constraint: target writes in late B and the A-end target levels are pinned by the + targets' 8-dim port-perpendicular end frames. A changed target port interface (PR2312 lineage) looks like the common + wall for local levers on these words; it changes the source contract and needs a complete replacement bound. + +## Credit + +dcharb78 (PR #3042) for the six-skip words and the carrier/pivot skips; Jeremy Kothe (PR #3015) for R1 and the declared +restore-edit stage; Nick Petalas for PR #3054 (T740 with the six skips), PR #3057 and PR #3065 (frame optima), PR #3056 +and PR #3060 (restore blocks used here as attainment controls) and T740; Marius-Paul Dumitrean for PR #2979 and its +lineage; icekylinx for PR #2833's auditor (vendored unchanged); Mason Hale (PR #2917) and Jeremy Diviney (PR #2908) for the +paired extractions. Details and retained files: [CREDITS.md](CREDITS.md), [NOTICE](NOTICE), [SOURCES.json](SOURCES.json). +Prepared by Marius-Paul Dumitrean with substantial AI assistance (Claude Code); author-checked, no independent review is +claimed. Apache-2.0. diff --git a/research/rank7-skip-restore-optimum/SOURCES.json b/research/rank7-skip-restore-optimum/SOURCES.json new file mode 100644 index 0000000000..6687f6adfa --- /dev/null +++ b/research/rank7-skip-restore-optimum/SOURCES.json @@ -0,0 +1,257 @@ +{ + "schema_version": 1, + "base_commit": "18aacb215fc3717b06be8ceb9fca62aeca0d3e99", + "upstream_repository": "https://github.com/CrocSwap/integer-mult-bounds", + "files": [ + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0", + "role": "originating task catalogue (priority revision 6)" + }, + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "role": "selected record (unchanged by this package)" + }, + { + "path": "research/gmx-t74-borrow43-handoff/new/borrow/audit_local.py", + "usage": "provenance", + "git_blob": "8224873d0497cf0b4c202f31b145fa273553d978", + "sha256": "a38940094f7d19cd6376aafdd4734fa68eabc9aff4c98c3c4a3e9540328b1c90", + "package_path": "vendor/audit_local.py", + "pr": 2833, + "role": "PR2833's independent exact auditor (icekylinx attribution), BORROW-WORD branch; walg_apply and run, vendored unchanged" + }, + { + "path": "research/frame-domain-ceiling/engines/moment.py", + "usage": "provenance", + "git_blob": "7d697cb45203fe72d97037403d6da41f71f3b7fd", + "sha256": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "package_path": "vendor/moment.py", + "role": "outward moment bounds behind the integer weights c[r] (frames.Costs)" + }, + { + "path": "research/frame-domain-ceiling/engines/base_two_moment.py", + "usage": "provenance", + "git_blob": "14a90fa0e788217856f070382c9e61bd7c603c61", + "sha256": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "package_path": "vendor/base_two_moment.py", + "role": "second moment engine (PR39 cross-check) behind the integer weights" + }, + { + "path": "research/frame-domain-ceiling/vendor/static44/gk/gk_common.py", + "usage": "provenance", + "git_blob": "0e5fde920d29106232776eb56347297c0d40fa72", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "package_path": "vendor/gk_common.py", + "role": "canonical GF(2) bases (DreamingOfClouds), as used by the frame toolkit" + }, + { + "path": "research/exact-frame-toolkit/frames.py", + "usage": "provenance", + "git_blob": "c27c28b80b52e23346a772a67c23934c8292fd69", + "sha256": "59d5f5725c50c5d6c22178e82ee79a5d7646f0133b1aa267081ec1ad228ec437", + "pr": 1186, + "role": "PR1186 exact frame toolkit (Graph domains, exact variable elimination, Costs): ported to frames_exact.py without numpy" + }, + { + "path": "research/rank7-restore-carrier-skips/edits/FINAL-WORD-base.json.gz", + "usage": "provenance", + "git_blob": "2ee02e318c98281a71445b954feccd55c153827c", + "sha256": "7e98f6f2a6c9ce9e7e04b515bd8ce4a4a533ff05f01ea265be2a1a994695260e", + "pin": "head:84cc406ad91ec53fff329a11a445d7effe564a77:research/rank7-restore-carrier-skips/edits/FINAL-WORD-base.json.gz", + "package_path": "data/WORD-3042-base.json.gz", + "pr": 3042, + "role": "dcharb78's six-skip base provider word (PR3042 head)" + }, + { + "path": "research/rank7-restore-carrier-skips/edits/FINAL-WORD-extra.json.gz", + "usage": "provenance", + "git_blob": "33ba5f34996a31edd197cb58eca575645575e529", + "sha256": "1396410de482883416fc7f534062ab005b484056b035fdcfa3b5cc065536ba35", + "pin": "head:84cc406ad91ec53fff329a11a445d7effe564a77:research/rank7-restore-carrier-skips/edits/FINAL-WORD-extra.json.gz", + "package_path": "data/WORD-3042-extra.json.gz", + "pr": 3042, + "role": "dcharb78's six-skip extra provider word (PR3042 head)" + }, + { + "path": "research/rank7-restore-carrier-skips/edits/EDITS.json", + "usage": "provenance", + "git_blob": "c2042a37bdba0febb791d39bcb1f9f55de9fb14e", + "sha256": "ebffcc1e57e59439b9678ff8d9be518c457af22ce77235c2fdb46540ab9b9b79", + "pin": "head:84cc406ad91ec53fff329a11a445d7effe564a77:research/rank7-restore-carrier-skips/edits/EDITS.json", + "package_path": "data/EDITS-3042.json", + "pr": 3042, + "role": "PR3042's declared restore edits R1_E42 and R2_E7 (erratum and calibration)" + }, + { + "path": "research/rank7-restore-carrier-skips/README.md", + "usage": "provenance", + "git_blob": "0cbfc50459652b00f46722ed7b5e769a9e5f6b50", + "sha256": "a7f24ba0b020afc394197ed2866f9958cfe6628c8b42bf84b09c98da0f681c85", + "pin": "head:84cc406ad91ec53fff329a11a445d7effe564a77:research/rank7-restore-carrier-skips/README.md", + "pr": 3042, + "role": "PR3042's README, whose per-block attribution the erratum corrects" + }, + { + "path": "research/rank7-t740-carrier-skips/vendor/pr3042/edits/FINAL-WORD-base.json.gz", + "usage": "provenance", + "git_blob": "2ee02e318c98281a71445b954feccd55c153827c", + "sha256": "7e98f6f2a6c9ce9e7e04b515bd8ce4a4a533ff05f01ea265be2a1a994695260e", + "pin": "head:4773c3ea67b471415870e38411fae313ec44a675:research/rank7-t740-carrier-skips/vendor/pr3042/edits/FINAL-WORD-base.json.gz", + "pr": 3054, + "role": "PR3054 (Nick Petalas) retains the same base word (same blob)" + }, + { + "path": "research/rank7-t740-carrier-skips/vendor/pr3042/edits/FINAL-WORD-extra.json.gz", + "usage": "provenance", + "git_blob": "33ba5f34996a31edd197cb58eca575645575e529", + "sha256": "1396410de482883416fc7f534062ab005b484056b035fdcfa3b5cc065536ba35", + "pin": "head:4773c3ea67b471415870e38411fae313ec44a675:research/rank7-t740-carrier-skips/vendor/pr3042/edits/FINAL-WORD-extra.json.gz", + "pr": 3054, + "role": "PR3054 retains the same extra word (same blob)" + }, + { + "path": "research/rank7-joint-endframes/data/WORD-base.json.gz", + "usage": "provenance", + "git_blob": "d9aa96a93fea5f7395e7783aef0bc117c0a0ae89", + "sha256": "abaf67bfcb257528658c906b612f57025617592bd7889828f92b97a5f4f4300d", + "pin": "head:be191346391661f4d35fc0d1508d0a6029572576:research/rank7-joint-endframes/data/WORD-base.json.gz", + "package_path": "data/WORD-2979-base.json.gz", + "pr": 2979, + "role": "PR2979's base word (calibration; also retained by PR3042 as data/WORD-base.json.gz)" + }, + { + "path": "research/rank7-joint-endframes/data/WORD-extra.json.gz", + "usage": "provenance", + "git_blob": "74f6cb64595c21f7726ae77e69437868620bdcee", + "sha256": "e0eaf64c4d5d324693d43889bce1b9e53e8da00402105c8c978fd102f208bed7", + "pin": "head:be191346391661f4d35fc0d1508d0a6029572576:research/rank7-joint-endframes/data/WORD-extra.json.gz", + "package_path": "data/WORD-2979-extra.json.gz", + "pr": 2979, + "role": "PR2979's extra word (calibration)" + }, + { + "path": "research/rank7-restore-frame-optimum/README.md", + "usage": "provenance", + "git_blob": "f3dc70b1b57a4bc6997dd2ccf9fda0c3d493cbca", + "sha256": "88e672250159e796bf1184974ba40ce8898a5e4f2e31cbcdf16c09ee6891f601", + "pr": 3057, + "role": "PR3057 (Nick Petalas): restore-frame optimum for the fixed scalar order (scope comparison)" + }, + { + "path": "research/rank7-joint-frame-optimum/README.md", + "usage": "provenance", + "git_blob": "9bba275378cfa7efa626013e32e24acd7d266754", + "sha256": "baf9e7d0d85753918b2d54f39cc43db8efb6802c704ed91cf8533fbd5bc343e9", + "pr": 3065, + "role": "PR3065 (Nick Petalas): joint A/B/restore frame optimum for the fixed scalar order; reports 743 variables, 210 components, largest 94" + }, + { + "path": "research/rank7-restore-contraction/contract.py", + "usage": "provenance", + "git_blob": "8b81fe8a760b23723fb6739f1e71165bd8ef7287", + "sha256": "5f9823fe342f629312e28d8edf5bca02171ce574f1037bc980397ba6c88ba784", + "pr": 3056, + "role": "PR3056 (Nick Petalas): OLD/NEW literal blocks of restore[175:179] used as an attainment control" + }, + { + "path": "research/rank7-native-tariff-optimum/tariff.py", + "usage": "provenance", + "git_blob": "b1676fd2e85d65ca5bb42d97c775a06f2d0a4dbb", + "sha256": "618721d59891a3aad495692ebb943451f5df6700a60e57d7761009aec0644655", + "pr": 3060, + "role": "PR3060 (Nick Petalas): OPTIMAL literal block of restore[175:179] used as an attainment control" + }, + { + "path": "research/rank7-joint-endframes-restore-edit/README.md", + "usage": "provenance", + "git_blob": "493f9d0621981ec8d061200264d2efe93c4a590a", + "sha256": "186a01ff053630b6451464ed61b779e3747602d85805f5f0ad0dca8c3b9407f0", + "pr": 3015, + "role": "PR3015 (Jeremy Kothe): R1 and the declared restore-edit stage" + }, + { + "path": "research/rank7-shared-restore-fanin/README.md", + "usage": "provenance", + "git_blob": "2ed3a44ebf163d140ab1f2b285a805d1334d8b19", + "sha256": "305677bd8f6b3d8fa79594bc8073b36023bc1efa2f35a77f1ac6d7f0711f0ec6", + "pr": 3044, + "role": "PR3044 (Nick Petalas): R2 shared restore covector on the R1 words" + } + ], + "adapted_sources": [ + { + "package_path": "frames_exact.py", + "origin": [ + "r12 BORROW-WORD harness bp.py (Marius-Paul Dumitrean; unpublished, sha256 940370add03868d982fe7fc1a133641b239adeb2567fefae6b754c94d615668d): build_problem, BorrowGraph, centre_descents, frame_profile", + "research/exact-frame-toolkit/frames.py (PR1186): Graph._domain, profile, solve_component_ve, optimal_frames accounting, Costs" + ], + "change": "numpy-free port of the exact variable-elimination path only (a component elimination cannot finish raises); hard-coded checkout paths replaced by vendored engines; optional caps keyed by original register" + }, + { + "package_path": "restore_bound.py", + "origin": [ + "lane K (r15) bound.py, lbforced.py, screen4.py, rowsfa.py, coords.py (pinned in evidence/laneK/ for the first two)" + ], + "change": "sound re-derivation: forced coordinates from the restore-entry rows (never from the restore); departure lemma with columns {r} + {y : L_y <= G} and all restored rows (replaces the partner-only rank test); every admissible entry frame and every two-jump first frame enumerated; carriers of blocked registers need a third jump; lifts with the weaker free-carrier condition" + }, + { + "package_path": "census.py", + "origin": [ + "lane K delcensus.py and swapcensus.py (relabel and exchange copied)" + ], + "change": "deletion census recomputed completely; tail-exchange candidate list re-derived and stored records re-checked on a sample" + } + ], + "new_sources": [ + "verify.py", + "run_registered.py", + "certificates/", + "README.md", + "TASK.json", + "VERIFY.json", + "NOTICE", + "CREDITS.md", + "PINS.json", + "MANIFEST.json", + ".gitattributes" + ], + "unpublished_sources": [ + { + "package_path": "evidence/laneK/bound.py", + "sha256": "6b1479b436c4f01bb32f771aa06af3d2260adee5dd5a5e2bf568b0192cee69d8", + "role": "lane K's current bound (takes the supplied M); runs only in lane K's tree" + }, + { + "package_path": "evidence/laneK/lbforced.py", + "sha256": "bd81e3f4460f61ef81e15e76ab25be5f8a9d7b71bb7dcbbf7a87873ca5398341", + "role": "lane K's current LB_forced (takes the supplied M)" + }, + { + "package_path": "evidence/laneK/NEGATIVE-3042-base.json", + "role": "lane K's receipt made with the r12 harness (bound to the recomputation by run_registered.py)" + }, + { + "package_path": "evidence/laneK/NEGATIVE-3042-extra.json", + "role": "same, extra provider" + }, + { + "package_path": "evidence/laneK/AUDITOR-SEMANTICS.json", + "role": "lane K's appended-gate auditor control (recomputed in certificates/CONTROLS.json)" + }, + { + "package_path": "evidence/laneK/FULLAB-SUMMARY.json", + "role": "lane K's A/B censuses scored by the bound (local evidence, not re-run)" + }, + { + "package_path": "evidence/tail-exchange/", + "role": "lane K's tail-exchange census records (both providers; identical records)" + } + ], + "source_boundary": "Only this package is new. Every retained upstream file is byte-identical to its pinned blob; the verifier reads only files inside the package and needs no network, Git or numpy." +} diff --git a/research/rank7-skip-restore-optimum/TASK.json b/research/rank7-skip-restore-optimum/TASK.json new file mode 100644 index 0000000000..97882cdf6f --- /dev/null +++ b/research/rank7-skip-restore-optimum/TASK.json @@ -0,0 +1,72 @@ +{ + "schema_version": 1, + "task_id": "complex-new-helper-inventory", + "priority_revision": 6, + "base_commit": "18aacb215fc3717b06be8ceb9fca62aeca0d3e99", + "original_card": { + "id": "complex-new-helper-inventory", + "question": "Can a new local cost interface change the deficit-to-recursive-cost ratio beyond current packing?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/complex-local-word-ceiling/README.md", + "research/heterogeneous-owner-assembly/README.md", + "certificates/selected-result.json", + "research/selected-k8-unrestricted-ends/README.md" + ], + "methods": [ + "Propose a changed helper inventory and derive an optimistic exact moment.", + "Design a small completed instance and independently verify its endpoint and rank bill." + ], + "acceptance_gate": "A new physically realizable contract outside the frozen catalogue whose per-call profile, screened with ceiling.ceiling(), beats the selected word's packing ceiling; a lower cap does not establish identical circuitry or order attainable optima, and is insufficient to pass the stronger-budget target under this model. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "research/complex-local-word-ceiling/verify.py" + ], + "expected": "PASS_COMPLEX_LOCAL_WORD_CEILING", + "inspect": "Read the selected word's per-call local profile, its packing ceiling and the lever table; run levers.py for the ideal budget of the lever you target.", + "scope": "Positive control and planning budget only; this is not a new construction or full cold replay." + }, + "first_experiment": "Before any synthesis, write the candidate per-call local profile (and centre charge / unpaid coordinates if changed) and screen it with ceiling.ceiling(); reject it if even the ideal ceiling does not beat the selected word's by your stated margin.", + "bottleneck_link": "Packing of the selected word is capped at +0.87% (ceiling model); only a lower local excess spend or a changed coverage law raises the cap.", + "allowed_variations": [ + "Narrow to one changed boundary or helper type with explicit counts.", + "If the coverage law, template or guard changes, derive an applicable fully charged replacement bound instead of applying the incumbent ceiling outside its scope." + ], + "scope_change_triggers": [ + "Mixing only providers already inside the pinned catalogue.", + "Only changing helper terminal subspaces and monotone frames within the fixed scalar word, entrances and cleanup contract already covered by #1995/#2013.", + "Continuing a partial cost improvement while leaving the same unpriced consumer, restoration or central-readout obligation unresolved; refresh the family expansion decision first. Local product-retiming evidence has a narrow scope and is not a ban on changed graphs or contracts." + ], + "overlap_terms": [ + "helper inventory", + "heterogeneous-owner", + "mutable leaver" + ] + }, + "scope_status": "refined", + "actual_scope": "On PR #3042's two six-skip provider words (also PR #3054's words): the complete class of exact restore-only rewrites (A with its prelude, B, warps, cut, initial corrections, precondition, compensation, start frames, helper end frames, removed helpers and buffers fixed; any restore scalar gate sequence; all frames re-solved; exactness = PR2833's auditor), priced by the certified frame solver at b = 0.001703676387993676.", + "scope_change_reason": "The card asks whether a changed local cost interface can beat current packing. On the six-skip words the only lever left to restore edits is the local frame bill at fixed widths and buffers, and PR3057/PR3065 already settled the fixed-scalar-order frame problem. This package narrows the card to one word pair and one section (the restore) but widens the move set to every exact restore gate sequence, and proves that the published restore is optimal there; a scoped negative that tells the next construction which premise (A/B or the target interface) must change.", + "bottleneck_link": "The restore-phase overhead of PR3042's words over the unconstrained empty-restore optimum is 499,481 units per call (161,558 forced entry caps on A/B chains + 337,923 forced visits). All of it is forced by A/B and the restored helpers' required content, so no restore-only rewrite can lower the local profile or raise the inventory's packing cap; a gain must change A/B or the target interface.", + "budget_minutes": 240, + "stop_rule": "Stop at an exact lower bound equal to the certified cost on both providers (scoped negative, no dependent construction round), or at the first exact restore-only rewrite that beats it (then one complete release). The bound must be calibrated on PR2979's words, where it has to reproduce dcharb78's realized 29,976.", + "outcome": "negative-result", + "evidence": "run_registered.py (Python 3.12 standard library): MANIFEST/PINS; verify.py (exact frame optimum, restore-entry rows and their rank, forced coordinates, 88 caps, LB_forced 10,867,765,164, classification 42 blocked + 9 payer groups = 337,923, bound = certified cost 10,868,103,087 on both providers, 51 literal visits all charged, normal-45 facts, PR2979 calibration gap 29,976 = the six PR3042 skips, per-block erratum of PR3042's README, auditor-semantics controls, PR3056/PR3060 attainment controls, 12 rejection controls) and census.py (complete deletion census, re-derived tail-exchange candidate list with sampled re-checks); regenerated receipts byte-equal to certificates/; lane K's stored receipts and its current bound.py/lbforced.py cross-checked in evidence/laneK/.", + "author": "Marius-Paul Dumitrean", + "ai_assistance": "Substantial AI assistance (Claude Code) for the search, the proof write-up, the stdlib port and the checks; author-checked, no independent review is claimed.", + "open_questions": [ + { + "question": "Can an A-phase (input block) or B-phase re-synthesis lower the restore's forced overhead (161,558 forced-cap units on A/B chains; 192,384 units of kernel/preload visits in 30 registers)?", + "why_it_matters": "This package proves the whole 499,481-unit restore overhead forced at fixed A/B; any further local gain on these words must change A/B, i.e. the forced coordinates M of the restored helpers or the entry bounds L/U.", + "first_step": "For a candidate A/B block, recompute the restore-entry rows, M, the caps and restore_bound.bound on the edited word before pricing it; only candidates whose bound falls below the current cost are worth realizing.", + "blocked_by": "Lane K's single-move A/B censuses scored by this bound (local evidence) found no positive gap; multi-gate input-block re-synthesis needs exact dirty-input identities for the changed block and its frame bill." + }, + { + "question": "Is the fixed target port interface the common wall for local levers on these words?", + "why_it_matters": "Several r15 searches stopped at late-B target writes and A-end target levels pinned by the targets' 8-dim port-perpendicular end frames.", + "first_step": "Name one changed port interface (PR2312 lineage), derive its complete replacement bound, and price its effect on L/U of the restore-entry registers with this package's bound.", + "blocked_by": "A changed port interface changes the source contract and needs a fully charged replacement bound and admission." + } + ] +} diff --git a/research/rank7-skip-restore-optimum/VERIFY.json b/research/rank7-skip-restore-optimum/VERIFY.json new file mode 100644 index 0000000000..3353657a92 --- /dev/null +++ b/research/rank7-skip-restore-optimum/VERIFY.json @@ -0,0 +1,30 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/run_registered.py" + ], + "timeout_seconds": 600, + "checks": "Complete inventory (MANIFEST) and pins; verify.py on both PR3042 providers: exact frame optimum 10,868,103,087 with the declared profile, restore-entry rows (PR2833 free algebra) independent, forced coordinates realized by the current restore, PR2833 auditor PASS, 88 forced caps, LB_forced 10,867,765,164, sound classification (42 blocked, 9 payer groups) giving bound = certified cost, 51 literal visits all charged, normal-45 facts; PR2979 calibration (gap 29,976 = the six PR3042 skips); per-block erratum of PR3042's README; auditor-semantics, PR3056/PR3060 attainment and 12 rejection controls; census.py (deletion census, tail-exchange candidate list and sampled re-checks); regenerated receipts byte-equal to certificates/; lane K receipts and its current bound.py/lbforced.py cross-check bound to the recomputation." + }, + { + "argv": [ + "{python}", + "-O", + "-B", + "-W", + "error", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "The proof replay with Python assertions disabled and warnings as errors: every check is an explicit exception; regenerated receipts compared with certificates/." + } + ] +} diff --git a/research/rank7-skip-restore-optimum/census.py b/research/rank7-skip-restore-optimum/census.py new file mode 100644 index 0000000000..67c0e1b44e --- /dev/null +++ b/research/rank7-skip-restore-optimum/census.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Empirical controls (not part of the proof): the single-gate deletion census of the restore, recomputed completely, and +the tail-exchange census of lane K, whose candidate list is re-derived here and whose stored records are re-checked on a +deterministic sample with this package's exactness test and exact frame solver. + +Deletion census: delete one restore gate at a time; keep it if the Lemma 1 end conditions still hold (relaxed semantics: +other final rows free) and price it. Tail-exchange census: for a register r with a restore-phase visit and any other +non-restored, non-target register s with dim(L_r + L_s) <= 8, insert the exact exchange [s += r; r -= s; s += r] at r's +first restore touch or at R0 and relabel the rest of the restore (r <-> s with signs), so that s carries r's restore role; +price every exact candidate. Marius-Paul Dumitrean, with substantial AI assistance (Claude Code). +""" +import argparse +import collections +import copy +import gzip +import json +import sys +import time +from pathlib import Path + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +import frames_exact as FX # noqa: E402 +import restore_bound as RB # noqa: E402 +import verify as VF # noqa: E402 + +SAMPLE_EVERY = 25 +TAIL_SHA = {'base': '7bfa6fee793b7c7732a21f9d24d6f67029d726b9e4bd646fd6e626ab58e5176d', + 'extra': '7bfa6fee793b7c7732a21f9d24d6f67029d726b9e4bd646fd6e626ab58e5176d'} +TAIL_PINS = {'base': 'evidence/tail-exchange/TAIL-EXCHANGE-3042-base.jsonl.gz', + 'extra': 'evidence/tail-exchange/TAIL-EXCHANGE-3042-extra.jsonl.gz'} + + +def deletion_census(w, rows, base): + exact = [] + n = 0 + for i in range(len(w['restore'])): + x = copy.deepcopy(w) + g = x['restore'].pop(i) + fin = RB.run_restore(x['restore'], rows) + dirty, leaks, targets = RB.end_conditions(x, fin, rows) + n += 1 + if dirty or leaks or targets: + continue + try: + d = FX.frame_optimum(x)['cost'] - base + except FX.Infeasible: + d = None + exact.append(dict(deleted=i, gate=g[:5], delta=d)) + return dict(deletions=n, exact=len(exact), exact_deletions=exact, + min_delta=min((e['delta'] for e in exact if e['delta'] is not None), default=None)) + + +def relabel(g, r, s): + """gate on old registers rewritten after the exchange (new s = old r, new r = -old s); lane K's swapcensus.py""" + g = list(g) + if g[0] == 'add': + t, u, num = g[1], g[2], g[3] + sgn = 1 + nt = {r: s, s: r}.get(t, t) + nu = {r: s, s: r}.get(u, u) + if u == s: + sgn = -sgn + if t == s: + sgn = -sgn + g[1], g[2], g[3] = nt, nu, num * sgn + else: + g[1] = {r: s, s: r}.get(g[1], g[1]) + return g + + +def exchange(w, r, s, p): + x = copy.deepcopy(w) + R0 = w['restore'] + sw = [['add', s, r, 1, 1, list(FX.FULL9)], ['add', r, s, -1, 1, list(FX.FULL9)], ['add', s, r, 1, 1, list(FX.FULL9)]] + x['restore'] = [list(g) for g in R0[:p]] + sw + [relabel(g, r, s) for g in R0[p:]] + return x + + +def tail_jobs(w, lit, LU): + R = RB.restored(w) + regs = [q for q, x in sorted(lit.items()) if x['overhead']] + jobs = [] + for r in regs: + first = min(i for i, g in enumerate(w['restore']) if r in FX.regs_of(g)) + for s in sorted(LU): + if s == r or s in R or RB.is_target(s): + continue + if len(FX.join(LU[r][0], LU[s][0])) > 8: + continue + for p in sorted({first, 0}): + jobs.append((r, s, p)) + return jobs + + +def tail_check(prov, w, rows, base, LU, lit): + raw = (HERE / TAIL_PINS[prov]).read_bytes() + recs = [json.loads(l) for l in gzip.decompress(raw).decode().splitlines()] + jobs = tail_jobs(w, lit, LU) + VF.require(sorted((x['r'], x['s'], x['p']) for x in recs) == sorted(jobs), 'stored census covers exactly the re-derived candidates') + hist = collections.Counter(x['delta'] for x in recs if x.get('status') == 'ok') + summary = dict(candidates=len(recs), exact=sum(1 for x in recs if x['clean']), frame_feasible=sum(1 for x in recs if x.get('status') == 'ok'), + infeasible=sum(1 for x in recs if x.get('status') == 'infeasible'), not_exact=sum(1 for x in recs if not x['clean']), + min_delta=min(hist), negative=sum(v for k, v in hist.items() if k < 0), + delta_histogram={str(k): v for k, v in sorted(hist.items())}) + checked = 0 + for i, x in enumerate(sorted(recs, key=lambda y: (y['r'], y['s'], y['p']))): + if i % SAMPLE_EVERY: + continue + y = exchange(w, x['r'], x['s'], x['p']) + fin = RB.run_restore(y['restore'], rows) + dirty, leaks, targets = RB.end_conditions(y, fin, rows) + clean = not dirty and not leaks and not targets + VF.require(clean == x['clean'], 'exactness of stored candidate %s' % ((x['r'], x['s'], x['p']),)) + if clean: + try: + d = FX.frame_optimum(y)['cost'] - base + status = 'ok' + except FX.Infeasible: + d, status = None, 'infeasible' + VF.require(status == x.get('status') and (d == x.get('delta') or status != 'ok'), 'price of stored candidate %s' % ((x['r'], x['s'], x['p']),)) + checked += 1 + summary['sample_every'] = SAMPLE_EVERY + summary['sample_rechecked'] = checked + return summary + + +def main(): + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument('--work', type=Path) + a = ap.parse_args() + t0 = time.monotonic() + VF.authenticate() + VF.authenticate(pins={TAIL_PINS['base']: TAIL_SHA['base'], TAIL_PINS['extra']: TAIL_SHA['extra']}) + out = {} + for prov in ('base', 'extra'): + w = VF.load_word('3042-' + prov) + rows = RB.entry_rows(w) + sol = FX.frame_optimum(w) + base = sol['cost'] + lit = RB.literal_restore_chains(w) + Mc, rk = RB.coordinates(rows, {x: {(x, ()): VF.Q(1)} for x in RB.restored(w)}) + caps, _ = RB.forced_caps({x: dict(v) for x, v in Mc.items()}, RB.end_frames(w), RB.restored(w)) + LU = RB.entry_bounds(w, RB.lb_forced(w, caps)) + dele = deletion_census(w, rows, base) + VF.require(dele['deletions'] == 212 and dele['exact'] == 10 and all(e['delta'] == 0 for e in dele['exact_deletions']), 'deletion census') + tail = tail_check(prov, w, rows, base, LU, lit) + VF.require(tail['candidates'] == 8098 and tail['negative'] == 0 and tail['min_delta'] == 0, 'tail-exchange census') + out[prov] = dict(deletion=dele, tail_exchange=tail) + print('PASS census', prov, 'deletions', dele['deletions'], 'exact', dele['exact'], 'min delta', dele['min_delta'], + '| tail exchanges', tail['candidates'], 'exact', tail['exact'], 'feasible', tail['frame_feasible'], 'min delta', + tail['min_delta'], 'rechecked', tail['sample_rechecked'], flush=True) + VF.require(out['base'] == out['extra'], 'providers agree') + text = VF.canonical(out) + if a.work: + a.work.mkdir(parents=True, exist_ok=True) + (a.work / 'CENSUS.json').write_text(text) + else: + VF.require((HERE / 'certificates/CENSUS.json').read_text() == text, 'regenerated census differs from certificates/CENSUS.json') + print('PASS_RANK7_SKIP_RESTORE_CENSUS deletions=212x2 exact=10 tail_exchanges=8098x2 negative=0 (%.1f s)' % (time.monotonic() - t0)) + + +if __name__ == '__main__': + main() diff --git a/research/rank7-skip-restore-optimum/certificates/BOUND-3042-base.json b/research/rank7-skip-restore-optimum/certificates/BOUND-3042-base.json new file mode 100644 index 0000000000..49ecc09cd8 --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/BOUND-3042-base.json @@ -0,0 +1,6018 @@ +{ + "LB_forced": 10867765164, + "LB_profile": { + "1": 2370, + "2": 693, + "3": 255, + "4": 116, + "5": 18, + "8": 8 + }, + "blocked": 42, + "blocked_detail": { + "105": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 102, + 22, + 8, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 66, + 36, + 22, + 8 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ] + } + }, + "2": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "226": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 6, + "overhead": 4996, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + } + }, + "228": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 6, + "overhead": 4996, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + } + }, + "230": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 6, + "overhead": 4996, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + } + }, + "231": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + } + }, + "232": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + }, + "236": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "238": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "3": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 48, + 8, + 4, + 3 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 256, + 128, + 67, + 33, + 18, + 8, + 4 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 256, + 128, + 67, + 34, + 17, + 8, + 4 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "306": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 152, + 80, + 40, + 4, + 2, + 1 + ] + } + }, + "308": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 74, + 42, + 16, + 6, + 1 + ] + } + }, + "310": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 67, + 34, + 16, + 8, + 7 + ] + } + }, + "322": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 145, + 80, + 32, + 8, + 5, + 2 + ] + } + }, + "324": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 72, + 41, + 16, + 4, + 3 + ] + } + }, + "326": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 32, + 16, + 10, + 7 + ] + } + }, + "34": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 39, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 65, + 38, + 21, + 11 + ], + "why": "no register can sit at G" + }, + { + "Z": 8, + "frame": [ + 266, + 138, + 74, + 44, + 30, + 1 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + } + }, + "351": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 38, + 18, + 12, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 256, + 128, + 96, + 18, + 10, + 6, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "363": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 43, + 24, + 6 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 262, + 134, + 70, + 32, + 19, + 13 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 262, + 134, + 70, + 38, + 21, + 11 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + }, + "383": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "Z": 10, + "frame": [ + 256, + 128, + 67, + 33, + 18, + 8, + 4 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 259, + 131, + 64, + 34, + 17, + 11, + 7 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 260, + 132, + 68, + 37, + 21, + 12, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "395": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 37, + 22, + 8 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 259, + 131, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 320, + 192, + 37, + 21, + 8, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "408": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 66, + 36, + 30, + 1 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 257, + 129, + 67, + 37, + 23, + 9 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ] + } + }, + "412": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 131, + 65, + 36, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 259, + 131, + 65, + 39, + 20, + 10 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 292, + 128, + 65, + 20, + 9, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ] + } + }, + "414": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 164, + 65, + 20, + 9, + 3 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 259, + 128, + 65, + 36, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 259, + 131, + 65, + 39, + 20, + 10 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ] + } + }, + "424": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 130, + 65, + 37, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 258, + 128, + 65, + 37, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 384, + 65, + 37, + 20, + 8, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ] + } + }, + "428": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 100, + 28, + 2, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 72, + 44, + 28, + 2 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 73, + 45, + 28, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ] + } + }, + "430": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 72, + 46, + 30, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 73, + 44, + 29, + 3 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 73, + 45, + 28, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ] + } + }, + "434": { + "entry_dims": [ + 7, + 7 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "436": { + "entry_dims": [ + 7, + 7 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "438": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 24, + 6, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 256, + 128, + 70, + 32, + 20, + 10, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "439": { + "entry_dims": [ + 7, + 7 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "44": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 165, + 65, + 20, + 8, + 2 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 293, + 128, + 65, + 20, + 8, + 2 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 384, + 65, + 37, + 20, + 8, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ] + } + }, + "440": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 262, + 128, + 64, + 32, + 20, + 10, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "475": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 76, + 40, + 28, + 2, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 64, + 37, + 17, + 12, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 257, + 129, + 65, + 36, + 16, + 13, + 3 + ] + } + }, + "486": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 130, + 65, + 32, + 17, + 10, + 5 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 260, + 130, + 64, + 32, + 20, + 10, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 257, + 130, + 65, + 32, + 16, + 10, + 4 + ] + } + }, + "5": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 45, + 29, + 3 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 259, + 131, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 259, + 131, + 67, + 38, + 21, + 11 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "54": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 41, + 26, + 4 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 267, + 139, + 75, + 41, + 26, + 4 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 320, + 192, + 34, + 17, + 11, + 4 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + } + }, + "7": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + }, + "70": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "71": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "72": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "73": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 19, + 13 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 262, + 134, + 70, + 32, + 19, + 13 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 320, + 192, + 32, + 19, + 11, + 6 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + } + }, + "bound": 10868103087, + "caps": { + "103": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 230 + ] + }, + "105": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "receivers": [ + 408, + 573 + ] + }, + "108": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 228 + ] + }, + "16": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "receivers": [ + 424 + ] + }, + "18": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 226 + ] + }, + "2": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 251, + 265 + ] + }, + "22": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 331 + ] + }, + "226": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 449 + ] + }, + "228": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 230, + 451 + ] + }, + "23": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 511 + ] + }, + "230": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 450 + ] + }, + "231": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 448 + ] + }, + "232": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 452 + ] + }, + "236": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 454 + ] + }, + "238": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 455 + ] + }, + "249": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 267 + ] + }, + "251": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 265, + 267 + ] + }, + "265": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 251 + ] + }, + "267": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265 + ] + }, + "299": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 226, + 230, + 484 + ] + }, + "3": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 554 + ] + }, + "306": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 498, + 499 + ] + }, + "308": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "receivers": [ + 304, + 501 + ] + }, + "310": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "receivers": [ + 304, + 500 + ] + }, + "311": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 499 + ] + }, + "322": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 327, + 511 + ] + }, + "324": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "receivers": [ + 320, + 513 + ] + }, + "326": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "receivers": [ + 320, + 512 + ] + }, + "327": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 510, + 511 + ] + }, + "331": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 228, + 230, + 508 + ] + }, + "34": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 228, + 230, + 331, + 509 + ] + }, + "35": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 499 + ] + }, + "351": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 531 + ] + }, + "363": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 532 + ] + }, + "367": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 543 + ] + }, + "383": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 555 + ] + }, + "395": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 556 + ] + }, + "399": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 567 + ] + }, + "40": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 299 + ] + }, + "400": { + "cap": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "receivers": [ + 412 + ] + }, + "408": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "receivers": [ + 572 + ] + }, + "412": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "receivers": [ + 574 + ] + }, + "414": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "receivers": [ + 412, + 575 + ] + }, + "416": { + "cap": [ + 256, + 128, + 68, + 32, + 16, + 12, + 2, + 1 + ], + "receivers": [ + 428 + ] + }, + "42": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "receivers": [ + 408 + ] + }, + "424": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "receivers": [ + 580 + ] + }, + "428": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "receivers": [ + 582 + ] + }, + "430": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "receivers": [ + 428, + 583 + ] + }, + "434": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 585 + ] + }, + "436": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 587 + ] + }, + "438": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 586 + ] + }, + "439": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 584 + ] + }, + "44": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "receivers": [ + 424, + 581 + ] + }, + "440": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 588 + ] + }, + "444": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 590 + ] + }, + "446": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 591 + ] + }, + "448": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 484 + ] + }, + "449": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 485 + ] + }, + "45": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 230 + ] + }, + "450": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 508 + ] + }, + "451": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 509 + ] + }, + "452": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 532 + ] + }, + "453": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 533 + ] + }, + "454": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 556 + ] + }, + "455": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 557 + ] + }, + "46": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 589 + ] + }, + "498": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 311 + ] + }, + "499": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 498 + ] + }, + "5": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 395, + 557 + ] + }, + "511": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 327 + ] + }, + "54": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 226, + 230, + 299, + 485 + ] + }, + "585": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 555 + ] + }, + "587": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 531 + ] + }, + "589": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 543 + ] + }, + "59": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "receivers": [ + 363 + ] + }, + "591": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 567 + ] + }, + "61": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 251 + ] + }, + "62": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249 + ] + }, + "63": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 267 + ] + }, + "69": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 566 + ] + }, + "7": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 453 + ] + }, + "70": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "71": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 249, + 267 + ] + }, + "72": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "73": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 363, + 533 + ] + }, + "92": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 230 + ] + }, + "94": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 265 + ] + }, + "96": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "receivers": [ + 395 + ] + } + }, + "certified_cost": 10868103087, + "certified_profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "current_restore": { + "auditor": { + "dual": "PASS", + "forward": "PASS", + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + "dirty": [], + "gates": 212, + "leaks": {}, + "targets_changed": [] + }, + "extras_blocked": 292959, + "extras_open": 44964, + "forced_caps": 88, + "frame_graph": { + "components": 210, + "largest_component": 94, + "variables": 743 + }, + "gap": 0, + "groups": [ + { + "members": [ + 0, + 2, + 61, + 62, + 63, + 70, + 71, + 72, + 76, + 94, + 233, + 235 + ], + "parts": [ + { + "kind": "lift", + "receiver": 230, + "region": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "source": 265 + }, + { + "kind": "lift", + "receiver": 230, + "region": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "source": 249 + } + ] + }, + { + "members": [ + 23, + 39 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 23 + } + ] + }, + { + "members": [ + 35, + 77 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 35 + } + ] + }, + { + "members": [ + 46, + 521 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 46 + } + ] + }, + { + "members": [ + 69 + ], + "parts": [ + { + "kind": "forced-visit", + "register": 69 + } + ] + }, + { + "members": [ + 367, + 496 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 367 + } + ] + }, + { + "members": [ + 399, + 472 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 399 + } + ] + }, + { + "members": [ + 444 + ], + "parts": [ + { + "kind": "forced-visit", + "register": 444 + } + ] + }, + { + "members": [ + 446, + 545 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 446 + } + ] + } + ], + "literal_visit_units": 337923, + "literal_visits": 51, + "normal45": { + "V45": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "entry_lower_bounds": { + "2": [ + 256, + 128, + 64, + 35, + 16, + 14 + ], + "249": [ + 256, + 139, + 64, + 40, + 16, + 5 + ], + "251": [ + 267, + 128, + 64, + 40, + 16, + 5 + ], + "265": [ + 256, + 128, + 64, + 40, + 27, + 5 + ], + "267": [ + 261, + 133, + 69, + 38, + 21, + 11 + ], + "70": [ + 272, + 128, + 80, + 35, + 11, + 5 + ], + "71": [ + 256, + 144, + 80, + 35, + 11, + 5 + ], + "72": [ + 320, + 192, + 35, + 16, + 11, + 5 + ] + }, + "visitors": [ + { + "beta": 6877, + "entry_lower": [ + 256, + 128, + 64, + 35, + 16, + 14 + ], + "receivers": [ + 230, + 251, + 265 + ], + "register": 2 + }, + { + "beta": 6877, + "entry_lower": [ + 272, + 128, + 80, + 35, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 70 + }, + { + "beta": 6877, + "entry_lower": [ + 256, + 144, + 80, + 35, + 11, + 5 + ], + "receivers": [ + 230, + 249, + 267 + ], + "register": 71 + }, + { + "beta": 6877, + "entry_lower": [ + 320, + 192, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 72 + } + ] + }, + "open_detail": { + "103": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "108": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "16": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "free": true + } + ] + }, + "18": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "22": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "free": true + } + ] + }, + "23": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 261, + 133, + 68, + 34, + 17, + 15 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 39 + ], + "frame": [ + 256, + 128, + 65, + 34, + 17, + 10, + 5 + ], + "needy_receivers": [ + 511 + ] + } + ] + }, + "35": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 260, + 132, + 74, + 44, + 30, + 1 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 77 + ], + "frame": [ + 256, + 128, + 74, + 40, + 26, + 4, + 1 + ], + "needy_receivers": [ + 499 + ] + } + ] + }, + "367": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 289, + 128, + 65, + 18, + 10, + 6 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 496 + ], + "frame": [ + 257, + 128, + 65, + 32, + 18, + 10, + 6 + ], + "needy_receivers": [ + 543 + ] + } + ] + }, + "399": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 256, + 131, + 68, + 34, + 17, + 12 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 472 + ], + "frame": [ + 256, + 131, + 64, + 34, + 17, + 8, + 4 + ], + "needy_receivers": [ + 567 + ] + } + ] + }, + "40": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "free": true + } + ] + }, + "400": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "free": true + } + ] + }, + "416": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 68, + 32, + 16, + 12, + 2, + 1 + ], + "free": true + } + ] + }, + "42": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "free": true + } + ] + }, + "444": { + "kind": "forced-visit", + "rejected_skip_frames": [ + { + "Z": 2, + "frame": [ + 273, + 128, + 64, + 48, + 8, + 4, + 3 + ], + "why": "departure from F: M[O][Z] full column rank" + } + ] + }, + "446": { + "kind": "zero-sum", + "rejected_skip_frames": [], + "skip_frames": [ + { + "carriers": [ + 545 + ], + "frame": [ + 256, + 145, + 64, + 48, + 8, + 4, + 3 + ], + "needy_receivers": [ + 591 + ] + } + ] + }, + "45": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "46": { + "kind": "zero-sum", + "rejected_skip_frames": [], + "skip_frames": [ + { + "carriers": [ + 521 + ], + "frame": [ + 288, + 128, + 96, + 18, + 10, + 6, + 1 + ], + "needy_receivers": [ + 589 + ] + } + ] + }, + "59": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "free": true + } + ] + }, + "61": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "62": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "63": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "69": { + "kind": "forced-visit", + "rejected_skip_frames": [ + { + "frame": [ + 259, + 128, + 68, + 34, + 17, + 12 + ], + "why": "no reader at F" + }, + { + "Z": 2, + "frame": [ + 259, + 128, + 64, + 34, + 17, + 8, + 4 + ], + "why": "departure from F: M[O][Z] full column rank" + } + ] + }, + "92": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "94": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "96": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "free": true + } + ] + } + }, + "payer_groups": 9, + "restore_entry": { + "forced_coordinates_match_restore": true, + "live_registers": 632, + "rank": 632, + "restored_helpers": 91 + }, + "theorem": "For every exact restore-only rewrite of WORD-3042-base (A, B, warps, cut, corrections, compensation, start frames, helper ends and buffers fixed; any restore gate sequence; all frames re-solved; exact = PR2833 auditor), certified cost >= LB_forced + forced extras = 10868103087 = certified cost of WORD-3042-base.", + "visit_blocks": [ + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charges": { + "beta": 24, + "forced-visit": 2, + "zero-sum": 4 + }, + "registers": [ + 3, + 44, + 46, + 69, + 105, + 306, + 308, + 310, + 322, + 324, + 326, + 351, + 367, + 383, + 399, + 408, + 412, + 414, + 424, + 428, + 430, + 434, + 436, + 438, + 439, + 440, + 444, + 446, + 475, + 486 + ], + "units": 192384 + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charges": { + "beta": 14 + }, + "registers": [ + 5, + 7, + 34, + 54, + 73, + 226, + 228, + 230, + 231, + 232, + 236, + 238, + 363, + 395 + ], + "units": 103043 + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charges": { + "beta": 4 + }, + "registers": [ + 2, + 70, + 71, + 72 + ], + "units": 27508 + }, + { + "block": "PR2908/PR2917 paired-extraction outputs", + "charges": { + "zero-sum": 2 + }, + "registers": [ + 23, + 35 + ], + "units": 9992 + }, + { + "block": "n42: PR2979 extraction + PR3042 R1_E42", + "charges": { + "lift": 1 + }, + "registers": [ + 61 + ], + "units": 4996 + } + ], + "visits": [ + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R142", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 230, + 251, + 265 + ], + "register": 2, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R68", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 554 + ], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 554 + ], + "register": 3, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R75", + 7, + 2 + ], + [ + "R211", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 395, + 557 + ], + "register": 5, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R30", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 453 + ], + "register": 7, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2908/PR2917 paired-extraction outputs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R112", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 510, + 511 + ], + "overhead": 4996, + "payer_group": [ + 23, + 39 + ], + "receivers": [ + 511 + ], + "register": 23, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R52", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 228, + 230, + 331, + 509 + ], + "register": 34, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2908/PR2917 paired-extraction outputs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R118", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 499 + ], + "overhead": 4996, + "payer_group": [ + 35, + 77 + ], + "receivers": [ + 499 + ], + "register": 35, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R7", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 424, + 581 + ], + "register": 44, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R89", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": [ + 46, + 521 + ], + "receivers": [ + 589 + ], + "register": 46, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R39", + 7, + 2 + ], + [ + "R187", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 226, + 230, + 299, + 485 + ], + "register": 54, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "n42: PR2979 extraction + PR3042 R1_E42", + "charge": "lift", + "entry_dim": 7, + "jumps": [ + [ + "R189", + 8, + 1 + ], + [ + "R190", + 9, + 1 + ] + ], + "leaks": [ + 251 + ], + "overhead": 4996, + "payer_group": [ + 0, + 2, + 61, + 62, + 63, + 70, + 71, + 72, + 76, + 94, + 233, + 235 + ], + "receivers": [ + 251 + ], + "register": 61, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "forced-visit", + "entry_dim": 7, + "jumps": [ + [ + "R77", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 566 + ], + "overhead": 4996, + "payer_group": [ + 69 + ], + "receivers": [ + 566 + ], + "register": 69, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R121", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 70, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R122", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 230, + 249, + 267 + ], + "register": 71, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R123", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 72, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R63", + 7, + 2 + ], + [ + "R203", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 363, + 533 + ], + "register": 73, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R1", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 408, + 573 + ], + "register": 105, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R22", + 7, + 1 + ], + [ + "R166", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 449 + ], + "register": 226, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R26", + 7, + 1 + ], + [ + "R179", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 230, + 451 + ], + "register": 228, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R24", + 7, + 1 + ], + [ + "R182", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 450 + ], + "register": 230, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R20", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 448 + ], + "register": 231, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R28", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 452 + ], + "register": 232, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R32", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 454 + ], + "register": 236, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R34", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 455 + ], + "register": 238, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R40", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 498 + ], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 498, + 499 + ], + "register": 306, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R48", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 304, + 501 + ], + "register": 308, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R47", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 304, + 500 + ], + "register": 310, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R15", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 327, + 511 + ], + "register": 322, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R56", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 320, + 513 + ], + "register": 324, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R55", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 320, + 512 + ], + "register": 326, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R57", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 531, + 587 + ], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 531 + ], + "register": 351, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R60", + 7, + 2 + ], + [ + "R198", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 532 + ], + "register": 363, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R64", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 543, + 589 + ], + "overhead": 4996, + "payer_group": [ + 367, + 496 + ], + "receivers": [ + 543 + ], + "register": 367, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R70", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 555, + 585 + ], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 555 + ], + "register": 383, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R74", + 7, + 2 + ], + [ + "R205", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 556 + ], + "register": 395, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R79", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 567, + 591 + ], + "overhead": 4996, + "payer_group": [ + 399, + 472 + ], + "receivers": [ + 567 + ], + "register": 399, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R0", + 7, + 2 + ], + [ + "R94", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 572 + ], + "register": 408, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R3", + 7, + 2 + ], + [ + "R101", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 574 + ], + "register": 412, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R4", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 412, + 575 + ], + "register": 414, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R6", + 7, + 2 + ], + [ + "R96", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 580 + ], + "register": 424, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R9", + 7, + 2 + ], + [ + "R98", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 582 + ], + "register": 428, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R10", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 428, + 583 + ], + "register": 430, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R83", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 585 + ], + "register": 434, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R86", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 587 + ], + "register": 436, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R85", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 586 + ], + "register": 438, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R82", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 584 + ], + "register": 439, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R88", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 588 + ], + "register": 440, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "forced-visit", + "entry_dim": 7, + "jumps": [ + [ + "R91", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": [ + 444 + ], + "receivers": [ + 590 + ], + "register": 444, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R92", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": [ + 446, + 545 + ], + "receivers": [ + 591 + ], + "register": 446, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R44", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 498 + ], + "overhead": 6877, + "payer_group": null, + "receivers": [], + "register": 475, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R54", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 510 + ], + "overhead": 6877, + "payer_group": null, + "receivers": [], + "register": 486, + "restored": false, + "verdict": "BLOCKED" + } + ], + "weights": { + "c1": 2116671, + "c2": 4228346, + "c3": 6338140, + "c4": 8446713, + "c5": 10554378, + "visit_unit": 4996 + }, + "word": "3042-base", + "word_sha256": "7e98f6f2a6c9ce9e7e04b515bd8ce4a4a533ff05f01ea265be2a1a994695260e" +} diff --git a/research/rank7-skip-restore-optimum/certificates/BOUND-3042-extra.json b/research/rank7-skip-restore-optimum/certificates/BOUND-3042-extra.json new file mode 100644 index 0000000000..e7893c6d97 --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/BOUND-3042-extra.json @@ -0,0 +1,6018 @@ +{ + "LB_forced": 10867765164, + "LB_profile": { + "1": 2370, + "2": 693, + "3": 255, + "4": 116, + "5": 18, + "8": 8 + }, + "blocked": 42, + "blocked_detail": { + "105": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 102, + 22, + 8, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 66, + 36, + 22, + 8 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ] + } + }, + "2": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "226": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 6, + "overhead": 4996, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + } + }, + "228": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 6, + "overhead": 4996, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + } + }, + "230": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 6, + "overhead": 4996, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + } + }, + "231": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + } + }, + "232": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + }, + "236": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "238": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "3": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 48, + 8, + 4, + 3 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 256, + 128, + 67, + 33, + 18, + 8, + 4 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 256, + 128, + 67, + 34, + 17, + 8, + 4 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "306": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 152, + 80, + 40, + 4, + 2, + 1 + ] + } + }, + "308": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 74, + 42, + 16, + 6, + 1 + ] + } + }, + "310": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 67, + 34, + 16, + 8, + 7 + ] + } + }, + "322": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 145, + 80, + 32, + 8, + 5, + 2 + ] + } + }, + "324": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 72, + 41, + 16, + 4, + 3 + ] + } + }, + "326": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 32, + 16, + 10, + 7 + ] + } + }, + "34": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 39, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 65, + 38, + 21, + 11 + ], + "why": "no register can sit at G" + }, + { + "Z": 8, + "frame": [ + 266, + 138, + 74, + 44, + 30, + 1 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + } + }, + "351": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 38, + 18, + 12, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 256, + 128, + 96, + 18, + 10, + 6, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "363": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 43, + 24, + 6 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 262, + 134, + 70, + 32, + 19, + 13 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 262, + 134, + 70, + 38, + 21, + 11 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + }, + "383": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "Z": 10, + "frame": [ + 256, + 128, + 67, + 33, + 18, + 8, + 4 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 259, + 131, + 64, + 34, + 17, + 11, + 7 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 260, + 132, + 68, + 37, + 21, + 12, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "395": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 37, + 22, + 8 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 259, + 131, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 320, + 192, + 37, + 21, + 8, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "408": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 66, + 36, + 30, + 1 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 257, + 129, + 67, + 37, + 23, + 9 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ] + } + }, + "412": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 131, + 65, + 36, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 259, + 131, + 65, + 39, + 20, + 10 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 292, + 128, + 65, + 20, + 9, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ] + } + }, + "414": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 164, + 65, + 20, + 9, + 3 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 259, + 128, + 65, + 36, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 259, + 131, + 65, + 39, + 20, + 10 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ] + } + }, + "424": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 130, + 65, + 37, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 258, + 128, + 65, + 37, + 20, + 10 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 384, + 65, + 37, + 20, + 8, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ] + } + }, + "428": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 100, + 28, + 2, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 72, + 44, + 28, + 2 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 73, + 45, + 28, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ] + } + }, + "430": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 72, + 46, + 30, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 73, + 44, + 29, + 3 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 257, + 129, + 73, + 45, + 28, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ] + } + }, + "434": { + "entry_dims": [ + 7, + 7 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "436": { + "entry_dims": [ + 7, + 7 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "438": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 24, + 6, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 256, + 128, + 70, + 32, + 20, + 10, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "439": { + "entry_dims": [ + 7, + 7 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "three_or_more": null, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ] + } + }, + "44": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 165, + 65, + 20, + 8, + 2 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 293, + 128, + 65, + 20, + 8, + 2 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 384, + 65, + 37, + 20, + 8, + 2 + ], + "why": "departure from G: M[O][Z] full column rank" + } + ], + "first_frame_cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ] + } + }, + "440": { + "entry_dims": [ + 6, + 7 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 262, + 128, + 64, + 32, + 20, + 10, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 7, + "overhead": 4996, + "visit_dim": 8, + "visit_frame": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ] + } + }, + "475": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 76, + 40, + 28, + 2, + 1 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 257, + 129, + 64, + 37, + 17, + 12, + 3 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 257, + 129, + 65, + 36, + 16, + 13, + 3 + ] + } + }, + "486": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 130, + 65, + 32, + 17, + 10, + 5 + ], + "why": "no register can sit at G" + }, + { + "frame": [ + 260, + 130, + 64, + 32, + 20, + 10, + 1 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 257, + 130, + 65, + 32, + 16, + 10, + 4 + ] + } + }, + "5": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 45, + 29, + 3 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 259, + 131, + 67, + 37, + 22, + 8 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 259, + 131, + 67, + 38, + 21, + 11 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + } + }, + "54": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 41, + 26, + 4 + ], + "why": "no register can sit at G" + }, + { + "Z": 6, + "frame": [ + 267, + 139, + 75, + 41, + 26, + 4 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 320, + 192, + 34, + 17, + 11, + 4 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + } + }, + "7": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + }, + "70": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "71": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "72": { + "entry_dims": [ + 6, + 6 + ], + "excluded_two_jump_frames": [], + "first_frame_cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "three_or_more": { + "entry_dim": 6, + "jumps": [ + 1, + 1, + 1 + ], + "overhead": 11873 + }, + "two_jump": { + "entry_dim": 6, + "overhead": 6877, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + } + }, + "73": { + "entry_dims": [ + 5, + 5 + ], + "excluded_two_jump_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 19, + 13 + ], + "why": "no register can sit at G" + }, + { + "Z": 10, + "frame": [ + 262, + 134, + 70, + 32, + 19, + 13 + ], + "why": "departure from G: M[O][Z] full column rank" + }, + { + "frame": [ + 320, + 192, + 32, + 19, + 11, + 6 + ], + "why": "no register can sit at G" + } + ], + "first_frame_cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "three_or_more": { + "entry_dim": 5, + "jumps": [ + 1, + 1, + 2 + ], + "overhead": 14975 + }, + "two_jump": { + "entry_dim": 5, + "overhead": 9979, + "visit_dim": 7, + "visit_frame": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + } + } + }, + "bound": 10868103087, + "caps": { + "103": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 230 + ] + }, + "105": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "receivers": [ + 408, + 573 + ] + }, + "108": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 228 + ] + }, + "16": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "receivers": [ + 424 + ] + }, + "18": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 226 + ] + }, + "2": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 251, + 265 + ] + }, + "22": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 331 + ] + }, + "226": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 449 + ] + }, + "228": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 230, + 451 + ] + }, + "23": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 511 + ] + }, + "230": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 450 + ] + }, + "231": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 448 + ] + }, + "232": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 452 + ] + }, + "236": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 454 + ] + }, + "238": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 455 + ] + }, + "249": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 267 + ] + }, + "251": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 265, + 267 + ] + }, + "265": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 251 + ] + }, + "267": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265 + ] + }, + "299": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 226, + 230, + 484 + ] + }, + "3": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 554 + ] + }, + "306": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 498, + 499 + ] + }, + "308": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "receivers": [ + 304, + 501 + ] + }, + "310": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "receivers": [ + 304, + 500 + ] + }, + "311": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 499 + ] + }, + "322": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 327, + 511 + ] + }, + "324": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "receivers": [ + 320, + 513 + ] + }, + "326": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "receivers": [ + 320, + 512 + ] + }, + "327": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 510, + 511 + ] + }, + "331": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 228, + 230, + 508 + ] + }, + "34": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 228, + 230, + 331, + 509 + ] + }, + "35": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 499 + ] + }, + "351": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 531 + ] + }, + "363": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 532 + ] + }, + "367": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 543 + ] + }, + "383": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 555 + ] + }, + "395": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 556 + ] + }, + "399": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 567 + ] + }, + "40": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 299 + ] + }, + "400": { + "cap": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "receivers": [ + 412 + ] + }, + "408": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "receivers": [ + 572 + ] + }, + "412": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "receivers": [ + 574 + ] + }, + "414": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "receivers": [ + 412, + 575 + ] + }, + "416": { + "cap": [ + 256, + 128, + 68, + 32, + 16, + 12, + 2, + 1 + ], + "receivers": [ + 428 + ] + }, + "42": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "receivers": [ + 408 + ] + }, + "424": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "receivers": [ + 580 + ] + }, + "428": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "receivers": [ + 582 + ] + }, + "430": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "receivers": [ + 428, + 583 + ] + }, + "434": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 585 + ] + }, + "436": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 587 + ] + }, + "438": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 586 + ] + }, + "439": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 584 + ] + }, + "44": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "receivers": [ + 424, + 581 + ] + }, + "440": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 588 + ] + }, + "444": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 590 + ] + }, + "446": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 591 + ] + }, + "448": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 484 + ] + }, + "449": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 485 + ] + }, + "45": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 230 + ] + }, + "450": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 508 + ] + }, + "451": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "receivers": [ + 509 + ] + }, + "452": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 532 + ] + }, + "453": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 533 + ] + }, + "454": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 556 + ] + }, + "455": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 557 + ] + }, + "46": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 589 + ] + }, + "498": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 311 + ] + }, + "499": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "receivers": [ + 498 + ] + }, + "5": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "receivers": [ + 395, + 557 + ] + }, + "511": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "receivers": [ + 327 + ] + }, + "54": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "receivers": [ + 226, + 230, + 299, + 485 + ] + }, + "585": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 555 + ] + }, + "587": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 531 + ] + }, + "589": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "receivers": [ + 543 + ] + }, + "59": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "receivers": [ + 363 + ] + }, + "591": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 567 + ] + }, + "61": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 251 + ] + }, + "62": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249 + ] + }, + "63": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 267 + ] + }, + "69": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "receivers": [ + 566 + ] + }, + "7": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 453 + ] + }, + "70": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "71": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 230, + 249, + 267 + ] + }, + "72": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "73": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "receivers": [ + 363, + 533 + ] + }, + "92": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "receivers": [ + 230 + ] + }, + "94": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 265 + ] + }, + "96": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "receivers": [ + 395 + ] + } + }, + "certified_cost": 10868103087, + "certified_profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "current_restore": { + "auditor": { + "dual": "PASS", + "forward": "PASS", + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + "dirty": [], + "gates": 212, + "leaks": {}, + "targets_changed": [] + }, + "extras_blocked": 292959, + "extras_open": 44964, + "forced_caps": 88, + "frame_graph": { + "components": 210, + "largest_component": 94, + "variables": 743 + }, + "gap": 0, + "groups": [ + { + "members": [ + 0, + 2, + 61, + 62, + 63, + 70, + 71, + 72, + 76, + 94, + 233, + 235 + ], + "parts": [ + { + "kind": "lift", + "receiver": 230, + "region": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "source": 265 + }, + { + "kind": "lift", + "receiver": 230, + "region": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "source": 249 + } + ] + }, + { + "members": [ + 23, + 39 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 23 + } + ] + }, + { + "members": [ + 35, + 77 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 35 + } + ] + }, + { + "members": [ + 46, + 521 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 46 + } + ] + }, + { + "members": [ + 69 + ], + "parts": [ + { + "kind": "forced-visit", + "register": 69 + } + ] + }, + { + "members": [ + 367, + 496 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 367 + } + ] + }, + { + "members": [ + 399, + 472 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 399 + } + ] + }, + { + "members": [ + 444 + ], + "parts": [ + { + "kind": "forced-visit", + "register": 444 + } + ] + }, + { + "members": [ + 446, + 545 + ], + "parts": [ + { + "kind": "zero-sum", + "register": 446 + } + ] + } + ], + "literal_visit_units": 337923, + "literal_visits": 51, + "normal45": { + "V45": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "entry_lower_bounds": { + "2": [ + 256, + 128, + 64, + 35, + 16, + 14 + ], + "249": [ + 256, + 139, + 64, + 40, + 16, + 5 + ], + "251": [ + 267, + 128, + 64, + 40, + 16, + 5 + ], + "265": [ + 256, + 128, + 64, + 40, + 27, + 5 + ], + "267": [ + 261, + 133, + 69, + 38, + 21, + 11 + ], + "70": [ + 272, + 128, + 80, + 35, + 11, + 5 + ], + "71": [ + 256, + 144, + 80, + 35, + 11, + 5 + ], + "72": [ + 320, + 192, + 35, + 16, + 11, + 5 + ] + }, + "visitors": [ + { + "beta": 6877, + "entry_lower": [ + 256, + 128, + 64, + 35, + 16, + 14 + ], + "receivers": [ + 230, + 251, + 265 + ], + "register": 2 + }, + { + "beta": 6877, + "entry_lower": [ + 272, + 128, + 80, + 35, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 70 + }, + { + "beta": 6877, + "entry_lower": [ + 256, + 144, + 80, + 35, + 11, + 5 + ], + "receivers": [ + 230, + 249, + 267 + ], + "register": 71 + }, + { + "beta": 6877, + "entry_lower": [ + 320, + 192, + 35, + 16, + 11, + 5 + ], + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 72 + } + ] + }, + "open_detail": { + "103": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "108": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "16": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "free": true + } + ] + }, + "18": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "22": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "free": true + } + ] + }, + "23": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 261, + 133, + 68, + 34, + 17, + 15 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 39 + ], + "frame": [ + 256, + 128, + 65, + 34, + 17, + 10, + 5 + ], + "needy_receivers": [ + 511 + ] + } + ] + }, + "35": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 260, + 132, + 74, + 44, + 30, + 1 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 77 + ], + "frame": [ + 256, + 128, + 74, + 40, + 26, + 4, + 1 + ], + "needy_receivers": [ + 499 + ] + } + ] + }, + "367": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 289, + 128, + 65, + 18, + 10, + 6 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 496 + ], + "frame": [ + 257, + 128, + 65, + 32, + 18, + 10, + 6 + ], + "needy_receivers": [ + 543 + ] + } + ] + }, + "399": { + "kind": "zero-sum", + "rejected_skip_frames": [ + { + "frame": [ + 256, + 131, + 68, + 34, + 17, + 12 + ], + "why": "no reader at F" + } + ], + "skip_frames": [ + { + "carriers": [ + 472 + ], + "frame": [ + 256, + 131, + 64, + 34, + 17, + 8, + 4 + ], + "needy_receivers": [ + 567 + ] + } + ] + }, + "40": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "free": true + } + ] + }, + "400": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "free": true + } + ] + }, + "416": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 68, + 32, + 16, + 12, + 2, + 1 + ], + "free": true + } + ] + }, + "42": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "free": true + } + ] + }, + "444": { + "kind": "forced-visit", + "rejected_skip_frames": [ + { + "Z": 2, + "frame": [ + 273, + 128, + 64, + 48, + 8, + 4, + 3 + ], + "why": "departure from F: M[O][Z] full column rank" + } + ] + }, + "446": { + "kind": "zero-sum", + "rejected_skip_frames": [], + "skip_frames": [ + { + "carriers": [ + 545 + ], + "frame": [ + 256, + 145, + 64, + 48, + 8, + 4, + 3 + ], + "needy_receivers": [ + 591 + ] + } + ] + }, + "45": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "46": { + "kind": "zero-sum", + "rejected_skip_frames": [], + "skip_frames": [ + { + "carriers": [ + 521 + ], + "frame": [ + 288, + 128, + 96, + 18, + 10, + 6, + 1 + ], + "needy_receivers": [ + 589 + ] + } + ] + }, + "59": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "free": true + } + ] + }, + "61": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "62": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "63": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "69": { + "kind": "forced-visit", + "rejected_skip_frames": [ + { + "frame": [ + 259, + 128, + 68, + 34, + 17, + 12 + ], + "why": "no reader at F" + }, + { + "Z": 2, + "frame": [ + 259, + 128, + 64, + 34, + 17, + 8, + 4 + ], + "why": "departure from F: M[O][Z] full column rank" + } + ] + }, + "92": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "free": true + } + ] + }, + "94": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "free": true + } + ] + }, + "96": { + "kind": "free-skip", + "skip_frames": [ + { + "frame": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "free": true + } + ] + } + }, + "payer_groups": 9, + "restore_entry": { + "forced_coordinates_match_restore": true, + "live_registers": 632, + "rank": 632, + "restored_helpers": 91 + }, + "theorem": "For every exact restore-only rewrite of WORD-3042-extra (A, B, warps, cut, corrections, compensation, start frames, helper ends and buffers fixed; any restore gate sequence; all frames re-solved; exact = PR2833 auditor), certified cost >= LB_forced + forced extras = 10868103087 = certified cost of WORD-3042-extra.", + "visit_blocks": [ + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charges": { + "beta": 24, + "forced-visit": 2, + "zero-sum": 4 + }, + "registers": [ + 3, + 44, + 46, + 69, + 105, + 306, + 308, + 310, + 322, + 324, + 326, + 351, + 367, + 383, + 399, + 408, + 412, + 414, + 424, + 428, + 430, + 434, + 436, + 438, + 439, + 440, + 444, + 446, + 475, + 486 + ], + "units": 192384 + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charges": { + "beta": 14 + }, + "registers": [ + 5, + 7, + 34, + 54, + 73, + 226, + 228, + 230, + 231, + 232, + 236, + 238, + 363, + 395 + ], + "units": 103043 + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charges": { + "beta": 4 + }, + "registers": [ + 2, + 70, + 71, + 72 + ], + "units": 27508 + }, + { + "block": "PR2908/PR2917 paired-extraction outputs", + "charges": { + "zero-sum": 2 + }, + "registers": [ + 23, + 35 + ], + "units": 9992 + }, + { + "block": "n42: PR2979 extraction + PR3042 R1_E42", + "charges": { + "lift": 1 + }, + "registers": [ + 61 + ], + "units": 4996 + } + ], + "visits": [ + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R142", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 230, + 251, + 265 + ], + "register": 2, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R68", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 554 + ], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 554 + ], + "register": 3, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R75", + 7, + 2 + ], + [ + "R211", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 395, + 557 + ], + "register": 5, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R30", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 453 + ], + "register": 7, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2908/PR2917 paired-extraction outputs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R112", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 510, + 511 + ], + "overhead": 4996, + "payer_group": [ + 23, + 39 + ], + "receivers": [ + 511 + ], + "register": 23, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R52", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 228, + 230, + 331, + 509 + ], + "register": 34, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2908/PR2917 paired-extraction outputs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R118", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 499 + ], + "overhead": 4996, + "payer_group": [ + 35, + 77 + ], + "receivers": [ + 499 + ], + "register": 35, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R7", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 424, + 581 + ], + "register": 44, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R89", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": [ + 46, + 521 + ], + "receivers": [ + 589 + ], + "register": 46, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R39", + 7, + 2 + ], + [ + "R187", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 226, + 230, + 299, + 485 + ], + "register": 54, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "n42: PR2979 extraction + PR3042 R1_E42", + "charge": "lift", + "entry_dim": 7, + "jumps": [ + [ + "R189", + 8, + 1 + ], + [ + "R190", + 9, + 1 + ] + ], + "leaks": [ + 251 + ], + "overhead": 4996, + "payer_group": [ + 0, + 2, + 61, + 62, + 63, + 70, + 71, + 72, + 76, + 94, + 233, + 235 + ], + "receivers": [ + 251 + ], + "register": 61, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "forced-visit", + "entry_dim": 7, + "jumps": [ + [ + "R77", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 566 + ], + "overhead": 4996, + "payer_group": [ + 69 + ], + "receivers": [ + 566 + ], + "register": 69, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R121", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 70, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R122", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 230, + 249, + 267 + ], + "register": 71, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "n45: PR2942 paired extraction, pivots 249/251/265/267 at V45", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R123", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 249, + 251, + 265, + 267 + ], + "register": 72, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R63", + 7, + 2 + ], + [ + "R203", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 363, + 533 + ], + "register": 73, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R1", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 408, + 573 + ], + "register": 105, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R22", + 7, + 1 + ], + [ + "R166", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 449 + ], + "register": 226, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R26", + 7, + 1 + ], + [ + "R179", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 230, + 451 + ], + "register": 228, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R24", + 7, + 1 + ], + [ + "R182", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 450 + ], + "register": 230, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R20", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 448 + ], + "register": 231, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R28", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 452 + ], + "register": 232, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R32", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 454 + ], + "register": 236, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R34", + 7, + 1 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 455 + ], + "register": 238, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R40", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 498 + ], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 498, + 499 + ], + "register": 306, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R48", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 304, + 501 + ], + "register": 308, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R47", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 304, + 500 + ], + "register": 310, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R15", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 327, + 511 + ], + "register": 322, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R56", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 320, + 513 + ], + "register": 324, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R55", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 320, + 512 + ], + "register": 326, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R57", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 531, + 587 + ], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 531 + ], + "register": 351, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R60", + 7, + 2 + ], + [ + "R198", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 532 + ], + "register": 363, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R64", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 543, + 589 + ], + "overhead": 4996, + "payer_group": [ + 367, + 496 + ], + "receivers": [ + 543 + ], + "register": 367, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R70", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 555, + 585 + ], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 555 + ], + "register": 383, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "stage-1 group gates (W_A..W_D)", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R74", + 7, + 2 + ], + [ + "R205", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 556 + ], + "register": 395, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R79", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 567, + 591 + ], + "overhead": 4996, + "payer_group": [ + 399, + 472 + ], + "receivers": [ + 567 + ], + "register": 399, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R0", + 7, + 2 + ], + [ + "R94", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 572 + ], + "register": 408, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R3", + 7, + 2 + ], + [ + "R101", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 574 + ], + "register": 412, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R4", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 412, + 575 + ], + "register": 414, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R6", + 7, + 2 + ], + [ + "R96", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 580 + ], + "register": 424, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R9", + 7, + 2 + ], + [ + "R98", + 8, + 1 + ] + ], + "leaks": [], + "overhead": 6877, + "payer_group": null, + "receivers": [ + 582 + ], + "register": 428, + "restored": true, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 5, + "jumps": [ + [ + "R10", + 7, + 2 + ], + [ + "end", + 9, + 2 + ] + ], + "leaks": [], + "overhead": 9979, + "payer_group": null, + "receivers": [ + 428, + 583 + ], + "register": 430, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R83", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 585 + ], + "register": 434, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R86", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 587 + ], + "register": 436, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R85", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 586 + ], + "register": 438, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R82", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 584 + ], + "register": 439, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 7, + "jumps": [ + [ + "R88", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": null, + "receivers": [ + 588 + ], + "register": 440, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "forced-visit", + "entry_dim": 7, + "jumps": [ + [ + "R91", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": [ + 444 + ], + "receivers": [ + 590 + ], + "register": 444, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "zero-sum", + "entry_dim": 7, + "jumps": [ + [ + "R92", + 8, + 1 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [], + "overhead": 4996, + "payer_group": [ + 446, + 545 + ], + "receivers": [ + 591 + ], + "register": 446, + "restored": false, + "verdict": "OPEN-forced" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R44", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 498 + ], + "overhead": 6877, + "payer_group": null, + "receivers": [], + "register": 475, + "restored": false, + "verdict": "BLOCKED" + }, + { + "block": "PR2857/PR2894 kernel-preload restore pairs", + "charge": "beta", + "entry_dim": 6, + "jumps": [ + [ + "R54", + 8, + 2 + ], + [ + "end", + 9, + 1 + ] + ], + "leaks": [ + 510 + ], + "overhead": 6877, + "payer_group": null, + "receivers": [], + "register": 486, + "restored": false, + "verdict": "BLOCKED" + } + ], + "weights": { + "c1": 2116671, + "c2": 4228346, + "c3": 6338140, + "c4": 8446713, + "c5": 10554378, + "visit_unit": 4996 + }, + "word": "3042-extra", + "word_sha256": "1396410de482883416fc7f534062ab005b484056b035fdcfa3b5cc065536ba35" +} diff --git a/research/rank7-skip-restore-optimum/certificates/CALIBRATION-2979.json b/research/rank7-skip-restore-optimum/certificates/CALIBRATION-2979.json new file mode 100644 index 0000000000..b954d2b651 --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/CALIBRATION-2979.json @@ -0,0 +1,120 @@ +{ + "base": { + "LB_forced": 10867765164, + "blocked_excess": { + "5": 4996, + "54": 4996, + "73": 4996 + }, + "bound": 10868103087, + "certified_cost": 10868133063, + "certified_profile": { + "1": 2445, + "2": 706, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "gap": 29976, + "group_excess": [ + { + "excess": 4996, + "forced": 4996, + "kinds": [ + "lift" + ], + "members_visiting": { + "61": 4996, + "63": 4996 + } + } + ], + "literal_visit_units": 367899, + "literal_visits": 54, + "pr3042_skips": [ + 5, + 22, + 40, + 54, + 63, + 73 + ], + "realized_by_pr3042": 29976, + "registers_involved": [ + 5, + 22, + 40, + 54, + 61, + 63, + 73 + ], + "uncharged_visits": { + "22": 4996, + "40": 4996 + }, + "unforced_total": 29976, + "word": "2979-base", + "word_sha256": "abaf67bfcb257528658c906b612f57025617592bd7889828f92b97a5f4f4300d" + }, + "extra": { + "LB_forced": 10867765164, + "blocked_excess": { + "5": 4996, + "54": 4996, + "73": 4996 + }, + "bound": 10868103087, + "certified_cost": 10868133063, + "certified_profile": { + "1": 2445, + "2": 706, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "gap": 29976, + "group_excess": [ + { + "excess": 4996, + "forced": 4996, + "kinds": [ + "lift" + ], + "members_visiting": { + "61": 4996, + "63": 4996 + } + } + ], + "literal_visit_units": 367899, + "literal_visits": 54, + "pr3042_skips": [ + 5, + 22, + 40, + 54, + 63, + 73 + ], + "realized_by_pr3042": 29976, + "registers_involved": [ + 5, + 22, + 40, + 54, + 61, + 63, + 73 + ], + "uncharged_visits": { + "22": 4996, + "40": 4996 + }, + "unforced_total": 29976, + "word": "2979-extra", + "word_sha256": "e0eaf64c4d5d324693d43889bce1b9e53e8da00402105c8c978fd102f208bed7" + } +} diff --git a/research/rank7-skip-restore-optimum/certificates/CENSUS.json b/research/rank7-skip-restore-optimum/certificates/CENSUS.json new file mode 100644 index 0000000000..830acc1068 --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/CENSUS.json @@ -0,0 +1,300 @@ +{ + "base": { + "deletion": { + "deletions": 212, + "exact": 10, + "exact_deletions": [ + { + "deleted": 165, + "delta": 0, + "gate": [ + "add", + 40, + 226, + -1, + 1 + ] + }, + { + "deleted": 176, + "delta": 0, + "gate": [ + "add", + 230, + 22, + 1, + 1 + ] + }, + { + "deleted": 184, + "delta": 0, + "gate": [ + "add", + 40, + 18, + -1, + 1 + ] + }, + { + "deleted": 185, + "delta": 0, + "gate": [ + "add", + 18, + 40, + 1, + 1 + ] + }, + { + "deleted": 186, + "delta": 0, + "gate": [ + "add", + 40, + 18, + -1, + 1 + ] + }, + { + "deleted": 187, + "delta": 0, + "gate": [ + "add", + 40, + 54, + 2, + 1 + ] + }, + { + "deleted": 190, + "delta": 0, + "gate": [ + "add", + 61, + 63, + -1, + 1 + ] + }, + { + "deleted": 203, + "delta": 0, + "gate": [ + "add", + 59, + 73, + 1, + 1 + ] + }, + { + "deleted": 210, + "delta": 0, + "gate": [ + "scale", + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ] + }, + { + "deleted": 211, + "delta": 0, + "gate": [ + "add", + 5, + 96, + -1, + 1 + ] + } + ], + "min_delta": 0 + }, + "tail_exchange": { + "candidates": 8098, + "delta_histogram": { + "0": 316, + "11873": 20, + "13094": 20, + "14002": 36, + "3102": 10, + "4996": 280, + "6877": 268, + "8098": 40 + }, + "exact": 6378, + "frame_feasible": 990, + "infeasible": 5388, + "min_delta": 0, + "negative": 0, + "not_exact": 1720, + "sample_every": 25, + "sample_rechecked": 324 + } + }, + "extra": { + "deletion": { + "deletions": 212, + "exact": 10, + "exact_deletions": [ + { + "deleted": 165, + "delta": 0, + "gate": [ + "add", + 40, + 226, + -1, + 1 + ] + }, + { + "deleted": 176, + "delta": 0, + "gate": [ + "add", + 230, + 22, + 1, + 1 + ] + }, + { + "deleted": 184, + "delta": 0, + "gate": [ + "add", + 40, + 18, + -1, + 1 + ] + }, + { + "deleted": 185, + "delta": 0, + "gate": [ + "add", + 18, + 40, + 1, + 1 + ] + }, + { + "deleted": 186, + "delta": 0, + "gate": [ + "add", + 40, + 18, + -1, + 1 + ] + }, + { + "deleted": 187, + "delta": 0, + "gate": [ + "add", + 40, + 54, + 2, + 1 + ] + }, + { + "deleted": 190, + "delta": 0, + "gate": [ + "add", + 61, + 63, + -1, + 1 + ] + }, + { + "deleted": 203, + "delta": 0, + "gate": [ + "add", + 59, + 73, + 1, + 1 + ] + }, + { + "deleted": 210, + "delta": 0, + "gate": [ + "scale", + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ] + }, + { + "deleted": 211, + "delta": 0, + "gate": [ + "add", + 5, + 96, + -1, + 1 + ] + } + ], + "min_delta": 0 + }, + "tail_exchange": { + "candidates": 8098, + "delta_histogram": { + "0": 316, + "11873": 20, + "13094": 20, + "14002": 36, + "3102": 10, + "4996": 280, + "6877": 268, + "8098": 40 + }, + "exact": 6378, + "frame_feasible": 990, + "infeasible": 5388, + "min_delta": 0, + "negative": 0, + "not_exact": 1720, + "sample_every": 25, + "sample_rechecked": 324 + } + } +} diff --git a/research/rank7-skip-restore-optimum/certificates/CONTROLS.json b/research/rank7-skip-restore-optimum/certificates/CONTROLS.json new file mode 100644 index 0000000000..1b52929306 --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/CONTROLS.json @@ -0,0 +1,378 @@ +{ + "ablation": { + "admitted": [ + { + "beta": 9979, + "frame": [ + 259, + 131, + 67, + 37, + 22, + 8 + ], + "overhead": 8098, + "register": 5 + }, + { + "beta": 9979, + "frame": [ + 266, + 138, + 74, + 44, + 30, + 1 + ], + "overhead": 8098, + "register": 34 + }, + { + "beta": 9979, + "frame": [ + 384, + 65, + 37, + 20, + 8, + 2 + ], + "overhead": 8098, + "register": 44 + }, + { + "beta": 9979, + "frame": [ + 267, + 139, + 75, + 41, + 26, + 4 + ], + "overhead": 8098, + "register": 54 + }, + { + "beta": 9979, + "frame": [ + 262, + 134, + 70, + 32, + 19, + 13 + ], + "overhead": 8098, + "register": 73 + }, + { + "beta": 9979, + "frame": [ + 257, + 129, + 67, + 37, + 22, + 8 + ], + "overhead": 8098, + "register": 105 + }, + { + "beta": 9979, + "frame": [ + 259, + 131, + 65, + 39, + 20, + 10 + ], + "overhead": 8098, + "register": 414 + }, + { + "beta": 9979, + "frame": [ + 257, + 129, + 73, + 45, + 28, + 2 + ], + "overhead": 8098, + "register": 430 + } + ], + "bound": 10868088039, + "drop": 15048, + "registers": [ + 5, + 34, + 44, + 54, + 73, + 105, + 414, + 430 + ] + }, + "attainment": [ + { + "auditor": { + "dual": "PASS", + "forward": "PASS", + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + "control": "PR3056 three-ADD contraction of restore[175:179]", + "delta": 0, + "dirty": 0, + "exact": true, + "feasible": true, + "gates": 211, + "leaks": 0, + "profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + } + }, + { + "auditor": { + "dual": "PASS", + "forward": "PASS", + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + "control": "PR3060 four-gate tariff word of restore[175:179]", + "delta": 0, + "dirty": 0, + "exact": true, + "feasible": true, + "gates": 212, + "leaks": 0, + "profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + } + } + ], + "auditor_semantics": [ + { + "appended": [ + "add", + 0, + 1, + 1, + 1 + ], + "auditor": { + "dual": "PASS", + "forward": "PASS", + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + "delta": 0, + "dirty": 0, + "exact": true, + "feasible": true, + "leaks": 0, + "profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + } + }, + { + "appended": [ + "add", + 62, + 70, + 1, + 1 + ], + "auditor": { + "dual": "PASS", + "forward": "PASS", + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + "delta": 0, + "dirty": 0, + "exact": true, + "feasible": true, + "leaks": 0, + "profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + } + }, + { + "appended": [ + "add", + 249, + 251, + 1, + 1 + ], + "auditor": { + "reason": "restored cold row is not its own input 249", + "status": "FAIL" + }, + "delta": 0, + "dirty": 1, + "exact": false, + "feasible": true, + "leaks": 1, + "profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + } + } + ], + "empty_restore_word_bound": { + "bound": 10868103087, + "forced_caps": 88 + }, + "fake_cheaper_restores": [ + { + "auditor": { + "reason": "restored cold row is not its own input 512", + "status": "FAIL" + }, + "control": "empty restore", + "delta": -499481, + "dirty": 65, + "exact": false, + "feasible": true, + "leaks": 39, + "profile": { + "1": 2367, + "2": 663, + "3": 256, + "4": 131, + "5": 18, + "8": 8 + } + }, + { + "auditor": { + "reason": "restored cold input still read by 498", + "status": "FAIL" + }, + "control": "deleted R44 475 += -1/2*498 (keeps a restored input in 475)", + "delta": -6877, + "dirty": 0, + "exact": false, + "feasible": true, + "leaks": 1, + "profile": { + "1": 2432, + "2": 711, + "3": 233, + "4": 108, + "5": 18, + "8": 8 + } + }, + { + "auditor": { + "reason": "restored cold row is not its own input 584", + "status": "FAIL" + }, + "control": "deleted R82 584 += -1*439 (restored 584 not its own input)", + "delta": -4996, + "dirty": 1, + "exact": false, + "feasible": true, + "leaks": 0, + "profile": { + "1": 2431, + "2": 713, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + } + } + ], + "rejection": [ + { + "control": "mislabeled provider (extra export under the base pin)", + "reason": "pinned export mismatch", + "rejected": true + }, + { + "control": "one flipped byte in the base export", + "reason": "pinned export mismatch", + "rejected": true + }, + { + "control": "certificate with the cap of register 2 dropped (LB 10867757066)", + "reason": "tight sum fails without the cap", + "rejected": true + }, + { + "control": "certificate with the forced visit of register 44 dropped", + "reason": "tight sum fails", + "rejected": true + }, + { + "control": "perturbed restore-entry row of register 70", + "reason": "restore does not realize the perturbed coordinates", + "rejected": true + }, + { + "control": "fake cheaper restore: empty restore (delta -499481)", + "reason": "Lemma 1 end conditions fail (65 dirty restored, 39 leaks); auditor: restored cold row is not its own input 512", + "rejected": true + }, + { + "control": "fake cheaper restore: deleted R44 475 += -1/2*498 (keeps a restored input in 475) (delta -6877)", + "reason": "Lemma 1 end conditions fail (0 dirty restored, 1 leaks); auditor: restored cold input still read by 498", + "rejected": true + }, + { + "control": "fake cheaper restore: deleted R82 584 += -1*439 (restored 584 not its own input) (delta -4996)", + "reason": "Lemma 1 end conditions fail (1 dirty restored, 0 leaks); auditor: restored cold row is not its own input 584", + "rejected": true + }, + { + "control": "claimed cost 10,868,103,086", + "reason": "recomputed certified cost differs", + "rejected": true + }, + { + "control": "optimality claimed for PR2979 base", + "reason": "PR2979 gap 29,976", + "rejected": true + }, + { + "control": "departure lemma with rows restricted to receivers containing the frame (bound 10868088039)", + "reason": "the restricted lemma no longer certifies optimality", + "rejected": true + }, + { + "control": "caps from the restore map of the emptied word (0 caps)", + "reason": "no caps", + "rejected": true + } + ] +} diff --git a/research/rank7-skip-restore-optimum/certificates/ERRATUM-3042.json b/research/rank7-skip-restore-optimum/certificates/ERRATUM-3042.json new file mode 100644 index 0000000000..41476ff12a --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/ERRATUM-3042.json @@ -0,0 +1,77 @@ +{ + "certified": { + "R1_E42": { + "delta_units": -19984, + "literal_skip_units": 19984, + "profile_delta": { + "1": -8, + "2": 4 + }, + "skipped_registers": [ + 22, + 40, + 54, + 63 + ] + }, + "R1_E42+R2_E7": { + "delta_units": -29976, + "literal_skip_units": 29976, + "profile_delta": { + "1": -12, + "2": 6 + }, + "skipped_registers": [ + 5, + 22, + 40, + 54, + 63, + 73 + ] + }, + "R2_E7": { + "delta_units": -9992, + "literal_skip_units": 9992, + "profile_delta": { + "1": -4, + "2": 2 + }, + "skipped_registers": [ + 5, + 73 + ] + } + }, + "corrections": { + "R1_E42": "-19,984 units/call (four skips: 63, 54, 40, 22; -8 H1 + 4 H2), not -14,888 for 63, 54, 40", + "R2_E7": "-9,992 units/call (two skips: 73, 5; -4 H1 + 2 H2), not -14,938 for 22, 73, 5", + "total": "-29,976 units/call (-12 H1 + 6 H2 = 6 x 4,996), not -29,826; final words, profile and kappa unaffected" + }, + "declared_block_gates": { + "R1_E42": "26 -> 33", + "R2_E7": "13 -> 15" + }, + "pr3042_readme": { + "R1_E42": { + "gates": "26 -> 29", + "registers": [ + 63, + 54, + 40 + ], + "units": -14888 + }, + "R2_E7": { + "gates": "13 -> 14", + "registers": [ + 22, + 73, + 5 + ], + "units": -14938 + }, + "total": -29826 + }, + "providers_identical": true +} diff --git a/research/rank7-skip-restore-optimum/certificates/RESULT.json b/research/rank7-skip-restore-optimum/certificates/RESULT.json new file mode 100644 index 0000000000..0f6f6c8f40 --- /dev/null +++ b/research/rank7-skip-restore-optimum/certificates/RESULT.json @@ -0,0 +1,21 @@ +{ + "LB_forced": 10867765164, + "blocked": 42, + "calibration_gap_2979": 29976, + "certificates": { + "BOUND-3042-base.json": "10922a932f51dac4021ea8d6a09b47b3bf0b8e278b77824a79bcf842d4929ebf", + "BOUND-3042-extra.json": "e75d625fede24fbc712f37f9f11269a418ef643703efc2e253a6005fd226a4db", + "CALIBRATION-2979.json": "68be5cf24d945ad0c16c7a55ccc655b0ea3c3ffc92c1d6a312200260247f4619", + "CONTROLS.json": "b6e91b1c67e425f3255874579b038e3c8ebb7ac926dae7f0e87e63d3db8748b2", + "ERRATUM-3042.json": "e2ac9e3af74a77574d2ec8afb4a5c2c0197c048f59bad1d2b8b4b65c613e0dd6" + }, + "certified_cost": 10868103087, + "forced_caps": 88, + "forced_extras": 337923, + "no_new_kappa": true, + "payer_groups": 9, + "pinned_inputs": 9, + "providers": 2, + "rejection_controls": 12, + "status": "PASS_RANK7_SKIP_RESTORE_OPTIMUM" +} diff --git a/research/rank7-skip-restore-optimum/data/EDITS-3042.json b/research/rank7-skip-restore-optimum/data/EDITS-3042.json new file mode 100644 index 0000000000..c2042a37bd --- /dev/null +++ b/research/rank7-skip-restore-optimum/data/EDITS-3042.json @@ -0,0 +1,2984 @@ +{ + "declared": { + "local_profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "width_inventory": { + "4": 26, + "5": 2, + "6": 16, + "7": 52, + "8": 99, + "9": 213 + } + }, + "edits": { + "base": [ + { + "id": "R1_E42", + "new": [ + [ + "add", + 40, + 54, + -2, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 40, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 226, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 40, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 18, + 226, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 18, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 226, + 18, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 34, + -2, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 228, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 230, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 230, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 228, + 108, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 228, + 1, + 4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 108, + 228, + -4, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 18, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 45, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 40, + 18, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 18, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 40, + 18, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 40, + 54, + 2, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 61, + 63, + 1, + 1, + [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + ], + [ + "add", + 230, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 61, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 230, + 92, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 103, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 108, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 230, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ] + ], + "old": [ + [ + "add", + 18, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 54, + -2, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 18, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 226, + 18, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 34, + -2, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 108, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 22, + 1, + 4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 228, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 108, + 228, + -4, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 45, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 54, + -2, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 92, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 103, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 108, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 22, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ] + ], + "section": "restore", + "start": 162, + "stop": 188 + }, + { + "id": "R2_E7", + "new": [ + [ + "add", + 363, + 73, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 59, + 1, + -4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 363, + 59, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 73, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 395, + 5, + 1, + 1, + [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + ], + [ + "add", + 96, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 96, + 1, + 4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 96, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 395, + 96, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 96, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ] + ], + "old": [ + [ + "add", + 59, + 73, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 59, + 1, + -4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 363, + 59, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 395, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 5, + 1, + -4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 395, + 5, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 96, + 395, + -4, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ] + ], + "section": "restore", + "start": 190, + "stop": 203 + } + ], + "extra": [ + { + "id": "R1_E42", + "new": [ + [ + "add", + 40, + 54, + -2, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 40, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 226, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 40, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ] + ], + [ + "add", + 18, + 226, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 18, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 226, + 18, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 34, + -2, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 228, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 230, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 230, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 228, + 108, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 228, + 1, + 4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 108, + 228, + -4, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 18, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 45, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 40, + 18, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 18, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 40, + 18, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 40, + 54, + 2, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 61, + 63, + 1, + 1, + [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + ], + [ + "add", + 230, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 61, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 230, + 92, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 103, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 108, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 230, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ] + ], + "old": [ + [ + "add", + 18, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 54, + -2, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 18, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 226, + 18, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 18, + 226, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 34, + -2, + 1, + [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ] + ], + [ + "add", + 22, + 108, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 22, + 1, + 4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 228, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 228, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 108, + 228, + -4, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 40, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 45, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 54, + -2, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 92, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 103, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 108, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "scale", + 22, + 1, + -4, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 230, + 22, + 1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 230, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ] + ], + "section": "restore", + "start": 162, + "stop": 188 + }, + { + "id": "R2_E7", + "new": [ + [ + "add", + 363, + 73, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 59, + 1, + -4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 363, + 59, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 73, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ], + [ + "add", + 395, + 5, + 1, + 1, + [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ] + ], + [ + "add", + 96, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 96, + 1, + 4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 96, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 395, + 96, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 96, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ] + ], + "old": [ + [ + "add", + 59, + 73, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 59, + 1, + -4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 363, + 59, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 59, + 363, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 96, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 395, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "scale", + 5, + 1, + -4, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 395, + 5, + 1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 5, + 395, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ], + [ + "add", + 96, + 395, + -4, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ] + ] + ], + "section": "restore", + "start": 190, + "stop": 203 + } + ] + } +} \ No newline at end of file diff --git a/research/rank7-skip-restore-optimum/data/WORD-2979-base.json.gz b/research/rank7-skip-restore-optimum/data/WORD-2979-base.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..d9aa96a93fea5f7395e7783aef0bc117c0a0ae89 GIT binary patch literal 71422 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]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

r4{x!a zT0FT9yMzqc&D6j1J4E9Y#k@_T>DTHBQT6WBg9}JDt+t!8dm@S%3XvW6$5y-|pA-H_pwd)3~(O#D#y>uHOSVW&|g{I|l;2 zjk_Me*pQ61F4DJo9btz_ivsS_L?>xUn)%othi^+PDwFm`=}b(xQLkoEU0hpoa}%jM z*X4ISY3&MDUttA*+njX8U!naWm1^)zGt6H>M-F-Cvn%{yhkJ5#Fj}(EqjVt%&HJ>a z_|a`iHPQAmc>w)dBk+UzyGITXGi`a)htIAar={u9~KJhNy@UDff_tkt9FC|E2Ea~ps4CkRl<{IhK zaccdnKY_gTLI?71N$k2m4mwiHu^g)393HS7bmy9imA`;|5?-Ym?GE@V{~jP1Ok=Vy zOZiP|M9^;Ss1|yrE>5(WJh&0AURZ*n5~Rbrr2COKtg^ZnISPb#&zF0WYl+mLq&=0m{z06``I%N;Z9Xl#G)2S9EK$D1 zcft`LG2CIt8vk3bq26~-7fQAJ1lS^KN5b7r<2;eWo#m-edv7iEqd1SFpFuv~9#&6l zDcAa;(MjmKp=+=KN1G*bMW@bx)M5P!X#2OCn zIKw*3NiksfU-9-XmH~6{sEol%@S#HCk}&O%k15A>rjcDB>B&B^#rEArm+#>V{XSXd z?sxK}efCfpvxlt@U&>5i;<{T^jDF72@v7x_)6?r2**T+)!v_h~W@`%US#)cnwpSg| zwrbjH#eXe#&>c3J9SiMdZO_*6+HQW^o&+NI6|4tx6NxjizjVhr!+&lJF;n%m{o9;7 z{L|g?v&mItF+RI`hkYt1tc`e4cWrVa#Vuct6v7VsmwNuX3TxMuE%9#mX368Gvb#Ns z?Bap^Flw8$ZsIa##ldue4MiwieKWq!%do)B%W_=gQD_#Q;#YTF`3rG5&?JTNlVC*`(dkhozT#eO z)>t~V-#D^;2>5k=%td`jCrF@fe7tYHpL{&(f821`@>`v!csxF{*j2w@EYv{ha)LwN zxZTaSB;R$A{8$@Y#qL!O@%U?B|DLq@4<#vN%*rOt`Rfr(=opsdXWOCk{QNpJkzUp? zgz0AqDpcyMY&;d%P0(Vd{P005R7#$EtJ8yiBeVd{68<(pTPTJE`Hu^}r}x%CO@7d; z9+1LZHZ<9>G$fQE78pW&r3yfn#UdNrAFAx@E&4;%PweZdv6rt5W4ib!06K3umVPna zaZ`MGByE=doM&tPyPCwCfczV45MILEJ1@i|X<&HgfL$u(cC1o(SF+|&!~AEjD4QW+LZbh{Pmy+b>gOWV#$(!i z7yvHd^+J#G{V$R3R-00~n%MhUsR;x8(fi}XH=*+~g$Fy#r3r&eVvlH5vl1L00MCt9 zeb>pY^dBgWus`5fFs<>CK`{!jnZBz%eP)HaS)l;DD;`l z52l^EyRYYHuMOow4rayv7Plr*vpsYz*YUTHmLy`}F$dXV+OglI$;s}-4a)?sa8@vX zVspHb=e+eGZ42<-X4(x*$ySWGdel1RQWL|wKKfDNs;0MKv1FBo9lMM z__e=}yypqpd>=>@VXjlr_8VfaG-d26cxCPb8h4-O>Sfr8&66+T^kFi8LgN? z>u;`t!%Tr|^uIxY-2q)sUCIICRmG%;^}pd?R$Ek!tjTSfs?XpCDdN}xoi$fNlPbX5 z?@%wG+n~koHcc-8iMUC(X1R*JQ~2I>or}M;uD!3}-!MPkc@9XQ6<<40W4u$i$n@&5 zSCvs_OVu&QjMd$YE^IiSGB}=_T(CWLLhJr+6iIR{LqWySNDmOT(r^vqS2 z5Bwg_vRa~OLzZEpVLN3oRg0Fm!xSD;8yUPGPB_5 zgrI;;qG!B{mRR(k62#A5yQcTGhJO;j)J{aO7nYNTXuM1?BjbZVY7iAsW^ot)eC|uS z4$z3Za-oT_eaFb3!=nDF<#OX%)JYKQUaUlz_56yLaYVI5juu*wa0ZIq7nN}e%op)-beG))+Mk7 zBXDevbCGeUH!tV@0o+wtd&dtdytP>c@Tpjkn4^eq{YeBJgJQq;2g^)3M@+wrzRnZx zwrWAwT9=r|3c22LgoBOnT`6t_*Og1*wAS-AxY*j`aazbmW5m#}{g74Gdn3%*5Q%*| zNA;oK?&9tEye7ySCiO2j_L;Ch|H%89A~su=_JtH8iemf34VDSTfP2`@Y-%sxk>*tK zTe?@%b|6LpO5C?^CQi({$KO#BEoY!?p2mOg0f;@nrp#K#-=0DudEB}R=5l8@myhF9 zIti_PCuXxC;7v2uxK%Z&(F_p!8|->qeC7fHmXBlOtO2o4=nj+AdsmGX$A}Oj8`$$o z`Bh`ddTC4Nv%~|QoshKvZ{uubX3;s-ZrHxPDCtA&^Z&w6I#E|P6{Y?0G28<-onxYe zZdiKrVr^c@)kz^HEziiuO~2i$?9*Uej{sJr;}W?wZ@<6}K4co3+|Cu_s^o9Ln;uJt zJi*SckFrrbSHN-to&#dp*qMiQ`CFb{aA4Jgv~m`($Qcv9%S$xcmd|#~6~#krQ%v^;X`>GP*B0{jCI+3FChpHI zE0qY4XF6&;TwI#806AwxLUT~{7R-q<*w-elp+F=VulMIKUF&TWCdpgXSCKB%0HI^) zqY?U!eYCfv=XnojaNolyIo~rKR+)6Y^FA7H5EIi$T2(ohBQ!FzS8>wOEGZVyf)q5* zykq(1MlRyb0&*j-Sa!Gl>I{>9N;1Or9BLWRj@j4QIZ&hDaFHi|Ym4pr=gt-zwUUpg zFg_Uejf`7_I5mbq3!o!d7=I(=ltQ>4;F^nBAm!nImRQ@P3$FrPr>Bo}*Chv5pz3bb zRYNfeGr@c49_(7CyhkvRtOr$BjH1wks@W02M;DFEk<0pN&=yGK@xZy{7Qt1*X1Y1V zYQLp*sI}^x!$|tqQadk*i%PF<_ytY(?kgx~OO3B zcCq4ExgdWNNu@~2W{AbT(2EVtU2$q}slc9^B;BgXc*dE=1$@XsM;@;)lJH;g4+(6> z8)fUIVzDCak%b4ZU{-AD6>qDuNiINzn#~m@_9M)S+I}86-x!nEI z6Z*BgXe0-8#4hsBg^uq_R6K@~!HP8Y$Xr7fmi2Al+n)zB1Y%+jC-zFMJ4O@x|)cfcb`-%D-GF$ZIcH1vq%)KMO~l{DGlig>#L5{ouja4$|h!a!2;0X zf}hI(@Hp=NXwv>0GQcb8C;9^AZQ2Q91v$vJurawr%3dy6 ziwWANl9%ftRuT};%rT7kv#b^uU2dNGGW*)V>#x{)N-fP!>=z}@?EXH*$1mRyh)O3M zq1@dQhjvPM)ol1Lp~=;>2(C;hh+r>-DOOAFhS+^Y#A7E16P>l#|IlWhPgVc;wGcR5XU@1N#3XI{bilirY-;)x?)OM*u2 zt$iV8ip)cJiv$R&Gp1#jU{2oHDPCi0)KNUn;iu`iMV>;v8FM4CW$iBts8b?A_TwyS z!y3thS|HnsUwCPkTf zRjHB2UgTTiislP00o{oL&Em1OqfQMdm5#YtS4zAKV{<2Mw44}^#4Cdh%@qB5)_d9^ zT|D45L*<5n@{G#;!FKcZglcF#P%U%PPEJaSuX&&*C&%=tqHgYmL`_v$ec}>&CVPeU zLbR8lD6>Uf@2g%3k{Eo1Tu~FxSkc18VG%2J5tK>W29vmpSx-O;cvGy}@b9!?9kt~e zvYtTWVo|w;>(S0lXVrsp1a4x%dSM^gd8D49^q*_Uj_Xj9t z@+xF+z5DkiDGg%}qiRd3XnH1ESm}{;CJgXVEDtTiFxrd?lGwa)aaPob>q!DmBpR#9 zCZNmGq~`cZq{+4@JrlZEm*|T=C_SUP*n64YxjpwJ_Ftw70OB(VEHkjAclYY)^|sve zOJ@BZL=g_%oz>uavh}J?F!qGXQT!}PyHdV&;T5;sMVLS6vLq2liPoWF#h>$6aBNUE zZkAwqFQ0s>qISybx^=7vS73EoK_nbH5|VLo`xmsCgcq`*0q^V*JP&*E!|253 z#49e24yp0VGLCGK<0gvJuYn793b)@O%UIbRBS=orxu9NsO-CGk`x(|FjxXH_RRs;9 zIJ<7$XXJAWml1-4xa@@P9+PVB^tV*_?2XE*`%!h?m!Rszj+fmX)2!ixIqJflmTwkuqe#8woteKK5b z!Mb~twck6agiS?!nKYLF_UTIgn|c1KaktQSK2=o}`c)^^SkY+-?ddEakIqDnqGqDh z$%vUk7%~Mt(wl*{T%2kACh(19Q4pC*s3vGrOflaypm-#^}{zNd(E_?Ho(-2BHqj%q^kV`H71zyR{ z2yrj7lP|Cdvqvb9E*?0IbCM}a4rLILD6NS+Rrs5ZeHx};c6mEKy>?*cR?PJ=(XK*h zH$#M)@zY5L1Mbj~B=Yu}2Q}2o(PmKw|IV`?U$^VRW!d#H^_?%nQIQE1Hf1@0B~*sy z=lvD|T`7r4N8TV$|4dX+AkP3rpUBLfUJ`yw!XIsp#irvg1-t>L8E~!E`T&2!_Z=9W zJMLxjiFvoqt#iGVi}VG8FIHD$yE67o?FX^%4L+WORb&0~zcwy;)oD3Gso}V-4fU0O z@)I~*<(W1nwTN%1r1>`Y6P^ZAj|JEg5@QUe!thc>{B_2F9=YO$5AxQqcG6;i=83rS z+N%r}3Q^qw=v3<&)#K37`wU8Twzg(eP=5AotT4v&x}vw zlwGJ1niXGIoE@0AuDxlxMIn2i_sN;5{Kmd0mj^EEOrY(3GMgLw#md66LoM+|?=pgs zWH0d<;)*PWsB%SQwd*P^%H(Fqm_BI=cg9mDO|kP(REz7IeuEsM!H%-@i^{S$uelK? zeCqk~nx>GrWJf)2J>o#ivcC09+-8tIM~&C&<#qS&inzfKwIe)E!tkz4FPC-$At@W z18OjOa_tDt=?&MgE!a=Pyf|7<1FHcz`ZAGeo#@VWtcQxLRZgQpM#o3U|9v?_b;G(i z(@fIcwQTj=?nEiY{nJuANmyrMz^|pReb2Eqi&ktwDXBpP18A8#s|9~EN=`;Sd1Hv{ zxt4_5F}j}SLl?3s*C?o;t>GEJoDZtpBEfwQ1Ifni=+!NXj`TSvQy%~M330tbv3B!r zp8nm*Ngube{VXiXZX|8vx^lDWJ)8Jg)5(eSo4P$^X0Ezu^0-hp*Sc9#7iC{%!z<0aFxe(%@;Jj)UWSHVBygi-M@#@Lg&J&CZ3~0% z#~Z}s%sIWtFbXd~iD2tkM$7c@cT;ZKntW6c^F9IR%bpdPjWdL_d>NPeTf^VGz3cmf z5}wtryNSR6m@Y?k0~z;!GSk=`K>HdTX^Y|t&(5{JXF}Iou@x&RhB5t^m~Tn;xcJ$0 zea?kuaETDX4L3!am~v&O6(I^#1_`IrZZ!+{K_J;Ui*jQ;uIyLA%3Bfd&c=kpObZxH$yhQbZOm^e!V1Uq5|C_1EEw<&CgDg+lwal> zWZJf5CMfp(C@^C*H_G48PzHmT=fWjXiK1WRDYqbL_u zC>i3g-gxT30YiKcP<(vVqXQaFuL&qZzkeRpQF36NiB_FF$SuS1 zax)vTqZKw*%9!*UCvy5$u9aA6yUaeWsUX@g#>4c z+Gl!e*n)h^<2m3T08!XS&T|AvUW)1;K*bX3l^H>tWxYWDFeKZ+$1b0IH3Au$@Ui@C zdf*yRPY}H0QGt3I%KU4Gl$U}Q2}xAKs?#iB_Gk?;gSBH+jb@SH(9R+pqp}0)rF(T1 zcS&v_pUeAAcKHqO6&#Zl+nXDhym0jF zg>s2(3DjDLK+V&urGpDBUMs#sX7!uH3)0@-r*6LyNv$X$B>Rb<_>TPilzIxU zen|{b2D+cJ`o4zQXQ%;u#pzQ92ikL;v@9aNzc<5)&}9DI5^crEP;G_mujW@XHLUNH zkUqqRcn|&Y5t7v76oZECBAbx~Q`i(f`lpIIcLf_)qkOIa0g}qK1Cw6S z5Q7xH?-aQNj))}K1jREo``P6PjGLUxWd~CU^xcbfh+qd-VkP~n@VcNHq$ZqG-Pi|E zs|o9uwVYJeh20_}ysEyP9a_x!ZU1A>3kXu%5clPH4zVu?(UlUxti*Q!z|9H|o|GDk zK_)~^5?qLM{*+GPcZ4Ts6+ry4hZQkOI(}zDCTtcaP;D;CB!)t)by`$V2C$?A>S`EK zpnI6sl6M-efyuqs+@OUMzraP0D-Bjt%%BBIhg-X80ZI6goK8sWy(01qSG04H1O&|9 zBwCK!GDJO06{_2*6B0i}Tfw|&?ZMk2=f0HOZFYndL;`s71Y^hu4qrzIwRA{vIf zO>W9UeA>Goq(#E(PHQM8b#k)(S&36Ei1t@d!C4gE&r0gq9g*DaC&_OYCIa2yT0O86CR=eg0NLXdvlNq&fdx}LIlZB>y*g|`= z!KtGWRamMn5>i{vaLKS;sUAT|wHYI`C+VEO+ax*p$B`_joirpB5jUO~ofN`0{75Nwjm!q$!(eIHIN(jHX$JdPotB3Ew zL-5(~_FZ1Im7E4g5U3>e4%{x<4FEIW!Q}A(dyqFsl01ksQAe$0y<+PbDK$q``?Y3J zb7M=WoZtfVh!F}tf<3eh0>A`WpY|&z||$J&tgRI#ztlrGZ?~j z@$Sbn3d}0|_2q?`fU_xrk*TB=-n6Fv(w`5POL{T?RT9wsCCjEl%MNS5+qK&{;m-^H zr6jF$gjjuQdJ=e_A(X!(_K#sr4qFKb)F(vqHnwtn3&ykPoAX1w|OW6u7uWjhaMk2~_gW|f) zQ6X1d*Lg!C#pmp;ARCJ)8M^La_IG7N~+>Npkya_*%vWBG|ozbN-y1Q+*X#%oLY8 z{9%?&+z;*OmkV3>AGEASUWVAf7sMY=UlWm~W*L!StRA0XG}?%BMWo^H6pdz^@Ly{o zSi&R4{e1~bf~}^nCahR`agm=$L#&aQaEVAwHt@5b?$x6sK96n_oG(P3GOx9O{kEz|s} zp;?T8P1s%SwJUEfoUGRHKwIdq;p_UZ*caDH@aMW>Y^F+UWWeBb0L09@EpLQR zQSbI3D<3B#XimJzy>p_-(le4v_SeSqB0E1D&lR|iNa|6KYUvJR7N};E2 zC?(^fAFG9BX>d9a$_+JwPb7Pgk00n8usPhle^Ldw>q->iiI8AcF&|Mssm_Y(5kdFj z$E9*|xrN|&stU7W2xpblSFJ#5Hp#OBr}E;?qZs$>X}7#X>Vln>6K{g+$&*Pn)>v|a z^m-fWCB!XvbZs|8V=!q;U`IuZ;$91NW?(x-KKuK>u+))Cz2hs|?qE|1%*JJV!qPv7 zUwF}FgazOU0sRQ2x-)lw<30M2!xKWkc2$f@P~c8y23sI?b`xBW5JVRR;=^h4aUojq zIUyfuPKa&O9?|_1JyakB@H`VF540X33BaX84b(_aigJUIy#t>Uf_;fU5h5=|oS6H% z34*=Yd7$C;-~w!y6g#3R9Z%?n5RMrL{CXKTLW8_5;V?8;`ti|F~w*!M<8qC6?kOfSO}WQbA`a<#{x z4uA9UXNs+C^|189o^t}Hv&RJ+tuf>p8;&Per-WsX?Z8?cX7w#gqA*B7Sq<%9i9g5%M8RHuh5w}QyS z0K^8HFSo`*?FfX_ zS!T>`gQocJ=Djw24W^K*G;)!UlT4#9WSxY1NFgQ2Trkm+%1_%VH-qWmwmLMYzUjy0 z=_suWPH#-)YaiS8zP90aZ$M{fdo7y{rp1L+uk{gTKP~U`S)$$!os9e75FW(iPDytn zE^kEFqv-fGaDq6+#e4P_cWkzboyrdz%5mG|U&D4KGX0YfCgyu&jY_##D}uKZ>`)~w z1(j=I|CcoOCwluqu{$3+Ka%$`d<)Z5^U?X_?`osN$=-Mhi5&jN7<6Nh$mh5w(kRk_ z>|=0=8F@FzT?Ugplpw6(0ChnAs4Iz6kqR?Mmgusy54&q;#t$?U;-Fz}90+_iu@qZq zza=E)w(bP{zuT_2`Yp(9cCYL1tL0W~d$QoQ^P0^{x7W1TP?{d2WUWkD144+Y?R#AR zp^g}F%G3WbMpk0=!pZ>MFcn{Dk^cy5uP-$OD%|4c6?1giKJ_u-sPXc0axNa38OH*N znmmdWL7xypB0Xtnrr$;I7q*M&FLoEmR>aJpo_UQ3CY&JRug+^#bPMH^#0}5ICB+z3x=c$WrS1==483sZ{2RlSeji+1LV3 zV~GAQTWC&09d(%!S0G6}PT^`Z;HuQNzr_fGuUL<$0+Yg<+F&nVze~pc@m51Z5+n6agUw7 zbSyMDA>y(sEL%UIO$Omq$25swiS*{boJ9NBE4{J(ig`b2Cg)D{e_?*nU^;%e$lQ zc1BhND#f9@?%9uLzYmV!{Ef%09xK!QM2%3SJQ|2^KbaTif7}6w#2Kid2P7es^pi-$ z1MC&r6w&oBkzbCT6IWa;C7OGzl0%=ffFpiiW-ipUPJ%;5%u1^JOu;IKwK#IQ(0K*0 zVjcnoK1Gz5KdTEN>{9*6CJc_kd!_V9^%t_)^aw0+=!!pr-I`zp$ORwm3grF{-39CJ zw{wi=s-DL<0aLaZo*@R83D(JYkMDL#ADtoDFCyW3s7WeOCEm7UnRy{t4tMdP+@ar1 zEfsMTA3w$7f{Ff=3o?7dgc+PTR)v1$p!a5K5Y&SidENE3VQt`^iT&q-k{&>nK=hie z)JK@xA7-ZH&wlIyt4?yox_Eau{RKNjR5rfFz8b>W+a)Whe0t$)9@`f-17wsR^smdd z;>_e9_qz9$KVz66=`Wv=-yQ`KCnkMMVgFEgi`+wS)tBs2Ix%ly%vn4R4W)QkNFDDF z)3|||F*rkJdj{}w32<(}b8GykrG}i9N^yf~{w0X0Xy>iB?n<;7)(}NX1fdLZUWz9J{| zkITN|%)B4(w)aa+!%HH|?q~eZSJ^aat1og)W|FWFp3$@Y{p%$S6&Y#|*MvsnI$s-& z;&NV4n$W~Q2H8S#B7=Z}CLII%csdim7WmNQQ%d9F&a~&n`xZ#bi2`S-hg+t>yeY3H;|`J1PeEIOCFt96mtNFjqSs}0WGPH=zFQejqQboXggBBh`Ap56b(o9!q;RnotK$wlV= zRz@nNUK$=B*D)FQkl|jlGSFFV7V@ot7}Y*m0fl~ptAh3rv4m^%Q=7;XN5AAdS}8@F z`xG$}O~8mIZ$yticu!{U<3^xla15&#T<5?E?&&k{4I}cVqN^%{pqaNTUO3?mV{EA8 zg0jtReRSAw?eO>_w16DN0$V27>H3T3Dl+3g*a=-dkVKcP<)g(T_gWO?6xB8wnFS^eHmtc`i+*X7->`Nzux@?e~{^!@}aG3j|P?%git!dJKR}t z$}aaMyUfO2X{o6XB^GRXcW>`ct33~yIyg;`8?rimACw{Xyhb;e>H2*~nQO8K3tStL zxZZMI=JNV#%p0JR9}M@j2erJG2Vb$CO@=BIb(vrOb`O~(;*tD|;4VaAvW8%o1}G?KtbCzTyv!~@;yY;b?wQ619oHxjHcP2 z^TZ1l?fBk@_eSiwAwvS<2AxYH#`m;Q$O{GGPV#nfH;TXTIhEls(;Oo+d6)gc$Q6%+ zfONT`{7g}ACh~9xKzck<3GPyZm^or5h8$fxd{8ZxXq)6d${uf}^d3Jk8kPG;iLU++Aim*} zhtSU4K@Ed=JP8Hxx0BI@(6^J({J!0Y(@=xPx@Ee1{0QDi2PbrZN!}B@DtIYQ(vZfO zw^TWBKJ1sDf|Vv2{Bzeap`Mv3FjepE)V6nQnx}H)b!-#`@527E%319qttCw6?Pb&W zs8E^=)kExMiO^K#cDbG8cyUTG0f;I27@oWf69Qm8m}O_(igf&xFKI`jt1)t{sB7T? zs6&N;{;R|wl&gykdHXKIL0Xa0xbDKcZezyG{o2__&7z&aQT3fz9WuzR%Ls@YZ)%b!i6tnC9!gZSiXtp2K?P4>B`Yiq%)E*flMKLo?uA(9eOfjsG$MFWAGz=$ z)WjOwVgsn5k9cI2jeHz4CGgwzXrwfp9=C#NUVvq@DquO7GaOAT0)HZJdzyUG?gW?1 znQgUg0}kV!{FZu1z07Y94Qs|7V|N-}m*DN(jXihvrV`M~6OS&kT>#oLh8EIk)aPl7 zX&-vFOzi3`3fF3HL2n3M=!HJ?|6j_H$$~?AH1h7$1s50dT1eCe4N-sxojN0 zf#BN%4)Sk^9%#iMPBx?pNyta;Q4Nl&^?qnq=*I( z^2B`)jUZE~SI#&A4Db#jWS3*T$#`!v-!JAc&^pj@Xl6gNn@{C(39%jHQ@YevF70{r zP56Z*ZNgE7KDReqk4i?(u|4J%!Df(0@t=sziz0E43P`vAM*t-~n~!K! z#Yl0R@0^O?w!hvl!3+eAjl@1y03XJr60R}{q3B}Ft0*4PD*c^(!6fz+v{K9#q)>B8 zlb#)w-yb*|XDD6=WZotzO#qkFmiQTGgESCMT#$A?WvM)r0D)CVW`yMUYsqc>&csc* zfe40zU-jC-Y_Si-3}cLLp=Na$cS_JC7{a51r_W*THcB1{by?;+7WPAUd}3RGMegM95MREtG-^)vbjh8vyr737h^ zo54HN3-;w^Q{>O%dTJcEquY?NE8;c$XnznoS9@|bbt;#TXMvV2h zLLCu2PA#9x7xCZMpXJkfbs8P%_j_#`CkQT(M=u4f0cD6dUK=YSIdw@Cw zhQQ`;cszsWbrADFpbR`>KRPP%!cEG5!FQA02{|`u&AVUO99>+lNu5Q`l7Qau3ePFf zJ{i5g$B`LYi^if{T~Spjf><;CPrYU*jyPl56H!;`Pi%#5^%~DCIRVM?RfIn=R#xte z&OUH=PRcH`K)s!!_R5&YEI>W)QOc~^+#&0`N*ybIc%xVPub})arv20_FGA-wGa>%I z@M+3){JNYO>+qXJ7X#p7Hr@t3DKTP_l~aHPY)#Y`aqmur@O>&qdu&h~NFN{UN?X=G z1xww?jpwYR&Wj&%W=#x@KB;sbRF~K1VeYz;$9GqM2a@lFCcJ_Q@8T;8+EPOD8&){w0yj z>{X~?yPWP#cHt$UV##Ld@8j=l?Ssj+HvMmZ;JGCQMhOdUY>M8>O*zv_omHG~V`&$i zYK%S)JqIFFr3@o-&T4QO7$ap=M!ci$XqG|!?g}NcK#=pG-7zX#E>M_vy`&=6X!S{3 z&~P*XKM?92?4?`)larlpb7OL161^<)eW0~c+PEW{*SUEKTDcRS!_UaRP$t?-b#P0) zn87Oe?PW}~C+6a8Z{@hWjZ%It3^W#3VgCaJEzgk*)IjBNw3l1{yV$Y>m?azPAL@IT z_E8O2Og(Xm`)_;j{}&L%|35&8oRuZugJQOp0B}^-x3m!|MFeQ@Dk281BV~-2i}4dO zzUwtT&Zd2D@Ff2G|9X82dl!IxLWwfEAG9>S9pp7l#8xgW3Yt7FJp%t=1qH71#9eL; zmG0zA5Eo<+$K*dLg8ey5Jfdl{y(QCH{$C#*s)g5%ZaWQPq*Fw>Lf1Z8$trE6wJe02 z{8+jy3pm56`!0lkIpCI(LReCCl5jB$2_fK?FO!>$du-GC#8evk3MXN7V|LF zu;_vO&QP&|%edDiYly?c))c}CSR&1hqJxOgAj2OBQOvI3rH5aEMF;Sx^OUH5S|iZM zWi9_Kb`c;I?;{~Qk$ZC_>OKcLoRdk1KYU*%o(I^2a6Sqy0*K_DOdb)70`(B!QEwG{ zxw;l7$)$x2n9^&Bbb&oC`w72We6Kcph1x)bvuVJOrLo^s(s`$$U7t1X{?B9j_AhJS zlsuemwJ)W1LBP&0vT>cim@A=u4KPU-@^~Lzk69LMnV?a8y7}r-U5R~kKn?m!J4mRV zZt#!Ics|QF&QPvE;f z1zpxM60y%-LOiLoKPerF0cYE86r_Yz9&DUE^V{hvjN@2~psbgcm!}VEK8X(~tBxbe zEfDKWuAFuHt43Na(RJXUE&7#~f)9%FqEG&wu#5&-z6X_yy!3HC2-`);`T~ODiQJm4 z_x6s0ln1iimCzR&3z@aqL}_{DA;@_XN$7r(IiwV2n%U*{f~grXVdf9HVhc7Rym{}s z@<~$Nu;h1JZXR@nMx}M~SED`qQDR|lL|bt+3X%6-%JkveGCh}*C3qC1JFl`|aVs_< z7otD~K7&H77jJ}Ke#atiYm_IlD2MM9BE3m8Z0{7=xT{#$Z{qxp1fvQUv2-1PFE7(R zCCHf^WUnEY(PR5%PG+OV&JO0c6^fKWW+G>w-Uw1q(>nw@I>FJ_HjZaQIU_JnM+^MA zba_8yIC&!DiC0@4Rz^(*jE$uliy%fGBuO1wbwV>Dy;}f?e0Yy0APuh7>+Y_S*p=jB zzg^7y7gG*l3>Y4Gd&XB-C?$_haAX*XL~cNC2(J>5Q6_PcvbA4-*=FLl2iKO8^Yd(? zFDl?L1`HJk%MMFqVjco<+EaWgi7K!-L9nni=TyeB0c>1D?JtF z7B!Em>ge&vO6E||t z&k1W+C+;G5EpGnC4h!J`ot3+e;qHoQtV7TSjV)QSKbl6o?kDiyoH8{cM@G~8gAyD2 zKI6Q5v;?oty&z4iU?9y+RF6Qcas&`h?!H^2nvTTeTyY)+&Ijj?qOz9A#*he?GGY>z z6!}}^%h0;-P!X@){lyD*-azuhhSMkSB>%0@wd${<==(b&m_d=!iK`b1P5d^eiP*sw zsIv~S>{j1I%(BPJ9DJHH%c(0B6lp5Mrhq}jUr*E0!es~!7n+?5*nKQQRp1F8jv4Ik zQ`}+zbh10pWkuJVGreT9(vH0L14*{cmsJp9xZv&SPNksuGz9H6ji^-gsX8+qMB1|h zil}cQm@aYeq?ilUJ_ki^a>Yp95ms2Dy_u{#vfng#h}~yz(Ybb5LAScb@|VI0uGJ^9Zi+*EO5q z2I?%@L~4$0gR{!u7!dEXiUv4@|J;`HMbv0)8SZFjQn{P#7>8(no9;Prad0qUSj zl8*i@I8Mr{HCL&5Oi|O_?WnI@n(n>@=>ac$!%-d@eBgrZjG|_gB8LM)9`q{L0qUSw zyN>=XKCLkEIXqQ&`r$t*JfMH#Q$jm(hnwCP=ay(tB_d=k2AIBHWf|m$~pJYH| zOXhTqy%#p;ULlXl;gil%2W9Ye^v@PUFKb)T_2(eEB!x5J?Wc9g7vn-y+W{wn$=0be z_+AkCy+ZEvv$xPTBrdA_fk)CB)0xTO1gbobvqyrWmu;GCB9Ax;);8RgK z+h5=zl#Kq7A7Dt67(ISUStd3}MgP#=kxq8vBpurI)0hJ1IwAam@SDNk^dr6LKdz>} zSj5JarV%-7;2f+Vdd}K5xV8%fd9AET-4wuWAk(f8Q>3ao$Zv;+7v$NH`Wq%Up**MgsLt!kZ2Uq`L_y>N1bm0)J6&Ct8jyWzra=n(>PmWuv)X~&M!1D+f{COkOw zVDSB>U*{zOUkrRB@DPMf-lACirXOntXtDMiA9#z7krHara?xr82TdF>7JXl|S*g-~!%|egpW&%}`lGcx59zT6~i=bGpdx zkg47wliFdF&Qk{_Mo0hbG4wK6@9KN2|3;)U!0o4%$>-ih@P5c4lF1foGk9m*yu^~R zXP?c5_902|kU#K<+G3h>>vv~IDS)cjM=5M#dOI88Zghat0S(RC-&2sihjD9kw8g-~ zE&T(JR5>>fM)w9UpLkb&$qJ?XA__SP6sq3r2d}5PwTC( zHga(_YDnZjOBAOBrJ-49i5a{@_=XJGO+MT64f1nCf7Kh(ai|8gZ5Y6B6p^#Z8p3}& zafF~oKd|8p1~D1;ZUH9P7`QWVD4RF&AC*~*{(=Uh{mLgk_X~T>>MZ2R0Y)Nn9sWLn z@CFY#2u0&w0fP!l9^jBiZ<(;4Ug1C140JI#i`J2vW82`YvVJpebf29?>(K1=7v7fg z?V1~0h2!~kDt8@ve&ofQJ3Ab4XQt8}oiY*dO~8*=;|{$|KUA&37fO+?3mKg zhF=hV-xDC*?2MZL+!=U7ldYv(+$s7AXn@9;U--aVcnT;3Upl2ehRC8Iqi3`~(4cuh zvQale47`@=2z@PYMymKb8gN!hj|6Wa`#^#~&OZw|N2v91RNf;28>94HrGMh_!>S`s zyOQIpV9yyLZ>)qjqILlOT5g8Q`>S>~!mF`0bGpc0Ayeyyi?9x(be=lU{5tyg9;@gn za#^}|OZBi`NbN5ooB(?+5raSE5XnRfmAZc+xg^}Y#F9iWbikwo7Lw6>5A+|`T7T+9LjnZ4s)Ws`hE|Nh4+uXY z{9;CFGjPA98nM%<@41k|LPe#kvrv|pi_+O-!yg0qk3)tCTJ!@Bm#Z-S|JLTF?-c+( z88{Wqjo@$D?=PnN*Kd5_5q@@uRaxYc0}KV$;7P(cNLci&LZ|5XN+f)7Iso$Mn9>Cm zR)-3xvpBpHW8uiTh1Ayp;in4!?3c+x_c|f(C*%EOyq}Qw6S_TsoS~wBSijksaNX<- zEeC+mox%G(0l>`7m zD*BuD11wAMu3)dO8y@UE`QGL%l8!w@ccz-(y*T5JC5I3*4NO)= z|A<*bLMe9zJ~C-cCXLA?&`Xtp_rrB0k_JW6phy}MNn?s{=*$^8YKcG$4rq=G#m89)A5)tfCM2%^?}w3HZ@|oo(9&wxNptk<1RfkDl^| zR6+-|tLPuvnfIa3bl;@wCozVmn!Ab&h+V?qD}*;9mVT4}(+cnp?TVZ&(8wgGI_O#r zxK;zM)qra?*jf#;Ym-NepA&fs;s>6S>0)T3PZTHv+i+aE34=j^Kb<-PZwUTutqIKu zI9E(ro5c1b@XElMVERq`2a)`oGGR}S`i)O~ZWi_=qM-QaY1LPx*>RUYuX*{oy_1UOlMgI?x8 z0-pptxlgE1K7tR#Vu|=4);l?O4sdb`=V-4C2tRM~2``=T5`b3*ZfvsiQc_bt1MD}E->gXir!AXjY{(a)ODw0TWW|ShSpLgY6>bk%;hJ77A%IG(PUxlp`UDq|x zbk}6u8Ob5U%mIW_MgNG|LP9xo&16h-_#ytM700tz5%@k_M<-EXRd)h(|wa}>Si5mrpqCGgYX@~46-+AcLq+Saw7O6^-g#bLw+9pBleCQKNO23HF_+9z&q15m0@3p>&8@* z4nGh%=_C%Oo*b$hN6|Eq;7Y*X0?bUNLz7AFP+|m$zgLHxXXh9IJUQPP=R0(605wfT z|1f@{6Wle~`PTx^1;V97@bxAiuyQh10`ShjhdS5yRl9Y)Sks71{}>=H)re%nfLGUc zjP|BTgue;WC)~@B&p&Ehly*=mtHxDn2l=x-F2`(6Ry!dEs2_;rM-mZctwRtJo)Y8W zh&F4Al9P=d?{?XM;L+-=v^vm-S+x{>Ao6+*_<~te!*nO9m&QJjo6PjwQtSJ`%Ynz( z=mTx^=L6adMhI%vo!YSw{7sO&1TA$}9boV0Mqq{b(123|1srYnBX*57wm<{o|1m&j zQp{jYR7s5usP_O_#~0@nlX8@9Mr!8`Nph6Dd$I*>PNHe>pJkJz0lPcz81N4p;312q+K$^2UNebb`A6Z$}5@MS`HhZ6|ivjJ?z=9_)Me9!?6QsfYx z&3IFKY_bV&FY;se{V?1p(AUvEgkkUsJxq)rwc9wy_8~uPe z{J?Rl)sD zn+QJ7Gzk7)AUvIL?`*&w%ncYV0{B4*nsmU118SiIx;p2tJvQ|+t$EcOm7VVAkm)@@GZIul)hcAs$ z8)`x-PvJfmmqvW86Qb|UsEx7~ECge(->R{6C(|2FzL%fAg`aj;kpMe06Yxd&4L{(O zeIR!Zfrk_DMJGUKyyzEBffs!Wn=bNZJn}EqPUL-Qq_cVUt~WYhzlc$0ja!cu2i|O- z&!n6DKI&L~4SrPkfrzWo2Nr~f6PN`~V8R)H@xA13;^VuY0R54_KMByW{9B(u9n1Bl z{>B_WePC6?nEp&9Ve=U&g4gBf9-x!|zP33zcf z5&U_>0Pvr8EdZWQxOX>s2OA|{4JIO`kT<;ZbJ z4xj{W_5t)(HZL@8rZ)LPBR@kNFC9KFG!Xs);pv3a@d5*$O(Q>)E${=?=m4h!=oHwZ zrHI0Q;P45!{DChW!69}74oh*==6xQm)(FPt->T!7M^aGQ9;5?!P@NfdX z!3lIYV}C1avMbRC>ZAiGMH>o*J(18tudVd~PpgUr++G>}dCn~p)ajIu-wOu3n``ND z{+pz!Udq_#CmMS;POeSzfL1-roe2CQ#|(sL*Z&dv2GMs2zYsaCGH_$mG{*b382XMR zVfT)x>GD#&lkoxVp-zw#_Z;#|=o7qma^)ZFAvtPkRS9@O;B7E!T8Hok;VUD*F!aW5 zjgh2nBso~2eNVsY@cu0YD}zIg2B~RK-Ctsl$oZB&hWb@k-~O8lc2=xlXZ!h}6Thxv1DvSXgzpgE8TmvdCwztQ1?$)ksANB&mW4|8w|rRUx?mR;^0Fg? z6&Jz?9NM1&HU41sGfq7j{{5Ria=N9&>+P7DNnE3z6K3$^1;95(ZxFsR_^#)J9ry+D zPY6H$zt;R4wC4Xykv|CKpI1o?o}Ie<=d@V%TNY^iro{^TKuik6ZjZ|U4fF{YFPD-x)a*fm>tXgAs3w!Mls(@WyWGKe3jO+Z%JwK=U#` zsWV2v4N;TKC*XsjCpN!9o8OqtZ*S8er@a!Jf0ni|{Nx-k;q|yG!QpgCTov%-*f8N2 z#6KbYfbb2%JA^N2xf&$DbqMclxf&Fo2F0hr-QpXu)1kC^XYBEYbdN*fNyknHH>gSs z?kxkkH|*H9uWwz|eZZ5?4|wzmPd<$uWWsaI4|tG?f<5af*hA>q+B&=6@NNuzFmOmb z6igp%t!f!)WBEY$q!j(BZ!qSs(Vy@>rk-w=@B=&>jsYDHFgD;!+5W#k{|5!s7rTJ- z1*f~wC6MpRz>Nw2hRoj+YLmVBcHjHgK9KOfH`rV`Ku-fp_(kCxf;XX%?SJ{-{|A^n J0>gbC2>=p=D&znF literal 0 HcmV?d00001 diff --git a/research/rank7-skip-restore-optimum/data/WORD-2979-extra.json.gz b/research/rank7-skip-restore-optimum/data/WORD-2979-extra.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..74f6cb64595c21f7726ae77e69437868620bdcee GIT binary patch literal 71419 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


o75;v46&M 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%0D*NJD#Jg6u+odl15SK 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 a;;3qwuG+a_gG#k&!%Od_;o?KvH~b%}O)h}| literal 0 HcmV?d00001 diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/AUDITOR-SEMANTICS.json b/research/rank7-skip-restore-optimum/evidence/laneK/AUDITOR-SEMANTICS.json new file mode 100644 index 0000000000..e54f48a78c --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/AUDITOR-SEMANTICS.json @@ -0,0 +1,28 @@ +{ + "test": "append a FULL-frame gate between two non-restored registers at the end of restore (changes their final rows); re-derive frames + cleanup; PR2833 auditor", + "results": [ + { + "gate": [ + "add", + 0, + 1, + 1, + 1 + ], + "audit": "PASS_INDEPENDENT_EXACT_BORROWING_WORD", + "cost_delta": 0 + }, + { + "gate": [ + "add", + 62, + 70, + 1, + 1 + ], + "audit": "PASS_INDEPENDENT_EXACT_BORROWING_WORD", + "cost_delta": 0 + } + ], + "conclusion": "non-restored final rows are free at the end of restore; exactness = restored helpers own input + no restored input leaked + targets untouched" +} \ No newline at end of file diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/CROSSCHECK.json b/research/rank7-skip-restore-optimum/evidence/laneK/CROSSCHECK.json new file mode 100644 index 0000000000..46f47ee26c --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/CROSSCHECK.json @@ -0,0 +1,233 @@ +{ + "laneK_files": { + "bound.py": "6b1479b436c4f01bb32f771aa06af3d2260adee5dd5a5e2bf568b0192cee69d8", + "lbforced.py": "bd81e3f4460f61ef81e15e76ab25be5f8a9d7b71bb7dcbbf7a87873ca5398341" + }, + "rows": [ + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "word", + "word": "3042-base" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "emptied-restore", + "word": "3042-base" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "word", + "word": "3042-extra" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "emptied-restore", + "word": "3042-extra" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "word", + "word": "2979-base" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "emptied-restore", + "word": "2979-base" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "word", + "word": "2979-extra" + }, + { + "agree": true, + "laneK_LB_forced": 10867765164, + "laneK_blocked": [ + 42, + 292959 + ], + "laneK_bound": 10868103087, + "laneK_caps": 88, + "laneK_lb_forced_direct": 10867765164, + "laneK_open": [ + 9, + 44964 + ], + "package_LB_forced": 10867765164, + "package_blocked": [ + 42, + 292959 + ], + "package_bound": 10868103087, + "package_caps": 88, + "package_groups": [ + 9, + 44964 + ], + "variant": "emptied-restore", + "word": "2979-extra" + } + ], + "status": "PASS_LANEK_CROSSCHECK" +} diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/FULLAB-SUMMARY.json b/research/rank7-skip-restore-optimum/evidence/laneK/FULLAB-SUMMARY.json new file mode 100644 index 0000000000..30325390a7 --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/FULLAB-SUMMARY.json @@ -0,0 +1,108 @@ +{ + "word": "WORD-3042-base", + "current_cost": 10868103087, + "rw_single_moves": { + "candidates": 25846, + "feasible": 22354, + "infeasible": 3492, + "errors": {}, + "other": {}, + "gap_histogram": { + "-15635": 17, + "-13754": 2, + "-6877": 14, + "-4996": 3, + "-3102": 11, + "0": 22307 + }, + "gap_positive": [], + "best_gap": 0, + "by_class": { + "A->A feasible": 20166, + "A->A infeasible": 1194, + "B->B feasible": 2188, + "B->B infeasible": 2233, + "R->B infeasible": 65 + }, + "excluded_invalid": [ + { + "ref": "B1865", + "gate": [ + "add", + 149, + 297, + -2, + 1 + ], + "to": [ + "B1873", + "after" + ], + "sec": "R", + "coef": "-2", + "bound": 10868093095, + "gap": 9992, + "dLB": -9992, + "dB": 0, + "dO": 0, + "reason": "target write landing in the restore (auditor: restoration writes only non-targets); its bound drop is an artifact of the empty-restore relaxation dropping a target write" + } + ] + }, + "read_splits_2to3": { + "candidates": 6387, + "feasible": 4894, + "infeasible": 1493, + "errors": {}, + "other": {}, + "gap_histogram": { + "-15635": 4, + "-11200": 4, + "-8098": 4, + "-6877": 2, + "-4996": 10, + "0": 4870 + }, + "gap_positive": [], + "best_gap": 0 + }, + "write_sinks": { + "candidates": 640, + "feasible": 66, + "infeasible": 444, + "errors": { + "RuntimeError('self add')": 118, + "ValueError(('target outside span', 531, ": 2, + "ValueError(('target outside span', 543, ": 1, + "ValueError(('target outside span', 554, ": 2, + "ValueError(('target outside span', 555, ": 1, + "ValueError(('target outside span', 557, ": 2, + "ValueError(('target outside span', 566, ": 2, + "ValueError(('target outside span', 567, ": 2 + }, + "other": {}, + "gap_histogram": { + "-11873": 58, + "-8098": 2, + "-4996": 2, + "0": 4 + }, + "gap_positive": [], + "best_gap": 0 + }, + "adjacent_pairs": { + "candidates": 350, + "feasible": 224, + "infeasible": 126, + "errors": {}, + "other": {}, + "gap_histogram": { + "-3102": 8, + "0": 216 + }, + "gap_positive": [], + "best_gap": 0 + }, + "lanef_merges_3to2": "99 legal (84 A, 15 B), 93 feasible, all gap 0 (out/AB/merge-ab-base.jsonl, complete over A and B)", + "note": "bound.py fix during this run: lb_forced now takes the caller-supplied M (the sink census had computed caps from an empty restore; the first 125 sink records were discarded and the census rerun). The move and split censuses were unaffected (their restore map equals the supplied M)." +} \ No newline at end of file diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-base.json b/research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-base.json new file mode 100644 index 0000000000..4bee0ed568 --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-base.json @@ -0,0 +1,1441 @@ +{ + "word": "3042-base", + "certified_cost": 10868103087, + "certified_profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "LB_forced": 10867765164, + "LB_certified": true, + "LB_profile": { + "1": 2370, + "2": 693, + "3": 255, + "4": 116, + "5": 18, + "8": 8 + }, + "forced_caps": 88, + "visits": 51, + "sum_forced_extras": 337923, + "LB_plus_forced": 10868103087, + "equals_current": true, + "blocked": 42, + "blocked_units": 292959, + "open_but_forced": 9, + "open_units": 44964, + "exchange_census": { + "priced": 990, + "negative": 0, + "min_delta": 0 + }, + "caps": { + "2": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 251, + 265 + ] + }, + "3": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 554 + ] + }, + "5": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 395, + 557 + ] + }, + "7": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 453 + ] + }, + "16": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 424 + ] + }, + "18": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 226 + ] + }, + "22": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 331 + ] + }, + "23": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 511 + ] + }, + "34": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 228, + 230, + 331, + 509 + ] + }, + "35": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 499 + ] + }, + "40": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 299 + ] + }, + "42": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 408 + ] + }, + "44": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "dim": 7, + "receivers": [ + 424, + 581 + ] + }, + "45": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 230 + ] + }, + "46": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 589 + ] + }, + "54": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 226, + 230, + 299, + 485 + ] + }, + "59": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "dim": 8, + "receivers": [ + 363 + ] + }, + "61": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 251 + ] + }, + "62": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249 + ] + }, + "63": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 267 + ] + }, + "69": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 566 + ] + }, + "70": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "71": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 249, + 267 + ] + }, + "72": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "73": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 363, + 533 + ] + }, + "92": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 230 + ] + }, + "94": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 265 + ] + }, + "96": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "dim": 8, + "receivers": [ + 395 + ] + }, + "103": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 230 + ] + }, + "105": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "dim": 7, + "receivers": [ + 408, + 573 + ] + }, + "108": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 228 + ] + }, + "226": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 449 + ] + }, + "228": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 230, + 451 + ] + }, + "230": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 450 + ] + }, + "231": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 448 + ] + }, + "232": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 452 + ] + }, + "236": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 454 + ] + }, + "238": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 455 + ] + }, + "249": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 267 + ] + }, + "251": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 265, + 267 + ] + }, + "265": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 251 + ] + }, + "267": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 251, + 265 + ] + }, + "299": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 226, + 230, + 484 + ] + }, + "306": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 498, + 499 + ] + }, + "308": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 304, + 501 + ] + }, + "310": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 304, + 500 + ] + }, + "311": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 499 + ] + }, + "322": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 327, + 511 + ] + }, + "324": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 320, + 513 + ] + }, + "326": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 320, + 512 + ] + }, + "327": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 510, + 511 + ] + }, + "331": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 228, + 230, + 508 + ] + }, + "351": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 531 + ] + }, + "363": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 532 + ] + }, + "367": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 543 + ] + }, + "383": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 555 + ] + }, + "395": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 556 + ] + }, + "399": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 567 + ] + }, + "400": { + "cap": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "dim": 8, + "receivers": [ + 412 + ] + }, + "408": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "dim": 7, + "receivers": [ + 572 + ] + }, + "412": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "dim": 7, + "receivers": [ + 574 + ] + }, + "414": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "dim": 7, + "receivers": [ + 412, + 575 + ] + }, + "416": { + "cap": [ + 256, + 128, + 68, + 32, + 16, + 12, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 428 + ] + }, + "424": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "dim": 7, + "receivers": [ + 580 + ] + }, + "428": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "dim": 7, + "receivers": [ + 582 + ] + }, + "430": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "dim": 7, + "receivers": [ + 428, + 583 + ] + }, + "434": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 585 + ] + }, + "436": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 587 + ] + }, + "438": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 586 + ] + }, + "439": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 584 + ] + }, + "440": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 588 + ] + }, + "444": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 590 + ] + }, + "446": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 591 + ] + }, + "448": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 484 + ] + }, + "449": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 485 + ] + }, + "450": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 508 + ] + }, + "451": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 509 + ] + }, + "452": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 532 + ] + }, + "453": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 533 + ] + }, + "454": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 556 + ] + }, + "455": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 557 + ] + }, + "498": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 311 + ] + }, + "499": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 498 + ] + }, + "511": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 327 + ] + }, + "585": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 555 + ] + }, + "587": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 531 + ] + }, + "589": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 543 + ] + }, + "591": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 567 + ] + } + }, + "theorem": "For every exact restore-only rewrite R of WORD-3042-base (A, B, warps, cut, helper ends, buffers fixed; exact = the PR2833 auditor end-of-restore conditions), cert_cost(R) >= LB_forced + sum_forced_extras = 10868103087 = cert_cost(WORD-3042-base)." +} \ No newline at end of file diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-extra.json b/research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-extra.json new file mode 100644 index 0000000000..fd764fb8cc --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/NEGATIVE-3042-extra.json @@ -0,0 +1,1441 @@ +{ + "word": "3042-extra", + "certified_cost": 10868103087, + "certified_profile": { + "1": 2433, + "2": 712, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "LB_forced": 10867765164, + "LB_certified": true, + "LB_profile": { + "1": 2370, + "2": 693, + "3": 255, + "4": 116, + "5": 18, + "8": 8 + }, + "forced_caps": 88, + "visits": 51, + "sum_forced_extras": 337923, + "LB_plus_forced": 10868103087, + "equals_current": true, + "blocked": 42, + "blocked_units": 292959, + "open_but_forced": 9, + "open_units": 44964, + "exchange_census": { + "priced": 990, + "negative": 0, + "min_delta": 0 + }, + "caps": { + "2": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 251, + 265 + ] + }, + "3": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 554 + ] + }, + "5": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 395, + 557 + ] + }, + "7": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 453 + ] + }, + "16": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 424 + ] + }, + "18": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 226 + ] + }, + "22": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 331 + ] + }, + "23": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 511 + ] + }, + "34": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 228, + 230, + 331, + 509 + ] + }, + "35": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 499 + ] + }, + "40": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 299 + ] + }, + "42": { + "cap": [ + 256, + 128, + 64, + 36, + 20, + 8, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 408 + ] + }, + "44": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "dim": 7, + "receivers": [ + 424, + 581 + ] + }, + "45": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 230 + ] + }, + "46": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 589 + ] + }, + "54": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 226, + 230, + 299, + 485 + ] + }, + "59": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "dim": 8, + "receivers": [ + 363 + ] + }, + "61": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 251 + ] + }, + "62": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249 + ] + }, + "63": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 267 + ] + }, + "69": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 566 + ] + }, + "70": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "71": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 249, + 267 + ] + }, + "72": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 251, + 265, + 267 + ] + }, + "73": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 363, + 533 + ] + }, + "92": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 230 + ] + }, + "94": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 265 + ] + }, + "96": { + "cap": [ + 256, + 128, + 64, + 32, + 16, + 8, + 5, + 3 + ], + "dim": 8, + "receivers": [ + 395 + ] + }, + "103": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 230 + ] + }, + "105": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "dim": 7, + "receivers": [ + 408, + 573 + ] + }, + "108": { + "cap": [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ], + "dim": 8, + "receivers": [ + 228 + ] + }, + "226": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 449 + ] + }, + "228": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 230, + 451 + ] + }, + "230": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 450 + ] + }, + "231": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 448 + ] + }, + "232": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 452 + ] + }, + "236": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 454 + ] + }, + "238": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 455 + ] + }, + "249": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 267 + ] + }, + "251": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 265, + 267 + ] + }, + "265": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 230, + 251 + ] + }, + "267": { + "cap": [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ], + "dim": 7, + "receivers": [ + 249, + 251, + 265 + ] + }, + "299": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 226, + 230, + 484 + ] + }, + "306": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 498, + 499 + ] + }, + "308": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 304, + 501 + ] + }, + "310": { + "cap": [ + 256, + 128, + 66, + 34, + 16, + 8, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 304, + 500 + ] + }, + "311": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 499 + ] + }, + "322": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 327, + 511 + ] + }, + "324": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 320, + 513 + ] + }, + "326": { + "cap": [ + 256, + 128, + 65, + 32, + 16, + 9, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 320, + 512 + ] + }, + "327": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 510, + 511 + ] + }, + "331": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 228, + 230, + 508 + ] + }, + "351": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 531 + ] + }, + "363": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 532 + ] + }, + "367": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 543 + ] + }, + "383": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 555 + ] + }, + "395": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 556 + ] + }, + "399": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 567 + ] + }, + "400": { + "cap": [ + 256, + 128, + 65, + 33, + 17, + 9, + 5, + 3 + ], + "dim": 8, + "receivers": [ + 412 + ] + }, + "408": { + "cap": [ + 256, + 128, + 66, + 36, + 22, + 8, + 1 + ], + "dim": 7, + "receivers": [ + 572 + ] + }, + "412": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "dim": 7, + "receivers": [ + 574 + ] + }, + "414": { + "cap": [ + 256, + 128, + 65, + 36, + 20, + 9, + 3 + ], + "dim": 7, + "receivers": [ + 412, + 575 + ] + }, + "416": { + "cap": [ + 256, + 128, + 68, + 32, + 16, + 12, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 428 + ] + }, + "424": { + "cap": [ + 256, + 128, + 65, + 37, + 20, + 8, + 2 + ], + "dim": 7, + "receivers": [ + 580 + ] + }, + "428": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "dim": 7, + "receivers": [ + 582 + ] + }, + "430": { + "cap": [ + 256, + 128, + 72, + 44, + 28, + 2, + 1 + ], + "dim": 7, + "receivers": [ + 428, + 583 + ] + }, + "434": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 585 + ] + }, + "436": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 587 + ] + }, + "438": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 586 + ] + }, + "439": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 584 + ] + }, + "440": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 588 + ] + }, + "444": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 590 + ] + }, + "446": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 591 + ] + }, + "448": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 484 + ] + }, + "449": { + "cap": [ + 256, + 128, + 64, + 34, + 17, + 11, + 4 + ], + "dim": 7, + "receivers": [ + 485 + ] + }, + "450": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 508 + ] + }, + "451": { + "cap": [ + 256, + 128, + 64, + 38, + 20, + 10, + 1 + ], + "dim": 7, + "receivers": [ + 509 + ] + }, + "452": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 532 + ] + }, + "453": { + "cap": [ + 256, + 128, + 64, + 32, + 19, + 11, + 6 + ], + "dim": 7, + "receivers": [ + 533 + ] + }, + "454": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 556 + ] + }, + "455": { + "cap": [ + 256, + 128, + 64, + 37, + 21, + 8, + 3 + ], + "dim": 7, + "receivers": [ + 557 + ] + }, + "498": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 311 + ] + }, + "499": { + "cap": [ + 256, + 128, + 72, + 40, + 24, + 4, + 2, + 1 + ], + "dim": 8, + "receivers": [ + 498 + ] + }, + "511": { + "cap": [ + 256, + 128, + 65, + 32, + 17, + 8, + 5, + 2 + ], + "dim": 8, + "receivers": [ + 327 + ] + }, + "585": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 555 + ] + }, + "587": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 531 + ] + }, + "589": { + "cap": [ + 256, + 128, + 64, + 32, + 18, + 10, + 6, + 1 + ], + "dim": 8, + "receivers": [ + 543 + ] + }, + "591": { + "cap": [ + 256, + 128, + 64, + 33, + 17, + 8, + 4, + 3 + ], + "dim": 8, + "receivers": [ + 567 + ] + } + }, + "theorem": "For every exact restore-only rewrite R of WORD-3042-extra (A, B, warps, cut, helper ends, buffers fixed; exact = the PR2833 auditor end-of-restore conditions), cert_cost(R) >= LB_forced + sum_forced_extras = 10868103087 = cert_cost(WORD-3042-extra)." +} \ No newline at end of file diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/bound.py b/research/rank7-skip-restore-optimum/evidence/laneK/bound.py new file mode 100644 index 0000000000..0ff35d3ac5 --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/bound.py @@ -0,0 +1,259 @@ +"""bound.py -- lower bound on the certified cost of ANY exact restore for a word's A/B (the restore re-synthesized freely). +bound(w) = LB_forced(w) + sum of forced restore-phase extras (exact arguments, see screen.py / screen4.py / lbforced.py): + M = restore map of w (w exact => every restored helper c ends at its own input = FIXED combination of entry rows); + caps: r's restore-entry frame inside E_c for every restored receiver c of r's entry content; + LB_forced = certified optimum of w with an EMPTY restore and the caps; + extras per register r with restored receivers or leaked restored inputs (L/U from the capped empty-restore graph): + BLOCKED (for some receiver c, or for its leaks, no partner s != r with J = L_r+L_s, |J|<9, J <= U_r ^ E_c ^ E_s; for a + restored r a receiver with E_r <= E_c does not block): min over entry dims d in [dim L_r, dim(U_r ^ cap)] and 2-splits + (a, D-a), D = dim E_r - d, of c_a + c_{D-a} - c_D; a split whose first frame has dim d+1 (or equals the blocking cap) is + dropped when no such frame admits partners passing the rank test (receivers' rows on r + partners must have rank <= + #partners), since r itself cannot deliver; + OPEN-but-forced 4,996: for every receiver c, every partner frame J has no free lifter (c cannot sit at J; every register + that can sit at J and climb inside E_c is non-restored, or BLOCKED with no visit frame strictly above J); the payer + groups ({r} u non-restored lifters) are disjoint between counted registers (overlaps are merged and counted once); + otherwise 0 (optimistic, keeps the bound valid). +Calibration target: bound(WORD-3042-*) == certified cost 10,868,103,087.""" +import sys +sys.path.insert(0, '/private/tmp/claude-501/-Users-mdumitrean-Desktop-dev-aigent-math-prime/c80ebb8e-fc28-4d1d-b7ef-b214d4660f98/scratchpad/r15/agents/K/code') +from screen4 import * +from lbforced import lb_forced +CC = bp.costs().c + +def rank(rows): + m = [list(r) for r in rows if any(r)] + if not m: return 0 + rk = 0; ncol = len(m[0]) + for c in range(ncol): + piv = next((i for i in range(rk, len(m)) if m[i][c] != 0), None) + if piv is None: continue + m[rk], m[piv] = m[piv], m[rk] + for i in range(len(m)): + if i != rk and m[i][c] != 0: + f = m[i][c] / m[rk][c]; m[i] = [a - f * b for a, b in zip(m[i], m[rk])] + rk += 1 + return rk + +def entry_info_graph(g, assign, al, removed): + out = {} + for q, segs in al.items(): + if q in removed: continue + v = segs[-1]; last = None + for k in g.chains[v]: + if g.nodes[k][2] in ('tail', 'end'): break + last = k + L = tuple(g.lower[last]); U = set(span(FULL)) + if last in set(g.mutable): + for t in g.nodes[last][0]: + if t == v: continue + j = g.nxt.get((last, t)) + if j is not None: U &= set(span(tuple(g.upper[j]))) + else: + U = set(span(tuple(assign.get(last, g.nodes[last][1])))) + out[q] = dict(L=L, U=tuple(basis(tuple(U)))) + return out + +def split_costs(D): + return sorted((CC[a] + CC[D - a] - CC[D], a) for a in range(1, D)) + +def bound(w, detail=False, rows=None, M=None): + Rs = restored_set(w); E = end_frames(w) + if M is None: M = restore_map(w) + if rows is None: rows = entry_rows(w) + lb = lb_forced(w, M=M); g = lb['graph']; al = aliases(lb['w0'], lb['meta']) + EI = entry_info_graph(g, lb['assign'], al, set(w['removed'])) + regs = [q for q in EI if not (V <= q < 2 * V)] + Lof = {q: EI[q]['L'] for q in EI} + recv = {r: sorted(c for c in Rs if c != r and M[c].get(r)) for r in regs} + leak = {r: sorted({var for var, word in rows[r] if var in Rs and var != r}) for r in regs} + _sp = {} + def SP(x): + y = _sp.get(x) + if y is None: y = _sp[x] = frozenset(span(x)) + return y + SL = {s: SP(Lof[s]) for s in EI}; SE = {s: SP(E[s]) for s in EI} + def partners(r, Ec): + # J = L_r + L_s lies in X = U_r ^ E_c ^ E_s <=> L_r and L_s both lie in X (no join needed for the test) + Lr = SL[r]; X0 = SP(EI[r]['U']) if Ec is None else (SP(EI[r]['U']) & SP(Ec)) + if not Lr <= X0: return [] + out = [] + for s in EI: + if s == r: continue + Es = SE[s] + if Lr <= Es and SL[s] <= X0 and SL[s] <= Es: + J = join(Lof[r], Lof[s]) + if len(J) < 9: out.append((s, J)) + return out + status = {}; extra = {}; info = {} + for r in regs: + if not recv[r] and not leak[r]: continue + blocking = [] + pc = {} + for c in recv[r]: + if r in Rs and leq(E[r], E[c]): continue + ps = partners(r, E[c]); pc[c] = ps + if not ps: blocking.append(c) + pl = partners(r, None) if (leak[r] and r not in Rs) else [] + blocked = bool(blocking) or (bool(leak[r]) and r not in Rs and not pl) + status[r] = 'BLOCKED' if blocked else 'OPEN' + info[r] = dict(recv=recv[r], leak=leak[r], blocking=blocking, pc=pc) + # visit-frame dims of blocked registers (for free-ride checks): entry dims and first-frame dims allowed + def blocked_extra(r): + Lr, Ur = Lof[r], EI[r]['U']; cap = set(span(FULL)) + for c in recv[r]: cap &= set(span(E[c])) + capb = tuple(basis(tuple(cap & set(span(Ur))))) + bcap = set(span(FULL)) + for c in info[r]['blocking'] or recv[r]: bcap &= set(span(E[c])) + bcap = tuple(basis(tuple(bcap))) + best = None; dE = len(E[r]); split_regions = []; best_enumerated_only = [False] + for d in range(len(Lr), len(capb) + 1): + D = dE - d + if D < 2: continue + for cost, a in split_costs(D): + f = d + a + feasible = True; enumerated = False + if leq(Lr, bcap) and (f == len(Lr) + 1 and d == len(Lr) or f == len(bcap)) and f <= len(bcap): + enumerated = True + # enumerate first frames J1 of dim f with L_r <= J1 <= bcap; rank test with partners at J1 + cands = set() + if f == len(bcap): cands.add(bcap) + else: + for z in span(bcap): + if z and not leq((z,), Lr): cands.add(join(Lr, (z,))) + ok = False; regions = set() + for J1 in cands: + P = [s for s in EI if s != r and leq(Lof[s], J1) and leq(J1, E[s])] + if not P: continue + cols = [r] + P + outs = [c for c in Rs if c != r and not (r in Rs and leq(E[r], E[c])) and any(M[c].get(q) for q in cols)] + if rank([[M[c].get(q, Q(0)) for q in cols] for c in outs]) <= len(P): + ok = True + SJ1 = set(span(J1)); need = False + for c in (info[r]['blocking'] or recv[r]): + SEc = set(span(E[c])) + if not (SJ1 < SEc) or leq(Lof[c], J1): continue + if any(h != r and leq(Lof[h], J1) and leq(J1, E[h]) and (set(span(E[h])) & SEc) > SJ1 for h in Rs): continue + ride = False + for h in EI: # a BLOCKED full-end register whose own visit could sit above J1 + if h == r or h in Rs or V <= h < 2 * V or not leq(Lof[h], J1): continue + if status.get(h) != 'BLOCKED': continue + caph = set(span(FULL)) + for c2 in recv.get(h, []): caph &= set(span(E[c2])) + if (caph & SEc) > SJ1: ride = True; break + if ride: continue + need = True; break + regions.add(J1 if need else None) + feasible = ok + if ok: split_regions.append((cost, regions)) + elif f > len(bcap): + feasible = False + if feasible: + if best is None or cost < best: + best = cost; best_enumerated_only[0] = enumerated + elif cost == best and not enumerated: + best_enumerated_only[0] = False + break + if best is None: + best = min(c for c, a in split_costs(dE - len(capb))) if dE - len(capb) >= 2 else 0 + # a lift region is forced only if EVERY feasible enumerated split of minimal cost needs a lift out of the same region and + # no split without enumeration (assumed feasible, optimistic) achieves the same cost + forced = None + mins = [rg for c, rg in split_regions if c == best] + if mins and best_enumerated_only[0]: + allr = set().union(*mins) + if None not in allr and len(allr) == 1: forced = next(iter(allr)) + return best, forced + lift_regions = {} + for r, st in status.items(): + if st == 'BLOCKED': + extra[r], reg_ = blocked_extra(r) + if reg_ is not None: lift_regions.setdefault(reg_, []).append(r) + # OPEN-but-forced (non-restored r only): + # zero-sum: every partner frame J for receiver c needs a lift (J strictly inside E_c, c cannot sit at J), no restored + # register can sit at J and climb inside E_c, all partners are non-restored and not BLOCKED -> r or a partner pays; + # rank: for receiver c every partner frame J fails the rank test on [r] + P_J -> r itself must climb above J. + groups = []; Rs_list = sorted(Rs); group_frames = {} + for r, st in status.items(): + if st != 'OPEN' or r in Rs or not recv[r]: continue + rank_cache = {} + kind = None; payers = {r} + for c, ps in info[r]['pc'].items(): + if not ps: continue + zs = True; rk_fail = True; seenJ = {} + SEc = SP(E[c]) + for s, J in ps: + SJ = SP(J) + if not (SJ < SEc) or SL[c] <= SJ: zs = False + if zs and any(SL[h] <= SJ and SJ <= SE[h] and (SE[h] & SEc) > SJ for h in Rs_list if h != r): zs = False + if s in Rs or status.get(s) == 'BLOCKED': zs = False + if rk_fail and J not in seenJ: + P = [h for h in EI if h != r and SL[h] <= SJ and SJ <= SE[h]] + key = frozenset(P) + if key not in rank_cache: + cols = [r] + P; outs = [c2 for c2 in Rs if any(M[c2].get(q) for q in cols)] + rank_cache[key] = rank([[M[c2].get(q, Q(0)) for q in cols] for c2 in outs]) <= len(P) + seenJ[J] = rank_cache[key] + if seenJ[J]: rk_fail = False + payers.add(s) + if rk_fail: kind = 'rank'; payers = {r}; break + if zs and kind is None: kind = 'zero-sum' + if kind: groups.append((r, payers, kind)); group_frames[r] = [(J, c) for c, ps in info[r]['pc'].items() for s, J in ps] + # lift (the base's 61 case, checked by its premises): restored c whose entry content q sits inside V (E_q <= V) must be + # carried above V inside E_c by a full-end register when no restored register can sit inside V and end above V in E_c. + lifts = [] + for c in Rs: + for q, x in M[c].items(): + if q == c or not x or q not in Rs: continue + Vq = E[q] + if leq(E[c], Vq) or leq(Lof[c], Vq): continue + if any(h in Rs and leq(Lof[h], Vq) and not leq(E[h], Vq) and (set(span(E[h])) & set(span(E[c]))) > set(span(Vq)) for h in EI): continue + lifts.append((c, Vq)) + lift_keys = [] + for c, Vq in sorted({(c, Vq) for c, Vq in lifts}): + payers = {h for h in EI if h not in Rs and not (V <= h < 2 * V) and leq(Lof[h], Vq)} + ride = False + for h in payers: + if h in extra: # BLOCKED: could its forced visit frame sit strictly above Vq inside E_c? + caph = set(span(EI[h]['U'])) | set(span(FULL)) + caph = set(span(FULL)) + for c2 in recv.get(h, []): caph &= set(span(E[c2])) + if (caph & set(span(E[c]))) > set(span(Vq)): ride = True; break + if ride: continue + lift_keys.append((c, Vq, frozenset(payers))) + merged = [] + for r, P, kind in groups: + hit = [m for m in merged if m[1] & P] + rs_ = {r}; Ps = set(P) + for m in hit: rs_ |= m[0]; Ps |= m[1] + merged = [m for m in merged if m not in hit] + [(rs_, Ps)] + open_forced = {('open',) + tuple(sorted(a)): CC[1] * 2 - CC[2] for a, _ in merged} + regions_counted = set() + for c, Vq, pay in lift_keys: + if any(pay & m[1] for m in merged): continue # shares a payer with a counted open group: count once + if Vq in regions_counted: continue + regions_counted.add(Vq); open_forced[('lift', c, Vq)] = CC[1] * 2 - CC[2] + def shareable(J1, lift_recv, members): + for r0 in members: + for J, c in group_frames.get(r0, []): + Jj = join(J, J1) + if len(Jj) >= 9: continue + if any(leq(Jj, E[c]) and leq(Jj, E[c1]) for c1 in lift_recv): return True + return False + for J1, rs_ in lift_regions.items(): + if J1 in regions_counted: continue + pay = {h for h in EI if h not in Rs and not (V <= h < 2 * V) and leq(Lof[h], J1)} + lift_recv = sorted({c for r0 in rs_ for c in (info[r0]['blocking'] or recv[r0]) if set(span(J1)) < set(span(E[c])) and not leq(Lof[c], J1)}) + if any((pay & m[1]) and shareable(J1, lift_recv, m[0]) for m in merged): continue + regions_counted.add(J1); open_forced[('blocked-lift',) + tuple(sorted(rs_)) + (J1,)] = CC[1] * 2 - CC[2] + tot = sum(extra.values()) + sum(open_forced.values()) + res = dict(bound=lb['cost'] + tot, LB_forced=lb['cost'], extras_blocked=sum(extra.values()), extras_open=sum(open_forced.values()), + n_blocked=len(extra), n_open_forced=len(open_forced), lifts=[k for k in open_forced if k[0] != 'open']) + if detail: res.update(extra=extra, open_groups=[(sorted(a), sorted(b)) for a, b in merged], open_kinds=[(r, k) for r, P, k in groups], status=status, info={r: dict(recv=v['recv'], leak=v['leak'], blocking=v['blocking']) for r, v in info.items()}) + return res + +if __name__ == '__main__': + w = W(sys.argv[1]); t0 = time.time(); b = bound(w, detail=True); cur = solve(w) + print('current', cur['cost'], 'bound', b['bound'], 'gap', cur['cost'] - b['bound'], 'LB_forced', b['LB_forced'], 'blocked', b['n_blocked'], b['extras_blocked'], + 'open-forced', b['n_open_forced'], b['extras_open'], 'lifts', b['lifts'], round(time.time() - t0, 2), 's') + print('open groups', b['open_groups']) + print('open kinds', b['open_kinds']) diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/crosscheck_lanek.py b/research/rank7-skip-restore-optimum/evidence/laneK/crosscheck_lanek.py new file mode 100644 index 0000000000..9a7292c79d --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/crosscheck_lanek.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Cross-check of this package's stdlib bound (restore_bound.py) against lane K's CURRENT bound.py / lbforced.py +(the r12 BORROW-WORD harness bp.py on the #1186 frame toolkit; numpy). Not part of the registered replay: it needs lane +K's working tree. Usage: crosscheck_lanek.py LANE_K_CODE_DIR PACKAGE_DIR OUT.json. Marius-Paul Dumitrean, with +substantial AI assistance (Claude Code).""" +import gzip, hashlib, json, sys +from fractions import Fraction as Q +from pathlib import Path +lane, pkg, out = Path(sys.argv[1]), Path(sys.argv[2]), Path(sys.argv[3]) +sys.path.insert(0, str(lane)) +import bound as KB # lane K, current +import lbforced as KL +sys.path.insert(0, str(pkg)) +import frames_exact as FX, restore_bound as RB +rows_out = [] +for name in ('3042-base', '3042-extra', '2979-base', '2979-extra'): + w = json.loads(gzip.decompress((pkg / ('data/WORD-%s.json.gz' % name)).read_bytes())) + for variant in ('word', 'emptied-restore'): + x = dict(w) + if variant == 'emptied-restore': + x['restore'] = [] + rows = RB.entry_rows(x) + Mc, rk = RB.coordinates(rows, {c: {(c, ()): Q(1)} for c in RB.restored(x)}) + M = {q: {q: Q(1)} for q in RB.live_registers(x)} + M.update({c: dict(v) for c, v in Mc.items()}) + kb = KB.bound(x, M=M) + kl = KL.lb_forced(x, M=M) + pb = RB.bound(x) + rec = dict(word=name, variant=variant, laneK_bound=kb['bound'], laneK_LB_forced=kb['LB_forced'], laneK_lb_forced_direct=kl['cost'], + laneK_caps=kl['ncaps'], laneK_blocked=[kb['n_blocked'], kb['extras_blocked']], laneK_open=[kb['n_open_forced'], kb['extras_open']], + package_bound=pb['bound'], package_LB_forced=pb['LB_forced'], package_caps=pb['forced_caps'], + package_blocked=[pb['blocked'], pb['extras_blocked']], package_groups=[pb['groups'], pb['extras_open']]) + rec['agree'] = (rec['laneK_bound'] == rec['package_bound'] and rec['laneK_LB_forced'] == rec['package_LB_forced'] == rec['laneK_lb_forced_direct'] + and rec['laneK_caps'] == rec['package_caps']) + rows_out.append(rec) + print(rec, flush=True) +assert all(r['agree'] for r in rows_out) +res = dict(status='PASS_LANEK_CROSSCHECK', laneK_files={f: hashlib.sha256((lane / f).read_bytes()).hexdigest() for f in ('bound.py', 'lbforced.py')}, + rows=rows_out) +out.write_text(json.dumps(res, indent=1, sort_keys=True) + '\n') +print('PASS_LANEK_CROSSCHECK', len(rows_out)) diff --git a/research/rank7-skip-restore-optimum/evidence/laneK/lbforced.py b/research/rank7-skip-restore-optimum/evidence/laneK/lbforced.py new file mode 100644 index 0000000000..b3434c7666 --- /dev/null +++ b/research/rank7-skip-restore-optimum/evidence/laneK/lbforced.py @@ -0,0 +1,37 @@ +"""lbforced.py WORD -- frame lower bound for ANY exact restore-only rewrite of the word (auditor semantics, A/B/warps/cut/ +endpoints fixed). Every restored helper c ends with its own input, a FIXED combination M[c][.] of the (independent) restore- +entry rows; so for every register r with M[c][r] != 0 the content of r must reach c along gates with nested frames inside E_c, +and r's restore-entry frame is inside E_c. LB = certified optimum of the word with an EMPTY restore and the caps +cap[r] = intersection of E_c over those c (applied from r's last pre-restore vertex to its end climb; toolkit BorrowGraph caps). +Any exact rewrite R satisfies the caps, and merging its restore-phase jumps of every register into one end climb never costs +more (c_{a+b} <= c_a + c_b), so cost(R) >= LB. If LB == cost(current word), the current restore is optimal in the whole class.""" +import sys +sys.path.insert(0, '/private/tmp/claude-501/-Users-mdumitrean-Desktop-dev-aigent-math-prime/c80ebb8e-fc28-4d1d-b7ef-b214d4660f98/scratchpad/r15/agents/K/code') +from screen4 import * +def lb_forced(w, extra_caps=None, M=None): + if M is None: M = restore_map(w) + E = end_frames(w); Rs = restored_set(w) + capf = {} + for c in Rs: + for r, x in M[c].items(): + if r == c or not x: continue + capf.setdefault(r, set(span(FULL))) + capf[r] &= set(span(E[c])) + if extra_caps: + for r, U in extra_caps.items(): + capf.setdefault(r, set(span(FULL))); capf[r] &= set(span(U)) + w0 = dict(w); w0['restore'] = [] + w2, meta = bp.build_problem(w0) + al = aliases(w0, meta) + caps = {al[r][-1]: tuple(basis(tuple(U))) for r, U in capf.items()} + g = bp.BorrowGraph(w2, meta['eq_end'], check_literal=False, tail_mutable=True, caps=caps, cut_equality=True) + res = bp.F.optimal_frames(w2, bp.costs(), check_literal=False, graph=g) + cd = bp.centre_descents(w0); prof = collections.Counter(res['profile']); prof.update(cd) + return dict(cost=res['cost'] + bp.costs().profile_cost(cd), certified=res['certified'], profile=dict(sorted(prof.items())), + ncaps=len(caps), assign=res['assign'], graph=g, meta=meta, w0=w0) +if __name__ == '__main__': + w = W(sys.argv[1]); cur = solve(w) + lb = lb_forced(w) + print('current', cur['cost'], cur['profile']) + print('LB_forced', lb['cost'], lb['certified'], lb['profile'], 'caps', lb['ncaps']) + print('gap (max possible gain of any exact restore-only rewrite)', cur['cost'] - lb['cost']) diff --git a/research/rank7-skip-restore-optimum/evidence/tail-exchange/TAIL-EXCHANGE-3042-base.jsonl.gz b/research/rank7-skip-restore-optimum/evidence/tail-exchange/TAIL-EXCHANGE-3042-base.jsonl.gz new file mode 100644 index 0000000000000000000000000000000000000000..3d6cfeeb2aff440f8581871be17f5ad6c0e0a5fa GIT binary patch literal 32643 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

17CVTdqeSBEPSl8P{(bspq4jb*URdNE+D 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

17CVTdqeSBEPSl8P{(bspq4jb*URdNE+D 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 inline problem with virtual registers split at warps (bp.build_problem).""" + R = w['report']['R'] + N = 2 * V + R + removed = set(w['removed']) + start = [(p,) for p in w['ports']] + [()] * (V + R) + for q, U in w.get('start_extra', {}).items(): + start[int(q)] = basis(tuple(U)) + end = [FULL9] * V + [perp_port(p) for p in w['ports']] + [FULL9] * R + for q, U in w.get('helper_final', {}).items(): + end[int(q)] = basis(tuple(U)) + starts = list(start) + finals = [None] * N + alias = list(range(N)) + eq_end = set() + nxt_virtual = [N] + + def close_and_split(r, fr, to): + cur = alias[r] + finals[cur] = basis(tuple(fr)) + eq_end.add(cur) + new = nxt_virtual[0] + nxt_virtual[0] += 1 + starts.append(basis(tuple(to))) + finals.append(None) + alias[r] = new + + def ren(e): + g = list(e) + if g[0] == 'add': + g[1] = alias[g[1]] + g[2] = alias[g[2]] + else: + g[1] = alias[g[1]] + return g + + npre = w.get('prelude_events', 0) + A_out = [] + A_idx = [] + for i, e in enumerate(w['A']): + if e[0] == 'warp': + if i >= npre: + raise ValueError('warp after prelude') + _, r, op, fr, to = e + close_and_split(r, fr, to) + else: + A_out.append(ren(e)) + A_idx.append(i) + centers_at_cut = [alias[q] for q in w['centers']] + byp = collections.defaultdict(list) + for op, rec in enumerate(w['warps'], 1): + byp[rec[0]].append(op) + B_out = [] + for p in range(len(w['B']) + 1): + for op in byp.get(p, []): + pos, lender, cols, U, E = w['warps'][op - 1] + close_and_split(lender, U, E) + if p < len(w['B']): + B_out.append(ren(w['B'][p])) + T_out = [ren(e) for e in w['restore']] + Nv = nxt_virtual[0] + for r in range(N): + a = alias[r] + if finals[a] is None: + finals[a] = end[r] + for r in removed: + starts[r] = () + finals[r] = () + if alias[r] != r: + raise ValueError('removed helper with a warp') + w2 = dict(A=A_out, B=B_out, _tail=T_out, ports=w['ports'], centers=centers_at_cut, center_frames=w['center_frames'], + target_levels=w.get('target_levels', {}), R=Nv - 2 * V, + _start_frames=[tuple(s) for s in starts], _final_frames=[tuple(f) for f in finals]) + meta = dict(N=N, Nv=Nv, eq_end=eq_end, A_idx=A_idx, virtual=Nv - N, removed=len(removed)) + return w2, meta + + +def aliases(w, meta): + """original register -> list of its virtual registers (warp segments) in solver order""" + N = meta['N'] + alias = {q: [q] for q in range(N)} + nxt = N + for e in w['A']: + if e[0] == 'warp': + alias[e[1]].append(nxt) + nxt += 1 + byp = collections.defaultdict(list) + for op, rec in enumerate(w['warps'], 1): + byp[rec[0]].append(op) + for p in range(len(w['B']) + 1): + for op in byp.get(p, []): + alias[w['warps'][op - 1][1]].append(nxt) + nxt += 1 + return alias + + +class FrameGraph: + """event graph of the inline problem (frames.Graph + bp.BorrowGraph, check_literal=False, tail_mutable=True)""" + + def __init__(self, w, eq_end, caps=None, cut_equality=True): + R = w['R'] + N = 2 * V + R + self.N = N + caps = caps or {} + nodes = [] + chains = [[] for _ in range(N)] + mutable = [] + start_frames = w['_start_frames'] + final_frames = w['_final_frames'] + tail = w.get('_tail', []) + + def node(regs, Fr, sec, index=None): + k = len(nodes) + nodes.append((tuple(regs), basis(tuple(Fr)), sec, index)) + for r in regs: + chains[r].append(k) + if sec in ('A', 'B', 'tail'): + mutable.append(k) + + for r in range(N): + node([r], start_frames[r], 'start') + for sec in ('A', 'B'): + if sec == 'B': + for r, Fr in zip(w['centers'], w['center_frames']): + node([r], Fr, 'cut') + for t in range(V): + node([V + t], w.get('target_levels', {}).get(str(t), []), 'cut') + for i, e in enumerate(w[sec]): + node(regs_of(e), e[-1] if e[-1] is not None else [], sec, i) + for i, e in enumerate(tail): + node(regs_of(e), e[-1], 'tail', i) + for r in range(N): + node([r], final_frames[r], 'end') + self.chains = chains + self.mutable = mutable + prev = {} + nxt = {} + for r, ch in enumerate(chains): + for p, q in zip(ch, ch[1:]): + prev[q, r] = p + nxt[p, r] = q + self.prev = prev + self.nxt = nxt + allowed = set(mutable) + lower = {} + upper = {} + for k, (regs, F0, sec, idx) in enumerate(nodes): + lower[k] = basis(tuple(x for r in regs for x in lower[prev[k, r]])) if k in allowed else F0 + if k in allowed: + for r in regs: + j = nxt.get((k, r)) + if j is None: + continue + if (cut_equality and sec == 'A' and nodes[j][2] == 'cut') or (nodes[j][2] == 'end' and r in eq_end): + lower[k] = basis(tuple(lower[k]) + tuple(nodes[j][1])) + elif sec != 'end': + for r in regs: + j = nxt.get((k, r)) + if j is not None and nodes[j][2] == 'end' and r in eq_end and span(F0) != span(nodes[j][1]): + raise Infeasible(('fixed vertex differs from its warp frame', k, sec, idx, r)) + for k in reversed(range(len(nodes))): + regs, F0, sec, idx = nodes[k] + if k in allowed: + U = set(span(FULL9)) + for r in regs: + U.intersection_update(span(upper[nxt[k, r]])) + for r in regs: + if r in caps and nodes[nxt[k, r]][2] in ('tail', 'end'): + U.intersection_update(span(caps[r])) + upper[k] = basis(tuple(U)) + if not leq(lower[k], upper[k]): + raise Infeasible(('L not inside U at mutable vertex', k, sec, idx)) + else: + upper[k] = F0 + if not leq(lower[k], F0): + raise Infeasible(('fixed vertex below its forced lower frame', k, sec, idx)) + for r in regs: + if (k, r) in nxt and not leq(F0, upper[nxt[k, r]]): + raise Infeasible(('fixed vertex above its successor cap', k, sec, idx)) + self.lower = lower + self.upper = upper + nodes = [((regs, lower[k], sec, idx) if (k in allowed and lower[k] == upper[k]) else (regs, F0, sec, idx)) + for k, (regs, F0, sec, idx) in enumerate(nodes)] + self.nodes = nodes + self.var = [k for k in mutable if lower[k] != upper[k]] + self.varset = set(self.var) + self.dom = {k: self._domain(k) for k in self.var} + adj = collections.defaultdict(set) + for (k, r), j in prev.items(): + if k in self.varset and j in self.varset: + adj[k].add(j) + adj[j].add(k) + comps = [] + remaining = set(self.var) + while remaining: + root = min(remaining) + stack = [root] + remaining.remove(root) + comp = [] + while stack: + k = stack.pop() + comp.append(k) + for j in adj[k] & remaining: + remaining.remove(j) + stack.append(j) + comps.append(sorted(comp)) + self.components = sorted(comps, key=lambda z: (-len(z), min(z))) + + def _domain(self, k): + L, U = self.lower[k], self.upper[k] + extras = [] + current = L + for v in U: + if v not in span(current): + extras.append(v) + current = basis(tuple(current) + (v,)) + d = len(extras) + if d > 5: + raise ValueError(('domain too large', k, d)) + spaces = {()} + frontier = [()] + while frontier: + nxt = [] + for S in frontier: + sp = set(span(S)) + for v in range(1, 1 << d): + if v not in sp: + T = basis(S + (v,)) + if T not in spaces: + spaces.add(T) + nxt.append(T) + frontier = nxt + + def lift(v): + z = 0 + for i, x in enumerate(extras): + if v >> i & 1: + z ^= x + return z + return sorted({basis(tuple(L) + tuple(lift(v) for v in S)) for S in spaces}) + + def frame(self, assign, k): + return assign[k] if k in self.varset else self.nodes[k][1] + + def profile(self, assign): + H_ = collections.Counter() + for (k, r), j in self.prev.items(): + d = len(self.frame(assign, k)) - len(self.frame(assign, j)) + if d: + H_[d] += 1 + return H_ + + +def solve_component(g, c, comp, max_tuples=VE_MAX_TUPLES): + """min-sum variable elimination over one component (frames.solve_component_ve); (cost, assignment) or None""" + cset = set(comp) + factors = [] + for (k, r), j in g.prev.items(): + if k in cset and j in cset: + tab = {} + for F in g.dom[j]: + for G in g.dom[k]: + if leq(F, G): + tab[(F, G)] = c[len(G) - len(F)] + factors.append(([j, k], tab)) + elif k in cset: + Fj = g.nodes[j][1] + factors.append(([k], {(F,): c[len(F) - len(Fj)] for F in g.dom[k]})) + elif j in cset: + Fk = g.nodes[k][1] + factors.append(([j], {(F,): c[len(Fk) - len(F)] for F in g.dom[j]})) + adj = {k: set() for k in comp} + for s, _ in factors: + if len(s) == 2: + adj[s[0]].add(s[1]) + adj[s[1]].add(s[0]) + gg = {v: set(nb) for v, nb in adj.items()} + order = [] + + def fill(v): + nb = list(gg[v]) + cnt = 0 + for i in range(len(nb)): + for j in range(i + 1, len(nb)): + if nb[j] not in gg[nb[i]]: + cnt += 1 + return cnt + while gg: + v = min(gg, key=lambda x: (fill(x), len(gg[x]), x)) + nb = list(gg[v]) + for i in range(len(nb)): + for j in range(i + 1, len(nb)): + gg[nb[i]].add(nb[j]) + gg[nb[j]].add(nb[i]) + for u in nb: + gg[u].discard(v) + del gg[v] + order.append(v) + active = [(list(s), dict(f)) for s, f in factors] + back = [] + for v in order: + group = [(s, f) for s, f in active if v in s] + rest = [(s, f) for s, f in active if v not in s] + cs, cf = list(group[0][0]), dict(group[0][1]) + for s, f in group[1:]: + common = [x for x in s if x in cs] + new = [x for x in s if x not in cs] + idx_s = {x: i for i, x in enumerate(s)} + idx_c = {x: i for i, x in enumerate(cs)} + byc = collections.defaultdict(list) + for key, val in f.items(): + byc[tuple(key[idx_s[x]] for x in common)].append((tuple(key[idx_s[x]] for x in new), val)) + nf = {} + for key, val in cf.items(): + for nk, nv in byc.get(tuple(key[idx_c[x]] for x in common), ()): + nf[key + nk] = val + nv + cs, cf = cs + new, nf + if len(cf) > max_tuples: + return None + vi = cs.index(v) + ns = cs[:vi] + cs[vi + 1:] + best = {} + arg = {} + for key, val in cf.items(): + ctx = key[:vi] + key[vi + 1:] + if ctx not in best or val < best[ctx]: + best[ctx] = val + arg[ctx] = key[vi] + back.append((v, ns, arg)) + active = rest + ([(ns, best)] if ns else [([], {(): min(best.values())})]) + total = sum(f.get((), 0) for s, f in active if not s) + assign = {} + for v, ns, arg in reversed(back): + assign[v] = arg[tuple(assign[x] for x in ns)] + return total, assign + + +def optimal_frames(g, c=None): + """exact optimum of the frame graph: exhaustive elimination per component plus fixed boundary edges""" + c = c or weights() + assign = {} + total = 0 + for comp in g.components: + res = solve_component(g, c, comp) if len(comp) <= VE_MAX_COMPONENT else None + if res is None: + raise ValueError(('component too wide for exact elimination', len(comp))) + cost, a = res + assign.update(a) + total += cost + fixed = 0 + for (k, r), j in g.prev.items(): + if k not in g.varset and j not in g.varset: + fixed += c[len(g.nodes[k][1]) - len(g.nodes[j][1])] + prof = g.profile(assign) + cost = total + fixed + if cost != profile_cost(prof, c): + raise ValueError('component accounting mismatch') + for (k, r), j in g.prev.items(): + if not leq(g.frame(assign, j), g.frame(assign, k)): + raise ValueError('returned assignment is not nested') + return dict(cost=cost, profile=prof, assign=assign) + + +def frame_optimum(w, caps=None): + """certified-model optimum of a BORROW-WORD; caps: {original register: cap frame at its last vertex before its end}""" + w2, meta = build_problem(w) + vcaps = {} + if caps: + al = aliases(w, meta) + vcaps = {al[r][-1]: basis(tuple(U)) for r, U in caps.items()} + g = FrameGraph(w2, meta['eq_end'], caps=vcaps) + res = optimal_frames(g) + cd = centre_descents(w) + prof = collections.Counter(res['profile']) + prof.update(cd) + return dict(cost=res['cost'] + profile_cost(cd), profile=dict(sorted(prof.items())), graph=g, meta=meta, + assign=res['assign'], variables=len(g.var), components=len(g.components), + largest_component=max((len(x) for x in g.components), default=0)) diff --git a/research/rank7-skip-restore-optimum/restore_bound.py b/research/rank7-skip-restore-optimum/restore_bound.py new file mode 100644 index 0000000000..cc03aa4fdc --- /dev/null +++ b/research/rank7-skip-restore-optimum/restore_bound.py @@ -0,0 +1,562 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Lower bound on the certified local cost of EVERY exact restore-only rewrite of a BORROW-WORD (stdlib only). + +A restore-only rewrite keeps the precondition, compensation, initial corrections, A (with its prelude), cut, warps, B, +start frames, helper end frames, removed helpers and buffers, and replaces the restore by an arbitrary scalar gate +sequence; all frames (A, B and restore) are re-solved. It is exact when PR2833's auditor (BORROW-WORD branch, vendored +unchanged) passes. The bound is + + bound(w) = LB_forced(w) + sum of forced restore-phase extras, + +where LB_forced is the exact frame optimum of w with an EMPTY restore and the forced entry caps, and the extras are +charged by the lemmas below (README.md, section "Proof"): + Lemma 1 auditor semantics: exact => every restored helper c ends with its own input row x_c and no live register keeps + a restored input c outside c (the auditor's forward `require`s at the end of restore); + Lemma 2 forced coordinates: restore-entry rows are linearly independent, so x_c = sum_q M[c][q] e_q is unique and every + exact restore realizes row c of its linear map equal to M[c]; + Lemma 3 forced caps: M[c][r] != 0 (r != c) => r is read on a path to c whose gate frames are nested inside E_c, hence + r's restore-entry frame F_r <= E_c; + Lemma 4 merge: replacing every register's restore-phase climbs by one end climb gives a feasible assignment of the + capped empty-restore problem and costs sum_r ov_r less (subadditive weights); + Lemma 5 delivery/cleaning: a receiver's content leaves r through a gate reading r at a frame inside E_c; a non-restored + register holding a restored input must be cleaned (written) below FULL (span of restored-input parts of FULL + registers never shrinks and ends at 0); + Lemma 6 departure (dual vectors): if r stays inside frame G until it jumps to a frame outside E_c for every c in O, + the nonzero dual vector d_r is supported on Z = {r} u {y : L_y <= G} and M[O][Z] d_r = 0; full column rank + of M[O][Z] therefore excludes that departure; + Lemma 7 lifts: content that sits at frame F (or inside a restored source's end V) and must reach a receiver that + cannot sit there is carried upward by a register that sits there; a non-restored carrier makes a visit + (>= 2c1 - c2), a blocked one needs >= 3 restore-phase jumps. +Marius-Paul Dumitrean, with substantial AI assistance (Claude Code). +""" +import collections +import copy +from fractions import Fraction as Q + +import frames_exact as FX + +AL = FX._load('rank7sro_audit_local', FX.HERE / 'vendor' / 'audit_local.py') # PR2833 auditor (walg_apply, run) +V = FX.V +basis, span, leq, join, meet, FULL9 = FX.basis, FX.span, FX.leq, FX.join, FX.meet, FX.FULL9 + + +# ------------------------------------------------------------------------------------------------ exact algebra +def live_registers(w): + n = 2 * V + w['report']['R'] + removed = set(w['removed']) + return [q for q in range(n) if q not in removed] + + +def restored(w): + return set(map(int, w['helper_final'])) + + +def is_target(q): + return V <= q < 2 * V + + +def program_pre_restore(w): + """the auditor's forward program up to the end of B (corrections, precondition, compensation, A, cut, B with warps)""" + corr = [['corr', t['target'], t['source'], tuple(t['operator_word']), Q(t['coefficient'])] for t in w['initial_corrections']] + prog = corr + w['precondition'] + w['compensation'] + w['A'] + w['cut'] + byp = {} + for op, rec in enumerate(w['warps'], 1): + byp.setdefault(rec[0], []).append(op) + for p in range(len(w['B']) + 1): + for op in byp.get(p, []): + prog.append(['warp', w['warps'][op - 1][1], op]) + if p < len(w['B']): + prog.append(w['B'][p]) + return prog + + +def entry_rows(w): + rows = {r: {(r, ()): Q(1)} for r in live_registers(w)} + for e in program_pre_restore(w): + AL.walg_apply(e, rows, False, 10 ** 6) + return rows + + +def run_restore(restore, rows): + rows = {r: dict(x) for r, x in rows.items()} + for e in restore: + AL.walg_apply(e, rows, False, 10 ** 6) + return rows + + +def end_conditions(w, rows_final, rows_entry=None): + """Lemma 1 end-of-restore conditions: (dirty restored helpers, leaks, changed targets)""" + R = restored(w) + dirty = sorted(c for c in R if rows_final[c] != {(c, ()): Q(1)}) + leaks = {} + for r, row in rows_final.items(): + ks = sorted({var for var, word in row if var in R and var != r}) + if ks: + leaks[r] = ks + targets = sorted(t for t in rows_final if is_target(t) and rows_entry is not None and rows_final[t] != rows_entry[t]) + return dirty, leaks, targets + + +def _axpy(dst, src, f): + for k, x in src.items(): + y = dst.get(k, Q(0)) + f * x + if y: + dst[k] = y + else: + dst.pop(k, None) + + +def coordinates(rows, targets): + """coordinates of target rows in the basis of `rows` (Gaussian elimination with combination tracking, Fractions); + raises if the rows are dependent or a target is outside their span""" + order = lambda k: (k[0], len(k[1]), k[1]) + piv = {} + for q in sorted(rows): + v = dict(rows[q]) + comb = {q: Q(1)} + while v: + k = min(v, key=order) + if k in piv: + pr, pc = piv[k] + f = -v[k] / pr[k] + _axpy(v, pr, f) + _axpy(comb, pc, f) + else: + piv[k] = (v, comb) + break + else: + raise ValueError(('restore-entry rows are dependent', q)) + out = {} + for name, t in targets.items(): + v = dict(t) + comb = {} + while v: + k = min(v, key=order) + if k not in piv: + raise ValueError(('target outside the span of the entry rows', name, k)) + pr, pc = piv[k] + f = v[k] / pr[k] + _axpy(v, pr, -f) + _axpy(comb, pc, f) + out[name] = comb + return out, len(piv) + + +def restore_map(w, restore=None): + """register-level linear map of a restore program (final_r = sum_q map[r][q] entry_q)""" + restore = w['restore'] if restore is None else restore + M = {q: {q: Q(1)} for q in live_registers(w)} + for g in restore: + if g[0] == 'add': + t, s, c = g[1], g[2], Q(g[3], g[4]) + row = dict(M[t]) + for k, x in M[s].items(): + y = row.get(k, Q(0)) + c * x + if y: + row[k] = y + else: + row.pop(k, None) + M[t] = row + else: + q = Q(g[2], g[3]) + M[g[1]] = {k: q * x for k, x in M[g[1]].items()} + return M + + +def end_frames(w): + n = 2 * V + w['report']['R'] + E = {} + for q in range(n): + if q < V: + E[q] = FULL9 + elif q < 2 * V: + E[q] = FX.perp_port(w['ports'][q - V]) + else: + E[q] = FULL9 + for q, U in w['helper_final'].items(): + E[int(q)] = basis(tuple(U)) + return E + + +def rank(rows): + m = [list(r) for r in rows if any(r)] + if not m: + return 0 + rk = 0 + ncol = len(m[0]) + for c in range(ncol): + piv = next((i for i in range(rk, len(m)) if m[i][c] != 0), None) + if piv is None: + continue + m[rk], m[piv] = m[piv], m[rk] + for i in range(len(m)): + if i != rk and m[i][c] != 0: + f = m[i][c] / m[rk][c] + m[i] = [a - f * b for a, b in zip(m[i], m[rk])] + rk += 1 + return rk + + +# ------------------------------------------------------------------------------------------------ frames +def forced_caps(M, E, R): + """Lemma 3: cap[r] = intersection of E_c over restored c != r with M[c][r] != 0; receivers per register""" + capf = {} + recv = collections.defaultdict(list) + for c in sorted(R): + for r, x in M[c].items(): + if r == c or not x: + continue + recv[r].append(c) + capf.setdefault(r, set(span(FULL9))) + capf[r] &= set(span(tuple(E[c]))) + return {r: basis(tuple(U)) for r, U in capf.items()}, {r: sorted(v) for r, v in recv.items()} + + +def empty_restore(w): + w0 = dict(w) + w0['restore'] = [] + return w0 + + +def lb_forced(w, caps): + return FX.frame_optimum(empty_restore(w), caps=caps) + + +def entry_bounds(w, lb): + """per live register: L (forward lower bound) and U (cap from its other registers) at its last pre-restore vertex, + in the capped empty-restore graph (valid for every exact restore-only rewrite)""" + g = lb['graph'] + al = FX.aliases(w, lb['meta']) + removed = set(w['removed']) + out = {} + mutable = set(g.mutable) + for q, segs in al.items(): + if q in removed: + continue + v = segs[-1] + last = None + for k in g.chains[v]: + if g.nodes[k][2] in ('tail', 'end'): + break + last = k + L = tuple(g.lower[last]) + if last in mutable: + U = set(span(FULL9)) + for t in g.nodes[last][0]: + if t == v: + continue + j = g.nxt.get((last, t)) + if j is not None: + U &= set(span(tuple(g.upper[j]))) + U = basis(tuple(U)) + else: + U = tuple(lb['assign'].get(last, g.nodes[last][1])) + out[q] = (L, U) + return out + + +def subspaces_between(A, B): + """all subspaces S with A <= S <= B, sorted by (dim, basis)""" + extras = [] + cur = basis(tuple(A)) + for v in basis(tuple(B)): + if v not in span(cur): + extras.append(v) + cur = basis(cur + (v,)) + d = len(extras) + spaces = {()} + frontier = [()] + while frontier: + nxt = [] + for Sb in frontier: + sp = set(span(Sb)) + for v in range(1, 1 << d): + if v not in sp: + T = basis(Sb + (v,)) + if T not in spaces: + spaces.add(T) + nxt.append(T) + frontier = nxt + + def lift(v): + z = 0 + for i, x in enumerate(extras): + if v >> i & 1: + z ^= x + return z + return sorted({basis(tuple(A) + tuple(lift(v) for v in Sb)) for Sb in spaces}, key=lambda s: (len(s), s)) + + +def compositions(D, kmin): + out = [] + + def rec(rem, pre): + if rem == 0: + if len(pre) >= kmin: + out.append(tuple(pre)) + return + for a in range(1, rem + 1): + rec(rem - a, pre + [a]) + rec(D, []) + return out + + +# ------------------------------------------------------------------------------------------------ the bound +def bound(w, rows=None, M=None, need_lb=None): + """the restore lower bound with its complete certificate (JSON-serializable)""" + c = FX.weights() + visit_unit = 2 * c[1] - c[2] + R = restored(w) + E = end_frames(w) + if rows is None: + rows = entry_rows(w) + if M is None: + Mc, rk = coordinates(rows, {x: {(x, ()): Q(1)} for x in R}) + M = {q: dict(v) for q, v in Mc.items()} + caps, recv = forced_caps(M, E, R) + lb = need_lb if need_lb is not None else lb_forced(w, caps) + LU = entry_bounds(w, lb) + live = [q for q in LU if not is_target(q)] + L = {q: LU[q][0] for q in LU} + U = {q: LU[q][1] for q in LU} + SL = {q: set(span(L[q])) for q in live} + SE = {q: set(span(E[q])) for q in live} + if not all(len(E[x]) < 9 for x in R): + raise ValueError('a restored helper ends at FULL') + if any(M[x].get(t) for x in R for t in range(V, 2 * V)): + raise ValueError('a restored helper needs a target row') + leak = {x: (sorted({var for var, word in rows[x] if var in R and var != x}) if x not in R else []) for x in live} + cap = {x: caps.get(x, FULL9) for x in live} + + def P_at(G, x): + SG = set(span(G)) + return [y for y in live if y != x and SL[y] <= SG and SG <= SE[y]] + dep_cache = {} + + def departure_impossible(x, G): + key = (x, G) + if key not in dep_cache: + SG = set(span(G)) + Z = [x] + [y for y in live if y != x and SL[y] <= SG] + O = [cc for cc in sorted(R) if cc != x and not leq(E[x], E[cc])] + mat = [[M[cc].get(q, Q(0)) for q in Z] for cc in O] + dep_cache[key] = (rank([r_ for r_ in mat if any(r_)]) == len(Z), len(Z)) + return dep_cache[key][0] + + def partner_exists(x, X): + if not leq(L[x], X): + return False + for s in live: + if s == x: + continue + J = join(L[x], L[s]) + if len(J) < 9 and leq(J, X) and leq(J, E[s]): + return True + return False + status = {} + info = {} + for x in live: + rx = recv.get(x, []) + if not rx and not leak[x]: + continue + rX = [cc for cc in rx if not leq(E[x], E[cc])] + blocking = [cc for cc in rX if not partner_exists(x, meet(U[x], E[cc]))] + leakblock = bool(leak[x]) and not partner_exists(x, U[x]) + status[x] = 'BLOCKED' if (blocking or leakblock) else 'OPEN' + info[x] = dict(receivers=rx, leaks=leak[x], blocking=blocking, leak_blocked=leakblock) + beta, min3, why = {}, {}, {} + for x, st in status.items(): + if st != 'BLOCKED': + continue + dE = len(E[x]) + FU = meet(U[x], cap[x], E[x]) + rX = [cc for cc in recv.get(x, []) if not leq(E[x], E[cc])] + rcap = meet(E[x], *[E[cc] for cc in rX]) if rX else E[x] + fmax = min(len(rcap), 8) + if not leq(L[x], FU): + raise ValueError(('empty restore-entry interval', x)) + dmin, dmax = len(L[x]), len(FU) + best2 = None + excluded = [] + for G in (subspaces_between(L[x], rcap) if leq(L[x], rcap) else []): + f = len(G) + if f >= dE or f > fmax or f == dmin: + continue + if not P_at(G, x): + excluded.append(dict(frame=list(G), why='no register can sit at G')) + continue + if departure_impossible(x, G): + excluded.append(dict(frame=list(G), why='departure from G: M[O][Z] full column rank', Z=dep_cache[(x, G)][1])) + continue + dG = len(meet(G, FU)) + for d in range(dmin, min(dmax, dG, f - 1) + 1): + o = c[f - d] + c[dE - f] - c[dE - d] + if best2 is None or o < best2[0]: + best2 = (o, d, f, G) + best3 = None + for d in range(dmin, dmax + 1): + for parts in compositions(dE - d, 3): + if d + parts[0] > fmax: + continue + o = sum(c[a] for a in parts) - c[sum(parts)] + if best3 is None or o < best3[0]: + best3 = (o, d, parts) + if best2 is None and best3 is None: + raise ValueError(('no admissible restore chain', x)) + beta[x] = min(b[0] for b in (best2, best3) if b is not None) + min3[x] = best3[0] if best3 is not None else None + why[x] = dict(two_jump=(dict(overhead=best2[0], entry_dim=best2[1], visit_dim=best2[2], visit_frame=list(best2[3])) + if best2 else None), + three_or_more=(dict(overhead=best3[0], entry_dim=best3[1], jumps=list(best3[2])) if best3 else None), + excluded_two_jump_frames=excluded, entry_dims=[dmin, dmax], first_frame_cap=list(rcap)) + + def blocked_cheap_lifter(h): + """a blocked register has no gate at its entry frame: carrying content upward needs >= 3 restore-phase jumps""" + return min3[h] is None or min3[h] < beta[h] + visit_unit + groups = [] + open_info = {} + for x, st in sorted(status.items()): + if st != 'OPEN' or x in R or not recv.get(x): + continue + FU = meet(U[x], cap[x], E[x]) + feasible = [] + rejected = [] + for F in subspaces_between(L[x], FU): + if len(F) >= 9: + continue + P = P_at(F, x) + if not P: + rejected.append(dict(frame=list(F), why='no reader at F')) + continue + if departure_impossible(x, F): + rejected.append(dict(frame=list(F), why='departure from F: M[O][Z] full column rank', Z=dep_cache[(x, F)][1])) + continue + feasible.append((F, P)) + if not feasible: + groups.append(dict(members=[x], kind='forced-visit', register=x)) + open_info[x] = dict(kind='forced-visit', rejected_skip_frames=rejected) + continue + payers = {x} + charged = True + frames_ = [] + for F, P in feasible: + SF = set(span(F)) + needy = [] + for cc in recv[x]: + if set(span(L[cc])) <= SF: + continue + if any(h in R and (SE[h] & SE[cc]) > SF for h in P): + continue + needy.append(cc) + if not needy: + charged = False + frames_.append(dict(frame=list(F), free=True)) + break + N = [h for h in P if h not in R] + frames_.append(dict(frame=list(F), needy_receivers=needy, carriers=N)) + payers |= set(N) + if not charged: + open_info[x] = dict(kind='free-skip', skip_frames=frames_) + continue + cheap = sorted(h for h in payers if status.get(h) == 'BLOCKED' and blocked_cheap_lifter(h)) + if cheap: + open_info[x] = dict(kind='uncharged (blocked carrier could lift inside its forced visit)', carriers=cheap) + continue + groups.append(dict(members=sorted(payers), kind='zero-sum', register=x)) + open_info[x] = dict(kind='zero-sum', skip_frames=frames_, rejected_skip_frames=rejected) + lifts = [] + for cc in sorted(R): + for q in sorted(M[cc]): + if q == cc or q not in R or not M[cc][q]: + continue + Vq = E[q] + SV = set(span(Vq)) + if leq(E[cc], Vq) or leq(L[cc], Vq): + continue + VE = meet(Vq, E[cc]) + SVE = set(span(VE)) + free = [h for h in live if h in R and h not in (q, cc) and SL[h] <= SVE and not (SE[h] & SE[cc]) <= SV] + if free: + continue + N = sorted(h for h in live if h not in R and SL[h] <= SVE) + if not N or any(status.get(h) == 'BLOCKED' and blocked_cheap_lifter(h) for h in N): + continue + lifts.append(dict(members=N, kind='lift', receiver=cc, source=q, region=list(Vq))) + merged = [] + for grp in groups + lifts: + P = set(grp['members']) + hit = [m for m in merged if m['members'] & P] + mem = set(P) + parts = [grp] + for m in hit: + mem |= m['members'] + parts += m['parts'] + merged = [m for m in merged if m not in hit] + [dict(members=mem, parts=parts)] + merged = sorted(merged, key=lambda m: min(m['members'])) + extras_blocked = sum(beta.values()) + extras_open = len(merged) * visit_unit + return dict(bound=lb['cost'] + extras_blocked + extras_open, LB_forced=lb['cost'], LB_profile={str(k): v for k, v in lb['profile'].items()}, + forced_caps=len(caps), caps={str(r): dict(cap=list(U), receivers=recv[r]) for r, U in sorted(caps.items())}, + blocked=len(beta), extras_blocked=extras_blocked, groups=len(merged), extras_open=extras_open, + beta={str(x): v for x, v in sorted(beta.items())}, why={str(x): v for x, v in sorted(why.items())}, + status={str(x): v for x, v in sorted(status.items())}, info={str(x): v for x, v in sorted(info.items())}, + open_info={str(x): v for x, v in sorted(open_info.items())}, + merged=[dict(members=sorted(m['members']), parts=[dict((k, v) for k, v in p.items() if k != 'members') for p in m['parts']]) + for m in merged], + _lb=lb, _LU=LU, _M=M, _E=E, _rows=rows) + + +# ------------------------------------------------------------------------------------------------ literal itineraries +def literal_restore_chains(w): + """per register: literal frame at restore entry and its literal restore-phase jumps (the auditor's climb order)""" + R_ = w['report']['R'] + n = 2 * V + R_ + start = [(p,) for p in w['ports']] + [()] * (V + R_) + for q, U in w.get('start_extra', {}).items(): + start[int(q)] = basis(tuple(U)) + E = end_frames(w) + cur = [basis(tuple(s)) for s in start] + npre = w.get('prelude_events', 0) + for e in w['A'][:npre]: + if e[0] == 'warp': + cur[e[1]] = basis(tuple(e[4])) + else: + for q in FX.regs_of(e): + cur[q] = basis(tuple(e[-1])) + for e in w['A'][npre:]: + for q in FX.regs_of(e): + cur[q] = basis(tuple(e[-1])) + byp = {} + for op, rec in enumerate(w['warps'], 1): + byp.setdefault(rec[0], []).append(op) + for p in range(len(w['B']) + 1): + for op in byp.get(p, []): + rec = w['warps'][op - 1] + if cur[rec[1]] != basis(tuple(rec[3])): + raise ValueError(('literal warp frame mismatch', op)) + cur[rec[1]] = basis(tuple(rec[4])) + if p < len(w['B']): + for q in FX.regs_of(w['B'][p]): + cur[q] = basis(tuple(w['B'][p][-1])) + entry = list(cur) + seq = collections.defaultdict(list) + for i, e in enumerate(w['restore']): + for q in FX.regs_of(e): + F = basis(tuple(e[-1])) + if not leq(cur[q], F): + raise ValueError(('literal restore frame not monotone', i, q)) + if len(F) > len(cur[q]): + seq[q].append(('R%d' % i, len(F), len(F) - len(cur[q]))) + cur[q] = F + c = FX.weights() + out = {} + for q in live_registers(w): + if not leq(cur[q], E[q]): + raise ValueError(('literal end frame below current frame', q)) + jumps = list(seq.get(q, [])) + if len(E[q]) > len(cur[q]): + jumps.append(('end', len(E[q]), len(E[q]) - len(cur[q]))) + tot = sum(j for _, _, j in jumps) + ov = sum(c[j] for _, _, j in jumps) - (c[tot] if tot else 0) + out[q] = dict(entry_dim=len(entry[q]), entry_frame=list(entry[q]), jumps=[list(j) for j in jumps], overhead=ov) + return out diff --git a/research/rank7-skip-restore-optimum/run_registered.py b/research/rank7-skip-restore-optimum/run_registered.py new file mode 100644 index 0000000000..a9772619b4 --- /dev/null +++ b/research/rank7-skip-restore-optimum/run_registered.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Registered check (standard library only): complete package inventory (MANIFEST.json) and pins (PINS.json); verify.py +and census.py rerun in a temporary directory, their regenerated receipts byte-equal to certificates/; lane K's stored +receipts (evidence/laneK/: the r12-harness NEGATIVE certificates, the cross-check of lane K's current bound.py and +lbforced.py) bound to this package's recomputation. Structure follows our PR2942/PR2979 run_registered.py (Mason Hale's +PR2917 lineage). Marius-Paul Dumitrean, with substantial AI assistance (Claude Code). +""" +import hashlib +import json +import os +import subprocess +import sys +import tempfile +from pathlib import Path + +P = Path(__file__).resolve().parent +LANEK = {'bound.py': '6b1479b436c4f01bb32f771aa06af3d2260adee5dd5a5e2bf568b0192cee69d8', + 'lbforced.py': 'bd81e3f4460f61ef81e15e76ab25be5f8a9d7b71bb7dcbbf7a87873ca5398341'} + + +def require(ok, message): + if not ok: + raise SystemExit('FAIL: ' + message) + + +def sha(p): + return hashlib.sha256(p.read_bytes()).hexdigest() + + +def tree(): + require(not any(f.is_symlink() for f in P.rglob('*')), 'no symlinks') + return {f.relative_to(P).as_posix(): sha(f) for f in P.rglob('*') + if f.is_file() and f.name != 'MANIFEST.json' and '__pycache__' not in f.parts} + + +def read(rel): + return json.loads((P / rel).read_bytes()) + + +def main(): + manifest = read('MANIFEST.json') + require(tree() == manifest, 'complete package inventory (MANIFEST.json)') + pins = read('PINS.json') + require(all(sha(P / rel) == h for rel, h in pins.items()), 'PINS.json') + with tempfile.TemporaryDirectory(prefix='rank7-skip-restore-') as tmp: + out = Path(tmp) + env = dict(os.environ, PYTHONDONTWRITEBYTECODE='1') + for key in ('PYTHONOPTIMIZE', 'PYTHONPATH', 'PYTHONSTARTUP'): + env.pop(key, None) + for script in ('verify.py', 'census.py'): + log = out / (script + '.log') + with log.open('w') as stream: + r = subprocess.run([sys.executable, '-B', '-W', 'error', str(P / script), '--work', str(out / 'regen')], + env=env, stdin=subprocess.DEVNULL, stdout=stream, stderr=subprocess.STDOUT, cwd=str(out)) + text = log.read_text() + if r.returncode: + print(text[-6000:]) + raise SystemExit(r.returncode) + print('PASS', script, text.strip().splitlines()[-1][:200], flush=True) + regen = sorted(f.name for f in (out / 'regen').iterdir()) + stored = sorted(f.name for f in (P / 'certificates').iterdir()) + require(regen == stored, 'regenerated receipt set equals certificates/ (%s vs %s)' % (regen, stored)) + for name in regen: + require((out / 'regen' / name).read_bytes() == (P / 'certificates' / name).read_bytes(), 'receipt ' + name) + res = read('certificates/RESULT.json') + require(res['status'] == 'PASS_RANK7_SKIP_RESTORE_OPTIMUM' and res['no_new_kappa'] and res['providers'] == 2, 'RESULT status') + for prov in ('base', 'extra'): + cert = read('certificates/BOUND-3042-%s.json' % prov) + neg = read('evidence/laneK/NEGATIVE-3042-%s.json' % prov) + require(cert['bound'] == cert['certified_cost'] == neg['certified_cost'] == neg['LB_plus_forced'], 'lane K certified cost ' + prov) + require(cert['LB_forced'] == neg['LB_forced'] and cert['LB_profile'] == neg['LB_profile'], 'lane K LB_forced ' + prov) + require(cert['forced_caps'] == neg['forced_caps'] == len(neg['caps']), 'lane K cap count ' + prov) + require(all(cert['caps'][r]['cap'] == v['cap'] and cert['caps'][r]['receivers'] == v['receivers'] for r, v in neg['caps'].items()), + 'lane K caps (frames and receivers) ' + prov) + require(cert['literal_visits'] == neg['visits'] and cert['literal_visit_units'] == neg['sum_forced_extras'], 'lane K visits ' + prov) + require((cert['blocked'], cert['extras_blocked']) == (neg['blocked'], neg['blocked_units']), 'lane K blocked ' + prov) + require(cert['extras_open'] == neg['open_units'] and cert['payer_groups'] == neg['open_but_forced'], 'lane K open-but-forced ' + prov) + cross = read('evidence/laneK/CROSSCHECK.json') + require(cross['status'] == 'PASS_LANEK_CROSSCHECK' and cross['laneK_files'] == LANEK, 'cross-check names the current lane K files') + require(all(sha(P / 'evidence/laneK' / f) == h for f, h in LANEK.items()), 'pinned lane K files') + require(len(cross['rows']) == 8 and all(r['agree'] for r in cross['rows']), 'lane K current bound agrees on 4 words x 2 restores') + require(tree() == manifest, 'inventory unchanged by the replay') + print('PASS_RANK7_SKIP_RESTORE_OPTIMUM_REGISTERED cost=%d LB_forced=%d forced=%d caps=%d (both providers; calibration gap %d; ' + 'no new kappa)' % (res['certified_cost'], res['LB_forced'], res['forced_extras'], res['forced_caps'], res['calibration_gap_2979'])) + + +if __name__ == '__main__': + main() diff --git a/research/rank7-skip-restore-optimum/vendor/audit_local.py b/research/rank7-skip-restore-optimum/vendor/audit_local.py new file mode 100644 index 0000000000..8224873d04 --- /dev/null +++ b/research/rank7-skip-restore-optimum/vendor/audit_local.py @@ -0,0 +1,501 @@ +"""Independent exact scalar/frame audit of the changed forward supplier. + +This does not import a generator, builder, stored compensation, or price. +All claimed endpoint matrices are derived from the input word's gates. +Optional --main checks the transported boundary against the pinned parent. +Prepared for icekylinx with OpenAI GPT-6 Astra assistance. Apache-2.0. +""" +import argparse,gzip,json,hashlib,time +from pathlib import Path +from fractions import Fraction as F +from collections import Counter + +def require(x,label): + if not x:raise RuntimeError(label) + +def basis(vs): + piv={} + for a in vs: + while a: + bit=a.bit_length()-1 + if bit in piv:a^=piv[bit] + else: + piv[bit]=a;break + for k in sorted(piv): + for j in piv: + if j>k and piv[j]>>k&1:piv[j]^=piv[k] + return tuple(piv[k] for k in sorted(piv,reverse=True)) + +def contained(a,b):return basis(a+b)==b + +def registers(e):return e[1:3] if e[0]=='add' else e[1:2] + +def apply(e,rows,dual=False): + if e[0]=='add': + t,s=e[1:3];q=F(e[3],e[4]);require(t!=s,'self add') + if dual:t,s,q=s,t,-q + dst=rows[t] + for k,x in list(rows[s].items()): + a=dst.get(k,F(0))+q*x + if a:dst[k]=a + else:dst.pop(k,None) + elif e[0]=='scale': + t=e[1];q=F(e[2],e[3]);require(q!=0,'zero scale') + if dual:q=1/q + rows[t]={k:q*x for k,x in rows[t].items()} + else:raise RuntimeError('unknown scalar primitive') + +def invert(e): + r=list(e) + if r[0]=='add':r[3]=-r[3] + else:r[2],r[3]=r[3],r[2] + return r + +def check_parent_interface(word,main): + # Read only the retained boundary data. No builder or local checker is imported. + relative="research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/CANONICAL-WORD.json.gz" + path=main/relative;raw=path.read_bytes() + require(hashlib.sha256(raw).hexdigest()=="66d3c3c70983224650643a0a05a21ac6c6959f84d0f4528650601016f5a76844",'parent canonical input pin') + parent=json.loads(gzip.decompress(raw)) + tau=lambda x:x^(43 if (x&43).bit_count()%2 else 0) + ports=parent['ports'];v=word['report']['v'] + require(len(ports)==len(set(ports))==v,'parent port count') + require(set(map(tau,word['ports']))==set(ports),'transported source/target ports') + moved={i:ports.index(tau(p)) for i,p in enumerate(word['ports'])} + centers=[moved.get(r,r) for r in word['centers']] + actual=[list(basis([tau(x) for x in frame])) for frame in word['center_frames']] + expected=[parent['frames'][f] for f in parent['center_frames']] + require(len(centers)==len(set(centers))==len(actual)==8,'eight distinct centre carriers') + require(actual==expected and all(len(f)==8 for f in actual),'ordered centre frame interface') + return dict(parent_path=relative,parent_file_sha256=hashlib.sha256(raw).hexdigest(), + transport_tau=43,ordered_frame_bases_match=True,all_ports_match=True, + transported_centers=centers,source_centers=[r for r in centers if r=2*v} + for e in w['precondition']:apply(e,dirt) + compensation=[['add',y,k,-a.numerator,a.denominator,[]] for y in range(v,2*v) for k,a in sorted(dirt[y].items())] + entering=set(map(int,w.get('start_extra',{})));lowends=set(map(int,w.get('helper_final',{}))) + coldends=lowends-entering + require(not any(e[2] in entering for e in compensation),'nonzero entrance response') + require(not any(r in entering|coldends for e in w['precondition']+compensation for r in registers(e)), 'pre-wrapper touch of residual helper') + require(all(e[-1]==[] for e in w['precondition']+compensation),'nonzero frame precondition') + early=w.get('early_cleanup',[]);earlyids={i for i,U in early} + require(len(earlyids)==len(early),'duplicate early cleanup gate') + tail=[w['cleanup'][i][:-1]+[U] for i,U in early] + cleanup=[e for i,e in enumerate(w['cleanup']) if i not in earlyids] + prefix=w['precondition']+compensation+main + program=prefix+tail+cleanup + for dual in (False,True): + actual=ident() + for e in program:apply(e,actual,dual) + expected=ident() + for t in range(v):expected[t if dual else v+t][v+t if dual else t]=F(-1 if dual else 1) + bad=[i for i in range(n) if actual[i]!=expected[i]] + require(not bad,'all-column endpoint failure '+str((dual,bad[:8]))) + print('endpoint', 'dual' if dual else 'forward','PASS',flush=True) + full=basis([1<>=1;i+=1 + return y + +def ginv(cols,h): + # inverse columns over F2 (None if singular), Gauss-Jordan on (G | I) column-wise + piv={}; + for i in range(h): + a=cols[i];b=1<>s&1:a^=piv[s][0];b^=piv[s][1] + if a:return None + pre.append(b) + return pre # pre[t] = G^{-1}(e_t) + +def gtrans(cols,h): + # transpose: column j of G^T = row j of G + return [sum(((cols[i]>>j)&1)< E (used for B-phase warps and for A-phase prelude warps)""" + inv=ginv(cols,h);require(inv is not None,'G not invertible') + require(all(gmul(cols,inv[t])==1<(Gx, (G+G^-T)x + G^-T z) + GiT=gtrans(inv,h) # G^{-T}: columns j = row j of G^{-1} + # G^{-T}(z): via columns GiT + def M(vec): + x=vec&((1<>h + gx=gmul(cols,x);S=gx^gmul(GiT,x) # (G + G^{-T}) x + return gx|((S^gmul(GiT,z))<>h)|((vec&((1<0)-(op<0))*(abs(op)+dsym)) + walg_add(rows[src],row,-c) + return + if e[0]=='warp': + op=e[2];s=(op>0)-(op<0) + if dual:op=s*(abs(op)+dsym) # dual orientation: K_G^{-T} is a distinct free symbol + rows[e[1]]=walg_warp(rows[e[1]],op);return + if e[0]=='add': + t,s=e[1:3];q=F(e[3],e[4]);require(t!=s,'self add') + if dual:t,s,q=s,t,-q + walg_add(rows[t],rows[s],q) + else: + t=e[1];q=F(e[2],e[3]);require(q!=0,'zero scale') + if dual:q=1/q + rows[t]={k:q*x for k,x in rows[t].items()} + +def invert_item(e,full): + if e[0]=='warp':return ['warp',e[1],-e[2]] + r=list(e) + if r[0]=='add':r[3]=-r[3] + else:r[2],r[3]=r[3],r[2] + return r + +def run_borrow(path,out,main,base,w,data,begin): + v,h,R=w['report']['v'],w['report']['h'],w['report']['R'];n=2*v+R + require((v,h)==(112,9),'wrong source geometry') + require(main is None,'--main parent interface is not available for coordinate-changed BORROW-WORD; use --base') + full=basis([1<=2*v,'correction source must be a remaining helper') + require(s not in entering,'correction source has nonzero entrance frame') + require(len(word)>=1 and all(1<=abs(o)<=K for o in word),'correction operator word') + require(c!=0 and c.denominator&(c.denominator-1)==0,'correction coefficient') + # the source is the lender of the operator it is read through + require(all(warps[abs(o)-1][1]==s for o in word),'correction source is not the lender of its operator') + # --- 4. frames: literal chain, monotone, paid profile --------------------------------------- + end=[full]*v+[basis([x for x in range(1,1<0 else list(to_),list(to_) if op_>0 else list(fr_),h) + require(cur[r_]==basis(fr_),'prelude warp frame mismatch '+str((r_,op_))) + cur[r_]=basis(to_) + else: + for q in registers(e):climb(q,e[-1]) + for e in Aord: + for q in registers(e):climb(q,e[-1]) + lev={int(t):basis(U) for t,U in w.get('target_levels',{}).items()} + require(all(cur[v+t]==lev.get(t,()) for t in range(v)),'target centre levels') + for q,U in zip(w['centers'],w['center_frames']): + U=basis(U);require(cur[q]==U,'center frame') + served={lev.get(e[1]-v,()) for e in w['cut'] if e[2]==q} + for T in sorted(served,key=lambda x:-len(x)): + require(contained(T,U),'center path not nested') + if T!=U:paid[len(U)-len(T)]+=1 + U=T + byposition={} + for op,rec in enumerate(warps,1):byposition.setdefault(rec[0],[]).append(op) + B=w['B'];forward=[] # chronological program of the (recorded) non-target word + for e in Aord:forward.append(e) + for p in range(len(B)+1): + for op in byposition.get(p,[]): + _,lender,cols,U,E=warps[op-1] + require(cur[lender]==basis(U),'warp frame mismatch '+str((op,lender,cur[lender],basis(U)))) + cur[lender]=basis(E);forward.append(['warp',lender,op]) + if p 2: + x /= 2 + k += 1 + lo, hi = log_unit(x) + l2, u2 = log_unit(Q(2)) + lo, hi = lo+k*l2, hi+k*u2 + # Outward rational rounding keeps later certificates compact. + return Q((lo*GRID).__floor__(), GRID), Q((hi*GRID).__ceil__(), GRID) + + +def exp_bounds(x): + require(0 <= x < 1, "exponential range") + term = total = Q(1) + for j in range(1, 13): + term *= x/j + total += term + tail = term*x/13/(1-x/14) + return total, total+tail + + +def moment(m, W, entries, saving): + lo = hi = Q(0) + for t, count in entries: + t, count = int(t), int(count) + require(0 < t < m and count > 0, "improper child") + l, u = log_bounds(Q(m, t)) + lower = exp_bounds(saving*l)[0] + upper = exp_bounds(saving*u)[1] + lo += Q(t*count, m*W)*lower + hi += Q(t*count, m*W)*upper + return Q((lo*GRID).__floor__(), GRID), Q((hi*GRID).__ceil__(), GRID) + diff --git a/research/rank7-skip-restore-optimum/vendor/gk_common.py b/research/rank7-skip-restore-optimum/vendor/gk_common.py new file mode 100644 index 0000000000..0e5fde920d --- /dev/null +++ b/research/rank7-skip-restore-optimum/vendor/gk_common.py @@ -0,0 +1,94 @@ +"""Shared helpers for the complex shared-donor-kernel / entrance-gauge word. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. + +A "gk word" is PR #433's FULL-WORD.json.gz with optional extension keys (absent in #433's word, so every default is +#433's behaviour): + start_extra {register: entrance frame (list of F2^9 vectors)} helpers that start at a nonzero frame (width 9 - dim) + target_levels {target: frame} frame a target reaches through nonzero-frame compensation +Entrance gauges are ordinary gates at the head of A (target += c * helper at the entrance frame); kernel updates are +ordinary gates at the head of A (donor += q * pivot at the entrance frame). +""" +import math +from collections import Counter + +V, K, T, L, M = 120, 4, 8, 9, 73 +DATA = 2 * K * V * T # 7680 +FULL = tuple(1 << i for i in range(8, -1, -1)) + + +def basis(vs): + b = {} + for x in vs: + for p in sorted(b, reverse=True): + if x >> p & 1: x ^= b[p] + if x: + p = x.bit_length() - 1 + for q in b: + if b[q] >> p & 1: b[q] ^= x + b[p] = x + return tuple(b[p] for p in sorted(b, reverse=True)) + + +def widths_of(word): + """residual width of every helper: 9 - dim(entrance frame); 9 when the word has no extension""" + R = word['report']['R'] if 'R' not in word else word['R'] + w = [L] * R + for r, E in word.get('start_extra', {}).items(): + assert 2 * V <= int(r) < 2 * V + R + w[int(r) - 2 * V] = L - len(basis(E)) + return w + + +def split_pad(p): + """a pad of rank p is paid as nested commuting children of rank <= 51 (so that 73^2 > 2*child^2); rank 1 stays 1""" + if p == 0: return [] + n = -(-p // 51); return [p // n + (1 if i < p % n else 0) for i in range(n)] + + +def tile(items): + """Bank tiling of unhosted residuals. items: list of (rep, helper, width); a bank has M = 73 cells. + * width-9 residuals (no wrapper acts on them): first fit in the given order, packed from offset 0, eight per bank, pad rank 1 + (PR #433/#442's tiling and routes [2, slot]); + * ENTERING residuals (width w < 9, paid wrappers, e = 9 - w spectators): banks of their own in which every entering helper is the ONLY + owner of its bank family in its invocation (the one-helper rule of PR #458 extended to banks): bank j holds the j-th entering + helper of each replica, residuals packed from offset 0 in replica order (at most one helper per replica, hence per invocation). + The spectators of an entering helper are the first e cells of the bank beyond every residual cell of the bank (the pad, which no call + uses for a residual, is paid as before: rank 73 - sum of widths; the spectators are borrowed inside it and not deducted). + Returns (assign, banks, pads): assign[(rep, helper)] = (bank, offset, width, pure, spectators) with pure = the bank holds only width-9 + residuals and spectators = () for width 9; pads = Counter of pad ranks (split into children of rank <= 51).""" + assign = {}; pads = Counter(); fill = [] + for z, (rep, h, w) in enumerate(items): # width 9: first fit, as PR #433 (all widths 9 reproduces it exactly) + if w != L: continue + for b, f in enumerate(fill): + if f + w <= M: break + else: + b = len(fill); fill.append(0) + assign[(rep, h)] = (b, fill[b], w, True, ()); fill[b] += w + nwide = len(fill); byrep = {} + for rep, h, w in items: + if w < L: byrep.setdefault(rep, []).append((h, w)) + cells = [0] * max((len(v) for v in byrep.values()), default=0); emax = [0] * len(cells); place = {} + for rep in sorted(byrep): # the j-th entering helper of every replica goes to entering bank j + for j, (h, w) in enumerate(byrep[rep]): + place[(rep, h)] = (nwide + j, cells[j], w); cells[j] += w; emax[j] = max(emax[j], L - w) + for j in range(len(cells)): assert cells[j] + emax[j] <= M, ('entering bank without room for its spectators', j) + for (rep, h), (b, off, w) in place.items(): + assign[(rep, h)] = (b, off, w, False, tuple(range(cells[b - nwide], cells[b - nwide] + L - w))) + fill += cells + for f in fill: + for part in split_pad(M - f): pads[part] += 1 + return assign, len(fill), pads + + +def route(off, w, pure, sp=()): + """owner route of a banked helper residual: PR #433's [2, slot] for width 9 (pure width-9 bank); an entering helper (w < 9) is + [2, offset, width, [spectator cells]] with e = 9 - w spectators""" + if w == L: assert pure and not sp; return [2, off // L] + assert not pure and len(sp) == L - w; return [2, off, w, list(sp)] + + +def unhosted_stock(widths): + """live stock and padding histogram of the unhosted (parent) template, per stage x nine""" + R = len(widths) + _, nb, pads = tile([(rep, h, widths[h]) for rep in range(T) for h in range(R)]) + return DATA + L * nb, Counter({r: z * L for r, z in pads.items()}) diff --git a/research/rank7-skip-restore-optimum/vendor/moment.py b/research/rank7-skip-restore-optimum/vendor/moment.py new file mode 100644 index 0000000000..7d697cb452 --- /dev/null +++ b/research/rank7-skip-restore-optimum/vendor/moment.py @@ -0,0 +1,113 @@ +"""Independent prospective ordinary five-stage cost, never supplier admission. + +Consumes a raw one-invocation ledger made from the actual source/internal/target +paths. No packed profile is used as an input. Missing physical/finite/compiler +obligations must remain explicit in the accompanying report. +""" +from collections import Counter +from decimal import Decimal, localcontext, ROUND_FLOOR +from fractions import Fraction as F +from functools import lru_cache +from math import factorial +import hashlib, json, sys +from pathlib import Path + +DYAD = 1 << 224 + +def floor(x): return F(x.numerator*DYAD//x.denominator, DYAD) +def ceil(x): return -floor(-x) + +@lru_cache(None) +def logarithm(x): + """Mercator bounds after binary reduction; ln(2) via two Mercator sums. + + For 1 <= y < 2, log(y) is an alternating series in z=y-1. + We instead reduce to 1 <= y < 3/2, and bound log(3/2) and + log(2) by the same alternating series at z=1/2 and z=1/3, + using log(2)=log(3/2)+log(4/3). All sums are exact rationals. + """ + assert x >= 1 + k = 0 + while x >= 2: x /= 2; k += 1 + j = int(x >= F(3, 2)) + if j: x /= F(3, 2) + def mercator(y): + z=y-1 + assert 0 <= z <= F(1,2) + # An even partial sum is below log; the next term bounds its tail. + t=z; s=F(0) + for n in range(1, 225): + s += (t if n & 1 else -t)/n + t *= z + return s, s+t/225 + a,b=mercator(x); c,d=mercator(F(3,2)); e,f=mercator(F(4,3)) + return floor(a+(k+j)*c+k*e), ceil(b+(k+j)*d+k*f) + +def exponential(l,u): + assert 0 <= l <= u < F(1,10) + def poly(x): + s=t=F(1) + for j in range(1,25): t=t*x/j; s+=t + return s,t + lo,_=poly(l);hi,last=poly(u) + return floor(lo),ceil(hi+last*u/25/(1-u/26)) + +def moment(H,m,W,a,bad=False): + lo=hi=F(0) + for r,n in H.items(): + assert 0 < r < m and n > 0 + l,u=logarithm(F(m,r)); e,f=exponential(a*l,a*u) + p=F(r*n,m*W);lo+=p*e;hi+=p*f + if bad: + # Existing envelope shape, only conditionally portable to the new cover. + l,u=logarithm(F(m));e,f=exponential(a*l,a*u) + p=F(32*m*sum(H.values()),10**16*W) + lo+=p*e;hi+=p*f + return floor(lo),ceil(hi) + +def decimal(x): + with localcontext() as c: + c.prec=70 + return str(Decimal(x.numerator)/Decimal(x.denominator)) + +def certify(H,m,W,bad=False): + with localcontext() as c: + c.prec=70 + terms=[(Decimal(r*n)/Decimal(m*W),(Decimal(m)/Decimal(r)).ln()) for r,n in H.items()] + fallback=Decimal(32*m*sum(H.values()))/Decimal(10**16*W) if bad else Decimal(0) + lm=Decimal(m).ln();lo=Decimal(0);hi=Decimal('.003') + for _ in range(210): + a=(lo+hi)/2 + if sum(p*(a*l).exp() for p,l in terms)+fallback*(a*lm).exp()<1:lo=a + else:hi=a + q=int(((lo+hi)/2*10**24).to_integral_value(rounding=ROUND_FLOOR)) + lo=F(q,10**24);hi=lo+F(1,10**24) + lv=moment(H,m,W,lo,bad);hv=moment(H,m,W,hi,bad) + assert lv[1]<1= LB_forced + forced extras = %d = certified cost of WORD-%s.') % (name, b['bound'], name), + seconds=None) + return cert, dict(sol=sol, rows=rows, M=Mc, b=b, lit=lit, seconds=round(time.monotonic() - t0, 2)) + + +def normal45_facts(w, b): + """the four normal-45 visits: eight pairwise-distinct 6-dim entry lower bounds inside V45; no partner""" + LU = b['_LU'] + E = b['_E'] + V45 = E[NORMAL45['pivots'][0]] + eight = NORMAL45['visitors'] + NORMAL45['pivots'] + require(all(E[p] == V45 and len(V45) == 7 for p in NORMAL45['pivots']), 'pivots end at V45') + Ls = {q: LU[q][0] for q in eight} + require(all(len(Ls[q]) == 6 and FX.leq(Ls[q], V45) for q in eight), 'eight 6-dim entry frames inside V45') + require(len(set(Ls.values())) == 8, 'pairwise distinct') + require(len(FX.basis(tuple(v for q in eight for v in Ls[q]))) == 7, 'they span V45') + live = [q for q in LU if not RB.is_target(q)] + rows = [] + for r in NORMAL45['visitors']: + recv = b['caps'][str(r)]['receivers'] + for c in recv: + X = FX.meet(LU[r][1], E[c]) + require(X == Ls[r], 'U_r meet E_c = L_r for visitor %d receiver %d' % (r, c)) + require(not any(s != r and FX.leq(LU[s][0], Ls[r]) and FX.leq(Ls[r], E[s]) for s in live), 'no partner for %d' % r) + rows.append(dict(register=r, receivers=recv, entry_lower=list(Ls[r]), beta=b['beta'][str(r)])) + return dict(V45=list(V45), entry_lower_bounds={str(q): list(Ls[q]) for q in eight}, visitors=rows) + + +# ------------------------------------------------------------------------------------------------ calibration and erratum +def calibration(name): + """the same bound on PR #2979's words (same A/B): the unforced part of its restore overhead is exactly what PR #3042 removed""" + w = load_word(name) + sol = FX.frame_optimum(w) + require(sol['cost'] == EXPECT['cost2979'] and iprof(sol['profile']) == PR2979_PROFILE, 'PR2979 certified optimum') + b = RB.bound(w) + lit = RB.literal_restore_chains(w) + visits = {q: x['overhead'] for q, x in lit.items() if x['overhead']} + beta = {int(x): v for x, v in b['beta'].items()} + unit = 2 * FX.weights()[1] - FX.weights()[2] + blocked_excess = {str(q): visits.get(q, 0) - v for q, v in sorted(beta.items()) if visits.get(q, 0) != v} + require(all(visits.get(q, 0) >= v for q, v in beta.items()), 'every blocked register pays at least its forced extra') + in_group = set() + group_excess = [] + for m in b['merged']: + vis = {q: visits[q] for q in m['members'] if q in visits and q not in beta} + require(sum(vis.values()) >= unit, 'every payer group pays at least one visit') + in_group |= set(vis) + if sum(vis.values()) > unit: + group_excess.append(dict(members_visiting={str(q): v for q, v in sorted(vis.items())}, forced=unit, + excess=sum(vis.values()) - unit, kinds=sorted({p['kind'] for p in m['parts']}))) + uncharged = {str(q): v for q, v in sorted(visits.items()) if q not in beta and q not in in_group} + total = sum(blocked_excess.values()) + sum(g['excess'] for g in group_excess) + sum(uncharged.values()) + involved = sorted({int(q) for q in blocked_excess} | {int(q) for q in uncharged} | + {int(q) for g in group_excess for q in g['members_visiting']}) + require(b['bound'] == EXPECT['cost'] and sol['cost'] - b['bound'] == total == EXPECT['cost2979'] - EXPECT['cost'], 'PR2979 bound') + require(set(SKIPS_3042) <= set(involved) and total == len(SKIPS_3042) * unit, 'unforced overhead = the six PR3042 skips') + return dict(word=name, word_sha256=PINS['data/WORD-%s.json.gz' % name], certified_cost=sol['cost'], certified_profile=sprof(sol['profile']), + LB_forced=b['LB_forced'], bound=b['bound'], gap=sol['cost'] - b['bound'], literal_visits=len(visits), + literal_visit_units=sum(visits.values()), blocked_excess=blocked_excess, group_excess=group_excess, + uncharged_visits=uncharged, unforced_total=total, registers_involved=involved, pr3042_skips=SKIPS_3042, + realized_by_pr3042=EXPECT['cost2979'] - EXPECT['cost']) + + +def erratum(): + spec = json.loads((HERE / 'data/EDITS-3042.json').read_bytes()) + out = {} + for prov in ('base', 'extra'): + w = load_word('2979-' + prov) + f = load_word('3042-' + prov) + c0 = FX.frame_optimum(w) + lit0 = RB.literal_restore_chains(w) + edits = {e['id']: e for e in spec['edits'][prov]} + require(sorted(edits) == ['R1_E42', 'R2_E7'], 'two declared blocks') + + def apply(ids): + x = copy.deepcopy(w) + for e in sorted((edits[i] for i in ids), key=lambda e: -e['start']): + require(e['section'] == 'restore' and x['restore'][e['start']:e['stop']] == e['old'], 'literal preimage ' + e['id']) + x['restore'][e['start']:e['stop']] = copy.deepcopy(e['new']) + return x + rows = {} + for ids in (['R1_E42'], ['R2_E7'], ['R1_E42', 'R2_E7']): + x = apply(ids) + s = FX.frame_optimum(x) + lit = RB.literal_restore_chains(x) + changed = sorted(q for q in lit if lit[q]['overhead'] != lit0[q]['overhead']) + dp = {str(k): iprof(s['profile']).get(k, 0) - iprof(c0['profile']).get(k, 0) for k in range(1, 9) + if iprof(s['profile']).get(k, 0) != iprof(c0['profile']).get(k, 0)} + rows['+'.join(ids)] = dict(delta_units=s['cost'] - c0['cost'], profile_delta=dp, skipped_registers=changed, + literal_skip_units=sum(lit0[q]['overhead'] - lit[q]['overhead'] for q in changed)) + if len(ids) == 2: + require(x['restore'] == f['restore'] and all(x[k] == f[k] for k in f if k not in ('restore', 'report', 'cleanup')), + 'both blocks reproduce the PR3042 word') + require(rows['R1_E42']['delta_units'] == -19984 and rows['R1_E42']['skipped_registers'] == [22, 40, 54, 63], 'R1_E42') + require(rows['R2_E7']['delta_units'] == -9992 and rows['R2_E7']['skipped_registers'] == [5, 73], 'R2_E7') + require(rows['R1_E42+R2_E7']['delta_units'] == -29976, 'total') + out[prov] = rows + require(out['base'] == out['extra'], 'providers agree') + sizes = {e['id']: '%d -> %d' % (len(e['old']), len(e['new'])) for e in spec['edits']['base']} + require(sizes == {'R1_E42': '26 -> 33', 'R2_E7': '13 -> 15'}, 'declared block sizes') + return dict(certified=out['base'], providers_identical=True, declared_block_gates=sizes, pr3042_readme=PR3042_README, + corrections=dict(R1_E42='-19,984 units/call (four skips: 63, 54, 40, 22; -8 H1 + 4 H2), not -14,888 for 63, 54, 40', + R2_E7='-9,992 units/call (two skips: 73, 5; -4 H1 + 2 H2), not -14,938 for 22, 73, 5', + total='-29,976 units/call (-12 H1 + 6 H2 = 6 x 4,996), not -29,826; final words, profile and kappa unaffected')) + + +# ------------------------------------------------------------------------------------------------ controls +def controls(state): + w = load_word('3042-base') + st = state['3042-base'] + rows, sol, b = st['rows'], st['sol'], st['b'] + base = sol['cost'] + out = {} + # auditor semantics: appended gates between non-restored FULL registers pass with cost delta 0 + sem = [] + for g in (['add', 0, 1, 1, 1, list(FX.FULL9)], ['add', 62, 70, 1, 1, list(FX.FULL9)]): + x = copy.deepcopy(w) + x['restore'].append(g) + r = price_and_audit(x, rows, base) + require(r['exact'] and r['delta'] == 0 and r['auditor']['status'] == 'PASS_INDEPENDENT_EXACT_BORROWING_WORD', 'appended ' + str(g[:5])) + sem.append(dict(appended=g[:5], **r)) + x = copy.deepcopy(w) + x['restore'].append(['add', 249, 251, 1, 1, list(b['_E'][249])]) + r = price_and_audit(x, rows, base) + require(not r['exact'] and r['auditor']['status'] == 'FAIL', 'a gate into a restored helper is rejected') + sem.append(dict(appended=['add', 249, 251, 1, 1], **r)) + out['auditor_semantics'] = sem + # attainment: two third-party restore rewrites (different gate sequences) tie the bound + att = [] + for label, block in (('PR3056 three-ADD contraction of restore[175:179]', PR3056_175), ('PR3060 four-gate tariff word of restore[175:179]', PR3060_175)): + x = copy.deepcopy(w) + require(x['restore'][175:179] == OLD_175, 'literal block') + x['restore'][175:179] = copy.deepcopy(block) + r = price_and_audit(x, rows, base) + require(r['exact'] and r['delta'] == 0 and r['auditor']['status'] == 'PASS_INDEPENDENT_EXACT_BORROWING_WORD', label) + att.append(dict(control=label, gates=len(x['restore']), **r)) + out['attainment'] = att + rej = [] + + def rejected(label, fn): + try: + fn() + except (AssertionError, ValueError, KeyError) as ex: + rej.append(dict(control=label, rejected=True, reason=str(ex)[:160])) + return + raise AssertionError('control was not rejected: ' + label) + # 1-2 source binding + rejected('mislabeled provider (extra export under the base pin)', + lambda: require(sha(HERE / 'data/WORD-3042-extra.json.gz') == PINS['data/WORD-3042-base.json.gz'], 'pinned export mismatch')) + raw = bytearray((HERE / 'data/WORD-3042-base.json.gz').read_bytes()) + raw[len(raw) // 2] ^= 1 + rejected('one flipped byte in the base export', lambda: require(hashlib.sha256(bytes(raw)).hexdigest() == PINS['data/WORD-3042-base.json.gz'], 'pinned export mismatch')) + # 3 wrong cap: weakening one forced cap lowers LB_forced below the cost, and the recomputed caps differ + caps = {int(r): tuple(v['cap']) for r, v in b['caps'].items()} + weak = dict(caps) + weak.pop(2) + lb_weak = FX.frame_optimum(RB.empty_restore(w), caps=weak)['cost'] + require(lb_weak < b['LB_forced'], 'the cap of register 2 is load-bearing') + rejected('certificate with the cap of register 2 dropped (LB %d)' % lb_weak, + lambda: require(lb_weak + b['extras_blocked'] + b['extras_open'] == base and len(weak) == len(caps), 'tight sum fails without the cap')) + # 4 dropped visit + rejected('certificate with the forced visit of register 44 dropped', + lambda: require(b['LB_forced'] + b['extras_blocked'] - b['beta']['44'] + b['extras_open'] == base, 'tight sum fails')) + # 5 perturbed entry row + def perturbed(): + rows2 = {q: dict(v) for q, v in rows.items()} + rows2[70] = dict(rows2[70]) + rows2[70][(70, ())] = rows2[70][(70, ())] * 2 + Mc2, rk2 = RB.coordinates(rows2, {x: {(x, ()): Q(1)} for x in RB.restored(w)}) + rmap = RB.restore_map(w) + require(all({q: v for q, v in rmap[x].items() if v} == Mc2[x] for x in RB.restored(w)), 'restore does not realize the perturbed coordinates') + rejected('perturbed restore-entry row of register 70', perturbed) + # 6-8 fake cheaper restores that violate exactness (cheaper certified frames, rejected by Lemma 1 and by the auditor) + fakes = [] + for label, edit in (('empty restore', lambda x: x.__setitem__('restore', [])), + ('deleted R44 475 += -1/2*498 (keeps a restored input in 475)', lambda x: x['restore'].pop(44)), + ('deleted R82 584 += -1*439 (restored 584 not its own input)', lambda x: x['restore'].pop(82))): + x = copy.deepcopy(w) + edit(x) + r = price_and_audit(x, rows, base) + require(r['feasible'] and r['delta'] < 0, 'fake restore is cheaper: ' + label) + require(not r['exact'] and r['auditor']['status'] == 'FAIL', 'fake restore rejected twice: ' + label) + fakes.append(dict(control=label, **r)) + rejected('fake cheaper restore: %s (delta %d)' % (label, r['delta']), + lambda r=r: require(r['exact'], 'Lemma 1 end conditions fail (%d dirty restored, %d leaks); auditor: %s' % ( + r['dirty'], r['leaks'], r['auditor'].get('reason', '')))) + out['fake_cheaper_restores'] = fakes + # 9 wrong claimed cost + rejected('claimed cost 10,868,103,086', lambda: require(base == 10868103086, 'recomputed certified cost differs')) + # 10 optimality claim for PR2979's words (calibration: the bound leaves a gap) + rejected('optimality claimed for PR2979 base', lambda: require(state['2979-base']['gap'] == 0, 'PR2979 gap 29,976')) + # 11 ablation of the departure lemma: rows restricted to receivers containing the frame + abl = ablation(w, b) + rejected('departure lemma with rows restricted to receivers containing the frame (bound %d)' % abl['bound'], + lambda: require(abl['bound'] == base, 'the restricted lemma no longer certifies optimality')) + # 12 caps taken from the restore map of the emptied word (lane K's fixed bug class) instead of forced coordinates + w0 = RB.empty_restore(w) + caps_bug, _ = RB.forced_caps(RB.restore_map(w0), b['_E'], RB.restored(w0)) + b0 = RB.bound(w0) + require(b0['bound'] == base and b0['forced_caps'] == EXPECT['caps'], 'the bound depends only on A/B (caps from coordinates)') + rejected('caps from the restore map of the emptied word (%d caps)' % len(caps_bug), lambda: require(len(caps_bug) == EXPECT['caps'], 'no caps')) + out['rejection'] = rej + out['ablation'] = abl + out['empty_restore_word_bound'] = dict(bound=b0['bound'], forced_caps=b0['forced_caps']) + require(len(rej) >= 8, 'rejection controls') + return out + + +def ablation(w, b): + """departure test with rows restricted to restored c whose end contains the departure frame: the (1,3) splits of the + eight (2,2) registers are admitted and the bound drops by 8 x (c2 + c2 - c4 - (c1 + c3 - c4))""" + c = FX.weights() + E = b['_E'] + LU = b['_LU'] + M = b['_M'] + R = RB.restored(w) + live = [q for q in LU if not RB.is_target(q)] + drop = 0 + admitted = [] + for x, why in b['why'].items(): + x = int(x) + for ex in why['excluded_two_jump_frames']: + if 'departure' not in ex['why']: + continue + G = tuple(ex['frame']) + SG = set(FX.span(G)) + Z = [x] + [y for y in live if y != x and set(FX.span(LU[y][0])) <= SG] + O = [cc for cc in sorted(R) if cc != x and FX.leq(G, E[cc]) and not FX.leq(E[x], E[cc])] + mat = [[M[cc].get(q, Q(0)) for q in Z] for cc in O] + if RB.rank([r_ for r_ in mat if any(r_)]) < len(Z): + dE = len(E[x]) + d = len(LU[x][0]) + f = len(G) + o = c[f - d] + c[dE - f] - c[dE - d] + if o < b['beta'][str(x)]: + admitted.append(dict(register=x, frame=list(G), overhead=o, beta=b['beta'][str(x)])) + best = {} + for a in admitted: + best[a['register']] = min(best.get(a['register'], a['beta']), a['overhead']) + drop = sum(b['beta'][str(x)] - v for x, v in best.items()) + return dict(admitted=admitted, registers=sorted(best), bound=b['bound'] - drop, drop=drop) + + +# ------------------------------------------------------------------------------------------------ main +def canonical(x): + return json.dumps(x, indent=1, sort_keys=True, default=str) + '\n' + + +def strip(cert): + return {k: v for k, v in cert.items() if not k.startswith('_') and k != 'seconds'} + + +def main(): + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument('--work', type=Path, help='write RESULT.json and the regenerated certificates here') + a = ap.parse_args() + t0 = time.monotonic() + n = authenticate() + certs = {} + state = {} + for prov in ('base', 'extra'): + name = '3042-' + prov + cert, st = certify(name, load_word(name)) + certs['BOUND-%s.json' % name] = strip(cert) + state[name] = st + print('PASS', name, 'cost', cert['certified_cost'], '= LB_forced', cert['LB_forced'], '+ forced', cert['extras_blocked'] + cert['extras_open'], + '(caps %d, blocked %d, groups %d, visits %d)' % (cert['forced_caps'], cert['blocked'], cert['payer_groups'], cert['literal_visits']), + st['seconds'], 's', flush=True) + a_ = dict(certs['BOUND-3042-base.json']) + b_ = dict(certs['BOUND-3042-extra.json']) + for k in ('word', 'word_sha256', 'theorem'): + a_.pop(k) + b_.pop(k) + require(canonical(a_) == canonical(b_), 'both providers give the identical certificate') + cal = {} + for prov in ('base', 'extra'): + cal[prov] = calibration('2979-' + prov) + state['2979-' + prov] = dict(gap=cal[prov]['gap']) + require({k: v for k, v in cal['base'].items() if k not in ('word', 'word_sha256')} == + {k: v for k, v in cal['extra'].items() if k not in ('word', 'word_sha256')}, 'calibration agrees') + certs['CALIBRATION-2979.json'] = cal + print('PASS calibration: bound on PR2979 words', cal['base']['bound'], 'gap', cal['base']['gap'], '= unforced overhead of', + cal['base']['registers_involved'], flush=True) + err = erratum() + certs['ERRATUM-3042.json'] = err + print('PASS erratum: R1_E42', err['certified']['R1_E42']['delta_units'], err['certified']['R1_E42']['skipped_registers'], + 'R2_E7', err['certified']['R2_E7']['delta_units'], err['certified']['R2_E7']['skipped_registers'], flush=True) + ctl = controls(state) + certs['CONTROLS.json'] = ctl + print('PASS controls: auditor semantics %d, attainment %d, rejection %d, ablation drop %d' % ( + len(ctl['auditor_semantics']), len(ctl['attainment']), len(ctl['rejection']), ctl['ablation']['drop']), flush=True) + result = dict(status='PASS_RANK7_SKIP_RESTORE_OPTIMUM', providers=2, pinned_inputs=n, certified_cost=EXPECT['cost'], + LB_forced=EXPECT['lb'], forced_caps=EXPECT['caps'], forced_extras=EXPECT['forced'], blocked=EXPECT['blocked'], + payer_groups=EXPECT['groups'], calibration_gap_2979=cal['base']['gap'], rejection_controls=len(ctl['rejection']), + certificates={k: hashlib.sha256(canonical(v).encode()).hexdigest() for k, v in sorted(certs.items())}, + no_new_kappa=True) + if a.work: + a.work.mkdir(parents=True, exist_ok=True) + for k, v in certs.items(): + (a.work / k).write_text(canonical(v)) + (a.work / 'RESULT.json').write_text(canonical(result)) + else: + for k, v in list(certs.items()) + [('RESULT.json', result)]: + stored = (HERE / 'certificates' / k).read_text() + require(stored == canonical(v), 'regenerated certificate differs from certificates/' + k) + print('PASS_RANK7_SKIP_RESTORE_OPTIMUM providers=2 cost=%d LB_forced=%d forced=%d caps=%d blocked=%d groups=%d rejections=%d ' + 'calibration_gap=%d no_new_kappa (%.1f s)' % (EXPECT['cost'], EXPECT['lb'], EXPECT['forced'], EXPECT['caps'], EXPECT['blocked'], + EXPECT['groups'], len(ctl['rejection']), cal['base']['gap'], time.monotonic() - t0)) + + +if __name__ == '__main__': + main()