From bf1742aee4d855efb8bbd44a8419eddb33a679e5 Mon Sep 17 00:00:00 2001 From: Sagar Thakrar Date: Thu, 15 Oct 2026 11:25:51 +0530 Subject: [PATCH] Construct PR2226 low (anticipatory) aliases on the T74 borrow words Local construction plus exact packing ceilings; no kappa claim. Adds PR2226's 32 low (anticipatory) aliases, with their 64 initial compensation terms, and the 5 high aliases PR2269 omitted (rank-zero lenders found among retired X fields 12, 6, 31, 4, 1) to both record T74 pivot-566+554 borrow words of PR2269 (head b479fc55): 80 aliases, 400 helpers per call, local mass 5385 -> 5264, 44 cleanup buffers (was 76). The 16 remaining low helpers are lender-blocked at every handoff. Exact replay over all 624 dirty inputs in both orientations, PR2226 Gaussian products, PR2269's own auditor and 23 controls at build time; an independent stdlib checker (28 controls per word) recounts the words. The merged fixed-word packing ceiling rises from 0.0017179 to 0.0017480 (R=48). Model idle-refill prices span 0.0016871-0.0017255 (calibrated ~0.0017127); native lowering, an owner fill and the outer remain open. Co-Authored-By: Claude Opus 5.5 --- .../t74-low-alias-borrowing/.gitattributes | 2 + research/t74-low-alias-borrowing/README.md | 242 + .../t74-low-alias-borrowing/SOURCES-PR.json | 96 + research/t74-low-alias-borrowing/SOURCES.json | 24 + research/t74-low-alias-borrowing/TASK.json | 76 + research/t74-low-alias-borrowing/VERIFY.json | 32 + research/t74-low-alias-borrowing/build_ext.py | 418 + research/t74-low-alias-borrowing/cap_ext.py | 54 + research/t74-low-alias-borrowing/check_ext.py | 1524 ++++ .../check_ext.receipt.json | 1736 ++++ .../demo-t8-delta-proxy.json | 14 + .../inputs/PR2226-WITNESS.json | 3926 +++++++++ .../inputs/blocks.json | 1 + .../inputs/extra.canonical.json.gz | Bin 0 -> 87680 bytes .../inputs/gauge44.canonical.json.gz | Bin 0 -> 87678 bytes .../inputs/witness_43_base.json | 1 + .../inputs/witness_43_extra.json | 1 + .../price-input-ext80.json | 30 + .../price_ext.all.receipt.json | 469 + .../price_ext.ext80.receipt.json | 141 + research/t74-low-alias-borrowing/price_ext.py | 961 +++ .../receipts/AUDIT-80base.json | 43 + .../receipts/AUDIT-80extra.json | 43 + .../receipts/BUILD.json | 1674 ++++ .../receipts/CONTROLS-80base.json | 148 + .../receipts/CONTROLS-80extra.json | 148 + .../t74-low-alias-borrowing/replay_core.py | 344 + research/t74-low-alias-borrowing/run_all.py | 258 + .../run_all.receipt.json | 154 + .../vendor/pr2226/NOTICE.md | 22 + .../vendor/pr2226/operators.py | 140 + .../vendor/pr2269/NOTICE.md | 14 + .../vendor/pr2269/audit_local.py | 483 ++ .../vendor/pr2269/borrow_controls.py | 128 + .../vendor/pr2269/build_word.py | 39 + .../vendor/pr2269/emit_word.py | 227 + .../witness/witness_80_base.json | 7590 +++++++++++++++++ .../witness/witness_80_extra.json | 7590 +++++++++++++++++ .../words/BORROW-WORD-80base.json.gz | Bin 0 -> 70131 bytes .../words/BORROW-WORD-80extra.json.gz | Bin 0 -> 70135 bytes 40 files changed, 28793 insertions(+) create mode 100644 research/t74-low-alias-borrowing/.gitattributes create mode 100644 research/t74-low-alias-borrowing/README.md create mode 100644 research/t74-low-alias-borrowing/SOURCES-PR.json create mode 100644 research/t74-low-alias-borrowing/SOURCES.json create mode 100644 research/t74-low-alias-borrowing/TASK.json create mode 100644 research/t74-low-alias-borrowing/VERIFY.json create mode 100644 research/t74-low-alias-borrowing/build_ext.py create mode 100644 research/t74-low-alias-borrowing/cap_ext.py create mode 100644 research/t74-low-alias-borrowing/check_ext.py create mode 100644 research/t74-low-alias-borrowing/check_ext.receipt.json create mode 100644 research/t74-low-alias-borrowing/demo-t8-delta-proxy.json create mode 100644 research/t74-low-alias-borrowing/inputs/PR2226-WITNESS.json create mode 100644 research/t74-low-alias-borrowing/inputs/blocks.json create mode 100644 research/t74-low-alias-borrowing/inputs/extra.canonical.json.gz create mode 100644 research/t74-low-alias-borrowing/inputs/gauge44.canonical.json.gz create mode 100644 research/t74-low-alias-borrowing/inputs/witness_43_base.json create mode 100644 research/t74-low-alias-borrowing/inputs/witness_43_extra.json create mode 100644 research/t74-low-alias-borrowing/price-input-ext80.json create mode 100644 research/t74-low-alias-borrowing/price_ext.all.receipt.json create mode 100644 research/t74-low-alias-borrowing/price_ext.ext80.receipt.json create mode 100644 research/t74-low-alias-borrowing/price_ext.py create mode 100644 research/t74-low-alias-borrowing/receipts/AUDIT-80base.json create mode 100644 research/t74-low-alias-borrowing/receipts/AUDIT-80extra.json create mode 100644 research/t74-low-alias-borrowing/receipts/BUILD.json create mode 100644 research/t74-low-alias-borrowing/receipts/CONTROLS-80base.json create mode 100644 research/t74-low-alias-borrowing/receipts/CONTROLS-80extra.json create mode 100644 research/t74-low-alias-borrowing/replay_core.py create mode 100644 research/t74-low-alias-borrowing/run_all.py create mode 100644 research/t74-low-alias-borrowing/run_all.receipt.json create mode 100644 research/t74-low-alias-borrowing/vendor/pr2226/NOTICE.md create mode 100644 research/t74-low-alias-borrowing/vendor/pr2226/operators.py create mode 100644 research/t74-low-alias-borrowing/vendor/pr2269/NOTICE.md create mode 100644 research/t74-low-alias-borrowing/vendor/pr2269/audit_local.py create mode 100644 research/t74-low-alias-borrowing/vendor/pr2269/borrow_controls.py create mode 100644 research/t74-low-alias-borrowing/vendor/pr2269/build_word.py create mode 100644 research/t74-low-alias-borrowing/vendor/pr2269/emit_word.py create mode 100644 research/t74-low-alias-borrowing/witness/witness_80_base.json create mode 100644 research/t74-low-alias-borrowing/witness/witness_80_extra.json create mode 100644 research/t74-low-alias-borrowing/words/BORROW-WORD-80base.json.gz create mode 100644 research/t74-low-alias-borrowing/words/BORROW-WORD-80extra.json.gz diff --git a/research/t74-low-alias-borrowing/.gitattributes b/research/t74-low-alias-borrowing/.gitattributes new file mode 100644 index 0000000000..f82e427c0e --- /dev/null +++ b/research/t74-low-alias-borrowing/.gitattributes @@ -0,0 +1,2 @@ +# Preserve exact PR2269 bytes (CRLF) so the pinned git blob ids in SOURCES.json stay valid. +vendor/pr2269/*.py -text diff --git a/research/t74-low-alias-borrowing/README.md b/research/t74-low-alias-borrowing/README.md new file mode 100644 index 0000000000..fd19c7a622 --- /dev/null +++ b/research/t74-low-alias-borrowing/README.md @@ -0,0 +1,242 @@ +# PR2226 low (anticipatory) aliases on the T74 pivot-566+554 borrow words + +**Construction (local, verified) plus exact packing ceiling and model prices. No kappa claim.** PR2269 (Jeremy Kothe) put +43 **high** PR2226 aliases on both T74 local words (`gauge44` "base" and `extra`). This +package adds PR2226's **32 low (anticipatory) aliases** and the **5 high aliases that PR2269 +omitted** to both words. Each word now has 80 aliases. The 32 low aliases come with the +64 initial compensation terms `c K_G z`. + +| word | aliases | helpers | local paid profile | local mass | +|---|---|---|---|---| +| gauge44, PR2269 (43 high) | 43 | 437 | `{1:2351,2:501,3:414,4:129,5:42,8:8}` | 5385 | +| gauge44 + 32 low | 75 | 405 | `{1:2303,2:527,3:386,4:125,5:42,8:8}` | 5289 | +| gauge44 + 5 high | 48 | 432 | `{1:2351,2:501,3:414,4:129,5:37,8:8}` | 5360 | +| **gauge44, this package (80)** | 80 | **400** | **`{1:2303,2:527,3:386,4:125,5:37,8:8}`** | **5264** | +| extra, PR2269 (43 high) | 43 | 437 | `{1:2339,2:509,3:418,4:125,5:42,8:8}` | 5385 | +| extra + 32 low | 75 | 405 | `{1:2287,2:535,3:386,4:125,5:42,8:8}` | 5289 | +| extra + 5 high | 48 | 432 | `{1:2339,2:509,3:418,4:125,5:37,8:8}` | 5360 | +| **extra, this package (80)** | 80 | **400** | **`{1:2287,2:535,3:386,4:125,5:37,8:8}`** | **5264** | + +Change per call: −121 rank units, i.e. −96 from the low aliases and −25 from the five high +aliases. COPY64 is still included. Each word has 624 independent input columns and 44 private +FULL-cleanup zero buffers (PR2269 had 76). The identity `mass = 1856 + sum of helper widths` +still holds: width inventory `{4:4,5:4,7:36,8:84,9:272}`, sum 3408. + +All 16 low helpers that were not aliased are blocked by one exact condition: no lender is +left (see below). There is no second construction choice that would avoid it. + +## What was checked + +`python3 -B build_ext.py --controls` is deterministic. Run it with +`PYTHONPATH` pointing at a numpy install; numpy is needed only for the Gaussian products. It +does the following: + +1. Checks the git-blob pins of every input. The inputs are copied from PR2269 head `b479fc55` + and PR2226 head `dacaf3d8`. +2. Replays PR2269's shipped 43-pair witnesses with `replay_core.py` and reproduces its + recorded profiles exactly. `replay_core.py` is PR2226's `replay.py` in function form. Its + semantics are unchanged; only the `80 pairs / 32 low` assertion is now a parameter. +3. Builds the low and high pairs. The initial corrections are read off the residual of an + exact diagnostic replay. Every residual term must have the form `(lender, (op,))` for a + low operator, with a dyadic coefficient. No other term is allowed. +4. Re-runs the full exact replay for all three variants: free noncommutative operator + algebra over all 624/629/656 independent inputs, `Y'=Y+X`, nested frame chronology, + cold restoration, inverse cleanup at FULL with private zero buffers, and the + omitted-inverse-warp control. It also confirms that dropping the compensation fails, and + so does flipping one coefficient's sign. +5. Runs PR2226 `operators.py` on all 80 warps per word: exact Gaussian handoff and FULL-exit + products, all 512 columns, phases included. The 43 inherited records are reproduced + byte-for-byte. +6. Emits `words/BORROW-WORD-80{base,extra}.json.gz` with PR2269's unchanged emitter, then + runs PR2269's independent `audit_local.py` as a subprocess. It passes in both + orientations (`PASS_INDEPENDENT_EXACT_BORROWING_WORD`: 80 warps, 64 corrections, profile + and width inventory re-derived from the word alone). +7. With `--controls`, runs PR2269's `borrow_controls.py`. All 23 mutations are rejected for + the expected reason, including the four initial-correction controls, which are not + vacuous here (`receipts/CONTROLS-80*.json`). + +Receipts: `receipts/BUILD.json` (per-candidate decisions and blockers), +`receipts/AUDIT-80*.json` and `receipts/CONTROLS-80*.json`. + +## Independent check and model prices + +- `python3 -I -B check_ext.py --out` (standard library only; imports no PR or construction code; + reads the reference inputs as git blobs at the PR2269/PR2226 heads) prints + `PASS_T74_LOW_ALIAS_WORDS_INDEPENDENT`: warp algebra, anticipatory-term structure (frame-zero + source = lender of its own operator), frame recount, exact forward and dual replay, links to + the canonical words, and 28/28 negative controls per word (`check_ext.receipt.json`). +- `python3 -I -B run_all.py --out` re-runs the check, then prices the recounted profiles with + `price_ext.py` (`price_ext.ext80.receipt.json`). E = 80586 extra freed mass versus PR2269. + These are **model prices of an idle refill that was not built**: + +| model | b (floor, 1e-22) | vs PR2269 b | +|---|---|---| +| F | 0.0017255088890837212072 | +1.725% | +| C | 0.0017126737497248571464 | +0.968% | +| C8 | 0.0017140567316684824711 | +1.050% | +| P | 0.0016871233700042746562 | −0.538% | + +Model caveats. F keeps PR2269's realized idle remnants fixed and caps idle children at rank 48; +it is not a ceiling (fully repacking all idle mass into rank 48 would give about 0.001748). +P is not a floor for a real supplier, because hosting may add paid adapters. C reproduces +PR2269's own refill exactly by construction. Out of sample, both calibrated rules overshoot +the realized record they were not fitted to: C on T8 by 2.0e-6 and C8 on T74 by 2.3e-6. +C8 is not exact even in sample; it is 5.2e-6 above PR2260's realized b (`price_ext.py controls`). + +## Packing ceiling for the new local words (exact, any hosting) + +`python3 -I -B cap_ext.py` evaluates the merged fixed-word packing ceiling +(`research/complex-local-word-ceiling/ceiling.py`) on the call-weighted local profile. It uses +m = 73, 896 families per nine-stage replica and centre 64, with the largest idle child R = 48 +(T74's maximum child) or 51. Each cap is an upper bound on b for **any** hosting, owner packing or +idle refill of that fixed local word under the coverage law. + +| local words | cap, R = 48 | cap, R = 51 | +|---|---|---| +| PR2269 (43 high) | 0.001717935928829 | 0.001727257612832 | +| **this package (80)** | **0.001747958371974** | **0.001758245201617** | + +The ceiling rises by +1.75%. PR2269's claimed b realizes 98.74% of its own R = 48 cap. PR2322 +reports 98.66% of a 0.001720061 cap for its profile. At the same 98.74%, the new words would +give b ≈ 0.0017259. **This is an estimate, not a bound or a claim.** It sits above every open +T74 claim (top: PR2322, 0.001697060296). It needs every obligation under *Scope and limits*. + +## Reproduce + +From the repository root, with the standard library and `git`. It takes about 25 s and fetches +the pinned PR heads if they are absent: + +```sh +python3 -I -B research/t74-low-alias-borrowing/run_all.py --fetch +python3 -I -B research/t74-low-alias-borrowing/cap_ext.py +``` + +Expected final lines: `PASS_T74_LOW_ALIAS_RUN_ALL check=PASS price=PASS crosscheck=PASS ...` and +`PASS_T74_LOW_ALIAS_PACKING_CAPS cap48_high43=0.001717935929 cap48_ext80=0.001747958372`. +`run_all.py` rewrites its receipts. Repeated runs differ only in elapsed-time fields. + +Rebuilding the words needs numpy, which is used only for the Gaussian products: +`python3 -B research/t74-low-alias-borrowing/run_all.py --build --numpy-site DIR`. It +reproduces `words/` and `witness/` byte for byte. + +## How PR2269 derived its T74 witnesses from PR2226 (reconstructed) + +PR2269 ships its T74 witnesses as inputs; the derivation script is not in the PR. Diffing +`witness_43_*.json` against PR2226 `WITNESS.json` shows how they were made: + +- The 43 kept high pairs keep the PR2226 register and lender. +- Each handoff index is the T74 block `first_input`, which is the T8 index + 7. +- `retirement_B_event` is moved to the T74 index. +- `handoff_basis` is recomputed as the first `dim(lender)` vectors of the echelon basis of the + helper's first post-handoff frame. +- The 48 early-tail gates are unchanged, with `before_B` moved to T74 indices. +- `initial_corrections = []`, and every low pair is dropped. +- High pairs 606, 635, 637, 638 and 639 are dropped. + +## Low aliases: conditions and outcome + +These are the PR2226 low-pair conditions as enforced here: + +- **(a)** The lender is retired before the handoff. It has no B, deferred or early-tail touch + after the handoff. +- **(b)** At the handoff, the lender is exactly its own initial dirty input (asserted in the + replay). +- **(c)** The lender's entrance frame has dimension 0. Every compensation term + `c K_op z_lender` then reads a frame-zero helper input, so the monomial `K_G` is free. The + auditor also requires that the source is the lender of its operator. +- **(d)** The handoff has rank zero: `E` is the first `dim(lender)` vectors of the helper's + first post-handoff frame. +- **(e)** Every pre-handoff event on the low helper, other than the deferred helper-only + corrections, is either an echo (`target += c L`, which is deleted) or a temporary + external addition (`L += a ext`) with zero net change. An echo that reads a nonzero + temporary part is rewritten as direct reads `target += c a ext` at the same index and frame. +- **(f)** The residual target response is exactly `-sum c K_op z_lender`, with dyadic `c`. + +**32 transfer, with PR2226's own lenders.** The 64 corrections form the same +`(target, source, coefficient)` multiset as PR2226's 64 T8 terms; only the operator ids +differ. The prefix rewrites come from the T74 pivot kernels: + +- 628 gets two rewrites, because the kernel inserts a temporary `±2·567` pair. +- 672 gets two, because the kernel's `B[6]` donates `−2·566` until `B[232]`. +- 676 gets one, as in T8. + +The exact replay accepts all five rewrite gates (`add 214 566 -1`, `add 151 567 1`, +`add 117 566 1`, `add 181 566 -1`, `add 181 566 1`, all at frame 3). + +**16 are blocked:** low helpers 632, 633, 634, 636, 640, 641, 642, 644, 648, 649, 650, 652, +656, 657, 658 and 660. Each one has a legal prefix plan. The blocker is lender supply. At +every one of the 12 handoffs, exactly 32 registers satisfy (a)–(c): the PR2226 low lenders +273…394, all at dimension 4. No other register qualifies, including registers that B never +touches. All 32 are used. Every low alias saves the same 3 units +(the lender is at dimension 4, the helper enters at dimension 1), so choosing a different 32 +cannot help. + +The other 16 cold registers with entrance dimension 0 are 311, 327, 498, 500, 501, 510, +512, 513 (final dimension 8) and 572–575, 580–583 (final dimension 7). Restoring them early +by moving more tail gates would hand off at dimension 7–8 into first frames of dimension 4–5. +That is a paid dimension-drop handoff. It is outside PR2226's rank-zero scope, and it costs +more mass than it saves. + +## The five omitted high aliases + +In T74, helpers 606, 635, 637, 638 and 639 enter at dimension 4. Their first frame after the +handoff is also dimension 4, because the pivot kernels re-solved those frames. The PR2226 +lenders 395, 363, 530, 331 and 299 are at dimension 5 at the handoff. Using them would need +a paid 5→4 drop. That is why PR2269 dropped these aliases. + +An exhaustive search over retired, unused, non-target registers found rank-zero lenders at +dimension 4: the X registers 12, 6, 31, 4 and 1. They retire in B between 732 and 862, and +their final frame is FULL. Each alias saves 5 units because the climbs to FULL merge. +Precedent: PR2226 and PR2269 already lend X register 73 to helper 653. The only other +rank-zero dimension-4 lenders are the 32 low lenders, and using them would give up a low +alias for no saving. + +## Scope and limits + +This covers the local scalar/frame construction plus exact Gaussian handoff products. It +does **not** include any of the following: + +- native lowering of the new words in either orientation (PR2269 `run_native_borrow.py` + chain, warp recipes, the Lemma G stage); +- a window-exact owner fill for 400-helper words; +- a refreeze of PLAN/SPEC; +- a certified price (only the model prices above), outer assembly or a kappa. + +Hosting caveats: + +- The five new high aliases lend X-register fields. +- The 64 compensation terms read 32 frame-zero helper inputs before the preconditioner. + +Whole-call ownership of these must be re-checked in the hosted owner map. A naive +per-call-type difference, `249·Δgauge44 + 417·Δextra`, gives +`{1:−33636, 2:+17316, 3:−20316, 4:−996, 5:−3330}` (mass −80586). That figure is only +arithmetic: how the freed units fill idle depends on a new fill. + +## Open next questions + +1. Run PR2269's native chain (`bw_transport`, `bw_emit`, warp recipes, LOCAL-PROGRAMS, Lemma G + labels) on `BORROW-WORD-80*`. Do the 64 frame-zero compensation reads and the X-register + lenders lower without paid adapters in both orientations? +2. Build a window-exact owner fill at 400 helpers per call, then price it. The model prices + above (-0.54% to +1.73% on b; calibrated about +1%) stay unverified until that fill exists. +3. Is there a rank-zero source of extra low lenders for blocks 632, 640, 648 and 656? One + option is a dimension-4 cold register with entrance dimension 0 created by re-solving a + pivot-kernel frame. The 16 remaining helpers would save at most 48 more units per call. + +## Credit + +- PR2226, anticipatory dirty borrowing (Cinna Davis, @1337isnot1337, with OpenAI Codex): the + mechanism, the alias rule, initial compensation, `replay.py` (adapted here as + `replay_core.py`) and `operators.py` (vendored). +- PR2269 (Jeremy Kothe, `research/gmx-t74-borrow43`): the T74 canonical words, the 43-alias + witnesses, and the BORROW-WORD emitter, auditor and controls (vendored byte copies). +- PR2260 (Dugongue): concurrent application of high aliases to the T8 parent. +- PR2322 (Vlado Vojdanovski) found concurrently and independently that retired source fields + can serve as rank-zero lenders for high roles: 619/621/622/623 to X fields 1/4/6/12 at a + common rank-4 chart. This package's five extra high lenders (X 12, 6, 31, 4, 1) use the same + idea. Its owner exchanges and the other open records (PR2302, PR2309, PR2312) use high aliases + only. None of them adds the 32 low (anticipatory) aliases. + +The full predecessor lineage is in `vendor/*/NOTICE*` and `SOURCES-PR.json`. Prepared with +substantial AI assistance (Claude Code, Anthropic); Apache-2.0. No independent human review +is claimed. diff --git a/research/t74-low-alias-borrowing/SOURCES-PR.json b/research/t74-low-alias-borrowing/SOURCES-PR.json new file mode 100644 index 0000000000..1251e1ab92 --- /dev/null +++ b/research/t74-low-alias-borrowing/SOURCES-PR.json @@ -0,0 +1,96 @@ +{ + "heads": { + "PR2269": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "PR2226": "dacaf3d81f1936bb55b8454b1244e5d014272754", + "PR2260": "fde6b107e26a14da5bac5b66913c914708ea6901" + }, + "base_main": "0fdd7d82d", + "files": { + "inputs/blocks.json": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/blocks.json", + "git_blob": "c683574b3861678081fd5c5944dbd7a47309f6fd", + "sha256": "ddfac1dae1fe7cc0a91e7c7205c6d9d0c07c682880aa34eed83bf4ad7384da9f" + }, + "inputs/gauge44.canonical.json.gz": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/gauge44.canonical.json.gz", + "git_blob": "4abb6e28f02c95b41ed345d4e4401d16d58ae791", + "sha256": "65c6d17ffee2eacf27bff438f37fc549c9ed0c909cbc7a52976cc75cf2d15b91" + }, + "inputs/extra.canonical.json.gz": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/extra.canonical.json.gz", + "git_blob": "e0d670d4351229ce6921ecfbecf180070b17616b", + "sha256": "d7e48dcbafa236a2e1e41f7958244211506f7c7630fe6a2d43d2bdf17b7ae015" + }, + "inputs/witness_43_base.json": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/witness_43_base.json", + "git_blob": "9f4b93f3bc52d4f4ffaa128cfd7ae574fd36c462", + "sha256": "67ffb66d94067f6e53aee9118fe90e14a57f497fc8b3f708b6dac3de2e58ff28" + }, + "inputs/witness_43_extra.json": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/witness_43_extra.json", + "git_blob": "864ba533f50c2f1f639a6a3559b185bd321b923a", + "sha256": "d46449c6dbf4477f260cf5baea9bbb570a66ee0b6db81f4a220b9e3086ae9e46" + }, + "inputs/PR2226-WITNESS.json": { + "pr": "PR2226", + "path": "research/anticipatory-dirty-borrowing/WITNESS.json", + "git_blob": "62edbcce166f7cf388231078c2cd7f75939b97e2", + "sha256": "86392adde6992a08ae90f7a69c58cace1b52d942f4d2c96e82ca79e5d1e15235" + }, + "vendor/pr2269/emit_word.py": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/emit_word.py", + "git_blob": "a97e3d7506b63aacb8c845a4702be9ecded710b8", + "sha256": "c38cd936c5dfc5988c6d50294f94ff003dd1fcd2bab5c4161d7de2cc445ba8ab" + }, + "vendor/pr2269/build_word.py": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/build_word.py", + "git_blob": "8684d54b319c3d3a3cbaeaf1bb3af8d45bde92cd", + "sha256": "a174c4ca05ef3c2dda789a042e16b20164fbc7d6ed7781c6b63964d30b498f36" + }, + "vendor/pr2269/audit_local.py": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/audit_local.py", + "git_blob": "a90b00e0232bc9d7bc85138bad8d95553db673d4", + "sha256": "36c82ecbface61a5b824c59ea90d1f31a31ff4b87bfef24e16742f06e18fa3c5" + }, + "vendor/pr2269/borrow_controls.py": { + "pr": "PR2269", + "path": "research/gmx-t74-borrow43/new/borrow/borrow_controls.py", + "git_blob": "99789e011d0d3dd699560e002a1c0b9ef7fbb3ac", + "sha256": "07fbbf8e2f06df063dc9d88e5e4f721222a9fcf30b983bf9127cd5aa4b611627" + }, + "vendor/pr2226/operators.py": { + "pr": "PR2226", + "path": "research/anticipatory-dirty-borrowing/operators.py", + "git_blob": "5c4fbe8cceedd769a1c367a31cd0beeae2175dc1", + "sha256": "b37b67a04681c776dafcdc6c9af0e8a2dbfa9893b02e0fa2d77ccc9182a87988" + }, + "vendor/pr2226/NOTICE.md": { + "pr": "PR2226", + "path": "research/anticipatory-dirty-borrowing/NOTICE.md", + "git_blob": "5ea70357a04d083dba066fbc5c809a5736d8edd6", + "sha256": "f1d45d886926915531e3a59968abf0a4c974d7038f869848e71bd3a21b834422" + } + }, + "adapted": { + "replay_core.py": "function form of PR2226 research/anticipatory-dirty-borrowing/replay.py (blob see PR2226 head) ; only the 80/32 pair-count assertion parameterised, diagnostic residual mode and probe hook added" + }, + "outputs": { + "witness/witness_80_base.json": "9380f74c032b0616d5b13e8ef94b6d9f80cac36239e329357e7d5fcab5283ad0", + "witness/witness_80_extra.json": "6737072dcca47c6e6526bd62a41585dd09026549550c9e62eb53e64b265a6709", + "words/BORROW-WORD-80base.json.gz": "61290abffd8c8225e0abb3958c1506674e256de688fc4cdf358bbe7c981df493", + "words/BORROW-WORD-80extra.json.gz": "1dd2d6f2ae5b5a27b5f89fb830203f0cca7a78d0323a7845e85e1e80f8f6d1a5" + }, + "tools": { + "check_ext.py": "independent word check (stdlib only; reads PR2269/PR2226 blobs via git at the heads above)", + "price_ext.py": "model pricing harness; `sources` re-reads PR2269/PR2260/PR2226 constants via git; PR2312 kappa is a reference value only", + "run_all.py": "runs check_ext.py + price_ext.py and cross-checks" + } +} diff --git a/research/t74-low-alias-borrowing/SOURCES.json b/research/t74-low-alias-borrowing/SOURCES.json new file mode 100644 index 0000000000..437931a716 --- /dev/null +++ b/research/t74-low-alias-borrowing/SOURCES.json @@ -0,0 +1,24 @@ +{ + "schema_version": 1, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", + "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "e8870e5917057d59b730eb14721a778639eca050", + "sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7" + }, + { + "path": "research/complex-local-word-ceiling/ceiling.py", + "usage": "input", + "git_blob": "6c0f54527d879396f689523bfde19928a9b6157c", + "sha256": "86a1432870b3b21d8454106ec9162fddc0471472d9214c590a1420f2426cedfc" + } + ] +} diff --git a/research/t74-low-alias-borrowing/TASK.json b/research/t74-low-alias-borrowing/TASK.json new file mode 100644 index 0000000000..4651524538 --- /dev/null +++ b/research/t74-low-alias-borrowing/TASK.json @@ -0,0 +1,76 @@ +{ + "schema_version": 1, + "task_id": "complex-new-helper-inventory", + "priority_revision": 4, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "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": [ + "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.", + "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." + ], + "overlap_terms": [ + "helper inventory", + "heterogeneous-owner", + "mutable leaver" + ] + }, + "scope_status": "refined", + "actual_scope": "Add PR2226's 32 low (anticipatory) aliases and the 5 high aliases PR2269 omitted to the record T74 pivot-566+554 borrow words (PR2269 head b479fc55); exact local construction and independent check; exact fixed-word packing ceilings and modelled idle-refill prices. Native lowering, owner fill and outer assembly are not done.", + "scope_change_reason": "The card asks whether a new local cost interface (helper inventory) can change the deficit-to-recursive-cost ratio; this refines it to one concrete inventory change on the current record words: anticipatory low aliases, which no record had used.", + "bottleneck_link": "Binding complex supplier: the 80-alias words lower local mass 5385 -> 5264 per call (400 helpers) and raise the exact fixed-word packing ceiling from 0.0017179 to 0.0017480 (R=48); at the realization records already achieve this is ~+1.6% b over the current top open claim, conditional on native lowering and a new owner fill.", + "budget_minutes": 180, + "stop_rule": "All 32 PR2226 low aliases and 5 omitted highs attempted on both words; the 16 remaining low helpers proven lender-blocked at every handoff; pricing by explicit models only.", + "outcome": "completed", + "evidence": "run_all.py: PASS_T74_LOW_ALIAS_RUN_ALL (independent check_ext 28/28 controls per word; model prices F/C/C8/P); cap_ext.py: PASS_T74_LOW_ALIAS_PACKING_CAPS; build_ext.py --controls (numpy, construction-time): PASS_T74_LOW_ALIAS_EXTENSION incl. PR2269 audit_local in both orientations and 23 borrow_controls mutations.", + "author": "Sagar Thakrar", + "ai_assistance": "Substantial AI assistance: Claude Code (Anthropic, Claude Opus 5.5) subagents constructed the witnesses/words (reusing PR2226/PR2269 tooling with credit), wrote an independent stdlib checker and pricing harness, and adversarially reviewed the result; the main session reran the checks and computed the packing caps.", + "open_questions": [ + { + "question": "Do the 64 frame-zero anticipatory compensation reads and the X-register lenders lower natively in both orientations without paid adapters?", + "why_it_matters": "No PR has natively lowered anticipatory compensation; the reflected handoffs need exact Gaussian-phase Clifford lifts.", + "first_step": "Run PR2269's native chain (bw_transport, bw_emit, warp recipes, Lemma G labels) on BORROW-WORD-80*.", + "blocked_by": "Native lowering tooling for initial corrections." + }, + { + "question": "What b does a window-exact owner fill at 400 helpers per call attain?", + "why_it_matters": "The ceiling is 0.0017480 (R=48); model prices range 0.0016871-0.0017255; only an actual fill decides.", + "first_step": "Re-run the T74 owner solver with the 80-alias widths and recount the idle profile.", + "blocked_by": "Owner-fill tooling of the T74 lineage." + }, + { + "question": "Can extra rank-zero low lenders be created for blocks 632/640/648/656?", + "why_it_matters": "16 more low helpers would save up to 48 units per call.", + "first_step": "Re-solve a pivot-kernel frame to create a dimension-4 cold register with entrance dimension 0.", + "blocked_by": "Lender supply is exhausted at every handoff in the current words." + } + ] +} diff --git a/research/t74-low-alias-borrowing/VERIFY.json b/research/t74-low-alias-borrowing/VERIFY.json new file mode 100644 index 0000000000..355797a246 --- /dev/null +++ b/research/t74-low-alias-borrowing/VERIFY.json @@ -0,0 +1,32 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/complex-local-word-ceiling/ceiling.py" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/run_all.py", + "--fetch" + ], + "timeout_seconds": 600, + "checks": "fetch pinned PR heads if absent; independent stdlib check of both 80-alias words (exact replay, frames, profiles, 28 controls per word); model prices with positive controls" + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/cap_ext.py" + ], + "timeout_seconds": 300, + "checks": "exact fixed-word packing ceilings (merged ceiling.py) for PR2269 and the 80-alias words, positive control" + } + ] +} diff --git a/research/t74-low-alias-borrowing/build_ext.py b/research/t74-low-alias-borrowing/build_ext.py new file mode 100644 index 0000000000..40924f32d0 --- /dev/null +++ b/research/t74-low-alias-borrowing/build_ext.py @@ -0,0 +1,418 @@ +#!/usr/bin/env python3 +"""Deterministic builder: PR2226 LOW (anticipatory) aliases + the 5 omitted high aliases on the two +T74 pivot-566+554 borrow words of PR2269. + +Construction-time oracle: the exact free-operator replay of PR2226 (replay_core.py, a function +form of PR2226 replay.py with only the 80/32 count assertion parameterised). Emission: PR2269's +BORROW-WORD builder (vendor/pr2269/emit_word.py, build_word.py, byte copies). Independent audit: +PR2269's audit_local.py (byte copy, run as a subprocess; it re-derives frames, profile, inverse +cleanup and both free-algebra orientations from the emitted word alone). Exact Gaussian handoff +products: PR2226 operators.py (byte copy; needs numpy). + +usage: python3 -B build_ext.py [--skip-gaussian] [--skip-audit] [--controls] +Writes witness/, words/, receipts/ under this directory. Exit 0 only if every check passes. + +Credits: PR2226 anticipatory dirty borrowing (Cinna Davis, @1337isnot1337, with OpenAI Codex +assistance): mechanism, alias rule, initial compensation, replay, operators. PR2269 (Jeremy +Kothe, research/gmx-t74-borrow43): T74 canonical words, 43-alias witnesses, BORROW-WORD emitter +and auditor. PR2260 (Dugongue): concurrent high-alias application on the T8 parent. +Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0. +""" +import argparse, gzip, hashlib, json, os, subprocess, sys, time +from fractions import Fraction as Q +from pathlib import Path + +if not __debug__: + raise RuntimeError('assertions must remain enabled') +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +sys.path.insert(0, str(HERE / 'vendor' / 'pr2269')) +from replay_core import replay, span, frame_basis, incident, ReplayError # noqa: E402 + +INP = HERE / 'inputs' +CASES = [('gauge44', 'base', 'eeb6a236'), ('extra', 'extra', 'cd417b90')] +PINS = { # git blob ids at PR2269 head b479fc55 / PR2226 head dacaf3d8 + 'blocks.json': 'c683574b3861678081fd5c5944dbd7a47309f6fd', + 'gauge44.canonical.json.gz': '4abb6e28f02c95b41ed345d4e4401d16d58ae791', + 'extra.canonical.json.gz': 'e0d670d4351229ce6921ecfbecf180070b17616b', + 'witness_43_base.json': '9f4b93f3bc52d4f4ffaa128cfd7ae574fd36c462', + 'witness_43_extra.json': '864ba533f50c2f1f639a6a3559b185bd321b923a', + 'PR2226-WITNESS.json': '62edbcce166f7cf388231078c2cd7f75939b97e2', +} +OMITTED_HIGH = [639, 638, 635, 606, 637] # PR2226 order; PR2269 omitted these five + + +def git_blob(path): + data = Path(path).read_bytes() + return hashlib.sha1(b'blob %d\0' % len(data) + data).hexdigest() + + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def load(canon, wt): + w = json.loads(gzip.decompress((INP / f'{canon}.canonical.json.gz').read_bytes())) + blocks = json.loads((INP / 'blocks.json').read_text())['sources'][0]['blocks'] + wit = json.loads((INP / f'witness_43_{wt}.json').read_text()) + return w, blocks, wit + + +def deferred_sets(w, blocks): + deferred = {}; skip = set() + for b in blocks: + ss = set(b['helpers']); part = [] + for i in range(b['first_correction'], b['first_input']): + e = w['B'][i] + if set(incident(e)) <= ss: + part.append(e); skip.add(i) + deferred[b['first_input']] = part + return deferred, skip + + +def prefix_plan(w, block, L, skip): + """PR2226 section 3: pre-handoff events touching a low helper must be echoes (target += c L) + or temporary external additions (L += a ext) with zero net change. Echoes are deleted; + an echo that reads a nonzero temporary part is rewritten as direct reads of the sources.""" + v = w['v']; i0 = block['first_input'] + events = [(j, w['B'][j]) for j in range(i0) if j not in skip and L in incident(w['B'][j])] + tmp = {}; deleted = []; echoes = []; rewrites = {} + for j, e in events: + if e[0] == 'add' and e[2] == L and v <= e[1] < 2 * v: + c = Q(e[3], e[4]); gates = [] + for ext, a in sorted(tmp.items()): + if a: + cc = c * a + gates.append(['add', e[1], ext, cc.numerator, cc.denominator, e[-1]]) + deleted.append(j); echoes.append(j); rewrites[str(j)] = gates + elif e[0] == 'add' and e[1] == L and e[2] != L and not (v <= e[2] < 2 * v): + tmp[e[2]] = tmp.get(e[2], Q(0)) + Q(e[3], e[4]); deleted.append(j) + else: + return None, {'condition': 'prefix events are echoes or temporary external additions', + 'witness_event': [j, e]} + if any(a for a in tmp.values()): + return None, {'condition': 'net temporary change is zero', + 'witness': {str(k): str(a) for k, a in tmp.items() if a}} + return {'deleted_prefix_indices': deleted, 'deleted_echo_indices': echoes, + 'early_prefix_rewrites': rewrites}, None + + +def touches(w, wit, deferred, skip): + t = {} + for e in wit['early_tail_events']: + for r in incident(e['gate']): + t.setdefault(r, []).append(('tail', e['before_B'])) + for i, e in enumerate(w['B']): + for d in deferred.get(i, []): + for r in incident(d): + t.setdefault(r, []).append(('B', i)) + if i not in skip: + for r in incident(e): + t.setdefault(r, []).append(('B', i)) + return t + + +def first_frame(w, i, L, deferred, skip, removed_echoes, rewrites): + for j in range(i, len(w['B'])): + gl = list(deferred.get(j, [])) + list(rewrites.get(j, [])) + if j not in skip and j not in removed_echoes: + gl.append(w['B'][j]) + for g in gl: + if L in incident(g): + return j, g[-1] + raise AssertionError(('helper never used after handoff', L)) + + +class Builder: + def __init__(self, canon, wt): + self.canon, self.wt = canon, wt + self.w, self.blocks, self.wit = load(canon, wt) + w = self.w + self.v = w['v']; self.n = 2 * w['v'] + w['R']; self.h = w['h'] + self.frames = list(map(span, w['frames'])) + self.frame_index = {} + for k, f in enumerate(self.frames): + self.frame_index.setdefault(f, k) + self.deferred, self.skip = deferred_sets(w, self.blocks) + self.tch = touches(w, self.wit, self.deferred, self.skip) + self.block_of = {L: b for b in self.blocks for L in b['helpers']} + self.probe = {b['first_input']: None for b in self.blocks} + r0 = replay(w, self.blocks, self.wit, expect_pairs=43, probe=self.probe) + # the shipped PR2269 witness replays to its recorded profile + assert r0['local_profile'] == {int(k): c for k, c in self.wit['replay']['local_profile'].items()} + self.base43 = r0 + + def retired(self, r, i): + return all((t == 'B' and x < i) or (t == 'tail' and x <= i) for t, x in self.tch.get(r, [])) + + def lender_facts(self, r, i, L_first_dim): + w = self.w; snap = self.probe[i] + return {'register': r, 'target_register': self.v <= r < 2 * self.v, + 'entrance_dim': len(w['frames'][w['start'][r]]), + 'final_dim': len(w['frames'][w['final'][r]]), + 'retired_before_handoff': self.retired(r, i), + 'equals_initial_input_at_handoff': r in snap['pristine'], + 'dim_at_handoff': len(snap['cur'].get(r, [])) if r in snap['cur'] else None, + 'zero_rank_handoff_possible': r in snap['cur'] and len(snap['cur'][r]) <= L_first_dim} + + def make_pair(self, L, lender, low, plan): + w = self.w; b = self.block_of[L]; i = b['first_input']; snap = self.probe[i] + plan = plan or {'deleted_prefix_indices': [], 'deleted_echo_indices': [], 'early_prefix_rewrites': {}} + rew = {int(k): g for k, g in plan['early_prefix_rewrites'].items()} + j, f1 = first_frame(w, i, L, self.deferred, self.skip, set(plan['deleted_prefix_indices']), rew) + fb = frame_basis(self.frames[f1]); du = len(snap['cur'][lender]) + assert len(fb) >= du, 'paid handoff' + E = fb[:du] + last = self.tch.get(lender, []) + lastB = max([x for t, x in last if t == 'B'], default=-1) + lastT = max([x for t, x in last if t == 'tail'], default=-1) + cb = frame_basis(span(b['common_frame'])) + p = {'register': L, 'base': b['base'], 'common_basis': cb, 'dimension': len(cb), 'deadline': i, + 'deleted_echo_indices': plan['deleted_echo_indices'], 'low': low, 'borrow_from': lender, + 'retirement_B_event': max(lastB, lastT - 1), + 'retirement_frame': self.frame_index[span(snap['cur'][lender])], + 'retirement_dimension': du, 'old_final_dimension': len(w['frames'][w['final'][lender]]), + 'handoff_B': i, 'handoff_basis': E, 'handoff_paid_rank': 0, 'anticipate': low, + 'retirement_basis': snap['cur'][lender], 'first_use_B': j} + if low: + p['deleted_prefix_indices'] = plan['deleted_prefix_indices'] + p['early_prefix_rewrites'] = plan['early_prefix_rewrites'] + return p + + def solve_corrections(self, pairs): + inv = {'pairs': pairs, 'initial_corrections': [], 'early_tail_events': self.wit['early_tail_events']} + d = replay(self.w, self.blocks, inv, diagnose=True) + bad = [op for op, old, ok in d['lender_check'] if not ok] + assert not bad, ('low lender not its restored initial input', bad) + lender = {k + 1: x['borrow_from'] for k, x in enumerate(pairs)} + low_ops = {k + 1 for k, x in enumerate(pairs) if x['low']} + corr = []; foreign = {} + for t, row in sorted(d['residual'].items()): + for (var, word), c in sorted(row.items(), key=lambda kv: (kv[0][1], kv[0][0])): + ok = (len(word) == 1 and word[0] in low_ops and var == lender[word[0]] + and c.denominator & (c.denominator - 1) == 0) + if not ok: + foreign.setdefault(t, []).append([var, list(word), str(c)]) + continue + corr.append({'target': t, 'source': var, 'operator_word': [word[0]], 'coefficient': str(-c)}) + return corr, foreign + + def high_candidates(self, L): + b = self.block_of[L]; i = b['first_input']; snap = self.probe[i] + _, f1 = first_frame(self.w, i, L, self.deferred, self.skip, set(), {}) + d1 = len(self.w['frames'][f1]) + return i, d1, snap + + +def gaussian_records(pairs, w, keep): + import importlib.util + spec = importlib.util.spec_from_file_location('pr2226_operators', HERE / 'vendor' / 'pr2226' / 'operators.py') + ops = importlib.util.module_from_spec(spec); spec.loader.exec_module(ops) + import numpy as np + h = w['h']; size = 1 << h; out = []; negative_rejected = False + for k, x in enumerate(pairs, 1): + U = w['frames'][x['retirement_frame']]; E = x['handoff_basis'] + assert len(U) == len(E) + G = ops.change(U, E, h); K = ops.monomial(G, h) + z = (np.eye(size, dtype=np.int64), np.zeros((size, size), dtype=np.int64), 0) + z = ops.frame(z, U, h, -1); z = ops.apply_mono(z, K); z = ops.frame(z, E, h, 1) + hh = ops.check(z) + if not negative_rejected: + zb = (np.eye(size, dtype=np.int64), np.zeros((size, size), dtype=np.int64), 0) + zb = ops.frame(zb, U, h, -1); zb = ops.frame(zb, E, h, 1) + try: + ops.check(zb) + except AssertionError: + negative_rejected = True + z = (np.eye(size, dtype=np.int64), np.zeros((size, size), dtype=np.int64), 0) + z = ops.coord(z, range(h), -1); z = ops.apply_mono(z, K, -1); z = ops.coord(z, range(h), 1) + eh = ops.check(z) + rec = {'operator': k, 'G_columns': G, 'handoff_exact_monomial_sha256': hh, + 'full_exit_exact_monomial_sha256': eh} + if k in keep: # PR2269's recorded products for its 43 operators are reproduced exactly + assert keep[k] == rec, ('PR2269 gaussian record not reproduced', k) + out.append(rec) + return out, negative_rejected + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument('--skip-gaussian', action='store_true') + ap.add_argument('--skip-audit', action='store_true') + ap.add_argument('--controls', action='store_true') + a = ap.parse_args() + t0 = time.monotonic() + for name, pin in PINS.items(): + assert git_blob(INP / name) == pin, ('input pin', name) + w8 = json.loads((INP / 'PR2226-WITNESS.json').read_text()) + P8 = {x['register']: x for x in w8['pairs']} + summary = {'status': None, 'pins_git_blob': PINS, 'words': {}} + for d in ('witness', 'words', 'receipts'): + (HERE / d).mkdir(exist_ok=True) + ok = True + for canon, wt, hname in CASES: + B = Builder(canon, wt); w = B.w; v = B.v + pairs = [dict(x) for x in B.wit['pairs']] + used = {x['borrow_from'] for x in pairs} | {x['register'] for x in pairs} + rec = {'base_43': {'local_profile': B.base43['local_profile'], 'local_mass': B.base43['local_mass'], + 'helpers': w['R'] - 43}} + # ---------- 1. low candidates: all 48 low helpers of the 12 blocks ---------- + low_report = {}; low_pairs = [] + handoffs = sorted({b['first_input'] for b in B.blocks}) + pools = {} + for i in handoffs: + snap = B.probe[i] + pools[i] = sorted(r for r in range(B.n) if not (v <= r < 2 * v) and r not in used + and r in snap['pristine'] and len(w['frames'][w['start'][r]]) == 0 + and B.retired(r, i)) + assert len({tuple(p) for p in pools.values()}) == 1, 'pool differs between handoffs' + pool = pools[handoffs[0]] + t8_low = [x for x in w8['pairs'] if x['low']] + assert sorted(x['borrow_from'] for x in t8_low) == pool, 'eligible low lenders != PR2226 low lenders' + for x8 in t8_low: # PR2226 order, PR2226 lender + L = x8['register']; b = B.block_of[L] + plan, why = prefix_plan(w, b, L, B.skip) + assert why is None, (L, why) + facts = B.lender_facts(x8['borrow_from'], b['first_input'], 9) + assert facts['retired_before_handoff'] and facts['equals_initial_input_at_handoff'] and facts['entrance_dim'] == 0 + p = B.make_pair(L, x8['borrow_from'], True, plan) + low_pairs.append(p); used |= {L, p['borrow_from']} + low_report[L] = {'status': 'ALIASED', 'lender': p['borrow_from'], 'lender_source': 'PR2226 lender transfers', + 'deleted_prefix_indices': plan['deleted_prefix_indices'], + 'early_prefix_rewrites': {k: g for k, g in plan['early_prefix_rewrites'].items() if g}} + for b in B.blocks: + for L in b['low']: + if L in low_report: + continue + plan, why = prefix_plan(w, b, L, B.skip) + i = b['first_input'] + free = [r for r in pools[i] if r not in used] + low_report[L] = {'status': 'BLOCKED', 'prefix_plan_legal': why is None, + 'prefix_events_deleted': plan['deleted_prefix_indices'] if plan else None, + 'blocker': 'no eligible lender: the set of non-target registers that are retired ' + 'before the handoff, have a zero-dimensional entrance frame (so K_G z is free ' + 'to read into the frame-zero target) and equal their own initial dirty input ' + 'at the handoff has exactly %d members at every one of the 12 handoffs; all ' + '%d are consumed by the 32 transferred low aliases (free now: %d)' % (len(pool), len(pool), len(free))} + # ---------- 2. the five omitted high aliases ---------- + high_report = {}; high_pairs = [] + for L in OMITTED_HIGH: + x8 = P8[L]; i, d1, snap = B.high_candidates(L) + t8 = x8['borrow_from'] + entry = {'T8_lender': t8, 'T8_lender_dim_at_handoff': len(snap['cur'][t8]), + 'helper_first_frame_dim_T74': d1, + 'helper_entrance_dim_T74': len(w['frames'][w['start'][L]]), + 'T8_lender_blocker': ('paid dimension-drop handoff %d->%d (outside PR2226 rank-zero scope)' + % (len(snap['cur'][t8]), d1)) if len(snap['cur'][t8]) > d1 else None} + cands = sorted((r for r in range(B.n) if not (v <= r < 2 * v) and r not in used and B.retired(r, i) + and r in snap['cur'] and 0 < len(snap['cur'][r]) <= d1), + key=lambda r: (-len(snap['cur'][r]), len(w['frames'][w['final'][r]]) < B.h, r)) + entry['zero_rank_candidates'] = len(cands) + chosen = None + for r in cands: + p = B.make_pair(L, r, False, None) + trial = pairs + low_pairs + high_pairs + [p] + corr, foreign = B.solve_corrections(trial) + if foreign: + continue + chosen = p; break + assert chosen is not None, ('no high lender', L) + high_pairs.append(chosen); used |= {L, chosen['borrow_from']} + entry.update(status='ALIASED', lender=chosen['borrow_from'], + lender_dim_at_handoff=chosen['retirement_dimension'], + lender_final_dim=chosen['old_final_dimension']) + high_report[L] = entry + # ---------- 3. corrections, exact replay of all variants ---------- + variants = {'low32': pairs + low_pairs, 'high5': pairs + high_pairs, 'ext80': pairs + low_pairs + high_pairs} + results = {} + for vn, prs in variants.items(): + corr, foreign = B.solve_corrections(prs) + assert not foreign, (vn, foreign) + inv = {'pairs': prs, 'initial_corrections': corr, 'early_tail_events': B.wit['early_tail_events']} + r = replay(w, B.blocks, inv) + assert all(ok_ for _, _, ok_ in r['lender_check']) + # negative control: omit the initial compensation -> the exact replay must fail + if corr: + try: + replay(w, B.blocks, dict(inv, initial_corrections=[])); raise AssertionError('no-compensation control passed') + except ReplayError: + pass + bad = [dict(c) for c in corr]; bad[0]['coefficient'] = str(-Q(bad[0]['coefficient'])) + try: + replay(w, B.blocks, dict(inv, initial_corrections=bad)); raise AssertionError('sign control passed') + except ReplayError: + pass + results[vn] = (inv, r) + rec[vn] = {'pairs': len(prs), 'low': sum(x['low'] for x in prs), 'initial_corrections': len(corr), + 'helpers': w['R'] - len(prs), 'local_profile': r['local_profile'], 'local_mass': r['local_mass'], + 'independent_input_columns': r['independent_input_columns'], + 'zero_FULL_cleanup_buffers': r['zero_FULL_cleanup_buffers'], + 'controls': 'omitted compensation and one flipped sign rejected' if corr else 'n/a'} + print(canon, vn, rec[vn], flush=True) + inv, r = results['ext80'] + # ---------- 4. exact Gaussian handoff products (PR2226 operators.py) ---------- + keep = {g['operator']: g for g in B.wit['gaussian']['records']} + assert sorted(keep) == list(range(1, 44)) + if a.skip_gaussian: + raise SystemExit('gaussian records are required to emit the word') + recs, neg = gaussian_records(inv['pairs'], w, keep) + assert neg, 'omitted logical basis map negative control did not fail' + witness = {'credit': 'PR2226 anticipatory dirty borrowing (Cinna Davis / 1337isnot1337, OpenAI Codex); ' + 'PR2269 T74 words and 43-alias witness (Jeremy Kothe); low aliases + 5 high aliases ' + 'added by research/t74-low-alias-borrowing (Claude Code assistance)', + 'variant': f'80_{wt}', 'pairs': inv['pairs'], 'initial_corrections': inv['initial_corrections'], + 'early_tail_events': inv['early_tail_events'], + 'replay': {k: r[k] for k in ('status', 'local_profile', 'local_mass', 'remaining_registers', + 'zero_FULL_cleanup_buffers', 'exact_cold_restoration', 'symbolic_warps')}, + 'gaussian': {'status': 'PASS_EXACT_GAUSSIAN_BORROW_HANDOFFS', 'operators': len(recs), + 'columns_per_operator': 1 << w['h'], 'physical_rank_zero_products_checked': 2 * len(recs), + 'omitted_logical_basis_map_rejected': neg, 'records': recs}} + witness['replay']['local_profile'] = {str(k): c for k, c in r['local_profile'].items()} + wp = HERE / 'witness' / f'witness_80_{wt}.json' + wp.write_text(json.dumps(witness, indent=1) + '\n') + # ---------- 5. emit BORROW-WORD with PR2269's builder ---------- + import build_word + out = HERE / 'words' / f'BORROW-WORD-80{wt}.json.gz' + cwd = os.getcwd(); os.chdir(HERE / 'vendor' / 'pr2269') + try: + build_word.main(str(INP / f'{canon}.canonical.json.gz'), str(INP / 'blocks.json'), str(wp), str(out), hname) + finally: + os.chdir(cwd) + # make the gzip deterministic (mtime 0) + content = gzip.decompress(out.read_bytes()) + out.write_bytes(gzip.compress(content, mtime=0)) + rec['word'] = {'path': str(out.relative_to(HERE)), 'content_sha256': hashlib.sha256(content).hexdigest()} + # ---------- 6. independent audit (PR2269 audit_local.py, subprocess) ---------- + if not a.skip_audit: + ar = HERE / 'receipts' / f'AUDIT-80{wt}.json' + pr = subprocess.run([sys.executable, '-B', str(HERE / 'vendor' / 'pr2269' / 'audit_local.py'), '--word', str(out), + '--base', str(INP / f'{canon}.canonical.json.gz'), '--output', str(ar)], + capture_output=True, text=True) + ok &= pr.returncode == 0 + rep = json.loads(ar.read_text()) if pr.returncode == 0 else {'stderr': pr.stderr[-2000:]} + rec['independent_audit'] = {k: rep.get(k) for k in ('status', 'removed_helpers', 'independent_inputs', 'warps', + 'corrections', 'restored_cold', 'local_profile', 'local_mass', + 'width_inventory', 'orientations')} if pr.returncode == 0 else rep + print(canon, 'audit', rec['independent_audit'], flush=True) + if pr.returncode == 0: + assert rep['local_mass'] == r['local_mass'] and {int(k): c for k, c in rep['local_profile'].items()} == r['local_profile'] + wi = rep['width_inventory']; rec['width_sum'] = sum(int(k) * c for k, c in wi.items()) + rec['mass_identity_1856_plus_width_sum'] = rep['local_mass'] == 1856 + rec['width_sum'] + if a.controls: + cr = HERE / 'receipts' / f'CONTROLS-80{wt}.json' + pr = subprocess.run([sys.executable, '-B', str(HERE / 'vendor' / 'pr2269' / 'borrow_controls.py'), str(out), + str(INP / f'{canon}.canonical.json.gz'), str(cr)], capture_output=True, text=True) + ok &= pr.returncode == 0; rec['controls_rc'] = pr.returncode + rec['low_candidates'] = {str(k): low_report[k] for k in sorted(low_report)} + rec['omitted_high'] = {str(k): high_report[k] for k in OMITTED_HIGH} + rec['low_lender_pool'] = pool + summary['words'][canon] = rec + summary['status'] = 'PASS_T74_LOW_ALIAS_EXTENSION' if ok else 'FAIL' + summary['seconds'] = round(time.monotonic() - t0, 1) + (HERE / 'receipts' / 'BUILD.json').write_text(json.dumps(summary, indent=1, sort_keys=True) + '\n') + print(summary['status']) + sys.exit(0 if ok else 1) + + +if __name__ == '__main__': + main() diff --git a/research/t74-low-alias-borrowing/cap_ext.py b/research/t74-low-alias-borrowing/cap_ext.py new file mode 100644 index 0000000000..04cdbcb9f1 --- /dev/null +++ b/research/t74-low-alias-borrowing/cap_ext.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Fixed-local-profile packing caps (exact intervals) for the T74 borrow words, using the merged +research/complex-local-word-ceiling/ceiling.py (Douglas Colkitt's interval engine lineage; see that package). + +For a fixed per-call local paid profile, ceiling() bounds the complex saving a of ANY hosting, owner packing or +idle-remainder choice under PR1012's coverage law (m = 73, 896 families per nine-stage replica, centre 64): all +idle mass in (fractional) children of the largest allowed rank R. The T74 supplier's maximum child is 48; R = 51 +(the halving-guard maximum) is also reported. The local profile used is the call-weighted average +(249 gauge44 + 417 extra calls) of the two words. These are upper bounds, not attained savings. +Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0.""" +import importlib.util +import os +import sys +from fractions import Fraction as Q + +HERE = os.path.dirname(os.path.abspath(__file__)) +ROOT = os.path.dirname(os.path.dirname(HERE)) +spec = importlib.util.spec_from_file_location('ceiling', os.path.join(ROOT, 'research/complex-local-word-ceiling/ceiling.py')) +C = importlib.util.module_from_spec(spec) +spec.loader.exec_module(C) + +PROFILES = { + 'pr2269_high43': ({1: 2351, 2: 501, 3: 414, 4: 129, 5: 42, 8: 8}, {1: 2339, 2: 509, 3: 418, 4: 125, 5: 42, 8: 8}), + 'ext80_this_package': ({1: 2303, 2: 527, 3: 386, 4: 125, 5: 37, 8: 8}, {1: 2287, 2: 535, 3: 386, 4: 125, 5: 37, 8: 8}), +} +CLAIMED_2269_B = Q('0.0016962471390584742207696225394800943861') + + +def avg(pg, pe): + return {r: Q(249 * pg.get(r, 0) + 417 * pe.get(r, 0), 666) for r in set(pg) | set(pe)} + + +def main(): + caps = {} + for R in (48, 51): + for name, (pg, pe) in PROFILES.items(): + lo, hi = C.ceiling(avg(pg, pe), 73, 896, 9, 64, R=R) + caps[(name, R)] = (lo, hi) + print('R=%d %-20s cap in [%s, %s]' % (R, name, float(lo), float(hi))) + lo69, hi69 = caps[('pr2269_high43', 48)] + assert CLAIMED_2269_B < lo69, 'positive control: #2269 claimed b must lie below its own cap' + lo80, hi80 = caps[('ext80_this_package', 48)] + assert lo80 > hi69, 'the 80-alias cap must exceed the 43-alias cap' + frac = CLAIMED_2269_B / hi69 + print('#2269 realised fraction of its R=48 cap >= %.6f' % float(frac)) + print('same fraction of the ext80 cap (estimate, not a bound): %.10f' % float(frac * lo80)) + print('PASS_T74_LOW_ALIAS_PACKING_CAPS cap48_high43=%.12f cap48_ext80=%.12f' % (float(hi69), float(lo80))) + return 0 + + +if __name__ == '__main__': + if not __debug__: + sys.exit('refusing to run with -O') + sys.exit(main()) diff --git a/research/t74-low-alias-borrowing/check_ext.py b/research/t74-low-alias-borrowing/check_ext.py new file mode 100644 index 0000000000..4ba868c75d --- /dev/null +++ b/research/t74-low-alias-borrowing/check_ext.py @@ -0,0 +1,1524 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Independent check of the extended T74 borrow words BORROW-WORD-80{base,extra} (48 high + 32 LOW aliases, +64 anticipatory initial corrections) produced by build_ext.py in this package. + +Objects under test (local files of this package, pinned below by sha256 and git blob id): + words/BORROW-WORD-80base.json.gz, words/BORROW-WORD-80extra.json.gz, + witness/witness_80_base.json, witness/witness_80_extra.json. +Reference inputs, read as git blobs at pinned commits (no copies are trusted): + PR #2269 head b479fc55 (research/gmx-t74-borrow43/): canonical unborrowed T74 words, block certificate, + 43-alias witnesses and the BORROW-WORD-43 words (positive control), the pivot-566 predecessor words; + PR #2226 head dacaf3d8 (research/anticipatory-dirty-borrowing/WITNESS.json): the 64 T8 correction terms. + +Adapted from our own iteration-3 independent checker (fork commit 4a2f20ea339e30348448096ca789d0efe55df9bb, +research/t74-borrow43-independent-check/words_check.py, Apache-2.0, same authors). The extension to LOW pairs +with anticipatory initial corrections is implemented from the WRITTEN semantics of PR2226 (PROOF.md sections +1-4 and README.md) only. This file imports and runs no PR code and no code of build_ext.py / replay_core.py / +the vendored files; it shares no code with them. + +Credit: PR2226 (Cinna Davis / @1337isnot1337, with OpenAI Codex) for anticipatory dirty borrowing, the alias +rule, initial monomial compensation and the free-operator replay idea; PR2269 (Jeremy Kothe / jeremykothe2) for +the T74 borrow43 package, canonical words, witnesses and the BORROW-WORD format; PR2260 (Dugongue) for the +concurrent high-alias application on the T8 parent; the T74 lineage PR1319/PR1297 (Rohan Arun), PR1625 +(mdumitrean) and the pivot-554 kernel; Ali Romman's block certificate; icekylinx (Zhihao Chen) for the +Clifford-frame normal forms (notes/general-clifford-frames.tex) and the local-word checker lineage. + +Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0. + +Usage: python3 -I -B check_ext.py [--repo PATH] [--out] [--skip-controls] [--skip-predecessor] +The final stdout line is PASS_T74_LOW_ALIAS_WORDS_INDEPENDENT or FAIL_T74_LOW_ALIAS_WORDS_INDEPENDENT. +--out writes check_ext.receipt.json next to this script. + +MODEL (stated precisely; see also the receipt field "model"). + * Registers 0..v-1 are X (sources), v..2v-1 are Y (targets), 2v..2v+R-1 helpers; n = 2v+R. Removed helpers + do not exist. A buffer register b = r+n exists only for r in helper_final (restored cold helpers) and only + in cleanup. + * Frame = GF(2)-subspace of F_2^h (h = 9), compared as spans. Start: X_i = span(port_i), Y = 0, helper = + start_extra[r] or 0. End: X = FULL, Y_i = port_i^perp, helper = helper_final[r] or FULL. + * Initial (anticipatory) corrections {target t, source s, operator_word [k], coefficient c} run FIRST, before + the preconditioner (PR2226 PROOF section 3): t += c K_k s. Structure: t is a Y register, s a live + non-target register, c a non-zero dyadic rational, k an existing forward warp whose lender is s (each term is + c K_G z for the pair lent by s), operator words have length one. Frames: t and s must both be at frame 0 + when the term runs (s's entrance frame is 0); K_k fixes L_0 (checked for every warp), so applying K_k to s, + reading it into t and inverting it is rank zero and pays nothing. + * Every framed gate (add t s c F | scale t c F) climbs each incident register from its current frame S to F; + legal only if S <= F; a strict climb pays one child of rank dim F - dim S. precondition/compensation are at + frame 0 and write targets only. + * After A every target sits at its level and every centre at its centre frame; cut gates add c*centre into a + target at its level; each centre pays one COPY child of rank dim(centre frame) - dim(level) per distinct + served level (nested chain). + * warp [pos, L, G, U, E] is inserted before B[pos] (list order inside a position): requires cur[L] == span U, + sets cur[L] = span E, pays nothing (rank-zero reference change K_G); logically L <- K_G L. + * After B and restore every live register climbs to its end frame (paid). cleanup items must all be at FULL, + may touch only live registers at FULL or buffers; they pay nothing. + * Logic: exact replay over Q (rationals x free group on K_1..K_80). Every live register starts as an + independent symbol (arbitrary dirty content); buffers start at 0. add t += c s, scale t *= c, warp + left-multiplies by K_k^{+-1} with free-group cancellation, a correction adds c K_k (row of s) to t. LOW-lender + exactness (PR2226 PROOF section 3): immediately before every warp whose operator occurs in a correction, the + lender's row must be exactly its own input symbol. Accept iff after cleanup Y_i = Y_i + X_i, every other + live register is its own input and every buffer is 0. The dual orientation replays g^{-T} for every item + (add -> s -= c t, scale -> 1/c, K -> K^{-T} as new free letters, correction -> s -= c K_k^T t with + K_k^T = (K_k^{-T})^{-1}) and expects X_i = X_i - Y_i. + * Warp algebra over GF(2): G invertible, dim U = dim E, G span U = span E, M = [[G,0],[G+G^-T,G^-T]] + symplectic, M L_0 = L_0, M L_FULL = L_FULL, M L_U = L_E (Fourier rank 0), G^-T U^perp = E^perp. Exact + Clifford phases / Gaussian lifts are NOT checked here. + * Links (witness/canonical/block certificate): the B section is the canonical B plus the 48 moved tail gates, + each removed helper renamed to its lender, minus the low helpers' pre-handoff echo/temporary gates, plus + the direct-read rewrites that this checker DERIVES from those deleted gates (temporaries must be net zero; + an echo t += c h reading a temporary part a*ext becomes t += c*a ext at the echo's frame). Every other + pre-handoff event of an aliased helper must be a helper-only correction inside its block. +""" + +import sys + +if sys.flags.optimize: + sys.stdout.write('refusing to run under python -O\nFAIL_T74_LOW_ALIAS_WORDS_INDEPENDENT\n') + sys.exit(2) + +import argparse +import copy +import gzip +import hashlib +import json +import os +import subprocess +import time +from collections import Counter +from fractions import Fraction + +PASS_LINE = 'PASS_T74_LOW_ALIAS_WORDS_INDEPENDENT' +FAIL_LINE = 'FAIL_T74_LOW_ALIAS_WORDS_INDEPENDENT' +HERE = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_REPO = os.path.dirname(os.path.dirname(HERE)) +RECEIPT = 'check_ext.receipt.json' + +PR2269 = 'b479fc5567bc09ab9185bffe89b62594f36d74e5' +PR2269_PKG = 'research/gmx-t74-borrow43/' +PR2226 = 'dacaf3d81f1936bb55b8454b1244e5d014272754' +PR2226_PKG = 'research/anticipatory-dirty-borrowing/' + +# key -> (commit, repo path, git blob id, sha256) +GIT_PINS = { + 'word43_base': (PR2269, PR2269_PKG + 'new/borrow/words/BORROW-WORD-43base.json.gz', + '448dd795adba29392a90b34aa3f1b1b796c7e0bd', + '9492a5537fb87d9ca98dffcd0230f7625b3789744fa94e2f18acf23d91d998b5'), + 'word43_extra': (PR2269, PR2269_PKG + 'new/borrow/words/BORROW-WORD-43extra.json.gz', + '2b51ba96256283bbc5578f99b694c50edd8a0e35', + '87d51f5298101d5947f45c43ee02f0ec45d6acbddabb808d0d02db1eaf063734'), + 'canon_base': (PR2269, PR2269_PKG + 'new/borrow/inputs/gauge44.canonical.json.gz', + '4abb6e28f02c95b41ed345d4e4401d16d58ae791', + '65c6d17ffee2eacf27bff438f37fc549c9ed0c909cbc7a52976cc75cf2d15b91'), + 'canon_extra': (PR2269, PR2269_PKG + 'new/borrow/inputs/extra.canonical.json.gz', + 'e0d670d4351229ce6921ecfbecf180070b17616b', + 'd7e48dcbafa236a2e1e41f7958244211506f7c7630fe6a2d43d2bdf17b7ae015'), + 'blocks': (PR2269, PR2269_PKG + 'new/borrow/inputs/blocks.json', + 'c683574b3861678081fd5c5944dbd7a47309f6fd', + 'ddfac1dae1fe7cc0a91e7c7205c6d9d0c07c682880aa34eed83bf4ad7384da9f'), + 'witness43_base': (PR2269, PR2269_PKG + 'new/borrow/inputs/witness_43_base.json', + '9f4b93f3bc52d4f4ffaa128cfd7ae574fd36c462', + '67ffb66d94067f6e53aee9118fe90e14a57f497fc8b3f708b6dac3de2e58ff28'), + 'witness43_extra': (PR2269, PR2269_PKG + 'new/borrow/inputs/witness_43_extra.json', + '864ba533f50c2f1f639a6a3559b185bd321b923a', + 'd46449c6dbf4477f260cf5baea9bbb570a66ee0b6db81f4a220b9e3086ae9e46'), + 'word566_base': (PR2269, PR2269_PKG + 'new/gauge44-word-566.json.gz', + '76c01583a0286cddb0f71e0cb13077e4317104f6', + 'eeb6a236ed0ea8873b8800947d0cd19c36a6fcfdf857fc42913cb45cd984f219'), + 'word566_extra': (PR2269, PR2269_PKG + 'new/extra-word-566.json.gz', + 'e86142b352466f54a3da38c96a6e1484145c3b5c', + 'cd417b904408c221d9840d08faff8af040cc4207f9804284f2f5375d21298a62'), + 'pr2226_witness': (PR2226, PR2226_PKG + 'WITNESS.json', + '62edbcce166f7cf388231078c2cd7f75939b97e2', + '86392adde6992a08ae90f7a69c58cace1b52d942f4d2c96e82ca79e5d1e15235'), +} + +# key -> (path relative to this package, git blob id, sha256): the constructed objects under test +LOCAL_PINS = { + 'word80_base': ('words/BORROW-WORD-80base.json.gz', 'c5953dfdb0ee9ac0c2c73eb29e320582b4569d2b', + '61290abffd8c8225e0abb3958c1506674e256de688fc4cdf358bbe7c981df493'), + 'word80_extra': ('words/BORROW-WORD-80extra.json.gz', '852868543ed36efa799b3ed6dd76a0442b0d6ff1', + '1dd2d6f2ae5b5a27b5f89fb830203f0cca7a78d0323a7845e85e1e80f8f6d1a5'), + 'witness80_base': ('witness/witness_80_base.json', 'cdcd39ff1beb577b975e48633d05ee629caa1362', + '9380f74c032b0616d5b13e8ef94b6d9f80cac36239e329357e7d5fcab5283ad0'), + 'witness80_extra': ('witness/witness_80_extra.json', '6b87d35600c44d053bf5ce03e34fc315d5a2af4a', + '6737072dcca47c6e6526bd62a41585dd09026549550c9e62eb53e64b265a6709'), +} + +# Claims under test, written here from the construction report (not read from the files). +CLAIMS = { + 'ext80': { + 'base': dict(profile={1: 2303, 2: 527, 3: 386, 4: 125, 5: 37, 8: 8}, base_tag='eeb6a236'), + 'extra': dict(profile={1: 2287, 2: 535, 3: 386, 4: 125, 5: 37, 8: 8}, base_tag='cd417b90'), + 'width_inventory': {4: 4, 5: 4, 7: 36, 8: 84, 9: 272}, 'helpers': 400, 'warps': 80, 'low': 32, + 'high': 48, 'corrections': 64, 'mass': 5264, 'buffers': 44, 'inputs': 624, 'rewrites': 5, + 'new_high_X_lenders': [1, 4, 6, 12, 31]}, + 'b43': { # PR2269 predecessor (positive control of this checker on zero-correction words) + 'base': dict(profile={1: 2351, 2: 501, 3: 414, 4: 129, 5: 42, 8: 8}, base_tag='eeb6a236'), + 'extra': dict(profile={1: 2339, 2: 509, 3: 418, 4: 125, 5: 42, 8: 8}, base_tag='cd417b90'), + 'width_inventory': {4: 36, 5: 9, 7: 36, 8: 116, 9: 240}, 'helpers': 437, 'warps': 43, 'low': 0, + 'high': 43, 'corrections': 0, 'mass': 5385, 'buffers': 76, 'inputs': 661, 'rewrites': 0}, + 'canonical': {'base': {1: 2348, 2: 500, 3: 416, 4: 130, 5: 82, 8: 8}, + 'extra': {1: 2340, 2: 508, 3: 420, 4: 126, 5: 82, 8: 8}}, + 'helpers_before': 480, +} + + +class Reject(Exception): + """A failed check; .check names the check family that rejected.""" + + def __init__(self, check, msg): + Exception.__init__(self, '[%s] %s' % (check, msg)) + self.check = check + self.msg = msg + + +def need(cond, check, msg): + if not cond: + raise Reject(check, msg) + + +# ---------------------------------------------------------------------------- +# Input loading and pinning +# ---------------------------------------------------------------------------- + +def git_blob_id(data): + h = hashlib.sha1() + h.update(b'blob %d\0' % len(data)) + h.update(data) + return h.hexdigest() + + +def verify_bytes(what, data, blob, sha): + need(git_blob_id(data) == blob, 'pin', 'git blob id mismatch for %s' % what) + need(hashlib.sha256(data).hexdigest() == sha, 'pin', 'sha256 mismatch for %s' % what) + + +def load_inputs(repo): + raw, pins = {}, {} + for key in sorted(GIT_PINS): + commit, path, blob, sha = GIT_PINS[key] + got = subprocess.run(['git', '-C', repo, 'rev-parse', commit + ':' + path], capture_output=True, text=True) + need(got.returncode == 0, 'pin', 'cannot resolve %s at %s (fetch the PR head first: git fetch ' + 'https://github.com/CrocSwap/integer-mult-bounds pull//head)' % (path, commit[:8])) + need(got.stdout.strip() == blob, 'pin', 'path %s does not resolve to the pinned blob' % path) + got = subprocess.run(['git', '-C', repo, 'cat-file', 'blob', blob], capture_output=True) + need(got.returncode == 0, 'pin', 'cannot read blob %s' % blob) + verify_bytes(path, got.stdout, blob, sha) + raw[key] = got.stdout + pins[key] = dict(commit=commit, path=path, git_blob=blob, sha256=sha, bytes=len(got.stdout)) + for key in sorted(LOCAL_PINS): + rel, blob, sha = LOCAL_PINS[key] + with open(os.path.join(HERE, rel), 'rb') as fh: + data = fh.read() + verify_bytes(rel, data, blob, sha) + raw[key] = data + pins[key] = dict(local=rel, git_blob=blob, sha256=sha, bytes=len(data)) + js = {} + for key, data in raw.items(): + path = GIT_PINS[key][1] if key in GIT_PINS else LOCAL_PINS[key][0] + if path.endswith('.gz'): + data = gzip.decompress(data) + js[key] = json.loads(data.decode('utf-8')) + return js, pins, raw + + +# ---------------------------------------------------------------------------- +# GF(2) linear algebra on integer bit vectors +# ---------------------------------------------------------------------------- + +def parity(x): + return bin(x).count('1') & 1 + + +def echelon(vectors): + """Fully reduced echelon basis {pivot bit: vector} of the span of the vectors.""" + piv = {} + for x in vectors: + x = int(x) + for b in list(piv): + if (x >> b) & 1: + x ^= piv[b] + if x: + lead = x.bit_length() - 1 + for b in list(piv): + if (piv[b] >> lead) & 1: + piv[b] ^= x + piv[lead] = x + return piv + + +def span(vectors): + """Canonical key of a subspace: its reduced echelon basis, sorted decreasingly.""" + return tuple(sorted(echelon(vectors).values(), reverse=True)) + + +def reduce_by(x, piv): + for b, vec in piv.items(): + if (x >> b) & 1: + x ^= vec + return x + + +def contains(small, big): + piv = echelon(big) + return all(reduce_by(x, piv) == 0 for x in small) + + +def dim_sum(a, b): + return len(span(list(a) + list(b))) + + +def perp(sub, h): + return span([x for x in range(1, 1 << h) if all(parity(x & u) == 0 for u in sub)]) + + +def mat_apply(cols, x): + y = 0 + i = 0 + while x: + if x & 1: + y ^= cols[i] + x >>= 1 + i += 1 + return y + + +def mat_inverse(cols, h): + """Columns of G^{-1}, or None if G is singular over GF(2).""" + piv = {} + for i in range(h): + a, b = cols[i], 1 << i # invariant: G(b) = a + for p in list(piv): + pa, pb = piv[p] + if (a >> p) & 1: + a ^= pa + b ^= pb + if a == 0: + return None + lead = a.bit_length() - 1 + for p in list(piv): + pa, pb = piv[p] + if (pa >> lead) & 1: + piv[p] = (pa ^ a, pb ^ b) + piv[lead] = (a, b) + inv = [0] * h + for p, (a, b) in piv.items(): + if a != (1 << p): + return None + inv[p] = b + return inv + + +def mat_transpose(cols, h): + return [sum(((cols[r] >> j) & 1) << r for r in range(h)) for j in range(h)] + + +def lagrangian(sub, h): + """L_W = {(u, u+p): u in W, p in W^perp} encoded as x | z << h.""" + return span([u | (u << h) for u in sub] + [p << h for p in perp(sub, h)]) + + +def symp(a, b, h): + mask = (1 << h) - 1 + return parity((a & mask) & (b >> h)) ^ parity((a >> h) & (b & mask)) + + +# ---------------------------------------------------------------------------- +# Parsing (borrow word and canonical word) into one internal program shape +# ---------------------------------------------------------------------------- + +def is_int(x): + return isinstance(x, int) and not isinstance(x, bool) + + +def dyadic(q): + return q.denominator & (q.denominator - 1) == 0 + + +def unit(q): + a = abs(q.numerator) + return a > 0 and a & (a - 1) == 0 and dyadic(q) + + +def regs_of(item): + if item[0] == 'add': + return (item[1], item[2]) + return (item[1],) + + +def conv_gate(g, frame_of, where, allow_warp=False): + need(isinstance(g, list) and g, 'format', 'gate is not a list at %s' % where) + op = g[0] + if op == 'add': + need(len(g) == 6 and all(is_int(x) for x in g[1:5]), 'format', 'bad add at %s' % where) + need(g[4] > 0 and g[3] != 0, 'format', 'bad add coefficient at %s' % where) + q = Fraction(g[3], g[4]) + need(dyadic(q), 'format', 'non-dyadic coefficient at %s' % where) + need(g[1] != g[2], 'format', 'self add at %s' % where) + return ('add', g[1], g[2], q, frame_of(g[5])) + if op == 'scale': + need(len(g) == 5 and all(is_int(x) for x in g[1:4]), 'format', 'bad scale at %s' % where) + need(g[3] != 0 and g[2] != 0, 'format', 'zero scale at %s' % where) + q = Fraction(g[2], g[3]) + need(unit(q), 'format', 'scale is not a dyadic unit at %s' % where) + return ('scale', g[1], q, frame_of(g[4])) + if op == 'warp' and allow_warp: + need(len(g) == 4 and is_int(g[1]) and is_int(g[2]) and g[2] != 0, 'format', 'bad warp item at %s' % where) + return ('warp', g[1], g[2], frame_of(g[3])) + raise Reject('format', 'unknown primitive %r at %s' % (op, where)) + + +def parse_correction(t, j): + need(isinstance(t, dict) and set(t) == {'target', 'source', 'operator_word', 'coefficient'}, 'format', + 'initial correction %d: fields' % j) + need(is_int(t['target']) and is_int(t['source']), 'format', 'initial correction %d: registers' % j) + ow = t['operator_word'] + need(isinstance(ow, list) and len(ow) == 1 and is_int(ow[0]) and ow[0] > 0, 'anticipatory', + 'initial correction %d: operator word must be a single forward warp id (scope of this checker)' % j) + need(isinstance(t['coefficient'], str), 'format', 'initial correction %d: coefficient must be a string' % j) + try: + q = Fraction(t['coefficient']) + except (ValueError, ZeroDivisionError): + raise Reject('format', 'initial correction %d: coefficient %r' % (j, t['coefficient'])) + need(q != 0 and dyadic(q), 'anticipatory', 'initial correction %d: coefficient is not a non-zero dyadic' % j) + return dict(target=t['target'], source=t['source'], op=ow[0], coef=q) + + +def check_corrections(P): + """Structure of the anticipatory terms (PR2226 PROOF section 3): t += c K_G z for the pair lent by z.""" + v = P['v'] + by_op = dict((wr['op'], wr) for wr in P['warps']) + live = set(P['live']) + for j, t in enumerate(P['corr']): + need(v <= t['target'] < 2 * v, 'anticipatory', 'correction %d writes a non-target %d' % (j, t['target'])) + need(t['source'] in live and not (v <= t['source'] < 2 * v), 'anticipatory', + 'correction %d source %d is not a live non-target register' % (j, t['source'])) + need(t['op'] in by_op, 'anticipatory', 'correction %d names a missing warp %d' % (j, t['op'])) + need(by_op[t['op']]['lender'] == t['source'], 'anticipatory', + 'correction %d: operator %d is not the reference change of the pair lent by source %d' % ( + j, t['op'], t['source'])) + return dict(terms=len(P['corr']), operators=len(set(t['op'] for t in P['corr'])), + sources=len(set(t['source'] for t in P['corr']))) + + +def parse_borrow(w): + need(w.get('kind') == 'BORROW-WORD', 'format', 'not a BORROW-WORD') + rep = w['report'] + v, h, R = rep['v'], rep['h'], rep['R'] + need((v, h, R) == (112, 9, 480), 'format', 'unexpected geometry') + n = 2 * v + R + full = span([1 << i for i in range(h)]) + + def frame_lit(F): + if F is None: + return None + need(isinstance(F, list) and all(is_int(x) and 0 < x < (1 << h) for x in F), 'format', 'bad frame literal') + return span(F) + + ports = w['ports'] + need(len(ports) == v and all(is_int(p) and 0 < p < (1 << h) for p in ports), 'format', 'ports') + removed = w['removed'] + need(len(set(removed)) == len(removed) and all(2 * v <= r < n for r in removed), 'format', 'removed helpers') + removed = set(removed) + live = [r for r in range(n) if r not in removed] + start, end = {}, {} + for i in range(v): + start[i] = span([ports[i]]) + end[i] = full + start[v + i] = () + end[v + i] = perp(span([ports[i]]), h) + for r in live: + if r >= 2 * v: + start[r] = () + end[r] = full + for k, F in w['start_extra'].items(): + r = int(k) + need(r in start and r >= 2 * v, 'format', 'start_extra names a non-live/non-helper register %s' % k) + start[r] = frame_lit(F) + restored = set() + for k, F in w['helper_final'].items(): + r = int(k) + need(r in end and r >= 2 * v, 'format', 'helper_final names a non-live/non-helper register %s' % k) + end[r] = frame_lit(F) + restored.add(r) + need(isinstance(w.get('initial_corrections'), list), 'format', 'initial_corrections missing') + corr = [parse_correction(t, j) for j, t in enumerate(w['initial_corrections'])] + sec = {} + for name in ('precondition', 'compensation', 'A', 'cut', 'B', 'restore'): + sec[name] = [conv_gate(g, frame_lit, '%s[%d]' % (name, i)) for i, g in enumerate(w[name])] + cleanup = [conv_gate(g, frame_lit, 'cleanup[%d]' % i, allow_warp=True) for i, g in enumerate(w['cleanup'])] + warps = [] + for k, rec in enumerate(w['warps'], 1): + need(isinstance(rec, list) and len(rec) == 5, 'format', 'warp record %d shape' % k) + pos, L, cols, U, E = rec + need(is_int(pos) and 0 <= pos <= len(sec['B']), 'format', 'warp %d position' % k) + need(is_int(L), 'format', 'warp %d lender' % k) + need(isinstance(cols, list) and len(cols) == h and all(is_int(c) and 0 <= c < (1 << h) for c in cols), + 'format', 'warp %d G columns' % k) + need(isinstance(U, list) and isinstance(E, list) and all(is_int(x) and 0 < x < (1 << h) for x in U + E), + 'format', 'warp %d frames' % k) + warps.append(dict(op=k, pos=pos, lender=L, G=list(cols), U_list=list(U), E_list=list(E), + U=span(U), E=span(E))) + by_pos = {} + for wr in warps: + by_pos.setdefault(wr['pos'], []).append(wr) + items = [] + for p in range(len(sec['B']) + 1): + for wr in by_pos.get(p, []): + items.append(('warp', wr['lender'], wr['op'], wr['U'], wr['E'])) + if p < len(sec['B']): + items.append(sec['B'][p]) + P = dict(kind='borrow', v=v, h=h, R=R, n=n, full=full, ports=ports, live=live, removed=removed, + start=start, end=end, restored=restored, buffers=set(r + n for r in restored), + centers=list(w['centers']), center_frames=[frame_lit(F) for F in w['center_frames']], + target_levels={int(k): frame_lit(F) for k, F in w['target_levels'].items()}, + corr=corr, pre=sec['precondition'] + sec['compensation'], n_pre=len(sec['precondition']), + A=sec['A'], cut=sec['cut'], B_items=items, post=sec['restore'], cleanup=cleanup, + warps=warps, sections=sec, + claimed_profile={int(k): c for k, c in rep['local_profile'].items()}, + claimed_inventory={int(k): c for k, c in rep['width_inventory'].items()}) + check_corrections(P) + return P + + +def parse_canonical(c): + v, h, R = c['v'], c['h'], c['R'] + need((v, h, R) == (112, 9, 480), 'format', 'unexpected canonical geometry') + n = 2 * v + R + full = span([1 << i for i in range(h)]) + frames = [] + for F in c['frames']: + need(isinstance(F, list) and all(is_int(x) and 0 < x < (1 << h) for x in F), 'format', 'canonical frame') + need(len(span(F)) == len(F), 'format', 'canonical frame basis is dependent') + frames.append(span(F)) + + def frame_idx(F): + if F is None: + return None + need(is_int(F) and 0 <= F < len(frames), 'format', 'canonical frame index') + return frames[F] + + ports = c['ports'] + need(len(c['start']) == n and len(c['final']) == n, 'format', 'canonical start/final length') + start = {r: frames[c['start'][r]] for r in range(n)} + end = {r: frames[c['final'][r]] for r in range(n)} + for i in range(v): + need(start[i] == span([ports[i]]), 'format', 'canonical X start is not its port line') + need(end[i] == full, 'format', 'canonical X end is not FULL') + need(start[v + i] == (), 'format', 'canonical Y start is not 0') + need(end[v + i] == perp(span([ports[i]]), h), 'format', 'canonical Y end is not port-perp') + sec = {} + for name in ('precondition', 'compensation', 'A', 'cut', 'B', 'tail', 'cleanup'): + sec[name] = [conv_gate(g, frame_idx, 'canon %s[%d]' % (name, i)) for i, g in enumerate(c[name])] + return dict(kind='canonical', v=v, h=h, R=R, n=n, full=full, ports=ports, live=list(range(n)), + removed=set(), start=start, end=end, restored=set(), buffers=set(), + centers=list(c['centers']), center_frames=[frames[i] for i in c['center_frames']], + target_levels={int(k): frame_idx(F) for k, F in c['target_levels'].items()}, + corr=[], pre=sec['precondition'] + sec['compensation'], n_pre=len(sec['precondition']), + A=sec['A'], cut=sec['cut'], B_items=list(sec['B']), post=sec['tail'], cleanup=sec['cleanup'], + warps=[], sections=sec, frames=frames, + claimed_profile={int(k): x for k, x in c['local_profile'].items()}, claimed_inventory=None) + + +# ---------------------------------------------------------------------------- +# Check 1: warp algebra +# ---------------------------------------------------------------------------- + +def check_warp(wr, h, live, v): + k = wr['op'] + cols = wr['G'] + inv = mat_inverse(cols, h) + need(inv is not None, 'warp', 'warp %d: G is singular over GF(2)' % k) + need(all(mat_apply(cols, inv[t]) == 1 << t and mat_apply(inv, cols[t]) == 1 << t for t in range(h)), + 'warp', 'warp %d: inverse witness' % k) + U, E = wr['U'], wr['E'] + need(len(U) == len(wr['U_list']) and len(E) == len(wr['E_list']), 'warp', + 'warp %d: U or E list is linearly dependent' % k) + need(len(U) == len(E), 'warp', 'warp %d: dim U != dim E' % k) + need(span([mat_apply(cols, u) for u in U]) == E, 'warp', 'warp %d: G span U != span E' % k) + git = mat_transpose(inv, h) # G^{-T} + mask = (1 << h) - 1 + + def M(vec): + x, z = vec & mask, vec >> h + gx = mat_apply(cols, x) + return gx | ((gx ^ mat_apply(git, x) ^ mat_apply(git, z)) << h) + + gens = [1 << i for i in range(2 * h)] + imgs = [M(g) for g in gens] + need(len(span(imgs)) == 2 * h, 'warp', 'warp %d: K_G singular' % k) + for a in range(2 * h): + for b in range(a + 1, 2 * h): + need(symp(imgs[a], imgs[b], h) == symp(gens[a], gens[b], h), 'warp', 'warp %d: K_G not symplectic' % k) + full = span([1 << i for i in range(h)]) + L0, LF, LU, LE = lagrangian((), h), lagrangian(full, h), lagrangian(U, h), lagrangian(E, h) + need(len(L0) == len(LF) == len(LU) == len(LE) == h, 'warp', 'warp %d: Lagrangian dimension' % k) + need(span([M(x) for x in L0]) == L0, 'warp', 'warp %d: K_G does not fix L_0' % k) + need(span([M(x) for x in LF]) == LF, 'warp', 'warp %d: K_G does not fix L_FULL' % k) + MLU = span([M(x) for x in LU]) + rank_in = h - (len(LE) + len(MLU) - dim_sum(LE, MLU)) + need(MLU == LE and rank_in == 0, 'warp', 'warp %d: K_G L_U != L_E (Fourier rank %d)' % (k, rank_in)) + need(span([mat_apply(git, p) for p in perp(U, h)]) == perp(E, h), 'warp', 'warp %d: G^-T U^perp != E^perp' % k) + need(wr['lender'] in live and not (v <= wr['lender'] < 2 * v), 'warp', + 'warp %d: lender must be a live non-target register' % k) + plain = h - (2 * h - dim_sum(LU, LE)) + by_formula = len(U) + len(E) - 2 * (len(U) + len(E) - dim_sum(U, E)) + need(plain == by_formula, 'warp', 'warp %d: Lagrangian distance lemma inconsistency' % k) + return dict(op=k, pos=wr['pos'], lender=wr['lender'], dim=len(U), plain_fourier_distance=plain, + U_eq_E=(U == E), U_in_E=contains(U, E)) + + +def check_all_warps(P): + out = [check_warp(wr, P['h'], set(P['live']), P['v']) for wr in P['warps']] + lenders = [wr['lender'] for wr in P['warps']] + need(len(set(lenders)) == len(lenders), 'warp', 'a register lends twice') + return out + + +# ---------------------------------------------------------------------------- +# Check 2: frame legality and paid-profile recount +# ---------------------------------------------------------------------------- + +def frame_check(P, charge_warps=False, warp_as_climb=()): + v, full = P['v'], P['full'] + cur = {r: P['start'][r] for r in P['live']} + paid, climbs, copies, warp_charge = Counter(), Counter(), Counter(), Counter() + per_reg = Counter() + istarget = lambda r: v <= r < 2 * v + + def climb(r, F, where): + need(r in cur, 'frame', 'register %d is not live (%s)' % (r, where)) + old = cur[r] + need(contains(old, F), 'frame', 'non-nested climb of %d at %s: %r -> %r' % (r, where, old, F)) + d = len(F) - len(old) + if d: + paid[d] += 1 + climbs[d] += 1 + per_reg[r] += d + cur[r] = F + + # anticipatory initial corrections: before the preconditioner, both ends at frame 0, K_k rank zero there + for j, t in enumerate(P['corr']): + for role in ('target', 'source'): + r = t[role] + need(r in cur, 'frame', 'initial correction %d: %s %d is not live' % (j, role, r)) + need(cur[r] == (), 'frame', 'initial correction %d: %s %d is not at frame 0 (frame %r)' % ( + j, role, r, cur[r])) + for i, g in enumerate(P['pre']): + need(g[-1] == (), 'frame', 'precondition/compensation gate %d not at frame 0' % i) + need(istarget(g[1]), 'frame', 'precondition/compensation gate %d writes a non-target' % i) + for r in regs_of(g): + climb(r, (), 'pre[%d]' % i) + for i, g in enumerate(list(P['A']) + [it for it in P['B_items'] if it[0] != 'warp'] + list(P['post'])): + need(not (g[0] == 'add' and not istarget(g[1]) and istarget(g[2])), 'frame', + 'a non-target register reads a target (item %d of A+B+post)' % i) + for i, g in enumerate(P['A']): + need(g[-1] is not None, 'frame', 'unframed gate in A') + for r in regs_of(g): + climb(r, g[-1], 'A[%d]' % i) + for t in range(v): + need(cur[v + t] == P['target_levels'].get(t, ()), 'frame', 'target %d not at its level after A' % t) + need(len(set(P['centers'])) == len(P['centers']) == len(P['center_frames']), 'frame', 'centres') + for q, U in zip(P['centers'], P['center_frames']): + need(q in cur and cur[q] == U, 'frame', 'centre %d not at its centre frame after A' % q) + served = dict((q, set()) for q in P['centers']) + for i, g in enumerate(P['cut']): + need(g[0] == 'add' and g[-1] is None, 'frame', 'cut[%d] is not an unframed add' % i) + t, s = g[1], g[2] + need(istarget(t) and s in served, 'frame', 'cut[%d] must add a centre into a target' % i) + need(cur[t] == P['target_levels'].get(t - v, ()), 'frame', 'cut[%d] target off its level' % i) + served[s].add(cur[t]) + for q, U in zip(P['centers'], P['center_frames']): + prev = U + for T in sorted(served[q], key=lambda S: (-len(S), S)): + need(contains(T, prev), 'frame', 'centre %d copy levels not nested' % q) + if T != prev: + paid[len(prev) - len(T)] += 1 + copies[len(prev) - len(T)] += 1 + prev = T + for i, it in enumerate(P['B_items']): + if it[0] == 'warp': + _, L, k, U, E = it + need(L in cur and not istarget(L), 'frame', 'warp %d lender %d not a live non-target' % (k, L)) + if k in warp_as_climb: + climb(L, E, 'warp %d treated as an ordinary climb' % k) + continue + need(cur[L] == U, 'frame', 'warp %d: lender %d frame %r != U %r' % (k, L, cur[L], U)) + if charge_warps: + d = len(U) + len(E) - 2 * (len(U) + len(E) - dim_sum(U, E)) + if d: + paid[d] += 1 + warp_charge[d] += 1 + cur[L] = E + else: + need(it[-1] is not None, 'frame', 'unframed gate in B') + for r in regs_of(it): + climb(r, it[-1], 'B item %d' % i) + for i, g in enumerate(P['post']): + need(g[-1] is not None, 'frame', 'unframed gate after B') + for r in regs_of(g): + climb(r, g[-1], 'post-B[%d]' % i) + for r in P['live']: + climb(r, P['end'][r], 'end frame') + for i, it in enumerate(P['cleanup']): + need(it[-1] == full, 'frame', 'cleanup item %d not at FULL' % i) + rr = (it[1],) if it[0] == 'warp' else regs_of(it) + for r in rr: + if r in P['buffers']: + continue + need(r in cur and cur[r] == full, 'frame', + 'cleanup item %d touches register %d whose frame is not FULL' % (i, r)) + for r in P['live']: + need(per_reg[r] == len(P['end'][r]) - len(P['start'][r]), 'frame', 'per-register charge != width for %d' % r) + helpers = [r for r in P['live'] if r >= 2 * v] + inventory = Counter(len(P['end'][r]) - len(P['start'][r]) for r in helpers) + return dict(paid=paid, climbs=climbs, copies=copies, warp_charge=warp_charge, inventory=inventory, + helpers=len(helpers), widths=[len(P['end'][r]) - len(P['start'][r]) for r in sorted(helpers)], + helper_width_sum=sum(inventory[k] * k for k in inventory), + mass=sum(k * c for k, c in paid.items())) + + +# ---------------------------------------------------------------------------- +# Check 3: exact replay over the free-group algebra Q +# ---------------------------------------------------------------------------- + +ONE = Fraction(1) + + +def left_mult(letter, word): + inverse = (letter[0], letter[1], -letter[2]) + return word[1:] if (word and word[0] == inverse) else (letter,) + word + + +def replay(P, dual=False): + v = P['v'] + rows = {} + for r in P['live']: + rows[r] = {(r, ()): ONE} + for b in P['buffers']: + rows[b] = {} + istarget = lambda r: v <= r < 2 * v + low_ops = set(t['op'] for t in P['corr']) + + def row(r): + need(r in rows, 'replay', 'unknown register %d' % r) + return rows[r] + + def axpy(dst, src, c, letter=None): + for (var, word), val in list(src.items()): + key = (var, word if letter is None else left_mult(letter, word)) + nv = dst.get(key, 0) + c * val + if nv: + dst[key] = nv + else: + del dst[key] + + def do(it): + kind = it[0] + if kind == 'add': + t, s, c = it[1], it[2], it[3] + if dual: + t, s, c = s, t, -c + need(t != s, 'replay', 'self add') + axpy(row(t), row(s), c) + elif kind == 'scale': + t, c = it[1], it[2] + if dual: + c = 1 / c + rr = row(t) + for key in rr: + rr[key] = rr[key] * c + elif kind == 'warp': + reg, k = it[1], it[2] + letter = (abs(k), 1 if dual else 0, 1 if k > 0 else -1) + rows[reg] = dict(((var, left_mult(letter, word)), val) for (var, word), val in row(reg).items()) + else: + raise Reject('replay', 'unknown item') + + # 0. anticipatory initial corrections: t += c K_k s (dual: s -= c K_k^T t, K_k^T = (K_k^{-T})^{-1}) + for t in P['corr']: + if not dual: + axpy(row(t['target']), row(t['source']), t['coef'], (t['op'], 0, 1)) + else: + axpy(row(t['source']), row(t['target']), -t['coef'], (t['op'], 1, -1)) + for it in list(P['pre']) + list(P['A']) + list(P['cut']): + do(it) + exact_lenders = 0 + for it in P['B_items']: + if it[0] == 'warp': + if not dual and it[2] in low_ops: + need(row(it[1]) == {(it[1], ()): ONE}, 'lender', + 'low lender %d is not exactly its own input at the handoff of warp %d' % (it[1], it[2])) + exact_lenders += 1 + do(('warp', it[1], it[2])) + else: + do(it) + for it in P['post']: + do(it) + diag = {} + need(all(not rows[b] for b in P['buffers']), 'replay', 'a buffer is non-zero before cleanup') + if not dual: + diag['low_lenders_exact_at_handoff'] = exact_lenders + for t in range(v): + need(rows[v + t] == {(v + t, ()): ONE, (t, ()): ONE}, 'replay', 'target %d not final before cleanup' % t) + for r in P['restored']: + need(rows[r] == {(r, ()): ONE}, 'replay', 'restored cold register %d is not its own input' % r) + readers = [r for r in P['live'] if r not in P['restored'] and not istarget(r) + and any(var in P['restored'] for var, _ in rows[r])] + need(not readers, 'replay', 'restored inputs still read by %r' % readers[:5]) + diag['rows_with_operator_words_before_cleanup'] = sum( + 1 for r in P['live'] if any(word for _, word in rows[r])) + peak = 0 + first_live = last_live = None + span_of = {} + noop_buffer_reads = 0 + for i, it in enumerate(P['cleanup']): + if it[0] == 'add': + src = it[2] if not dual else it[1] + if src in P['buffers'] and not rows[src]: + noop_buffer_reads += 1 + do(it) + live_buffers = 0 + for b in P['buffers']: + if rows[b]: + live_buffers += 1 + lo, hi = span_of.get(b, (i, i)) + span_of[b] = (min(lo, i), i) + if live_buffers: + first_live = i if first_live is None else first_live + last_live = i + peak = max(peak, live_buffers) + events = sorted([(lo, 1) for lo, hi in span_of.values()] + [(hi + 1, -1) for lo, hi in span_of.values()]) + overlap = best = 0 + for _, d in events: + overlap += d + best = max(best, overlap) + diag['buffers_ever_nonzero'] = len(span_of) + diag['max_overlap_of_buffer_lifetimes'] = best + diag['cleanup_adds_reading_a_zero_buffer'] = noop_buffer_reads + for r in P['live']: + if dual: + exp = {(r, ()): ONE, (r + v, ()): -ONE} if r < v else {(r, ()): ONE} + else: + exp = {(r, ()): ONE, (r - v, ()): ONE} if istarget(r) else {(r, ()): ONE} + need(rows[r] == exp, 'replay', 'final map wrong on register %d (%s)' % (r, 'dual' if dual else 'forward')) + need(all(not rows[b] for b in P['buffers']), 'replay', 'a zero buffer is not returned to zero') + # backstop after the algebraic checks: every low operator must have had its forward warp (and exactness test) + need(dual or exact_lenders == len(low_ops), 'lender', 'a low operator has no forward warp in B') + diag.update(peak_nonzero_buffers=peak, buffer_nonzero_window=[first_live, last_live], + buffers=len(P['buffers']), independent_inputs=len(P['live']), corrections=len(P['corr'])) + return diag + + +# ---------------------------------------------------------------------------- +# Links: canonical base, block certificate, witness, PR2226 terms, PR2269 43-word, 566 predecessor +# ---------------------------------------------------------------------------- + +def coef(g): + return g[3] if g[0] == 'add' else g[2] + + +def norm(g): + return (g[0],) + tuple(regs_of(g)) + (coef(g), g[-1]) + + +def block_maps(blocks): + high, low, block_of = set(), set(), {} + for bl in blocks['sources'][0]['blocks']: + high |= set(bl['high']) + low |= set(bl['low']) + for r in bl['helpers']: + need(r not in block_of, 'link', 'helper %d in two blocks' % r) + block_of[r] = bl + need(not (high & low), 'link', 'a helper is both high and low') + return high, low, block_of + + +def prefix_analysis(C, pairs, block_of, low, v): + """Derive, from the canonical B alone, what aliasing each helper requires before its handoff. + + For each aliased helper h with handoff index H (= its block's first input): every canonical B event on h + before H is either a helper-only correction inside h's block (deferred; kept) or, for a LOW helper only, + an echo t += c h (t a target; deleted) or a temporary h += a ext (ext outside the block, not a target; + deleted). Temporaries must have zero net change per source; an echo reading the current temporary part + sum a*ext becomes direct reads t += c*a ext at the echo's frame (the derived rewrites).""" + CB = C['sections']['B'] + istarget = lambda r: v <= r < 2 * v + events = {} + for i, g in enumerate(CB): + for r in set(regs_of(g)): + events.setdefault(r, []).append(i) + deleted, rewrites, info = set(), [], {} + for pr in pairs: + h = pr['register'] + bl = block_of[h] + H = pr['handoff_B'] + need(H == bl['first_input'], 'prefix', 'helper %d: handoff %r != block first input %r' % (h, H, bl['first_input'])) + helpers = set(bl['helpers']) + pre = [i for i in events.get(h, []) if i < H] + kept = [i for i in pre if all(r in helpers for r in regs_of(CB[i]))] + others = [i for i in pre if i not in kept] + if h not in low: + need(not others, 'prefix', 'high helper %d has a pre-handoff event outside helper-only corrections' % h) + need(not pr.get('deleted_prefix_indices') and not pr.get('deleted_echo_indices'), 'prefix', + 'high helper %d witness deletes gates' % h) + info[h] = dict(kind='high', deferred_helper_only=len(kept)) + continue + need(sorted(others) == sorted(pr.get('deleted_prefix_indices', [])), 'prefix', + 'low helper %d: witness deleted prefix %r != derived %r' % (h, pr.get('deleted_prefix_indices'), others)) + temp = {} + mine, echoes, temps = [], 0, 0 + for i in sorted(others): + g = CB[i] + need(g[0] == 'add', 'prefix', 'low helper %d: pre-handoff scale at B[%d]' % (h, i)) + if g[1] == h and g[2] not in helpers and not istarget(g[2]): + temp[g[2]] = temp.get(g[2], 0) + g[3] + temps += 1 + elif g[2] == h and istarget(g[1]): + echoes += 1 + for ext in sorted(temp): + if temp[ext]: + mine.append(('add', g[1], ext, g[3] * temp[ext], g[-1])) + else: + raise Reject('prefix', 'low helper %d: B[%d] %r is neither an echo nor a temporary' % (h, i, g)) + need(all(a == 0 for a in temp.values()), 'prefix', 'low helper %d: temporaries are not net zero' % h) + echo_idx = sorted(i for i in others if CB[i][2] == h) + need(echo_idx == sorted(pr.get('deleted_echo_indices', [])), 'prefix', 'low helper %d: echo indices' % h) + wit_rw = Counter() + for idx, lst in pr.get('early_prefix_rewrites', {}).items(): + need(int(idx) in others, 'prefix', 'low helper %d: rewrite keyed by a non-deleted index' % h) + for g in lst: + wit_rw[(g[1], g[2], Fraction(g[3], g[4]), C['frames'][g[5]])] += 1 + need(wit_rw == Counter((g[1], g[2], g[3], g[4]) for g in mine), 'prefix', + 'low helper %d: witness rewrites != derived rewrites' % h) + deleted |= set(others) + rewrites += mine + info[h] = dict(kind='low', deferred_helper_only=len(kept), echoes=echoes, temporaries=temps, rewrites=len(mine)) + return deleted, rewrites, info + + +def link_checks(tag, P, C, wit, blocks, w_raw): + out = {} + v, n, h = P['v'], P['n'], P['h'] + need(P['ports'] == C['ports'] and P['centers'] == C['centers'], 'link', 'ports/centres differ from canonical') + need(P['center_frames'] == C['center_frames'], 'link', 'centre frames differ from canonical') + removed = P['removed'] + high, low, block_of = block_maps(blocks) + need(removed <= (high | low), 'link', 'a removed helper is neither high nor low') + rh, rl = removed & high, removed & low + out['removed_high'], out['removed_low'] = len(rh), len(rl) + touches = lambda g: any(r in removed for r in regs_of(g)) + need(not any(touches(g) for g in C['sections']['compensation'] if any(r in rh for r in regs_of(g))), 'link', + 'canonical compensation reads a removed HIGH helper (a high helper must have zero response)') + for name in ('precondition', 'compensation', 'A', 'cut'): + kept = [norm(g) for g in C['sections'][name] if not touches(g)] + need([norm(g) for g in P['sections'][name]] == kept, 'link', 'section %s != canonical minus removed' % name) + out['canonical_%s_gates_dropped' % name] = len(C['sections'][name]) - len(kept) + for r in P['live']: + if r >= 2 * v: + need(P['start'][r] == C['start'][r], 'link', 'start frame of %d differs from canonical' % r) + for r in P['restored']: + need(P['end'][r] == C['end'][r], 'link', 'cold end frame of %d differs from canonical' % r) + canon_cold = [r for r in range(2 * v, n) if len(C['end'][r]) < h] + out['canonical_cold_helpers'] = len(canon_cold) + cold_full = sorted(r for r in canon_cold if r not in removed and r not in P['restored']) + out['canonical_cold_helpers_ending_FULL_after_borrowing'] = cold_full + grown = sum(len(P['end'][r]) - len(C['end'][r]) for r in cold_full) + removed_widths = sum(len(C['end'][r]) - len(C['start'][r]) for r in removed) + need(all(P['start'][r] == C['start'][r] and P['end'][r] == C['end'][r] for r in P['live'] if r not in cold_full), + 'link', 'some other register changed its start/end frame') + out['mass_identity'] = dict(removed_widths=removed_widths, width_added_to_cold_now_FULL=grown, + predicted_saving=removed_widths - grown) + out['removed_old_widths'] = dict(sorted(Counter(len(C['end'][r]) - len(C['start'][r]) for r in removed).items())) + # witness <-> word + pairs = wit['pairs'] + need(len(pairs) == len(P['warps']), 'link', 'witness pair count') + need(wit['initial_corrections'] == w_raw['initial_corrections'], 'link', 'witness corrections != word corrections') + gauss = dict((g['operator'], g['G_columns']) for g in wit['gaussian']['records']) + low_ops, low_lenders = set(), set() + for wr, pr in zip(P['warps'], pairs): + k = wr['op'] + need(pr['borrow_from'] == wr['lender'], 'link', 'warp %d lender != witness borrow_from' % k) + need(gauss.get(k) == wr['G'], 'link', 'warp %d G != witness Gaussian record' % k) + need(span(pr['retirement_basis']) == wr['U'], 'link', 'warp %d U != witness retirement basis' % k) + need(span(pr['handoff_basis']) == wr['E'], 'link', 'warp %d E != witness handoff basis' % k) + is_low = pr['register'] in low + need(pr['low'] is is_low and pr['anticipate'] is is_low and pr['handoff_paid_rank'] == 0, 'link', + 'warp %d witness flags (low/anticipate/handoff_paid_rank)' % k) + if is_low: + low_ops.add(k) + low_lenders.add(wr['lender']) + need(set(p['register'] for p in pairs) == removed, 'link', 'witness registers != removed set') + need(set(t['op'] for t in P['corr']) == low_ops, 'link', 'correction operators != the low pairs\' warps') + need(set(t['source'] for t in P['corr']) == low_lenders, 'link', 'correction sources != low lenders') + out['low_ops'] = sorted(low_ops) + out['low_lenders'] = sorted(low_lenders) + out['low_lenders_entrance_frame_dims'] = sorted(set(len(P['start'][L]) for L in low_lenders)) + out['low_lenders_canonical_final_dims'] = dict(sorted(Counter(len(C['end'][L]) for L in low_lenders).items())) + # B: canonical B + moved tail, renamed, minus derived deleted prefix, plus derived rewrites + deleted, rewrites, pinfo = prefix_analysis(C, pairs, block_of, low, v) + rename = dict((p['register'], p['borrow_from']) for p in pairs) + + def ren(g): + if g[0] == 'add': + return ('add', rename.get(g[1], g[1]), rename.get(g[2], g[2]), g[3], g[4]) + return ('scale', rename.get(g[1], g[1]), g[2], g[3]) + CB = C['sections']['B'] + moved = [C['sections']['tail'][e['old_tail_index']] for e in wit['early_tail_events']] + lhs = Counter(norm(ren(g)) for i, g in enumerate(CB) if i not in deleted) + lhs.update(norm(ren(g)) for g in moved) + lhs.update(norm(ren(g)) for g in rewrites) + rhs = Counter(norm(it) for it in P['B_items'] if it[0] != 'warp') + need(lhs == rhs, 'link', 'B multiset != canonical B - deleted prefix + moved tail + derived rewrites (renamed)') + out['B_multiset_ok'] = True + out['moved_tail_gates'] = len(moved) + out['deleted_prefix_gates'] = len(deleted) + out['derived_rewrites'] = sorted([[g[1], g[2], str(g[3]), list(g[4])] for g in rewrites]) + out['low_prefix'] = dict( + echoes=sum(x.get('echoes', 0) for x in pinfo.values()), + temporaries=sum(x.get('temporaries', 0) for x in pinfo.values()), + deferred_helper_only_low=sum(x['deferred_helper_only'] for x in pinfo.values() if x['kind'] == 'low'), + deferred_helper_only_high=sum(x['deferred_helper_only'] for x in pinfo.values() if x['kind'] == 'high')) + return out + + +def link_pr2226(P, wit, w2226, wit43): + """The 64 terms are PR2226's 64 T8 terms up to operator ids; low pairs are PR2226's; 43 highs are PR2269's.""" + out = {} + reg_of_op = dict((k, p['register']) for k, p in enumerate(wit['pairs'], 1)) + reg_of_op_2226 = dict((k, p['register']) for k, p in enumerate(w2226['pairs'], 1)) + ours = Counter((t['target'], t['source'], t['coef'], reg_of_op[t['op']]) for t in P['corr']) + theirs = Counter() + for j, t in enumerate(w2226['initial_corrections']): + q = parse_correction(t, j) + theirs[(q['target'], q['source'], q['coef'], reg_of_op_2226[q['op']])] += 1 + need(ours == theirs, 'link2226', '(target, source, coefficient, aliased register) multiset != PR2226 T8 terms') + out['terms_equal_pr2226'] = sum(ours.values()) + lp = lambda pp: set((p['register'], p['borrow_from']) for p in pp if p.get('low')) + need(lp(wit['pairs']) == lp(w2226['pairs']), 'link2226', 'low (register, lender) pairs != PR2226 low pairs') + out['low_pairs_equal_pr2226'] = len(lp(w2226['pairs'])) + hp = lambda pp: set((p['register'], p['borrow_from']) for p in pp if not p.get('low')) + ours_h, w43_h, t_h = hp(wit['pairs']), hp(wit43['pairs']), hp(w2226['pairs']) + need(w43_h <= ours_h, 'link2226', 'a PR2269 high pair is missing or changed') + new = sorted(ours_h - w43_h) + out['high_pairs_from_pr2269'] = len(w43_h) + out['new_high_pairs'] = [list(x) for x in new] + out['new_high_pr2226_lenders'] = sorted([list(x) for x in t_h if x[0] in set(r for r, _ in new)]) + out['high_pairs_equal_pr2226'] = len(ours_h & t_h) + return out + + +def link_566(C, o): + """Canonical word == predecessor 566 word up to a register permutation and a linear frame map.""" + h = C['h'] + pi = {} + pairs = {} + + def lit(F): + return None if F is None else span(F) + + def add_pair(a, b, where): + need((a is None) == (b is None), 'link566', 'frame presence differs at %s' % where) + if a is not None: + need(pairs.setdefault(a, b) == b, 'link566', 'inconsistent frame pair at %s' % where) + + def align(cg, og, where): + need(cg[0] == og[0], 'link566', 'op differs at %s' % where) + oc = conv_gate(og, lit, where) + need(coef(cg) == coef(oc), 'link566', 'coefficient differs at %s' % where) + for x, y in zip(regs_of(cg), regs_of(oc)): + need(pi.setdefault(x, y) == y, 'link566', 'register map conflict at %s' % where) + add_pair(cg[-1], oc[-1], where) + + for name in ('precondition', 'A', 'cut', 'B'): + need(len(C['sections'][name]) == len(o[name]), 'link566', 'length of %s' % name) + for i, (cg, og) in enumerate(zip(C['sections'][name], o[name])): + align(cg, og, '%s[%d]' % (name, i)) + early = o['early_cleanup'] + eidx = [e[0] for e in early] + need(len(set(eidx)) == len(eidx) == len(C['sections']['tail']), 'link566', 'early cleanup count') + rest = [g for i, g in enumerate(o['cleanup']) if i not in set(eidx)] + need(len(rest) == len(C['sections']['cleanup']), 'link566', 'cleanup length') + for i, (cg, og) in enumerate(zip(C['sections']['cleanup'], rest)): + align(cg, og, 'cleanup[%d]' % i) + for i, (cg, (j, F)) in enumerate(zip(C['sections']['tail'], early)): + og = list(o['cleanup'][j][:-1]) + [F] + align(cg, og, 'tail[%d]' % i) + need(len(pi) == C['n'] and len(set(pi.values())) == C['n'], 'link566', 'register map is not a bijection') + v = C['v'] + need(all((x < v) == (y < v) and (x < 2 * v) == (y < 2 * v) for x, y in pi.items()), 'link566', 'roles not preserved') + need(all(x == y for x, y in pi.items() if x >= 2 * v), 'link566', 'helpers renumbered') + ones = [(a[0], b[0]) for a, b in pairs.items() if len(a) == 1 and b is not None and len(b) == 1] + piv = {} + for a, b in ones: + x, y = a, b + for p in list(piv): + pa, pb = piv[p] + if (x >> p) & 1: + x ^= pa + y ^= pb + if x: + lead = x.bit_length() - 1 + for p in list(piv): + pa, pb = piv[p] + if (pa >> lead) & 1: + piv[p] = (pa ^ x, pb ^ y) + piv[lead] = (x, y) + need(len(piv) == h, 'link566', 'one-dimensional frame pairs do not span F_2^h') + tau = [0] * h + for p, (a, b) in piv.items(): + need(a == 1 << p, 'link566', 'tau construction') + tau[p] = b + need(mat_inverse(tau, h) is not None, 'link566', 'tau singular') + tmap = lambda S: span([mat_apply(tau, x) for x in S]) + for a, b in pairs.items(): + need(tmap(a) == b, 'link566', 'frame pair not induced by the linear map tau') + for i in range(v): + need(mat_apply(tau, C['ports'][i]) == o['ports'][pi[i]], 'link566', 'port %d' % i) + need([pi[q] for q in C['centers']] == o['centers'], 'link566', 'centres') + need([tmap(F) for F in C['center_frames']] == [span(F) for F in o['center_frames']], 'link566', 'centre frames') + full = C['full'] + for r in range(2 * v, C['n']): + os_ = span(o['start_extra'][str(r)]) if str(r) in o['start_extra'] else () + oe = span(o['helper_final'][str(r)]) if str(r) in o['helper_final'] else full + need(tmap(C['start'][r]) == os_, 'link566', 'helper start %d' % r) + need(tmap(C['end'][r]) == oe, 'link566', 'helper end %d' % r) + need(dict((int(k), c) for k, c in o['report']['local_profile'].items()) == C['claimed_profile'], 'link566', + 'canonical local_profile != 566 report local_profile') + return dict(register_permutation_nonidentity=sum(1 for x, y in pi.items() if x != y), + aligned_frame_pairs=len(pairs)) + + +# ---------------------------------------------------------------------------- +# Controls +# ---------------------------------------------------------------------------- + +def dsort(c): + return dict((str(k), c[k]) for k in sorted(c)) + + +def expect_reject(name, target, fn, results, also=None): + """Run fn (which must raise Reject from check family `target`).""" + entry = dict(control=name, target_check=target) + try: + fn() + entry.update(rejected=False) + except Reject as e: + entry.update(rejected=True, by=e.check, reason=e.msg[:200]) + entry['ok'] = bool(entry['rejected'] and entry.get('by') == target) + if also is not None: + info = {} + for label, g in also: + try: + g() + info[label] = 'accepted' + except Reject as e: + info[label] = 'rejected[%s]' % e.check + entry['other_checks'] = info + results.append(entry) + print(' control %-66s target=%-12s %s' % (name, target, 'REJECTED-OK' if entry['ok'] else 'NOT-OK ' + str(entry)), + flush=True) + return entry['ok'] + + +def mutate_P(P): + Q = dict(P) + for key in ('pre', 'A', 'cut', 'B_items', 'post', 'cleanup'): + Q[key] = list(P[key]) + Q['warps'] = [dict(w) for w in P['warps']] + Q['corr'] = [dict(t) for t in P['corr']] + return Q + + +def profile_check(P, fr, claim): + need(dict(fr['paid']) == P['claimed_profile'], 'profile', + 'recount %r != word report %r' % (dsort(fr['paid']), P['claimed_profile'])) + need(dict(fr['paid']) == claim, 'profile', 'recount != claimed profile') + + +def controls_low(P, results): + """Controls specific to LOW pairs and anticipatory initial corrections.""" + ok = True + corr = P['corr'] + low_ops = sorted(set(t['op'] for t in corr)) + by_op = dict((w['op'], w) for w in P['warps']) + t0 = corr[0] + # 1. drop one anticipatory term + Q = mutate_P(P) + del Q['corr'][0] + ok &= expect_reject('anticipatory: drop term 0 (%d += %s K_%d %d)' % (t0['target'], t0['coef'], t0['op'], + t0['source']), 'replay', + lambda: replay(Q), results, also=[('frame', lambda: frame_check(Q))]) + # 2. perturb one term (x2), 3. flip its sign + for label, f in (('x2', lambda c: 2 * c), ('sign flip', lambda c: -c)): + Q = mutate_P(P) + Q['corr'][0]['coef'] = f(t0['coef']) + ok &= expect_reject('anticipatory: term 0 coefficient %s' % label, 'replay', lambda: replay(Q), results, + also=[('dual replay', lambda: replay(Q, dual=True))]) + # 4. drop all terms + Q = mutate_P(P) + Q['corr'] = [] + ok &= expect_reject('anticipatory: drop all %d terms' % len(corr), 'replay', lambda: replay(Q), results) + # 5. retarget one term to another target + Q = mutate_P(P) + Q['corr'][0]['target'] = P['v'] + ((t0['target'] - P['v'] + 1) % P['v']) + ok &= expect_reject('anticipatory: term 0 written into target %d' % Q['corr'][0]['target'], 'replay', + lambda: replay(Q), results) + # 6. structurally valid redirection to another low pair (source and operator consistent) + other = next(k for k in low_ops if by_op[k]['lender'] != t0['source']) + Q = mutate_P(P) + Q['corr'][0]['op'], Q['corr'][0]['source'] = other, by_op[other]['lender'] + ok &= expect_reject('anticipatory: term 0 redirected to pair K_%d / lender %d' % (other, by_op[other]['lender']), + 'replay', lambda: replay(Q), results, also=[('structure', lambda: check_corrections(Q))]) + # 7. operator not owned by the source + Q = mutate_P(P) + Q['corr'][0]['op'] = other + ok &= expect_reject('anticipatory: term 0 uses K_%d of another lender' % other, 'anticipatory', + lambda: check_corrections(Q), results) + # 8. a term reading an X register (structurally consistent: X lender with its own warp) + xw = next(w for w in P['warps'] if w['lender'] < P['v']) + Q = mutate_P(P) + Q['corr'][0]['op'], Q['corr'][0]['source'] = xw['op'], xw['lender'] + ok &= expect_reject('anticipatory: term 0 reads X register %d through K_%d' % (xw['lender'], xw['op']), 'frame', + lambda: frame_check(Q), results, also=[('structure', lambda: check_corrections(Q))]) + # 9. drop one low warp entirely (forward in B and inverse in cleanup), corrections kept + k = low_ops[0] + Q = mutate_P(P) + Q['B_items'] = [it for it in P['B_items'] if not (it[0] == 'warp' and it[2] == k)] + Q['cleanup'] = [it for it in P['cleanup'] if not (it[0] == 'warp' and it[2] == -k)] + ok &= expect_reject('low warp %d (lender %d) dropped from B and cleanup' % (k, by_op[k]['lender']), 'replay', + lambda: replay(Q), results, also=[('frame', lambda: frame_check(Q))]) + # 10. drop only the forward low warp + Q = mutate_P(P) + Q['B_items'] = [it for it in P['B_items'] if not (it[0] == 'warp' and it[2] == k)] + ok &= expect_reject('low warp %d dropped from B only' % k, 'replay', lambda: replay(Q), results) + # 11. low lender disturbed before its handoff (lender += X_0 just before the warp): exactness check + L = by_op[k]['lender'] + j = next(i for i, it in enumerate(P['B_items']) if it[0] == 'warp' and it[2] == k) + Q = mutate_P(P) + Q['B_items'].insert(j, ('add', L, 0, ONE, P['full'])) + ok &= expect_reject('low lender %d += X_0 just before its handoff' % L, 'lender', lambda: replay(Q), results) + # 12. low warp treated as an ordinary climb + kc = next(kk for kk in low_ops if by_op[kk]['U'] != by_op[kk]['E']) + ok &= expect_reject('low warp %d as an ordinary climb U->E' % kc, 'frame', + lambda: frame_check(P, warp_as_climb=(kc,)), results) + return ok + + +def controls_generic(P, claim, results): + """Iteration-3 controls, applied to a low warp where a warp is chosen.""" + ok = True + v = P['v'] + warps = P['warps'] + low_ops = set(t['op'] for t in P['corr']) + k0 = next((w['op'] for w in warps if w['U'] != w['E'] and w['op'] in low_ops), + next(w['op'] for w in warps if w['U'] != w['E'])) + Q2 = mutate_P(P) + j = next(i for i, it in enumerate(P['cleanup']) if it[0] == 'warp' and it[2] == -k0) + del Q2['cleanup'][j] + ok &= expect_reject('drop inverse warp %d in cleanup' % k0, 'replay', lambda: replay(Q2), results, + also=[('frame', lambda: frame_check(Q2))]) + lender = next(w['lender'] for w in warps if w['op'] == k0) + wi = next(i for i, it in enumerate(P['B_items']) if it[0] == 'warp' and it[2] == k0) + bi = next(i for i in range(wi + 1, len(P['B_items'])) + if P['B_items'][i][0] == 'add' and lender in regs_of(P['B_items'][i])) + for label, key, idx in (('B item %d (lender %d after its warp)' % (bi, lender), 'B_items', bi), + ('compensation gate 0', 'pre', P['n_pre']), + ('first cleanup add between live registers', 'cleanup', + next(i for i, it in enumerate(P['cleanup']) + if it[0] == 'add' and it[1] not in P['buffers'] and it[2] not in P['buffers']))): + Q3 = mutate_P(P) + g = list(Q3[key][idx]) + g[3] = g[3] * 2 + Q3[key][idx] = tuple(g) + ok &= expect_reject('perturb coefficient x2: %s' % label, 'replay', lambda: replay(Q3), results, + also=[('frame', lambda: frame_check(Q3))]) + + def charged(): + fr = frame_check(P, charge_warps=True) + profile_check(P, fr, claim) + ok &= expect_reject('charge every warp as a climb of rank d(L_U,L_E)', 'profile', charged, results) + pair = None + for a in warps: + for b in warps: + if a['op'] < b['op'] and a['pos'] == b['pos'] and a['U'] != b['U']: + pair = (a['op'], b['op']) + break + if pair: + break + need(pair is not None, 'control', 'no swappable warp pair') + la = next(w['lender'] for w in warps if w['op'] == pair[0]) + lb = next(w['lender'] for w in warps if w['op'] == pair[1]) + Q5 = mutate_P(P) + Q5['B_items'] = [(it[0], lb if it[1] == la else la, it[2], it[3], it[4]) + if it[0] == 'warp' and it[2] in pair else it for it in P['B_items']] + ok &= expect_reject('swap lenders of warps %d,%d' % pair, 'frame', lambda: frame_check(Q5), results, + also=[('replay', lambda: replay(Q5))]) + + def warp_mut(fn): + wr = dict(warps[0]) + fn(wr) + return lambda: check_warp(wr, P['h'], set(P['live']), v) + + def singular(wr): + wr['G'] = list(wr['G']) + wr['G'][1] = wr['G'][0] + ok &= expect_reject('warp 1: singular G', 'warp', warp_mut(singular), results) + + def wrong_image(wr): + h = P['h'] + for jj in range(h): + for i in range(h): + if i == jj: + continue + G = list(wr['G']) + G[jj] ^= G[i] + if mat_inverse(G, h) is not None and span([mat_apply(G, u) for u in wr['U']]) != wr['E']: + wr['G'] = G + return + raise Reject('control', 'no wrong-image G found') + ok &= expect_reject('warp 1: invertible G with G span U != span E', 'warp', warp_mut(wrong_image), results) + + def dim_drop(wr): + wr['E_list'] = wr['E_list'][:-1] + wr['E'] = span(wr['E_list']) + ok &= expect_reject('warp 1: dim E != dim U', 'warp', warp_mut(dim_drop), results) + Q7 = mutate_P(P) + j = next(i for i, it in enumerate(P['cleanup']) if it[0] == 'add' and (it[1] in P['buffers'] or it[2] in P['buffers'])) + it = list(P['cleanup'][j]) + if it[1] in P['buffers']: + it[1] -= P['n'] + else: + it[2] -= P['n'] + Q7['cleanup'][j] = tuple(it) + ok &= expect_reject('cleanup item %d uses the restored register, not its buffer' % j, 'frame', + lambda: frame_check(Q7), results) + Q8 = mutate_P(P) + del Q8['post'][0] + ok &= expect_reject('delete restore gate 0', 'replay', lambda: replay(Q8), results) + Q9 = mutate_P(P) + del Q9['pre'][P['n_pre']] + ok &= expect_reject('delete compensation gate 0', 'replay', lambda: replay(Q9), results) + Q10 = mutate_P(P) + written, keep = set(), [] + for it in P['cleanup']: + if it[0] == 'add' and it[2] in P['buffers'] and it[2] not in written: + continue + if it[0] == 'add' and it[1] in P['buffers']: + written.add(it[1]) + keep.append(it) + Q10['cleanup'] = keep + ok &= expect_reject('drop %d forward-no-op cleanup adds (dual replay)' % (len(P['cleanup']) - len(keep)), 'replay', + lambda: replay(Q10, dual=True), results, also=[('forward replay', lambda: replay(Q10))]) + ok &= results[-1]['other_checks']['forward replay'] == 'accepted' + # positive mutation: re-express U and E of every warp in another basis of the same span + Qp = mutate_P(P) + rebased = [] + for wr in warps: + w2 = dict(wr) + if len(w2['U_list']) > 1: + w2['U_list'] = [w2['U_list'][0] ^ w2['U_list'][1]] + w2['U_list'][1:] + w2['E_list'] = w2['E_list'][1:] + [w2['E_list'][0] ^ w2['E_list'][-1]] + w2['U'], w2['E'] = span(w2['U_list']), span(w2['E_list']) + rebased.append(w2) + entry = dict(control='positive: rebased warp U/E lists (same spans) accepted', target_check='warp+frame') + try: + for w2 in rebased: + check_warp(w2, P['h'], set(P['live']), v) + Qp['warps'] = rebased + profile_check(Qp, frame_check(Qp), claim) + entry.update(accepted=True, ok=True) + except Reject as e: + entry.update(accepted=False, ok=False, reason=str(e)) + print(' control %-66s %s' % (entry['control'], 'ACCEPTED-OK' if entry['ok'] else 'NOT-OK'), flush=True) + results.append(entry) + ok &= entry['ok'] + return ok + + +# ---------------------------------------------------------------------------- +# Driver +# ---------------------------------------------------------------------------- + +def check_word(label, w, claim, common, results_controls=None): + """Warps, structure, frames/profile recount and both replays of one BORROW-WORD.""" + P = parse_borrow(w) + res = dict(base_tag=w.get('base')) + need(w.get('base') == claim['base_tag'], 'link', 'base tag') + wres = check_all_warps(P) + need(len(wres) == common['warps'], 'warp', 'warp count %d' % len(wres)) + need(len(P['corr']) == common['corrections'], 'anticipatory', 'correction count %d' % len(P['corr'])) + low_ops = set(t['op'] for t in P['corr']) + need(len(low_ops) == common['low'], 'anticipatory', 'low operator count %d' % len(low_ops)) + res['warps'] = dict(count=len(wres), dims=dsort(Counter(x['dim'] for x in wres)), + low_ops=sorted(low_ops), lenders=[x['lender'] for x in wres], + lenders_that_are_X=[x['lender'] for x in wres if x['lender'] < P['v']], + U_equal_E=sum(1 for x in wres if x['U_eq_E']), + plain_fourier_distance=dsort(Counter(x['plain_fourier_distance'] for x in wres)), + anticipatory_terms=len(P['corr']), anticipatory_structure=check_corrections(P)) + fr = frame_check(P) + profile_check(P, fr, claim['profile']) + need(dict(fr['inventory']) == common['width_inventory'] == P['claimed_inventory'], 'profile', 'width inventory') + need(fr['helpers'] == common['helpers'] == P['R'] - len(P['removed']), 'profile', 'helper count') + need(fr['mass'] == common['mass'], 'profile', 'local mass %d' % fr['mass']) + need(fr['mass'] == 1856 + fr['helper_width_sum'], 'profile', 'mass != 1856 + helper widths') + frc = frame_check(P, charge_warps=True) + res['frames'] = dict(paid_profile=dsort(fr['paid']), climbs=dsort(fr['climbs']), copy_charges=dsort(fr['copies']), + local_mass=fr['mass'], width_inventory=dsort(fr['inventory']), helpers=fr['helpers'], + helper_width_sum=fr['helper_width_sum'], + if_warps_charged_profile=dsort(frc['paid']), if_warps_charged_mass=frc['mass']) + print(' [%s] warps %d PASS (dims %s, %d low, %d corrections); frames PASS: paid %s mass %d helpers %d ' + 'inventory %s' % (label, len(wres), res['warps']['dims'], len(low_ops), len(P['corr']), + res['frames']['paid_profile'], fr['mass'], fr['helpers'], res['frames']['width_inventory']), + flush=True) + t0 = time.time() + rf = replay(P) + rd = replay(P, dual=True) + need(rf['independent_inputs'] == common['inputs'] and rf['buffers'] == common['buffers'], 'replay', + 'input/buffer count %d/%d' % (rf['independent_inputs'], rf['buffers'])) + res['replay'] = dict(forward=rf, dual=rd) + print(' [%s] replay forward+dual PASS over %d inputs, %d buffers, %d low lenders exact at handoff (%.1f s)' % ( + label, rf['independent_inputs'], rf['buffers'], rf.get('low_lenders_exact_at_handoff', 0), time.time() - t0), + flush=True) + return P, fr, res + + +def main(): + ap = argparse.ArgumentParser(description='Independent check of BORROW-WORD-80{base,extra} (low aliases)') + ap.add_argument('--repo', default=DEFAULT_REPO, help='git checkout containing the PR2269 and PR2226 heads') + ap.add_argument('--out', action='store_true', help='write %s next to this script' % RECEIPT) + ap.add_argument('--skip-controls', action='store_true', help='skip negative controls (not a PASS run)') + ap.add_argument('--skip-predecessor', action='store_true', help='skip the PR2269 43-word positive control') + args = ap.parse_args() + t0 = time.time() + receipt = dict(checker='check_ext.py', python=sys.version.split()[0], + scope='BORROW-WORD-80{base,extra} + witness_80_*: warps, anticipatory structure, frames, ' + 'profiles, exact replay; links to PR2269 canonical/blocks/43-word and PR2226 terms', + adapted_from='fork commit 4a2f20ea339e30348448096ca789d0efe55df9bb ' + 'research/t74-borrow43-independent-check/words_check.py (own code)') + ok = True + try: + js, pins, raw = load_inputs(args.repo) + receipt['pins'] = pins + print('pins: %d inputs verified (sha256 + git blob id)' % len(pins), flush=True) + words = {} + for tag in ('base', 'extra'): + print('== word 80%s' % tag, flush=True) + w = js['word80_' + tag] + claim = CLAIMS['ext80'][tag] + P, fr, res = check_word('80' + tag, w, claim, CLAIMS['ext80']) + C = parse_canonical(js['canon_' + tag]) + res['links'] = link_checks(tag, P, C, js['witness80_' + tag], js['blocks'], w) + L = res['links'] + need(L['removed_low'] == CLAIMS['ext80']['low'] and L['removed_high'] == CLAIMS['ext80']['high'], 'link', + 'low/high split %d/%d' % (L['removed_low'], L['removed_high'])) + need(len(L['derived_rewrites']) == CLAIMS['ext80']['rewrites'], 'link', 'rewrite count') + print(' links PASS: %d high + %d low removed; B = canonical B - %d deleted prefix + %d moved tail + %d ' + 'derived rewrites (renamed); low lenders entrance dims %s, canonical final dims %s' % ( + L['removed_high'], L['removed_low'], L['deleted_prefix_gates'], L['moved_tail_gates'], + len(L['derived_rewrites']), L['low_lenders_entrance_frame_dims'], + L['low_lenders_canonical_final_dims']), flush=True) + res['pr2226'] = link_pr2226(P, js['witness80_' + tag], js['pr2226_witness'], js['witness43_' + tag]) + need(sorted(l for _, l in res['pr2226']['new_high_pairs']) == CLAIMS['ext80']['new_high_X_lenders'], + 'link2226', 'new high lenders') + print(' PR2226 link PASS: 64 terms = PR2226 T8 terms (target, source, coefficient, aliased register); ' + '%d low pairs = PR2226; %d PR2269 high pairs kept; new high pairs %s (PR2226 lenders %s)' % ( + res['pr2226']['low_pairs_equal_pr2226'], res['pr2226']['high_pairs_from_pr2269'], + res['pr2226']['new_high_pairs'], res['pr2226']['new_high_pr2226_lenders']), flush=True) + # canonical positive control + 566 link + mass bookkeeping + frC = frame_check(C) + need(dict(frC['paid']) == C['claimed_profile'] == CLAIMS['canonical'][tag], 'canonical', + 'canonical profile not reproduced: %r' % dsort(frC['paid'])) + rC = replay(C) + l566 = link_566(C, js['word566_' + tag]) + res['canonical'] = dict(paid_profile=dsort(frC['paid']), local_mass=frC['mass'], helpers=frC['helpers'], + replay=rC, link_566=l566) + need(frC['mass'] - fr['mass'] == L['mass_identity']['predicted_saving'] and frC['copies'] == fr['copies'], + 'profile', 'saving does not match the width bookkeeping') + res['saving_vs_canonical'] = frC['mass'] - fr['mass'] + print(' canonical positive control: profile %s mass %d, replay PASS, 566-link PASS; saving %d = removed ' + 'widths %d - widths added %d' % (res['canonical']['paid_profile'], frC['mass'], + res['saving_vs_canonical'], L['mass_identity']['removed_widths'], + L['mass_identity']['width_added_to_cold_now_FULL']), flush=True) + if not args.skip_predecessor: + print(' -- positive control: PR2269 BORROW-WORD-43%s through the same checker' % tag, flush=True) + P43, fr43, r43 = check_word('43' + tag, js['word43_' + tag], CLAIMS['b43'][tag], CLAIMS['b43']) + l43 = link_checks(tag, P43, C, js['witness43_' + tag], js['blocks'], js['word43_' + tag]) + need(l43['removed_low'] == 0 and l43['removed_high'] == 43, 'link', '43-word split') + res['predecessor_43'] = dict(paid_profile=r43['frames']['paid_profile'], + local_mass=r43['frames']['local_mass'], replay=r43['replay'], + links=dict((k, l43[k]) for k in ('removed_high', 'removed_low', + 'deleted_prefix_gates', 'moved_tail_gates'))) + res['delta_vs_pr2269'] = dict((str(r), fr['paid'].get(r, 0) - fr43['paid'].get(r, 0)) + for r in sorted(set(fr['paid']) | set(fr43['paid']))) + res['mass_delta_vs_pr2269'] = fr['mass'] - fr43['mass'] + print(' delta vs PR2269 43-word: %s, mass %+d' % (res['delta_vs_pr2269'], res['mass_delta_vs_pr2269']), + flush=True) + if not args.skip_controls: + results = [] + print(' -- negative controls (low pairs / anticipatory terms)', flush=True) + cok = controls_low(P, results) + print(' -- negative controls (iteration-3 set, on a low warp)', flush=True) + cok &= controls_generic(P, claim['profile'], results) + bad = bytearray(raw['word80_' + tag]) + bad[len(bad) // 2] ^= 1 + rel, blob, sha = LOCAL_PINS['word80_' + tag] + cok &= expect_reject('pin: one flipped bit in the word file', 'pin', + lambda: verify_bytes(rel, bytes(bad), blob, sha), results) + wbad = copy.deepcopy(js['witness80_' + tag]) + pr0 = next(p for p in wbad['pairs'] if p['low'] and p['deleted_prefix_indices']) + pr0['deleted_prefix_indices'] = pr0['deleted_prefix_indices'][:-1] + cok &= expect_reject('witness: one deleted prefix gate of helper %d kept' % pr0['register'], 'prefix', + lambda: link_checks(tag, P, C, wbad, js['blocks'], w), results) + res['controls'] = results + res['controls_ok'] = bool(cok) + print(' controls: %d/%d as required' % (sum(1 for e in results if e['ok']), len(results)), flush=True) + ok &= bool(cok) + words[tag] = res + receipt['words'] = words + receipt['recounted'] = dict( + (('gauge44' if tag == 'base' else 'extra'), + dict(profile=words[tag]['frames']['paid_profile'], helpers=words[tag]['frames']['helpers'], + helper_width_sum=words[tag]['frames']['helper_width_sum'], + local_mass=words[tag]['frames']['local_mass'])) for tag in ('base', 'extra')) + fb = words['base'] + receipt['findings'] = [ + 'Both 80-alias words: 80 warps pass the GF(2) checks (rank-zero K_G handoffs); 64 anticipatory terms ' + 'c K_k z_L read 32 frame-zero low lenders before the preconditioner, each with the warp of its own pair.', + 'Paid profiles recounted from the words alone: base %s, extra %s; mass %d each = 1856 + helper widths %d; ' + '%d helpers; inventory %s.' % (words['base']['frames']['paid_profile'], + words['extra']['frames']['paid_profile'], fb['frames']['local_mass'], + fb['frames']['helper_width_sum'], fb['frames']['helpers'], + fb['frames']['width_inventory']), + 'Exact replay over Q in both orientations on %d independent dirty inputs: Y += X, every other live ' + 'register restored, %d buffers zero; each of the 32 low lenders is exactly its own input at its handoff.' % ( + fb['replay']['forward']['independent_inputs'], fb['replay']['forward']['buffers']), + 'B equals canonical B minus %d pre-handoff low-helper gates (echoes/net-zero temporaries), plus 48 moved ' + 'tail gates and %d direct-read rewrites derived here independently, with helpers renamed to lenders.' % ( + fb['links']['deleted_prefix_gates'], len(fb['links']['derived_rewrites'])), + ] + receipt['not_checked'] = [ + 'Exact Clifford (Gaussian, phase) lifts of K_G and their native lowering in either orientation.', + 'Hosting of the 64 frame-zero correction reads and of the X-register lenders (1,4,6,12,31,73) in a whole-call ' + 'owner map; private cleanup buffers; owner fill at 400 helpers; global profile; kappa.', + ] + except Reject as e: + ok = False + receipt['failure'] = str(e) + print('FAILED: %s' % e, flush=True) + receipt['skip_controls'] = bool(args.skip_controls) + receipt['result'] = PASS_LINE if (ok and not args.skip_controls) else FAIL_LINE + receipt['model'] = __doc__.split('MODEL (stated precisely; see also the receipt field "model").')[1].strip() + receipt['elapsed_s'] = round(time.time() - t0, 1) + print('elapsed %.1f s' % (time.time() - t0)) + if args.out: + with open(os.path.join(HERE, RECEIPT), 'w') as fh: + json.dump(receipt, fh, indent=1, sort_keys=True, default=str) + fh.write('\n') + print('receipt written: %s' % os.path.join(HERE, RECEIPT)) + print(receipt['result']) + return 0 if receipt['result'] == PASS_LINE else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/research/t74-low-alias-borrowing/check_ext.receipt.json b/research/t74-low-alias-borrowing/check_ext.receipt.json new file mode 100644 index 0000000000..350d078d66 --- /dev/null +++ b/research/t74-low-alias-borrowing/check_ext.receipt.json @@ -0,0 +1,1736 @@ +{ + "adapted_from": "fork commit 4a2f20ea339e30348448096ca789d0efe55df9bb research/t74-borrow43-independent-check/words_check.py (own code)", + "checker": "check_ext.py", + "elapsed_s": 15.7, + "findings": [ + "Both 80-alias words: 80 warps pass the GF(2) checks (rank-zero K_G handoffs); 64 anticipatory terms c K_k z_L read 32 frame-zero low lenders before the preconditioner, each with the warp of its own pair.", + "Paid profiles recounted from the words alone: base {'1': 2303, '2': 527, '3': 386, '4': 125, '5': 37, '8': 8}, extra {'1': 2287, '2': 535, '3': 386, '4': 125, '5': 37, '8': 8}; mass 5264 each = 1856 + helper widths 3408; 400 helpers; inventory {'4': 4, '5': 4, '7': 36, '8': 84, '9': 272}.", + "Exact replay over Q in both orientations on 624 independent dirty inputs: Y += X, every other live register restored, 44 buffers zero; each of the 32 low lenders is exactly its own input at its handoff.", + "B equals canonical B minus 136 pre-handoff low-helper gates (echoes/net-zero temporaries), plus 48 moved tail gates and 5 direct-read rewrites derived here independently, with helpers renamed to lenders." + ], + "model": "* Registers 0..v-1 are X (sources), v..2v-1 are Y (targets), 2v..2v+R-1 helpers; n = 2v+R. Removed helpers\n do not exist. A buffer register b = r+n exists only for r in helper_final (restored cold helpers) and only\n in cleanup.\n * Frame = GF(2)-subspace of F_2^h (h = 9), compared as spans. Start: X_i = span(port_i), Y = 0, helper =\n start_extra[r] or 0. End: X = FULL, Y_i = port_i^perp, helper = helper_final[r] or FULL.\n * Initial (anticipatory) corrections {target t, source s, operator_word [k], coefficient c} run FIRST, before\n the preconditioner (PR2226 PROOF section 3): t += c K_k s. Structure: t is a Y register, s a live\n non-target register, c a non-zero dyadic rational, k an existing forward warp whose lender is s (each term is\n c K_G z for the pair lent by s), operator words have length one. Frames: t and s must both be at frame 0\n when the term runs (s's entrance frame is 0); K_k fixes L_0 (checked for every warp), so applying K_k to s,\n reading it into t and inverting it is rank zero and pays nothing.\n * Every framed gate (add t s c F | scale t c F) climbs each incident register from its current frame S to F;\n legal only if S <= F; a strict climb pays one child of rank dim F - dim S. precondition/compensation are at\n frame 0 and write targets only.\n * After A every target sits at its level and every centre at its centre frame; cut gates add c*centre into a\n target at its level; each centre pays one COPY child of rank dim(centre frame) - dim(level) per distinct\n served level (nested chain).\n * warp [pos, L, G, U, E] is inserted before B[pos] (list order inside a position): requires cur[L] == span U,\n sets cur[L] = span E, pays nothing (rank-zero reference change K_G); logically L <- K_G L.\n * After B and restore every live register climbs to its end frame (paid). cleanup items must all be at FULL,\n may touch only live registers at FULL or buffers; they pay nothing.\n * Logic: exact replay over Q (rationals x free group on K_1..K_80). Every live register starts as an\n independent symbol (arbitrary dirty content); buffers start at 0. add t += c s, scale t *= c, warp\n left-multiplies by K_k^{+-1} with free-group cancellation, a correction adds c K_k (row of s) to t. LOW-lender\n exactness (PR2226 PROOF section 3): immediately before every warp whose operator occurs in a correction, the\n lender's row must be exactly its own input symbol. Accept iff after cleanup Y_i = Y_i + X_i, every other\n live register is its own input and every buffer is 0. The dual orientation replays g^{-T} for every item\n (add -> s -= c t, scale -> 1/c, K -> K^{-T} as new free letters, correction -> s -= c K_k^T t with\n K_k^T = (K_k^{-T})^{-1}) and expects X_i = X_i - Y_i.\n * Warp algebra over GF(2): G invertible, dim U = dim E, G span U = span E, M = [[G,0],[G+G^-T,G^-T]]\n symplectic, M L_0 = L_0, M L_FULL = L_FULL, M L_U = L_E (Fourier rank 0), G^-T U^perp = E^perp. Exact\n Clifford phases / Gaussian lifts are NOT checked here.\n * Links (witness/canonical/block certificate): the B section is the canonical B plus the 48 moved tail gates,\n each removed helper renamed to its lender, minus the low helpers' pre-handoff echo/temporary gates, plus\n the direct-read rewrites that this checker DERIVES from those deleted gates (temporaries must be net zero;\n an echo t += c h reading a temporary part a*ext becomes t += c*a ext at the echo's frame). Every other\n pre-handoff event of an aliased helper must be a helper-only correction inside its block.", + "not_checked": [ + "Exact Clifford (Gaussian, phase) lifts of K_G and their native lowering in either orientation.", + "Hosting of the 64 frame-zero correction reads and of the X-register lenders (1,4,6,12,31,73) in a whole-call owner map; private cleanup buffers; owner fill at 400 helpers; global profile; kappa." + ], + "pins": { + "blocks": { + "bytes": 50270, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "c683574b3861678081fd5c5944dbd7a47309f6fd", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/blocks.json", + "sha256": "ddfac1dae1fe7cc0a91e7c7205c6d9d0c07c682880aa34eed83bf4ad7384da9f" + }, + "canon_base": { + "bytes": 87678, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "4abb6e28f02c95b41ed345d4e4401d16d58ae791", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/gauge44.canonical.json.gz", + "sha256": "65c6d17ffee2eacf27bff438f37fc549c9ed0c909cbc7a52976cc75cf2d15b91" + }, + "canon_extra": { + "bytes": 87680, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "e0d670d4351229ce6921ecfbecf180070b17616b", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/extra.canonical.json.gz", + "sha256": "d7e48dcbafa236a2e1e41f7958244211506f7c7630fe6a2d43d2bdf17b7ae015" + }, + "pr2226_witness": { + "bytes": 69305, + "commit": "dacaf3d81f1936bb55b8454b1244e5d014272754", + "git_blob": "62edbcce166f7cf388231078c2cd7f75939b97e2", + "path": "research/anticipatory-dirty-borrowing/WITNESS.json", + "sha256": "86392adde6992a08ae90f7a69c58cace1b52d942f4d2c96e82ca79e5d1e15235" + }, + "witness43_base": { + "bytes": 45301, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "9f4b93f3bc52d4f4ffaa128cfd7ae574fd36c462", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/witness_43_base.json", + "sha256": "67ffb66d94067f6e53aee9118fe90e14a57f497fc8b3f708b6dac3de2e58ff28" + }, + "witness43_extra": { + "bytes": 45306, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "864ba533f50c2f1f639a6a3559b185bd321b923a", + "path": "research/gmx-t74-borrow43/new/borrow/inputs/witness_43_extra.json", + "sha256": "d46449c6dbf4477f260cf5baea9bbb570a66ee0b6db81f4a220b9e3086ae9e46" + }, + "witness80_base": { + "bytes": 114840, + "git_blob": "cdcd39ff1beb577b975e48633d05ee629caa1362", + "local": "witness/witness_80_base.json", + "sha256": "9380f74c032b0616d5b13e8ef94b6d9f80cac36239e329357e7d5fcab5283ad0" + }, + "witness80_extra": { + "bytes": 114837, + "git_blob": "6b87d35600c44d053bf5ce03e34fc315d5a2af4a", + "local": "witness/witness_80_extra.json", + "sha256": "6737072dcca47c6e6526bd62a41585dd09026549550c9e62eb53e64b265a6709" + }, + "word43_base": { + "bytes": 69989, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "448dd795adba29392a90b34aa3f1b1b796c7e0bd", + "path": "research/gmx-t74-borrow43/new/borrow/words/BORROW-WORD-43base.json.gz", + "sha256": "9492a5537fb87d9ca98dffcd0230f7625b3789744fa94e2f18acf23d91d998b5" + }, + "word43_extra": { + "bytes": 69991, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "2b51ba96256283bbc5578f99b694c50edd8a0e35", + "path": "research/gmx-t74-borrow43/new/borrow/words/BORROW-WORD-43extra.json.gz", + "sha256": "87d51f5298101d5947f45c43ee02f0ec45d6acbddabb808d0d02db1eaf063734" + }, + "word566_base": { + "bytes": 57438, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "76c01583a0286cddb0f71e0cb13077e4317104f6", + "path": "research/gmx-t74-borrow43/new/gauge44-word-566.json.gz", + "sha256": "eeb6a236ed0ea8873b8800947d0cd19c36a6fcfdf857fc42913cb45cd984f219" + }, + "word566_extra": { + "bytes": 57440, + "commit": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "git_blob": "e86142b352466f54a3da38c96a6e1484145c3b5c", + "path": "research/gmx-t74-borrow43/new/extra-word-566.json.gz", + "sha256": "cd417b904408c221d9840d08faff8af040cc4207f9804284f2f5375d21298a62" + }, + "word80_base": { + "bytes": 70131, + "git_blob": "c5953dfdb0ee9ac0c2c73eb29e320582b4569d2b", + "local": "words/BORROW-WORD-80base.json.gz", + "sha256": "61290abffd8c8225e0abb3958c1506674e256de688fc4cdf358bbe7c981df493" + }, + "word80_extra": { + "bytes": 70135, + "git_blob": "852868543ed36efa799b3ed6dd76a0442b0d6ff1", + "local": "words/BORROW-WORD-80extra.json.gz", + "sha256": "1dd2d6f2ae5b5a27b5f89fb830203f0cca7a78d0323a7845e85e1e80f8f6d1a5" + } + }, + "python": "3.14.4", + "recounted": { + "extra": { + "helper_width_sum": 3408, + "helpers": 400, + "local_mass": 5264, + "profile": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + } + }, + "gauge44": { + "helper_width_sum": 3408, + "helpers": 400, + "local_mass": 5264, + "profile": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + } + } + }, + "result": "PASS_T74_LOW_ALIAS_WORDS_INDEPENDENT", + "scope": "BORROW-WORD-80{base,extra} + witness_80_*: warps, anticipatory structure, frames, profiles, exact replay; links to PR2269 canonical/blocks/43-word and PR2226 terms", + "skip_controls": false, + "words": { + "base": { + "base_tag": "eeb6a236", + "canonical": { + "helpers": 480, + "link_566": { + "aligned_frame_pairs": 1008, + "register_permutation_nonidentity": 220 + }, + "local_mass": 5590, + "paid_profile": { + "1": 2348, + "2": 500, + "3": 416, + "4": 130, + "5": 82, + "8": 8 + }, + "replay": { + "buffer_nonzero_window": [ + null, + null + ], + "buffers": 0, + "buffers_ever_nonzero": 0, + "cleanup_adds_reading_a_zero_buffer": 0, + "corrections": 0, + "independent_inputs": 704, + "low_lenders_exact_at_handoff": 0, + "max_overlap_of_buffer_lifetimes": 0, + "peak_nonzero_buffers": 0, + "rows_with_operator_words_before_cleanup": 0 + } + }, + "controls": [ + { + "by": "replay", + "control": "anticipatory: drop term 0 (114 += 1/2 K_62 339)", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 coefficient x2", + "ok": true, + "other_checks": { + "dual replay": "rejected[replay]" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 coefficient sign flip", + "ok": true, + "other_checks": { + "dual replay": "rejected[replay]" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: drop all 64 terms", + "ok": true, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 written into target 115", + "ok": true, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 redirected to pair K_44 / lender 277", + "ok": true, + "other_checks": { + "structure": "accepted" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "anticipatory", + "control": "anticipatory: term 0 uses K_44 of another lender", + "ok": true, + "reason": "correction 0: operator 44 is not the reference change of the pair lent by source 339", + "rejected": true, + "target_check": "anticipatory" + }, + { + "by": "frame", + "control": "anticipatory: term 0 reads X register 73 through K_30", + "ok": true, + "other_checks": { + "structure": "accepted" + }, + "reason": "initial correction 0: source 73 is not at frame 0 (frame (224,))", + "rejected": true, + "target_check": "frame" + }, + { + "by": "replay", + "control": "low warp 44 (lender 277) dropped from B and cleanup", + "ok": true, + "other_checks": { + "frame": "rejected[frame]" + }, + "reason": "target 43 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "low warp 44 dropped from B only", + "ok": true, + "reason": "target 43 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "lender", + "control": "low lender 277 += X_0 just before its handoff", + "ok": true, + "reason": "low lender 277 is not exactly its own input at the handoff of warp 44", + "rejected": true, + "target_check": "lender" + }, + { + "by": "frame", + "control": "low warp 44 as an ordinary climb U->E", + "ok": true, + "reason": "non-nested climb of 277 at warp 44 treated as an ordinary climb: (388, 75, 41, 26) -> (258, 130, 85, 45)", + "rejected": true, + "target_check": "frame" + }, + { + "by": "replay", + "control": "drop inverse warp 44 in cleanup", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "final map wrong on register 277 (forward)", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "perturb coefficient x2: B item 1123 (lender 277 after its warp)", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "target 43 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "perturb coefficient x2: compensation gate 0", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "target 1 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "perturb coefficient x2: first cleanup add between live registers", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "a zero buffer is not returned to zero", + "rejected": true, + "target_check": "replay" + }, + { + "by": "profile", + "control": "charge every warp as a climb of rank d(L_U,L_E)", + "ok": true, + "reason": "recount {'1': 2303, '2': 528, '3': 386, '4': 181, '5': 37, '6': 23, '8': 8} != word report {1: 2303, 2: 527, 3: 386, 4: 125, 5: 37, 8: 8}", + "rejected": true, + "target_check": "profile" + }, + { + "by": "frame", + "control": "swap lenders of warps 1,14", + "ok": true, + "other_checks": { + "replay": "rejected[replay]" + }, + "reason": "warp 1: lender 349 frame (416, 70, 19, 13) != U (261, 133, 85, 45)", + "rejected": true, + "target_check": "frame" + }, + { + "by": "warp", + "control": "warp 1: singular G", + "ok": true, + "reason": "warp 1: G is singular over GF(2)", + "rejected": true, + "target_check": "warp" + }, + { + "by": "warp", + "control": "warp 1: invertible G with G span U != span E", + "ok": true, + "reason": "warp 1: G span U != span E", + "rejected": true, + "target_check": "warp" + }, + { + "by": "warp", + "control": "warp 1: dim E != dim U", + "ok": true, + "reason": "warp 1: dim U != dim E", + "rejected": true, + "target_check": "warp" + }, + { + "by": "frame", + "control": "cleanup item 0 uses the restored register, not its buffer", + "ok": true, + "reason": "cleanup item 0 touches register 591 whose frame is not FULL", + "rejected": true, + "target_check": "frame" + }, + { + "by": "replay", + "control": "delete restore gate 0", + "ok": true, + "reason": "restored cold register 572 is not its own input", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "delete compensation gate 0", + "ok": true, + "reason": "target 1 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "drop 18 forward-no-op cleanup adds (dual replay)", + "ok": true, + "other_checks": { + "forward replay": "accepted" + }, + "reason": "a zero buffer is not returned to zero", + "rejected": true, + "target_check": "replay" + }, + { + "accepted": true, + "control": "positive: rebased warp U/E lists (same spans) accepted", + "ok": true, + "target_check": "warp+frame" + }, + { + "by": "pin", + "control": "pin: one flipped bit in the word file", + "ok": true, + "reason": "git blob id mismatch for words/BORROW-WORD-80base.json.gz", + "rejected": true, + "target_check": "pin" + }, + { + "by": "prefix", + "control": "witness: one deleted prefix gate of helper 689 kept", + "ok": true, + "reason": "low helper 689: witness deleted prefix [269, 270, 271] != derived [269, 270, 271, 272]", + "rejected": true, + "target_check": "prefix" + } + ], + "controls_ok": true, + "delta_vs_pr2269": { + "1": -48, + "2": 26, + "3": -28, + "4": -4, + "5": -5, + "8": 0 + }, + "frames": { + "climbs": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37 + }, + "copy_charges": { + "8": 8 + }, + "helper_width_sum": 3408, + "helpers": 400, + "if_warps_charged_mass": 5628, + "if_warps_charged_profile": { + "1": 2303, + "2": 528, + "3": 386, + "4": 181, + "5": 37, + "6": 23, + "8": 8 + }, + "local_mass": 5264, + "paid_profile": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "width_inventory": { + "4": 4, + "5": 4, + "7": 36, + "8": 84, + "9": 272 + } + }, + "links": { + "B_multiset_ok": true, + "canonical_A_gates_dropped": 0, + "canonical_cold_helpers": 78, + "canonical_cold_helpers_ending_FULL_after_borrowing": [ + 273, + 275, + 277, + 282, + 289, + 291, + 293, + 298, + 305, + 307, + 309, + 314, + 321, + 323, + 325, + 330, + 337, + 339, + 341, + 346, + 353, + 355, + 357, + 362, + 369, + 371, + 373, + 378, + 385, + 387, + 389, + 394, + 533, + 554 + ], + "canonical_compensation_gates_dropped": 0, + "canonical_cut_gates_dropped": 0, + "canonical_precondition_gates_dropped": 0, + "deleted_prefix_gates": 136, + "derived_rewrites": [ + [ + 117, + 566, + "1", + [ + 51 + ] + ], + [ + 151, + 567, + "1", + [ + 51 + ] + ], + [ + 181, + 566, + "-1", + [ + 51 + ] + ], + [ + 181, + 566, + "1", + [ + 51 + ] + ], + [ + 214, + 566, + "-1", + [ + 51 + ] + ] + ], + "low_lenders": [ + 273, + 275, + 277, + 282, + 289, + 291, + 293, + 298, + 305, + 307, + 309, + 314, + 321, + 323, + 325, + 330, + 337, + 339, + 341, + 346, + 353, + 355, + 357, + 362, + 369, + 371, + 373, + 378, + 385, + 387, + 389, + 394 + ], + "low_lenders_canonical_final_dims": { + "4": 32 + }, + "low_lenders_entrance_frame_dims": [ + 0 + ], + "low_ops": [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "low_prefix": { + "deferred_helper_only_high": 144, + "deferred_helper_only_low": 96, + "echoes": 128, + "temporaries": 8 + }, + "mass_identity": { + "predicted_saving": 326, + "removed_widths": 488, + "width_added_to_cold_now_FULL": 162 + }, + "moved_tail_gates": 48, + "removed_high": 48, + "removed_low": 32, + "removed_old_widths": { + "4": 8, + "5": 40, + "8": 32 + } + }, + "mass_delta_vs_pr2269": -121, + "pr2226": { + "high_pairs_equal_pr2226": 43, + "high_pairs_from_pr2269": 43, + "low_pairs_equal_pr2226": 32, + "new_high_pairs": [ + [ + 606, + 12 + ], + [ + 635, + 6 + ], + [ + 637, + 31 + ], + [ + 638, + 4 + ], + [ + 639, + 1 + ] + ], + "new_high_pr2226_lenders": [ + [ + 606, + 395 + ], + [ + 635, + 363 + ], + [ + 637, + 530 + ], + [ + 638, + 331 + ], + [ + 639, + 299 + ] + ], + "terms_equal_pr2226": 64 + }, + "predecessor_43": { + "links": { + "deleted_prefix_gates": 0, + "moved_tail_gates": 48, + "removed_high": 43, + "removed_low": 0 + }, + "local_mass": 5385, + "paid_profile": { + "1": 2351, + "2": 501, + "3": 414, + "4": 129, + "5": 42, + "8": 8 + }, + "replay": { + "dual": { + "buffer_nonzero_window": [ + 0, + 4498 + ], + "buffers": 76, + "buffers_ever_nonzero": 58, + "cleanup_adds_reading_a_zero_buffer": 355, + "corrections": 0, + "independent_inputs": 661, + "max_overlap_of_buffer_lifetimes": 48, + "peak_nonzero_buffers": 48 + }, + "forward": { + "buffer_nonzero_window": [ + 1, + 4470 + ], + "buffers": 76, + "buffers_ever_nonzero": 76, + "cleanup_adds_reading_a_zero_buffer": 110, + "corrections": 0, + "independent_inputs": 661, + "low_lenders_exact_at_handoff": 0, + "max_overlap_of_buffer_lifetimes": 44, + "peak_nonzero_buffers": 44, + "rows_with_operator_words_before_cleanup": 88 + } + } + }, + "replay": { + "dual": { + "buffer_nonzero_window": [ + 0, + 4527 + ], + "buffers": 44, + "buffers_ever_nonzero": 26, + "cleanup_adds_reading_a_zero_buffer": 84, + "corrections": 64, + "independent_inputs": 624, + "max_overlap_of_buffer_lifetimes": 22, + "peak_nonzero_buffers": 22 + }, + "forward": { + "buffer_nonzero_window": [ + 1, + 4499 + ], + "buffers": 44, + "buffers_ever_nonzero": 44, + "cleanup_adds_reading_a_zero_buffer": 87, + "corrections": 64, + "independent_inputs": 624, + "low_lenders_exact_at_handoff": 32, + "max_overlap_of_buffer_lifetimes": 44, + "peak_nonzero_buffers": 44, + "rows_with_operator_words_before_cleanup": 96 + } + }, + "saving_vs_canonical": 326, + "warps": { + "U_equal_E": 0, + "anticipatory_structure": { + "operators": 32, + "sources": 32, + "terms": 64 + }, + "anticipatory_terms": 64, + "count": 80, + "dims": { + "4": 77, + "5": 3 + }, + "lenders": [ + 243, + 250, + 266, + 259, + 333, + 317, + 554, + 285, + 281, + 301, + 297, + 313, + 329, + 349, + 345, + 365, + 361, + 381, + 377, + 397, + 393, + 225, + 227, + 229, + 234, + 241, + 245, + 257, + 261, + 73, + 401, + 403, + 405, + 410, + 417, + 419, + 421, + 426, + 433, + 435, + 437, + 442, + 542, + 277, + 282, + 275, + 273, + 293, + 298, + 291, + 289, + 309, + 314, + 307, + 305, + 325, + 330, + 323, + 321, + 341, + 346, + 339, + 337, + 357, + 362, + 355, + 353, + 373, + 378, + 371, + 369, + 389, + 394, + 387, + 385, + 1, + 4, + 6, + 12, + 31 + ], + "lenders_that_are_X": [ + 73, + 1, + 4, + 6, + 12, + 31 + ], + "low_ops": [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "plain_fourier_distance": { + "2": 1, + "4": 56, + "6": 23 + } + } + }, + "extra": { + "base_tag": "cd417b90", + "canonical": { + "helpers": 480, + "link_566": { + "aligned_frame_pairs": 1008, + "register_permutation_nonidentity": 220 + }, + "local_mass": 5594, + "paid_profile": { + "1": 2340, + "2": 508, + "3": 420, + "4": 126, + "5": 82, + "8": 8 + }, + "replay": { + "buffer_nonzero_window": [ + null, + null + ], + "buffers": 0, + "buffers_ever_nonzero": 0, + "cleanup_adds_reading_a_zero_buffer": 0, + "corrections": 0, + "independent_inputs": 704, + "low_lenders_exact_at_handoff": 0, + "max_overlap_of_buffer_lifetimes": 0, + "peak_nonzero_buffers": 0, + "rows_with_operator_words_before_cleanup": 0 + } + }, + "controls": [ + { + "by": "replay", + "control": "anticipatory: drop term 0 (114 += 1/2 K_62 339)", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 coefficient x2", + "ok": true, + "other_checks": { + "dual replay": "rejected[replay]" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 coefficient sign flip", + "ok": true, + "other_checks": { + "dual replay": "rejected[replay]" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: drop all 64 terms", + "ok": true, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 written into target 115", + "ok": true, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "anticipatory: term 0 redirected to pair K_44 / lender 277", + "ok": true, + "other_checks": { + "structure": "accepted" + }, + "reason": "target 2 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "anticipatory", + "control": "anticipatory: term 0 uses K_44 of another lender", + "ok": true, + "reason": "correction 0: operator 44 is not the reference change of the pair lent by source 339", + "rejected": true, + "target_check": "anticipatory" + }, + { + "by": "frame", + "control": "anticipatory: term 0 reads X register 73 through K_30", + "ok": true, + "other_checks": { + "structure": "accepted" + }, + "reason": "initial correction 0: source 73 is not at frame 0 (frame (224,))", + "rejected": true, + "target_check": "frame" + }, + { + "by": "replay", + "control": "low warp 44 (lender 277) dropped from B and cleanup", + "ok": true, + "other_checks": { + "frame": "rejected[frame]" + }, + "reason": "target 43 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "low warp 44 dropped from B only", + "ok": true, + "reason": "target 43 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "lender", + "control": "low lender 277 += X_0 just before its handoff", + "ok": true, + "reason": "low lender 277 is not exactly its own input at the handoff of warp 44", + "rejected": true, + "target_check": "lender" + }, + { + "by": "frame", + "control": "low warp 44 as an ordinary climb U->E", + "ok": true, + "reason": "non-nested climb of 277 at warp 44 treated as an ordinary climb: (388, 75, 41, 26) -> (258, 130, 85, 45)", + "rejected": true, + "target_check": "frame" + }, + { + "by": "replay", + "control": "drop inverse warp 44 in cleanup", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "final map wrong on register 277 (forward)", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "perturb coefficient x2: B item 1123 (lender 277 after its warp)", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "target 43 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "perturb coefficient x2: compensation gate 0", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "target 1 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "perturb coefficient x2: first cleanup add between live registers", + "ok": true, + "other_checks": { + "frame": "accepted" + }, + "reason": "a zero buffer is not returned to zero", + "rejected": true, + "target_check": "replay" + }, + { + "by": "profile", + "control": "charge every warp as a climb of rank d(L_U,L_E)", + "ok": true, + "reason": "recount {'1': 2287, '2': 536, '3': 386, '4': 181, '5': 37, '6': 23, '8': 8} != word report {1: 2287, 2: 535, 3: 386, 4: 125, 5: 37, 8: 8}", + "rejected": true, + "target_check": "profile" + }, + { + "by": "frame", + "control": "swap lenders of warps 1,14", + "ok": true, + "other_checks": { + "replay": "rejected[replay]" + }, + "reason": "warp 1: lender 349 frame (416, 70, 19, 13) != U (261, 133, 85, 45)", + "rejected": true, + "target_check": "frame" + }, + { + "by": "warp", + "control": "warp 1: singular G", + "ok": true, + "reason": "warp 1: G is singular over GF(2)", + "rejected": true, + "target_check": "warp" + }, + { + "by": "warp", + "control": "warp 1: invertible G with G span U != span E", + "ok": true, + "reason": "warp 1: G span U != span E", + "rejected": true, + "target_check": "warp" + }, + { + "by": "warp", + "control": "warp 1: dim E != dim U", + "ok": true, + "reason": "warp 1: dim U != dim E", + "rejected": true, + "target_check": "warp" + }, + { + "by": "frame", + "control": "cleanup item 0 uses the restored register, not its buffer", + "ok": true, + "reason": "cleanup item 0 touches register 591 whose frame is not FULL", + "rejected": true, + "target_check": "frame" + }, + { + "by": "replay", + "control": "delete restore gate 0", + "ok": true, + "reason": "restored cold register 572 is not its own input", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "delete compensation gate 0", + "ok": true, + "reason": "target 1 not final before cleanup", + "rejected": true, + "target_check": "replay" + }, + { + "by": "replay", + "control": "drop 18 forward-no-op cleanup adds (dual replay)", + "ok": true, + "other_checks": { + "forward replay": "accepted" + }, + "reason": "a zero buffer is not returned to zero", + "rejected": true, + "target_check": "replay" + }, + { + "accepted": true, + "control": "positive: rebased warp U/E lists (same spans) accepted", + "ok": true, + "target_check": "warp+frame" + }, + { + "by": "pin", + "control": "pin: one flipped bit in the word file", + "ok": true, + "reason": "git blob id mismatch for words/BORROW-WORD-80extra.json.gz", + "rejected": true, + "target_check": "pin" + }, + { + "by": "prefix", + "control": "witness: one deleted prefix gate of helper 689 kept", + "ok": true, + "reason": "low helper 689: witness deleted prefix [269, 270, 271] != derived [269, 270, 271, 272]", + "rejected": true, + "target_check": "prefix" + } + ], + "controls_ok": true, + "delta_vs_pr2269": { + "1": -52, + "2": 26, + "3": -32, + "4": 0, + "5": -5, + "8": 0 + }, + "frames": { + "climbs": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37 + }, + "copy_charges": { + "8": 8 + }, + "helper_width_sum": 3408, + "helpers": 400, + "if_warps_charged_mass": 5628, + "if_warps_charged_profile": { + "1": 2287, + "2": 536, + "3": 386, + "4": 181, + "5": 37, + "6": 23, + "8": 8 + }, + "local_mass": 5264, + "paid_profile": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "width_inventory": { + "4": 4, + "5": 4, + "7": 36, + "8": 84, + "9": 272 + } + }, + "links": { + "B_multiset_ok": true, + "canonical_A_gates_dropped": 0, + "canonical_cold_helpers": 78, + "canonical_cold_helpers_ending_FULL_after_borrowing": [ + 273, + 275, + 277, + 282, + 289, + 291, + 293, + 298, + 305, + 307, + 309, + 314, + 321, + 323, + 325, + 330, + 337, + 339, + 341, + 346, + 353, + 355, + 357, + 362, + 369, + 371, + 373, + 378, + 385, + 387, + 389, + 394, + 533, + 554 + ], + "canonical_compensation_gates_dropped": 0, + "canonical_cut_gates_dropped": 0, + "canonical_precondition_gates_dropped": 0, + "deleted_prefix_gates": 136, + "derived_rewrites": [ + [ + 117, + 566, + "1", + [ + 51 + ] + ], + [ + 151, + 567, + "1", + [ + 51 + ] + ], + [ + 181, + 566, + "-1", + [ + 51 + ] + ], + [ + 181, + 566, + "1", + [ + 51 + ] + ], + [ + 214, + 566, + "-1", + [ + 51 + ] + ] + ], + "low_lenders": [ + 273, + 275, + 277, + 282, + 289, + 291, + 293, + 298, + 305, + 307, + 309, + 314, + 321, + 323, + 325, + 330, + 337, + 339, + 341, + 346, + 353, + 355, + 357, + 362, + 369, + 371, + 373, + 378, + 385, + 387, + 389, + 394 + ], + "low_lenders_canonical_final_dims": { + "4": 32 + }, + "low_lenders_entrance_frame_dims": [ + 0 + ], + "low_ops": [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "low_prefix": { + "deferred_helper_only_high": 144, + "deferred_helper_only_low": 96, + "echoes": 128, + "temporaries": 8 + }, + "mass_identity": { + "predicted_saving": 330, + "removed_widths": 492, + "width_added_to_cold_now_FULL": 162 + }, + "moved_tail_gates": 48, + "removed_high": 48, + "removed_low": 32, + "removed_old_widths": { + "4": 4, + "5": 44, + "8": 32 + } + }, + "mass_delta_vs_pr2269": -121, + "pr2226": { + "high_pairs_equal_pr2226": 43, + "high_pairs_from_pr2269": 43, + "low_pairs_equal_pr2226": 32, + "new_high_pairs": [ + [ + 606, + 12 + ], + [ + 635, + 6 + ], + [ + 637, + 31 + ], + [ + 638, + 4 + ], + [ + 639, + 1 + ] + ], + "new_high_pr2226_lenders": [ + [ + 606, + 395 + ], + [ + 635, + 363 + ], + [ + 637, + 530 + ], + [ + 638, + 331 + ], + [ + 639, + 299 + ] + ], + "terms_equal_pr2226": 64 + }, + "predecessor_43": { + "links": { + "deleted_prefix_gates": 0, + "moved_tail_gates": 48, + "removed_high": 43, + "removed_low": 0 + }, + "local_mass": 5385, + "paid_profile": { + "1": 2339, + "2": 509, + "3": 418, + "4": 125, + "5": 42, + "8": 8 + }, + "replay": { + "dual": { + "buffer_nonzero_window": [ + 0, + 4498 + ], + "buffers": 76, + "buffers_ever_nonzero": 58, + "cleanup_adds_reading_a_zero_buffer": 355, + "corrections": 0, + "independent_inputs": 661, + "max_overlap_of_buffer_lifetimes": 48, + "peak_nonzero_buffers": 48 + }, + "forward": { + "buffer_nonzero_window": [ + 1, + 4470 + ], + "buffers": 76, + "buffers_ever_nonzero": 76, + "cleanup_adds_reading_a_zero_buffer": 110, + "corrections": 0, + "independent_inputs": 661, + "low_lenders_exact_at_handoff": 0, + "max_overlap_of_buffer_lifetimes": 44, + "peak_nonzero_buffers": 44, + "rows_with_operator_words_before_cleanup": 88 + } + } + }, + "replay": { + "dual": { + "buffer_nonzero_window": [ + 0, + 4527 + ], + "buffers": 44, + "buffers_ever_nonzero": 26, + "cleanup_adds_reading_a_zero_buffer": 84, + "corrections": 64, + "independent_inputs": 624, + "max_overlap_of_buffer_lifetimes": 22, + "peak_nonzero_buffers": 22 + }, + "forward": { + "buffer_nonzero_window": [ + 1, + 4499 + ], + "buffers": 44, + "buffers_ever_nonzero": 44, + "cleanup_adds_reading_a_zero_buffer": 87, + "corrections": 64, + "independent_inputs": 624, + "low_lenders_exact_at_handoff": 32, + "max_overlap_of_buffer_lifetimes": 44, + "peak_nonzero_buffers": 44, + "rows_with_operator_words_before_cleanup": 96 + } + }, + "saving_vs_canonical": 330, + "warps": { + "U_equal_E": 0, + "anticipatory_structure": { + "operators": 32, + "sources": 32, + "terms": 64 + }, + "anticipatory_terms": 64, + "count": 80, + "dims": { + "4": 77, + "5": 3 + }, + "lenders": [ + 243, + 250, + 266, + 259, + 333, + 317, + 554, + 285, + 281, + 301, + 297, + 313, + 329, + 349, + 345, + 365, + 361, + 381, + 377, + 397, + 393, + 225, + 227, + 229, + 234, + 241, + 245, + 257, + 261, + 73, + 401, + 403, + 405, + 410, + 417, + 419, + 421, + 426, + 433, + 435, + 437, + 442, + 542, + 277, + 282, + 275, + 273, + 293, + 298, + 291, + 289, + 309, + 314, + 307, + 305, + 325, + 330, + 323, + 321, + 341, + 346, + 339, + 337, + 357, + 362, + 355, + 353, + 373, + 378, + 371, + 369, + 389, + 394, + 387, + 385, + 1, + 4, + 6, + 12, + 31 + ], + "lenders_that_are_X": [ + 73, + 1, + 4, + 6, + 12, + 31 + ], + "low_ops": [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75 + ], + "plain_fourier_distance": { + "2": 1, + "4": 56, + "6": 23 + } + } + } + } +} diff --git a/research/t74-low-alias-borrowing/demo-t8-delta-proxy.json b/research/t74-low-alias-borrowing/demo-t8-delta-proxy.json new file mode 100644 index 0000000000..e9bb97b353 --- /dev/null +++ b/research/t74-low-alias-borrowing/demo-t8-delta-proxy.json @@ -0,0 +1,14 @@ +{ + "delta": { + "1": -42, + "2": 27, + "3": -23, + "4": -13 + }, + "family": "T74", + "helpers": { + "extra": 401, + "gauge44": 401 + }, + "label": "PROXY: T8 transfer delta (PR2226 80-alias word minus PR2260 44-high word) applied to both PR2269 T74 words; not a constructed word" +} diff --git a/research/t74-low-alias-borrowing/inputs/PR2226-WITNESS.json b/research/t74-low-alias-borrowing/inputs/PR2226-WITNESS.json new file mode 100644 index 0000000000..62edbcce16 --- /dev/null +++ b/research/t74-low-alias-borrowing/inputs/PR2226-WITNESS.json @@ -0,0 +1,3926 @@ +{ + "pairs": [ + { + "register": 597, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 243, + "retirement_B_event": -1, + "retirement_frame": 66, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 643, + "base": 640, + "common_basis": [ + 423, + 65, + 20, + 10 + ], + "dimension": 4, + "deadline": 1102, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 250, + "retirement_B_event": -1, + "retirement_frame": 66, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1102, + "handoff_basis": [ + 423, + 65, + 20, + 10 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 645, + "base": 640, + "common_basis": [ + 423, + 65, + 20, + 10 + ], + "dimension": 4, + "deadline": 1102, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 266, + "retirement_B_event": -1, + "retirement_frame": 95, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1102, + "handoff_basis": [ + 423, + 65, + 20, + 10 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 646, + "base": 640, + "common_basis": [ + 423, + 65, + 20, + 10 + ], + "dimension": 4, + "deadline": 1102, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 259, + "retirement_B_event": -1, + "retirement_frame": 95, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1102, + "handoff_basis": [ + 423, + 65, + 20, + 10 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 659, + "base": 656, + "common_basis": [ + 427, + 96, + 24, + 6 + ], + "dimension": 4, + "deadline": 1118, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 333, + "retirement_B_event": 780, + "retirement_frame": 211, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1118, + "handoff_basis": [ + 427, + 96, + 24, + 6 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 661, + "base": 656, + "common_basis": [ + 427, + 96, + 24, + 6 + ], + "dimension": 4, + "deadline": 1118, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 317, + "retirement_B_event": 760, + "retirement_frame": 182, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1118, + "handoff_basis": [ + 427, + 96, + 24, + 6 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 651, + "base": 648, + "common_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "dimension": 5, + "deadline": 1110, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 554, + "retirement_B_event": 1046, + "retirement_frame": 734, + "retirement_dimension": 5, + "old_final_dimension": 8, + "handoff_B": 1110, + "handoff_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 683, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 285, + "retirement_B_event": 721, + "retirement_frame": 124, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 686, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 281, + "retirement_B_event": 719, + "retirement_frame": 124, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 689, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [ + 255, + 256, + 257, + 258 + ], + "low": true, + "deleted_prefix_indices": [ + 255, + 256, + 257, + 258 + ], + "early_prefix_rewrites": { + "255": [], + "256": [], + "257": [], + "258": [] + }, + "borrow_from": 277, + "retirement_B_event": 719, + "retirement_frame": 124, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 690, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [ + 259, + 260, + 261, + 262 + ], + "low": true, + "deleted_prefix_indices": [ + 259, + 260, + 261, + 262 + ], + "early_prefix_rewrites": { + "259": [], + "260": [], + "261": [], + "262": [] + }, + "borrow_from": 282, + "retirement_B_event": 721, + "retirement_frame": 124, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 696, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [ + 267, + 268, + 269, + 270 + ], + "low": true, + "deleted_prefix_indices": [ + 267, + 268, + 269, + 270 + ], + "early_prefix_rewrites": { + "267": [], + "268": [], + "269": [], + "270": [] + }, + "borrow_from": 275, + "retirement_B_event": 722, + "retirement_frame": 124, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 697, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [ + 271, + 272, + 273, + 274 + ], + "low": true, + "deleted_prefix_indices": [ + 271, + 272, + 273, + 274 + ], + "early_prefix_rewrites": { + "271": [], + "272": [], + "273": [], + "274": [] + }, + "borrow_from": 273, + "retirement_B_event": 720, + "retirement_frame": 124, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 699, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 301, + "retirement_B_event": 740, + "retirement_frame": 153, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 639, + "base": 632, + "common_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "dimension": 5, + "deadline": 1094, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 299, + "retirement_B_event": 942, + "retirement_frame": 630, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1094, + "handoff_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 702, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 297, + "retirement_B_event": 738, + "retirement_frame": 153, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 700, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [ + 279, + 280, + 281, + 282 + ], + "low": true, + "deleted_prefix_indices": [ + 279, + 280, + 281, + 282 + ], + "early_prefix_rewrites": { + "279": [], + "280": [], + "281": [], + "282": [] + }, + "borrow_from": 293, + "retirement_B_event": 738, + "retirement_frame": 153, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 592, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [ + 51, + 52, + 53, + 54 + ], + "low": true, + "deleted_prefix_indices": [ + 51, + 52, + 53, + 54 + ], + "early_prefix_rewrites": { + "51": [], + "52": [], + "53": [], + "54": [] + }, + "borrow_from": 298, + "retirement_B_event": 740, + "retirement_frame": 153, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 593, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [ + 55, + 56, + 57, + 58 + ], + "low": true, + "deleted_prefix_indices": [ + 55, + 56, + 57, + 58 + ], + "early_prefix_rewrites": { + "55": [], + "56": [], + "57": [], + "58": [] + }, + "borrow_from": 291, + "retirement_B_event": 741, + "retirement_frame": 153, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 594, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [ + 59, + 60, + 61, + 62 + ], + "low": true, + "deleted_prefix_indices": [ + 59, + 60, + 61, + 62 + ], + "early_prefix_rewrites": { + "59": [], + "60": [], + "61": [], + "62": [] + }, + "borrow_from": 289, + "retirement_B_event": 739, + "retirement_frame": 153, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 703, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 313, + "retirement_B_event": 758, + "retirement_frame": 182, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 698, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [ + 275, + 276, + 277, + 278 + ], + "low": true, + "deleted_prefix_indices": [ + 275, + 276, + 277, + 278 + ], + "early_prefix_rewrites": { + "275": [], + "276": [], + "277": [], + "278": [] + }, + "borrow_from": 309, + "retirement_B_event": 758, + "retirement_frame": 182, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 596, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [ + 63, + 64, + 65, + 66 + ], + "low": true, + "deleted_prefix_indices": [ + 63, + 64, + 65, + 66 + ], + "early_prefix_rewrites": { + "63": [], + "64": [], + "65": [], + "66": [] + }, + "borrow_from": 314, + "retirement_B_event": 760, + "retirement_frame": 182, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 692, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [ + 263, + 264, + 265, + 266 + ], + "low": true, + "deleted_prefix_indices": [ + 263, + 264, + 265, + 266 + ], + "early_prefix_rewrites": { + "263": [], + "264": [], + "265": [], + "266": [] + }, + "borrow_from": 307, + "retirement_B_event": 761, + "retirement_frame": 182, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 600, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [ + 67, + 68, + 69, + 70 + ], + "low": true, + "deleted_prefix_indices": [ + 67, + 68, + 69, + 70 + ], + "early_prefix_rewrites": { + "67": [], + "68": [], + "69": [], + "70": [] + }, + "borrow_from": 305, + "retirement_B_event": 759, + "retirement_frame": 182, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 638, + "base": 632, + "common_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "dimension": 5, + "deadline": 1094, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 331, + "retirement_B_event": 944, + "retirement_frame": 632, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1094, + "handoff_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 701, + "base": 696, + "common_basis": [ + 455, + 33, + 18, + 12 + ], + "dimension": 4, + "deadline": 1158, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 329, + "retirement_B_event": 778, + "retirement_frame": 211, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1158, + "handoff_basis": [ + 455, + 33, + 18, + 12 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 601, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [ + 71, + 72, + 73, + 74 + ], + "low": true, + "deleted_prefix_indices": [ + 71, + 72, + 73, + 74 + ], + "early_prefix_rewrites": { + "71": [], + "72": [], + "73": [], + "74": [] + }, + "borrow_from": 325, + "retirement_B_event": 778, + "retirement_frame": 211, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 602, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [ + 75, + 76, + 77, + 78 + ], + "low": true, + "deleted_prefix_indices": [ + 75, + 76, + 77, + 78 + ], + "early_prefix_rewrites": { + "75": [], + "76": [], + "77": [], + "78": [] + }, + "borrow_from": 330, + "retirement_B_event": 780, + "retirement_frame": 211, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 604, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [ + 79, + 80, + 81, + 82 + ], + "low": true, + "deleted_prefix_indices": [ + 79, + 80, + 81, + 82 + ], + "early_prefix_rewrites": { + "79": [], + "80": [], + "81": [], + "82": [] + }, + "borrow_from": 323, + "retirement_B_event": 781, + "retirement_frame": 211, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 688, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [ + 251, + 252, + 253, + 254 + ], + "low": true, + "deleted_prefix_indices": [ + 251, + 252, + 253, + 254 + ], + "early_prefix_rewrites": { + "251": [], + "252": [], + "253": [], + "254": [] + }, + "borrow_from": 321, + "retirement_B_event": 779, + "retirement_frame": 211, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 595, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 349, + "retirement_B_event": 800, + "retirement_frame": 240, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 695, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 345, + "retirement_B_event": 798, + "retirement_frame": 240, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 684, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [ + 247, + 248, + 249, + 250 + ], + "low": true, + "deleted_prefix_indices": [ + 247, + 248, + 249, + 250 + ], + "early_prefix_rewrites": { + "247": [], + "248": [], + "249": [], + "250": [] + }, + "borrow_from": 341, + "retirement_B_event": 798, + "retirement_frame": 240, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 608, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [ + 83, + 84, + 85, + 86 + ], + "low": true, + "deleted_prefix_indices": [ + 83, + 84, + 85, + 86 + ], + "early_prefix_rewrites": { + "83": [], + "84": [], + "85": [], + "86": [] + }, + "borrow_from": 346, + "retirement_B_event": 800, + "retirement_frame": 240, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 609, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [ + 87, + 88, + 89, + 90 + ], + "low": true, + "deleted_prefix_indices": [ + 87, + 88, + 89, + 90 + ], + "early_prefix_rewrites": { + "87": [], + "88": [], + "89": [], + "90": [] + }, + "borrow_from": 339, + "retirement_B_event": 801, + "retirement_frame": 240, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 610, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [ + 91, + 92, + 93, + 94 + ], + "low": true, + "deleted_prefix_indices": [ + 91, + 92, + 93, + 94 + ], + "early_prefix_rewrites": { + "91": [], + "92": [], + "93": [], + "94": [] + }, + "borrow_from": 337, + "retirement_B_event": 799, + "retirement_frame": 240, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 598, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 365, + "retirement_B_event": 818, + "retirement_frame": 269, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 635, + "base": 632, + "common_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "dimension": 5, + "deadline": 1094, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 363, + "retirement_B_event": 946, + "retirement_frame": 634, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1094, + "handoff_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 599, + "base": 592, + "common_basis": [ + 320, + 192, + 45, + 30 + ], + "dimension": 4, + "deadline": 1054, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 361, + "retirement_B_event": 816, + "retirement_frame": 269, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1054, + "handoff_basis": [ + 320, + 192, + 45, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 682, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [ + 243, + 244, + 245, + 246 + ], + "low": true, + "deleted_prefix_indices": [ + 243, + 244, + 245, + 246 + ], + "early_prefix_rewrites": { + "243": [], + "244": [], + "245": [], + "246": [] + }, + "borrow_from": 357, + "retirement_B_event": 816, + "retirement_frame": 269, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 612, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [ + 95, + 96, + 97, + 98 + ], + "low": true, + "deleted_prefix_indices": [ + 95, + 96, + 97, + 98 + ], + "early_prefix_rewrites": { + "95": [], + "96": [], + "97": [], + "98": [] + }, + "borrow_from": 362, + "retirement_B_event": 818, + "retirement_frame": 269, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 681, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [ + 239, + 240, + 241, + 242 + ], + "low": true, + "deleted_prefix_indices": [ + 239, + 240, + 241, + 242 + ], + "early_prefix_rewrites": { + "239": [], + "240": [], + "241": [], + "242": [] + }, + "borrow_from": 355, + "retirement_B_event": 819, + "retirement_frame": 269, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 680, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [ + 235, + 236, + 237, + 238 + ], + "low": true, + "deleted_prefix_indices": [ + 235, + 236, + 237, + 238 + ], + "early_prefix_rewrites": { + "235": [], + "236": [], + "237": [], + "238": [] + }, + "borrow_from": 353, + "retirement_B_event": 817, + "retirement_frame": 269, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 694, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 381, + "retirement_B_event": 836, + "retirement_frame": 298, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 693, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 377, + "retirement_B_event": 834, + "retirement_frame": 298, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 676, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [ + 229, + 231, + 233, + 234 + ], + "low": true, + "deleted_prefix_indices": [ + 229, + 230, + 231, + 232, + 233, + 234 + ], + "early_prefix_rewrites": { + "229": [], + "231": [ + [ + "add", + 181, + 566, + 1, + 1, + 3 + ] + ], + "233": [], + "234": [] + }, + "borrow_from": 373, + "retirement_B_event": 834, + "retirement_frame": 298, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 624, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [ + 115, + 116, + 117, + 118 + ], + "low": true, + "deleted_prefix_indices": [ + 115, + 116, + 117, + 118 + ], + "early_prefix_rewrites": { + "115": [], + "116": [], + "117": [], + "118": [] + }, + "borrow_from": 378, + "retirement_B_event": 836, + "retirement_frame": 298, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 625, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [ + 119, + 120, + 121, + 122 + ], + "low": true, + "deleted_prefix_indices": [ + 119, + 120, + 121, + 122 + ], + "early_prefix_rewrites": { + "119": [], + "120": [], + "121": [], + "122": [] + }, + "borrow_from": 371, + "retirement_B_event": 837, + "retirement_frame": 298, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 626, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [ + 123, + 124, + 125, + 126 + ], + "low": true, + "deleted_prefix_indices": [ + 123, + 124, + 125, + 126 + ], + "early_prefix_rewrites": { + "123": [], + "124": [], + "125": [], + "126": [] + }, + "borrow_from": 369, + "retirement_B_event": 835, + "retirement_frame": 298, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 691, + "base": 688, + "common_basis": [ + 258, + 130, + 85, + 45 + ], + "dimension": 4, + "deadline": 1150, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 397, + "retirement_B_event": 854, + "retirement_frame": 327, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1150, + "handoff_basis": [ + 258, + 130, + 85, + 45 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 606, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 395, + "retirement_B_event": 948, + "retirement_frame": 636, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 687, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 393, + "retirement_B_event": 852, + "retirement_frame": 327, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 674, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [ + 225, + 226, + 227, + 228 + ], + "low": true, + "deleted_prefix_indices": [ + 225, + 226, + 227, + 228 + ], + "early_prefix_rewrites": { + "225": [], + "226": [], + "227": [], + "228": [] + }, + "borrow_from": 389, + "retirement_B_event": 852, + "retirement_frame": 327, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 628, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [ + 127, + 129, + 131, + 132 + ], + "low": true, + "deleted_prefix_indices": [ + 127, + 128, + 129, + 130, + 131, + 132 + ], + "early_prefix_rewrites": { + "127": [], + "129": [ + [ + "add", + 214, + 566, + -1, + 1, + 3 + ] + ], + "131": [], + "132": [] + }, + "borrow_from": 394, + "retirement_B_event": 854, + "retirement_frame": 327, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 673, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [ + 221, + 222, + 223, + 224 + ], + "low": true, + "deleted_prefix_indices": [ + 221, + 222, + 223, + 224 + ], + "early_prefix_rewrites": { + "221": [], + "222": [], + "223": [], + "224": [] + }, + "borrow_from": 387, + "retirement_B_event": 855, + "retirement_frame": 327, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 672, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [ + 217, + 218, + 219, + 220 + ], + "low": true, + "deleted_prefix_indices": [ + 217, + 218, + 219, + 220 + ], + "early_prefix_rewrites": { + "217": [], + "218": [], + "219": [], + "220": [] + }, + "borrow_from": 385, + "retirement_B_event": 853, + "retirement_frame": 327, + "retirement_dimension": 4, + "old_final_dimension": 4, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": true + }, + { + "register": 685, + "base": 680, + "common_basis": [ + 407, + 66, + 36, + 9 + ], + "dimension": 4, + "deadline": 1142, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 225, + "retirement_B_event": -1, + "retirement_frame": 37, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1142, + "handoff_basis": [ + 407, + 66, + 36, + 9 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 679, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 227, + "retirement_B_event": -1, + "retirement_frame": 37, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 678, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 229, + "retirement_B_event": -1, + "retirement_frame": 37, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 677, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 234, + "retirement_B_event": -1, + "retirement_frame": 37, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 675, + "base": 672, + "common_basis": [ + 413, + 72, + 48, + 3 + ], + "dimension": 4, + "deadline": 1134, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 241, + "retirement_B_event": -1, + "retirement_frame": 66, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1134, + "handoff_basis": [ + 413, + 72, + 48, + 3 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 663, + "base": 656, + "common_basis": [ + 427, + 96, + 24, + 6 + ], + "dimension": 4, + "deadline": 1118, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 245, + "retirement_B_event": -1, + "retirement_frame": 66, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1118, + "handoff_basis": [ + 427, + 96, + 24, + 6 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 662, + "base": 656, + "common_basis": [ + 427, + 96, + 24, + 6 + ], + "dimension": 4, + "deadline": 1118, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 257, + "retirement_B_event": -1, + "retirement_frame": 95, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1118, + "handoff_basis": [ + 427, + 96, + 24, + 6 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 647, + "base": 640, + "common_basis": [ + 423, + 65, + 20, + 10 + ], + "dimension": 4, + "deadline": 1102, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 261, + "retirement_B_event": -1, + "retirement_frame": 95, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1102, + "handoff_basis": [ + 423, + 65, + 20, + 10 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 653, + "base": 648, + "common_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "dimension": 5, + "deadline": 1110, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 73, + "retirement_B_event": 947, + "retirement_frame": 635, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1110, + "handoff_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 603, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 401, + "retirement_B_event": -1, + "retirement_frame": 356, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 605, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 403, + "retirement_B_event": -1, + "retirement_frame": 356, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 607, + "base": 600, + "common_basis": [ + 409, + 80, + 40, + 5, + 2 + ], + "dimension": 5, + "deadline": 1062, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 405, + "retirement_B_event": -1, + "retirement_frame": 356, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1062, + "handoff_basis": [ + 409, + 80, + 40, + 5 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 611, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 410, + "retirement_B_event": -1, + "retirement_frame": 356, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 613, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 417, + "retirement_B_event": -1, + "retirement_frame": 385, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 614, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 419, + "retirement_B_event": -1, + "retirement_frame": 385, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 615, + "base": 608, + "common_basis": [ + 272, + 144, + 75, + 42, + 7 + ], + "dimension": 5, + "deadline": 1070, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 421, + "retirement_B_event": -1, + "retirement_frame": 385, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1070, + "handoff_basis": [ + 272, + 144, + 75, + 42 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 627, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 426, + "retirement_B_event": -1, + "retirement_frame": 385, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 629, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 433, + "retirement_B_event": -1, + "retirement_frame": 414, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 630, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 435, + "retirement_B_event": -1, + "retirement_frame": 414, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 631, + "base": 624, + "common_basis": [ + 391, + 68, + 34, + 17, + 8 + ], + "dimension": 5, + "deadline": 1086, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 437, + "retirement_B_event": -1, + "retirement_frame": 414, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1086, + "handoff_basis": [ + 391, + 68, + 34, + 17 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 655, + "base": 648, + "common_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "dimension": 5, + "deadline": 1110, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 442, + "retirement_B_event": -1, + "retirement_frame": 414, + "retirement_dimension": 4, + "old_final_dimension": 9, + "handoff_B": 1110, + "handoff_basis": [ + 288, + 160, + 75, + 25 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 637, + "base": 632, + "common_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "dimension": 5, + "deadline": 1094, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 530, + "retirement_B_event": 1048, + "retirement_frame": 736, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1094, + "handoff_basis": [ + 257, + 129, + 76, + 42, + 30 + ], + "handoff_paid_rank": 0, + "anticipate": false + }, + { + "register": 654, + "base": 648, + "common_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "dimension": 5, + "deadline": 1110, + "deleted_echo_indices": [], + "low": false, + "borrow_from": 542, + "retirement_B_event": 1050, + "retirement_frame": 738, + "retirement_dimension": 5, + "old_final_dimension": 9, + "handoff_B": 1110, + "handoff_basis": [ + 288, + 160, + 75, + 25, + 7 + ], + "handoff_paid_rank": 0, + "anticipate": false + } + ], + "early_tail_events": [ + { + "old_tail_index": 35, + "before_B": 722, + "gate": [ + "add", + 282, + 285, + -1, + 1, + 124 + ] + }, + { + "old_tail_index": 36, + "before_B": 722, + "gate": [ + "scale", + 282, + 1, + -1, + 124 + ] + }, + { + "old_tail_index": 37, + "before_B": 720, + "gate": [ + "add", + 277, + 281, + -1, + 1, + 124 + ] + }, + { + "old_tail_index": 38, + "before_B": 720, + "gate": [ + "scale", + 277, + 1, + -1, + 124 + ] + }, + { + "old_tail_index": 39, + "before_B": 723, + "gate": [ + "add", + 275, + 31, + -1, + 1, + 124 + ] + }, + { + "old_tail_index": 40, + "before_B": 721, + "gate": [ + "add", + 273, + 12, + -1, + 1, + 124 + ] + }, + { + "old_tail_index": 41, + "before_B": 741, + "gate": [ + "add", + 298, + 301, + -1, + 1, + 153 + ] + }, + { + "old_tail_index": 42, + "before_B": 741, + "gate": [ + "scale", + 298, + 1, + -1, + 153 + ] + }, + { + "old_tail_index": 43, + "before_B": 739, + "gate": [ + "add", + 293, + 297, + -1, + 1, + 153 + ] + }, + { + "old_tail_index": 44, + "before_B": 739, + "gate": [ + "scale", + 293, + 1, + -1, + 153 + ] + }, + { + "old_tail_index": 45, + "before_B": 742, + "gate": [ + "add", + 291, + 55, + -1, + 1, + 153 + ] + }, + { + "old_tail_index": 46, + "before_B": 740, + "gate": [ + "add", + 289, + 101, + -1, + 1, + 153 + ] + }, + { + "old_tail_index": 47, + "before_B": 761, + "gate": [ + "add", + 314, + 317, + -1, + 1, + 182 + ] + }, + { + "old_tail_index": 48, + "before_B": 761, + "gate": [ + "scale", + 314, + 1, + -1, + 182 + ] + }, + { + "old_tail_index": 49, + "before_B": 759, + "gate": [ + "add", + 309, + 313, + -1, + 1, + 182 + ] + }, + { + "old_tail_index": 50, + "before_B": 759, + "gate": [ + "scale", + 309, + 1, + -1, + 182 + ] + }, + { + "old_tail_index": 51, + "before_B": 762, + "gate": [ + "add", + 307, + 85, + -1, + 1, + 182 + ] + }, + { + "old_tail_index": 52, + "before_B": 760, + "gate": [ + "add", + 305, + 98, + -1, + 1, + 182 + ] + }, + { + "old_tail_index": 53, + "before_B": 781, + "gate": [ + "add", + 330, + 333, + -1, + 1, + 211 + ] + }, + { + "old_tail_index": 54, + "before_B": 781, + "gate": [ + "scale", + 330, + 1, + -1, + 211 + ] + }, + { + "old_tail_index": 55, + "before_B": 779, + "gate": [ + "add", + 325, + 329, + -1, + 1, + 211 + ] + }, + { + "old_tail_index": 56, + "before_B": 779, + "gate": [ + "scale", + 325, + 1, + -1, + 211 + ] + }, + { + "old_tail_index": 57, + "before_B": 782, + "gate": [ + "add", + 323, + 33, + -1, + 1, + 211 + ] + }, + { + "old_tail_index": 58, + "before_B": 780, + "gate": [ + "add", + 321, + 49, + -1, + 1, + 211 + ] + }, + { + "old_tail_index": 59, + "before_B": 801, + "gate": [ + "add", + 346, + 349, + -1, + 1, + 240 + ] + }, + { + "old_tail_index": 60, + "before_B": 801, + "gate": [ + "scale", + 346, + 1, + -1, + 240 + ] + }, + { + "old_tail_index": 61, + "before_B": 799, + "gate": [ + "add", + 341, + 345, + -1, + 1, + 240 + ] + }, + { + "old_tail_index": 62, + "before_B": 799, + "gate": [ + "scale", + 341, + 1, + -1, + 240 + ] + }, + { + "old_tail_index": 63, + "before_B": 802, + "gate": [ + "add", + 339, + 1, + -1, + 1, + 240 + ] + }, + { + "old_tail_index": 64, + "before_B": 800, + "gate": [ + "add", + 337, + 6, + -1, + 1, + 240 + ] + }, + { + "old_tail_index": 65, + "before_B": 819, + "gate": [ + "add", + 362, + 365, + -1, + 1, + 269 + ] + }, + { + "old_tail_index": 66, + "before_B": 819, + "gate": [ + "scale", + 362, + 1, + -1, + 269 + ] + }, + { + "old_tail_index": 67, + "before_B": 817, + "gate": [ + "add", + 357, + 361, + -1, + 1, + 269 + ] + }, + { + "old_tail_index": 68, + "before_B": 817, + "gate": [ + "scale", + 357, + 1, + -1, + 269 + ] + }, + { + "old_tail_index": 69, + "before_B": 820, + "gate": [ + "add", + 355, + 74, + -1, + 1, + 269 + ] + }, + { + "old_tail_index": 70, + "before_B": 818, + "gate": [ + "add", + 353, + 83, + -1, + 1, + 269 + ] + }, + { + "old_tail_index": 71, + "before_B": 837, + "gate": [ + "add", + 378, + 381, + -1, + 1, + 298 + ] + }, + { + "old_tail_index": 72, + "before_B": 837, + "gate": [ + "scale", + 378, + 1, + -1, + 298 + ] + }, + { + "old_tail_index": 73, + "before_B": 835, + "gate": [ + "add", + 373, + 377, + -1, + 1, + 298 + ] + }, + { + "old_tail_index": 74, + "before_B": 835, + "gate": [ + "scale", + 373, + 1, + -1, + 298 + ] + }, + { + "old_tail_index": 75, + "before_B": 838, + "gate": [ + "add", + 371, + 88, + -1, + 1, + 298 + ] + }, + { + "old_tail_index": 76, + "before_B": 836, + "gate": [ + "add", + 369, + 80, + -1, + 1, + 298 + ] + }, + { + "old_tail_index": 77, + "before_B": 855, + "gate": [ + "add", + 394, + 397, + -1, + 1, + 327 + ] + }, + { + "old_tail_index": 78, + "before_B": 855, + "gate": [ + "scale", + 394, + 1, + -1, + 327 + ] + }, + { + "old_tail_index": 79, + "before_B": 853, + "gate": [ + "add", + 389, + 393, + -1, + 1, + 327 + ] + }, + { + "old_tail_index": 80, + "before_B": 853, + "gate": [ + "scale", + 389, + 1, + -1, + 327 + ] + }, + { + "old_tail_index": 81, + "before_B": 856, + "gate": [ + "add", + 387, + 4, + -1, + 1, + 327 + ] + }, + { + "old_tail_index": 82, + "before_B": 854, + "gate": [ + "add", + 385, + 68, + -1, + 1, + 327 + ] + } + ], + "initial_corrections": [ + { + "target": 114, + "source": 339, + "operator_word": [ + 36 + ], + "coefficient": "1/2" + }, + { + "target": 114, + "source": 337, + "operator_word": [ + 37 + ], + "coefficient": "1/2" + }, + { + "target": 117, + "source": 387, + "operator_word": [ + 56 + ], + "coefficient": "-1" + }, + { + "target": 117, + "source": 389, + "operator_word": [ + 54 + ], + "coefficient": "-1" + }, + { + "target": 121, + "source": 346, + "operator_word": [ + 35 + ], + "coefficient": "1/2" + }, + { + "target": 121, + "source": 337, + "operator_word": [ + 37 + ], + "coefficient": "1/2" + }, + { + "target": 123, + "source": 305, + "operator_word": [ + 25 + ], + "coefficient": "1/2" + }, + { + "target": 123, + "source": 330, + "operator_word": [ + 29 + ], + "coefficient": "1/2" + }, + { + "target": 126, + "source": 355, + "operator_word": [ + 43 + ], + "coefficient": "-1" + }, + { + "target": 126, + "source": 357, + "operator_word": [ + 41 + ], + "coefficient": "-1" + }, + { + "target": 130, + "source": 371, + "operator_word": [ + 49 + ], + "coefficient": "1/2" + }, + { + "target": 130, + "source": 394, + "operator_word": [ + 55 + ], + "coefficient": "1" + }, + { + "target": 133, + "source": 273, + "operator_word": [ + 13 + ], + "coefficient": "-1" + }, + { + "target": 133, + "source": 309, + "operator_word": [ + 22 + ], + "coefficient": "-1" + }, + { + "target": 137, + "source": 346, + "operator_word": [ + 35 + ], + "coefficient": "1/2" + }, + { + "target": 137, + "source": 362, + "operator_word": [ + 42 + ], + "coefficient": "1/2" + }, + { + "target": 149, + "source": 273, + "operator_word": [ + 13 + ], + "coefficient": "-1" + }, + { + "target": 149, + "source": 293, + "operator_word": [ + 17 + ], + "coefficient": "1" + }, + { + "target": 151, + "source": 378, + "operator_word": [ + 48 + ], + "coefficient": "1/2" + }, + { + "target": 151, + "source": 369, + "operator_word": [ + 50 + ], + "coefficient": "1/2" + }, + { + "target": 153, + "source": 355, + "operator_word": [ + 43 + ], + "coefficient": "-1" + }, + { + "target": 153, + "source": 341, + "operator_word": [ + 34 + ], + "coefficient": "1" + }, + { + "target": 155, + "source": 277, + "operator_word": [ + 10 + ], + "coefficient": "-1" + }, + { + "target": 155, + "source": 307, + "operator_word": [ + 24 + ], + "coefficient": "1" + }, + { + "target": 159, + "source": 275, + "operator_word": [ + 12 + ], + "coefficient": "-1" + }, + { + "target": 159, + "source": 293, + "operator_word": [ + 17 + ], + "coefficient": "-1" + }, + { + "target": 164, + "source": 353, + "operator_word": [ + 44 + ], + "coefficient": "-1" + }, + { + "target": 164, + "source": 341, + "operator_word": [ + 34 + ], + "coefficient": "-1" + }, + { + "target": 166, + "source": 371, + "operator_word": [ + 49 + ], + "coefficient": "1/2" + }, + { + "target": 166, + "source": 369, + "operator_word": [ + 50 + ], + "coefficient": "1/2" + }, + { + "target": 173, + "source": 339, + "operator_word": [ + 36 + ], + "coefficient": "1/2" + }, + { + "target": 173, + "source": 362, + "operator_word": [ + 42 + ], + "coefficient": "-1/2" + }, + { + "target": 175, + "source": 325, + "operator_word": [ + 28 + ], + "coefficient": "1/2" + }, + { + "target": 175, + "source": 323, + "operator_word": [ + 30 + ], + "coefficient": "-1/2" + }, + { + "target": 177, + "source": 385, + "operator_word": [ + 57 + ], + "coefficient": "-1" + }, + { + "target": 177, + "source": 389, + "operator_word": [ + 54 + ], + "coefficient": "-1" + }, + { + "target": 181, + "source": 385, + "operator_word": [ + 57 + ], + "coefficient": "-1" + }, + { + "target": 181, + "source": 373, + "operator_word": [ + 47 + ], + "coefficient": "-1" + }, + { + "target": 183, + "source": 325, + "operator_word": [ + 28 + ], + "coefficient": "1/2" + }, + { + "target": 183, + "source": 330, + "operator_word": [ + 29 + ], + "coefficient": "1/2" + }, + { + "target": 188, + "source": 291, + "operator_word": [ + 19 + ], + "coefficient": "1/2" + }, + { + "target": 188, + "source": 289, + "operator_word": [ + 20 + ], + "coefficient": "1/2" + }, + { + "target": 190, + "source": 277, + "operator_word": [ + 10 + ], + "coefficient": "-1" + }, + { + "target": 190, + "source": 282, + "operator_word": [ + 11 + ], + "coefficient": "-1" + }, + { + "target": 193, + "source": 298, + "operator_word": [ + 18 + ], + "coefficient": "1/2" + }, + { + "target": 193, + "source": 289, + "operator_word": [ + 20 + ], + "coefficient": "1/2" + }, + { + "target": 199, + "source": 298, + "operator_word": [ + 18 + ], + "coefficient": "1/2" + }, + { + "target": 199, + "source": 314, + "operator_word": [ + 23 + ], + "coefficient": "1/2" + }, + { + "target": 202, + "source": 305, + "operator_word": [ + 25 + ], + "coefficient": "1/2" + }, + { + "target": 202, + "source": 323, + "operator_word": [ + 30 + ], + "coefficient": "1/2" + }, + { + "target": 204, + "source": 291, + "operator_word": [ + 19 + ], + "coefficient": "1/2" + }, + { + "target": 204, + "source": 314, + "operator_word": [ + 23 + ], + "coefficient": "-1/2" + }, + { + "target": 208, + "source": 387, + "operator_word": [ + 56 + ], + "coefficient": "-1" + }, + { + "target": 208, + "source": 373, + "operator_word": [ + 47 + ], + "coefficient": "1" + }, + { + "target": 211, + "source": 321, + "operator_word": [ + 31 + ], + "coefficient": "-1" + }, + { + "target": 211, + "source": 307, + "operator_word": [ + 24 + ], + "coefficient": "-1" + }, + { + "target": 214, + "source": 378, + "operator_word": [ + 48 + ], + "coefficient": "1/2" + }, + { + "target": 214, + "source": 394, + "operator_word": [ + 55 + ], + "coefficient": "-1" + }, + { + "target": 216, + "source": 321, + "operator_word": [ + 31 + ], + "coefficient": "-1" + }, + { + "target": 216, + "source": 282, + "operator_word": [ + 11 + ], + "coefficient": "-1" + }, + { + "target": 218, + "source": 353, + "operator_word": [ + 44 + ], + "coefficient": "-1" + }, + { + "target": 218, + "source": 357, + "operator_word": [ + 41 + ], + "coefficient": "-1" + }, + { + "target": 222, + "source": 275, + "operator_word": [ + 12 + ], + "coefficient": "-1" + }, + { + "target": 222, + "source": 309, + "operator_word": [ + 22 + ], + "coefficient": "-1" + } + ] +} diff --git a/research/t74-low-alias-borrowing/inputs/blocks.json b/research/t74-low-alias-borrowing/inputs/blocks.json new file mode 100644 index 0000000000..c683574b38 --- /dev/null +++ b/research/t74-low-alias-borrowing/inputs/blocks.json @@ -0,0 +1 @@ +{"sources": [{"blocks": [{"Q": [["0", "-1/2", "-1/2", "0", "0", "-1/2", "-1/2", "0"], ["-1/2", "0", "-1/2", "0", "0", "1/2", "0", "1/2"], ["-1/2", "0", "0", "-1/2", "-1/2", "0", "0", "-1/2"], ["0", "-1/2", "0", "-1/2", "1/2", "0", "1/2", "0"]], "R": [["0", "-1/2", "-1/2", "0"], ["-1/2", "0", "-1/2", "0"], ["-1/2", "0", "0", "-1/2"], ["0", "-1/2", "0", "1/2"]], "base": 592, "common_frame": [320, 192, 45, 30], "common_rank": 4, "first_correction": 433, "first_input": 1061, "helpers": [592, 593, 594, 595, 596, 597, 598, 599], "high": [595, 597, 598, 599], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1", "initial_scalar_columns": [1, 3, 8, 12, 17, 22, 28, 32, 592, 593, 594, 595, 596, 597, 598, 599], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [592, 593, 594, 595, 596, 597, 598, 599, 283, 100, 315, 48, 347, 82, 379, 67], "removed_correction_indices": [420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431], "scalar_prefix_length": 4669}, "input_arrays": [283, 100, 315, 48, 347, 82, 379, 67], "input_frames": [[271, 143, 79, 45, 30], [320, 192, 41, 26, 4], [320, 192, 44, 30, 1], [266, 138, 74, 45, 30], [262, 134, 70, 45, 30], [320, 192, 32, 19, 13], [320, 192, 37, 22, 8], [259, 131, 67, 45, 30]], "input_gate_indices": [1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [592, 593, 594, 596], "output_entry_indices": [1420, 1417, 1416, 1421], "output_gate_indices": [1416, 1417, 1420, 1421, 1424, 1425, 1428, 1429], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [{"eligible_targets": [], "frame": [271, 143, 79, 45, 30, 4, 1], "indices": [0, 1, 2, 3]}, {"eligible_targets": [], "frame": [271, 143, 79, 45, 30, 9, 4], "indices": [0, 1, 4, 5]}, {"eligible_targets": [], "frame": [271, 143, 79, 45, 30, 9, 1], "indices": [0, 2, 4, 6]}, {"eligible_targets": [193], "frame": [271, 143, 79, 45, 30, 13, 1], "indices": [0, 2, 5, 7]}, {"eligible_targets": [199], "frame": [271, 143, 79, 45, 30, 9, 5], "indices": [0, 3, 4, 7]}, {"eligible_targets": [], "frame": [271, 143, 79, 45, 30, 13, 5], "indices": [0, 3, 5, 6]}, {"eligible_targets": [], "frame": [320, 192, 70, 41, 26, 4, 1], "indices": [1, 2, 4, 7]}, {"eligible_targets": [188], "frame": [320, 192, 41, 26, 9, 4, 1], "indices": [1, 2, 5, 6]}, {"eligible_targets": [204], "frame": [320, 192, 74, 41, 26, 12, 4], "indices": [1, 3, 4, 6]}, {"eligible_targets": [], "frame": [320, 192, 74, 41, 26, 9, 4], "indices": [1, 3, 5, 7]}, {"eligible_targets": [], "frame": [320, 192, 74, 44, 30, 9, 1], "indices": [2, 3, 6, 7]}, {"eligible_targets": [], "frame": [262, 134, 70, 45, 30, 13, 5], "indices": [4, 5, 6, 7]}], "subset_spectrum": [{"count": 8, "frame_rank": 5, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 6, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 7, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 7, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 7, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 8, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 8, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 8, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 8, "matrix_rank": 4, "size": 8}], "target_arrays": [188, 193, 199, 204], "target_caps": [[320, 192, 32, 16, 8, 4, 2, 1], [258, 130, 66, 32, 18, 10, 6, 1], [257, 129, 65, 33, 16, 9, 5, 2], [257, 129, 65, 33, 17, 8, 4, 3]], "target_entry_frames": [[320, 192, 33, 16, 9, 5, 2], [258, 130, 66, 33, 18, 11, 7], [320, 192, 33, 16, 9, 5, 2], [258, 130, 66, 33, 18, 11, 7]]}, {"Q": [["-1/2", "0", "-1/2", "0", "0", "1/2", "0", "1/2"], ["0", "-1/2", "0", "-1/2", "1/2", "0", "1/2", "0"], ["0", "-1/2", "-1/2", "0", "0", "-1/2", "-1/2", "0"], ["-1/2", "0", "0", "-1/2", "-1/2", "0", "0", "-1/2"]], "R": [["-1/2", "0", "-1/2", "0"], ["0", "-1/2", "0", "1/2"], ["0", "-1/2", "-1/2", "0"], ["-1/2", "0", "0", "-1/2"]], "base": 600, "common_frame": [409, 80, 40, 5, 2], "common_rank": 5, "first_correction": 409, "first_input": 1069, "helpers": [600, 601, 602, 603, 604, 605, 606, 607], "high": [603, 605, 606, 607], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1", "initial_scalar_columns": [1, 4, 5, 6, 12, 18, 19, 24, 600, 601, 602, 603, 604, 605, 606, 607], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [600, 601, 602, 603, 604, 605, 606, 607, 279, 274, 295, 290, 343, 338, 359, 354], "removed_correction_indices": [396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407], "scalar_prefix_length": 4677}, "input_arrays": [279, 274, 295, 290, 343, 338, 359, 354], "input_frames": [[385, 72, 40, 24, 5, 2], [408, 80, 40, 4, 2, 1], [273, 136, 80, 40, 5, 2], [264, 145, 80, 40, 5, 2], [392, 65, 40, 17, 5, 2], [401, 80, 32, 8, 5, 2], [280, 129, 80, 40, 5, 2], [257, 152, 80, 40, 5, 2]], "input_gate_indices": [1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [600, 601, 602, 604], "output_entry_indices": [1449, 1453, 1452, 1448], "output_gate_indices": [1448, 1449, 1452, 1453, 1456, 1457, 1460, 1461], "profile": {"1": 32, "4": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [123, 175, 183, 202], "target_caps": [[257, 128, 64, 32, 16, 8, 5, 2], [264, 128, 64, 40, 16, 4, 2, 1], [272, 128, 80, 32, 8, 4, 2, 1], [257, 128, 65, 33, 17, 9, 5, 2]], "target_entry_frames": [[265, 128, 64, 40, 16, 5, 2], [265, 128, 64, 40, 16, 5, 2], [272, 128, 80, 33, 9, 5, 2], [272, 128, 80, 33, 9, 5, 2]]}, {"Q": [["0", "-1/2", "-1/2", "0", "0", "-1/2", "-1/2", "0"], ["-1/2", "0", "-1/2", "0", "0", "1/2", "0", "1/2"], ["-1/2", "0", "0", "-1/2", "-1/2", "0", "0", "-1/2"], ["0", "-1/2", "0", "-1/2", "1/2", "0", "1/2", "0"]], "R": [["0", "-1/2", "-1/2", "0"], ["-1/2", "0", "-1/2", "0"], ["-1/2", "0", "0", "-1/2"], ["0", "-1/2", "0", "1/2"]], "base": 608, "common_frame": [272, 144, 75, 42, 7], "common_rank": 5, "first_correction": 421, "first_input": 1077, "helpers": [608, 609, 610, 611, 612, 613, 614, 615], "high": [611, 613, 614, 615], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "-1", "initial_scalar_columns": [1, 3, 6, 12, 17, 18, 26, 35, 608, 609, 610, 611, 612, 613, 614, 615], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [608, 609, 610, 611, 612, 613, 614, 615, 278, 276, 294, 292, 358, 356, 342, 340], "removed_correction_indices": [408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419], "scalar_prefix_length": 4685}, "input_arrays": [278, 276, 294, 292, 358, 356, 342, 340], "input_frames": [[266, 138, 75, 42, 26, 7], [272, 144, 72, 41, 4, 3], [264, 136, 75, 42, 24, 7], [272, 144, 74, 42, 6, 1], [257, 129, 75, 42, 17, 7], [272, 144, 67, 34, 8, 7], [259, 131, 75, 42, 19, 7], [272, 144, 65, 32, 10, 7]], "input_gate_indices": [1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [608, 609, 610, 612], "output_entry_indices": [1484, 1481, 1480, 1485], "output_gate_indices": [1480, 1481, 1484, 1485, 1488, 1489, 1492, 1493], "profile": {"1": 32, "4": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [114, 121, 137, 173], "target_caps": [[256, 128, 64, 33, 16, 8, 4, 3], [256, 128, 65, 32, 16, 8, 5, 2], [256, 128, 64, 32, 16, 10, 6, 1], [256, 128, 72, 40, 16, 4, 2, 1]], "target_entry_frames": [[256, 128, 64, 33, 16, 11, 7], [256, 128, 73, 40, 16, 5, 2], [256, 128, 64, 33, 16, 11, 7], [256, 128, 73, 40, 16, 5, 2]]}, {"Q": [["0", "-1/2", "0", "-1/2", "-1", "0", "-1", "0"], ["-1/2", "0", "-1/2", "0", "0", "-1", "0", "-1"], ["0", "-1/2", "-1/2", "0", "0", "1", "1", "0"], ["-1/2", "0", "0", "-1/2", "1", "0", "0", "1"]], "R": [["0", "-1/2", "0", "-1"], ["-1/2", "0", "-1/2", "0"], ["0", "-1/2", "-1/2", "0"], ["-1/2", "0", "0", "1"]], "base": 624, "common_frame": [391, 68, 34, 17, 8], "common_rank": 5, "first_correction": 397, "first_input": 1093, "helpers": [624, 625, 626, 627, 628, 629, 630, 631], "high": [627, 629, 630, 631], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/16", "initial_scalar_columns": [1, 2, 6, 10, 11, 14, 15, 24, 624, 625, 626, 627, 628, 629, 630, 631], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [624, 625, 626, 627, 628, 629, 630, 631, 246, 244, 262, 260, 360, 60, 348, 350], "removed_correction_indices": [384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395], "scalar_prefix_length": 4701}, "input_arrays": [246, 244, 262, 260, 360, 60, 348, 350], "input_frames": [[261, 130, 68, 34, 17, 8], [258, 133, 68, 34, 17, 8], [390, 68, 34, 16, 8, 1], [385, 66, 34, 17, 8, 6], [262, 129, 68, 34, 17, 8], [257, 134, 68, 34, 17, 8], [389, 68, 32, 17, 8, 2], [386, 65, 34, 17, 8, 5]], "input_gate_indices": [1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [624, 625, 626, 628], "output_entry_indices": [1549, 1545, 1548, 1544], "output_gate_indices": [1544, 1545, 1548, 1549, 1552, 1553, 1556, 1557], "profile": {"1": 32, "4": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [130, 151, 166, 214], "target_caps": [[256, 129, 64, 32, 17, 8, 4, 2], [256, 130, 64, 34, 16, 8, 4, 1], [256, 132, 68, 32, 16, 8, 2, 1], [256, 129, 65, 33, 17, 8, 5, 3]], "target_entry_frames": [[256, 131, 64, 34, 17, 8, 4], [256, 131, 64, 34, 17, 8, 4], [256, 132, 68, 33, 17, 8, 3], [256, 132, 68, 33, 17, 8, 3]]}, {"Q": [["-1/2", "0", "0", "-1/2", "1", "0", "0", "1"], ["-1/2", "0", "-1/2", "0", "0", "-1", "0", "-1"], ["0", "-1/2", "0", "-1/2", "-1", "0", "-1", "0"], ["0", "-1/2", "-1/2", "0", "0", "1", "1", "0"]], "R": [["-1/2", "0", "0", "1"], ["-1/2", "0", "-1/2", "0"], ["0", "-1/2", "0", "-1"], ["0", "-1/2", "-1/2", "0"]], "base": 632, "common_frame": [257, 129, 76, 42, 30], "common_rank": 5, "first_correction": 385, "first_input": 1101, "helpers": [632, 633, 634, 635, 636, 637, 638, 639], "high": [635, 637, 638, 639], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/16", "initial_scalar_columns": [2, 3, 4, 10, 12, 13, 14, 18, 632, 633, 634, 635, 636, 637, 638, 639], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [632, 633, 634, 635, 636, 637, 638, 639, 456, 457, 466, 467, 376, 66, 396, 398], "removed_correction_indices": [372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383], "scalar_prefix_length": 4709}, "input_arrays": [456, 457, 466, 467, 376, 66, 396, 398], "input_frames": [[257, 129, 72, 42, 26, 4], [257, 129, 76, 41, 29, 3], [257, 129, 69, 35, 23, 9], [257, 129, 66, 36, 16, 14], [257, 129, 67, 37, 17, 15], [257, 129, 68, 34, 22, 8], [257, 129, 76, 40, 28, 2], [257, 129, 73, 42, 27, 5]], "input_gate_indices": [1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [632, 633, 634, 636], "output_entry_indices": [1576, 1577, 1581, 1580], "output_gate_indices": [1576, 1577, 1580, 1581, 1584, 1585, 1588, 1589], "profile": {"1": 32, "4": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [144, 147, 157, 160], "target_caps": [[256, 128, 66, 32, 16, 10, 4, 1], [256, 128, 64, 34, 18, 8, 4, 1], [256, 128, 64, 36, 16, 12, 2, 1], [256, 128, 68, 32, 20, 8, 2, 1]], "target_entry_frames": [[256, 128, 70, 32, 20, 10, 1], [256, 128, 64, 38, 18, 12, 1], [256, 128, 64, 38, 18, 12, 1], [256, 128, 70, 32, 20, 10, 1]]}, {"Q": [["-1/2", "0", "-1/2", "0", "0", "-1", "0", "-1"], ["0", "-1/2", "-1/2", "0", "0", "1", "1", "0"], ["-1/2", "0", "0", "-1/2", "1", "0", "0", "1"], ["0", "-1/2", "0", "-1/2", "-1", "0", "-1", "0"]], "R": [["-1/2", "0", "-1/2", "0"], ["0", "-1/2", "-1/2", "0"], ["-1/2", "0", "0", "1"], ["0", "-1/2", "0", "-1"]], "base": 640, "common_frame": [423, 65, 20, 10], "common_rank": 4, "first_correction": 373, "first_input": 1109, "helpers": [640, 641, 642, 643, 644, 645, 646, 647], "high": [643, 645, 646, 647], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/16", "initial_scalar_columns": [2, 3, 4, 5, 8, 9, 10, 11, 640, 641, 642, 643, 644, 645, 646, 647], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [640, 641, 642, 643, 644, 645, 646, 647, 458, 459, 464, 465, 392, 97, 380, 382], "removed_correction_indices": [360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371], "scalar_prefix_length": 4717}, "input_arrays": [458, 459, 464, 465, 392, 97, 380, 382], "input_frames": [[261, 130, 65, 32, 20, 10], [258, 133, 65, 32, 20, 10], [387, 65, 32, 16, 10, 4], [388, 65, 32, 20, 9, 3], [260, 131, 65, 32, 20, 10], [259, 132, 65, 32, 20, 10], [386, 65, 32, 17, 10, 5], [389, 65, 32, 20, 8, 2]], "input_gate_indices": [1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [640, 641, 642, 644], "output_entry_indices": [1609, 1612, 1608, 1613], "output_gate_indices": [1608, 1609, 1612, 1613, 1616, 1617, 1620, 1621], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [135, 146, 162, 220], "target_caps": [[257, 128, 65, 32, 16, 8, 4, 2], [258, 128, 64, 32, 16, 10, 4, 1], [260, 128, 64, 32, 20, 8, 2, 1], [257, 128, 65, 32, 17, 9, 5, 3]], "target_entry_frames": [[257, 128, 65, 32, 18, 10, 6], [262, 128, 64, 32, 20, 10, 1], [262, 128, 64, 32, 20, 10, 1], [257, 128, 65, 32, 18, 10, 6]]}, {"Q": [["1", "0", "0", "1", "1", "0", "0", "1"], ["0", "1", "1", "0", "0", "1", "1", "0"], ["1", "0", "1", "0", "0", "-1", "0", "-1"], ["0", "1", "0", "1", "-1", "0", "-1", "0"]], "R": [["1", "0", "0", "1"], ["0", "1", "1", "0"], ["1", "0", "1", "0"], ["0", "1", "0", "-1"]], "base": 648, "common_frame": [288, 160, 75, 25, 7], "common_rank": 5, "first_correction": 445, "first_input": 1117, "helpers": [648, 649, 650, 651, 652, 653, 654, 655], "high": [651, 653, 654, 655], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/256", "initial_scalar_columns": [2, 3, 8, 9, 12, 13, 16, 17, 648, 649, 650, 651, 652, 653, 654, 655], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [648, 649, 650, 651, 652, 653, 654, 655, 248, 10, 268, 270, 280, 38, 300, 302], "removed_correction_indices": [432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443], "scalar_prefix_length": 4725}, "input_arrays": [248, 10, 268, 270, 280, 38, 300, 302], "input_frames": [[288, 160, 67, 17, 8, 7], [258, 130, 75, 34, 25, 7], [259, 131, 75, 35, 25, 7], [288, 160, 66, 16, 9, 7], [288, 160, 72, 25, 4, 3], [265, 137, 75, 41, 25, 7], [264, 136, 75, 40, 25, 7], [288, 160, 73, 25, 5, 2]], "input_gate_indices": [1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [648, 649, 650, 652], "output_entry_indices": [1640, 1644, 1641, 1645], "output_gate_indices": [1640, 1641, 1644, 1645, 1648, 1649, 1652, 1653], "profile": {"1": 32, "4": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [187, 194, 198, 205], "target_caps": [[288, 160, 64, 16, 8, 4, 2, 1], [258, 130, 64, 34, 18, 10, 6, 1], [257, 129, 65, 33, 17, 8, 5, 2], [257, 129, 65, 33, 16, 9, 4, 3]], "target_entry_frames": [[288, 160, 64, 18, 10, 6, 1], [288, 160, 64, 18, 10, 6, 1], [257, 129, 65, 33, 19, 10, 7], [257, 129, 65, 33, 19, 10, 7]]}, {"Q": [["1", "0", "1", "0", "0", "-1", "0", "-1"], ["0", "1", "0", "1", "-1", "0", "-1", "0"], ["0", "1", "1", "0", "0", "1", "1", "0"], ["1", "0", "0", "1", "1", "0", "0", "1"]], "R": [["1", "0", "1", "0"], ["0", "1", "0", "-1"], ["0", "1", "1", "0"], ["1", "0", "0", "1"]], "base": 656, "common_frame": [427, 96, 24, 6], "common_rank": 4, "first_correction": 361, "first_input": 1125, "helpers": [656, 657, 658, 659, 660, 661, 662, 663], "high": [659, 661, 662, 663], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "-1/256", "initial_scalar_columns": [2, 4, 5, 12, 14, 15, 25, 31, 656, 657, 658, 659, 660, 661, 662, 663], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [656, 657, 658, 659, 660, 661, 662, 663, 252, 254, 264, 79, 296, 19, 284, 286], "removed_correction_indices": [348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359], "scalar_prefix_length": 4733}, "input_arrays": [252, 254, 264, 79, 296, 19, 284, 286], "input_frames": [[296, 130, 96, 24, 6, 1], [258, 168, 96, 24, 6, 1], [418, 96, 16, 8, 6, 1], [392, 66, 34, 24, 6, 1], [290, 136, 96, 24, 6, 1], [264, 162, 96, 24, 6, 1], [424, 96, 24, 4, 2, 1], [386, 72, 40, 24, 6, 1]], "input_gate_indices": [1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [656, 657, 658, 660], "output_entry_indices": [1673, 1677, 1676, 1672], "output_gate_indices": [1672, 1673, 1676, 1677, 1680, 1681, 1684, 1685], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [141, 171, 185, 196], "target_caps": [[256, 130, 64, 32, 16, 8, 6, 1], [256, 136, 64, 32, 24, 4, 2, 1], [256, 160, 96, 16, 8, 4, 2, 1], [256, 130, 66, 34, 18, 10, 6, 1]], "target_entry_frames": [[256, 138, 64, 32, 24, 6, 1], [256, 138, 64, 32, 24, 6, 1], [256, 160, 96, 18, 10, 6, 1], [256, 160, 96, 18, 10, 6, 1]]}, {"Q": [["0", "1", "1", "0", "0", "1", "1", "0"], ["1", "0", "1", "0", "0", "-1", "0", "-1"], ["1", "0", "0", "1", "1", "0", "0", "1"], ["0", "1", "0", "1", "-1", "0", "-1", "0"]], "R": [["0", "1", "1", "0"], ["1", "0", "1", "0"], ["1", "0", "0", "1"], ["0", "1", "0", "-1"]], "base": 672, "common_frame": [413, 72, 48, 3], "common_rank": 4, "first_correction": 297, "first_input": 1141, "helpers": [672, 673, 674, 675, 676, 677, 678, 679], "high": [675, 677, 678, 679], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/256", "initial_scalar_columns": [1, 6, 10, 11, 13, 14, 15, 24, 672, 673, 674, 675, 676, 677, 678, 679], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [672, 673, 674, 675, 676, 677, 678, 679, 462, 463, 470, 471, 328, 109, 316, 318], "removed_correction_indices": [283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294], "scalar_prefix_length": 4749}, "input_arrays": [462, 463, 470, 471, 328, 109, 316, 318], "input_frames": [[280, 129, 72, 48, 4, 3], [257, 152, 72, 48, 4, 3], [393, 72, 32, 16, 4, 3], [400, 65, 48, 9, 4, 3], [272, 137, 72, 48, 4, 3], [265, 144, 72, 48, 4, 3], [385, 72, 40, 24, 4, 3], [408, 72, 48, 4, 2, 1]], "input_gate_indices": [1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [672, 673, 674, 676], "output_entry_indices": [1740, 1737, 1736, 1741], "output_gate_indices": [1736, 1737, 1740, 1741, 1744, 1745, 1748, 1749], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [117, 177, 181, 208], "target_caps": [[257, 128, 64, 32, 16, 8, 4, 3], [264, 128, 72, 32, 16, 4, 2, 1], [272, 128, 64, 48, 8, 4, 2, 1], [257, 128, 65, 33, 17, 9, 4, 3]], "target_entry_frames": [[273, 128, 64, 48, 8, 4, 3], [264, 128, 72, 33, 17, 4, 3], [273, 128, 64, 48, 8, 4, 3], [264, 128, 72, 33, 17, 4, 3]]}, {"Q": [["0", "1", "1", "0", "0", "1", "1", "0"], ["0", "1", "0", "1", "-1", "0", "-1", "0"], ["1", "0", "0", "1", "1", "0", "0", "1"], ["1", "0", "1", "0", "0", "-1", "0", "-1"]], "R": [["0", "1", "1", "0"], ["0", "1", "0", "-1"], ["1", "0", "0", "1"], ["1", "0", "1", "0"]], "base": 680, "common_frame": [407, 66, 36, 9], "common_rank": 4, "first_correction": 309, "first_input": 1149, "helpers": [680, 681, 682, 683, 684, 685, 686, 687], "high": [683, 685, 686, 687], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/256", "initial_scalar_columns": [1, 3, 4, 5, 6, 18, 19, 24, 680, 681, 682, 683, 684, 685, 686, 687], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [680, 681, 682, 683, 684, 685, 686, 687, 478, 479, 490, 491, 502, 503, 514, 515], "removed_correction_indices": [295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306], "scalar_prefix_length": 4757}, "input_arrays": [478, 479, 490, 491, 502, 503, 514, 515], "input_frames": [[388, 65, 36, 16, 9, 3], [387, 66, 32, 16, 9, 4], [262, 129, 66, 36, 16, 9], [257, 134, 66, 36, 16, 9], [390, 66, 36, 16, 8, 1], [385, 66, 34, 16, 9, 6], [260, 131, 66, 36, 16, 9], [259, 132, 66, 36, 16, 9]], "input_gate_indices": [1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [680, 681, 682, 684], "output_entry_indices": [1772, 1773, 1768, 1769], "output_gate_indices": [1768, 1769, 1772, 1773, 1776, 1777, 1780, 1781], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [126, 153, 164, 218], "target_caps": [[256, 129, 64, 32, 16, 9, 4, 2], [256, 130, 66, 32, 16, 8, 4, 1], [256, 132, 64, 36, 16, 8, 2, 1], [256, 129, 65, 33, 16, 9, 5, 3]], "target_entry_frames": [[256, 133, 64, 36, 16, 9, 2], [256, 130, 66, 33, 16, 9, 5], [256, 133, 64, 36, 16, 9, 2], [256, 130, 66, 33, 16, 9, 5]]}, {"Q": [["0", "1", "0", "1", "-1", "0", "-1", "0"], ["0", "1", "1", "0", "0", "1", "1", "0"], ["1", "0", "0", "1", "1", "0", "0", "1"], ["1", "0", "1", "0", "0", "-1", "0", "-1"]], "R": [["0", "1", "0", "-1"], ["0", "1", "1", "0"], ["1", "0", "0", "1"], ["1", "0", "1", "0"]], "base": 688, "common_frame": [258, 130, 85, 45], "common_rank": 4, "first_correction": 333, "first_input": 1157, "helpers": [688, 689, 690, 691, 692, 693, 694, 695], "high": [691, 693, 694, 695], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "1/256", "initial_scalar_columns": [1, 3, 4, 6, 8, 12, 31, 32, 688, 689, 690, 691, 692, 693, 694, 695], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [688, 689, 690, 691, 692, 693, 694, 695, 480, 481, 492, 493, 516, 517, 504, 505], "removed_correction_indices": [319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330], "scalar_prefix_length": 4765}, "input_arrays": [480, 481, 492, 493, 516, 517, 504, 505], "input_frames": [[257, 129, 76, 45, 25, 3], [258, 130, 72, 41, 25, 4], [258, 130, 70, 39, 19, 10], [258, 130, 65, 32, 20, 13], [258, 130, 68, 37, 17, 8], [258, 130, 67, 34, 22, 15], [258, 130, 76, 44, 24, 1], [258, 130, 74, 43, 25, 6]], "input_gate_indices": [1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [688, 689, 690, 692], "output_entry_indices": [1805, 1804, 1800, 1801], "output_gate_indices": [1800, 1801, 1804, 1805, 1808, 1809, 1812, 1813], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [], "subset_spectrum": [{"count": 8, "frame_rank": 6, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 7, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 8, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 8, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 9, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 9, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 9, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 9, "matrix_rank": 4, "size": 8}], "target_arrays": [155, 190, 211, 216], "target_caps": [[258, 130, 64, 32, 16, 8, 4, 1], [258, 130, 66, 34, 18, 10, 4, 1], [257, 129, 65, 32, 17, 8, 5, 3], [257, 129, 64, 33, 16, 9, 5, 3]], "target_entry_frames": [[258, 130, 64, 33, 16, 9, 5], [258, 130, 66, 35, 18, 11, 5], [258, 130, 66, 35, 18, 11, 5], [258, 130, 64, 33, 16, 9, 5]]}, {"Q": [["0", "1", "1", "0", "0", "1", "1", "0"], ["0", "1", "0", "1", "-1", "0", "-1", "0"], ["1", "0", "0", "1", "1", "0", "0", "1"], ["1", "0", "1", "0", "0", "-1", "0", "-1"]], "R": [["0", "1", "1", "0"], ["0", "1", "0", "-1"], ["1", "0", "0", "1"], ["1", "0", "1", "0"]], "base": 696, "common_frame": [455, 33, 18, 12], "common_rank": 4, "first_correction": 321, "first_input": 1165, "helpers": [696, 697, 698, 699, 700, 701, 702, 703], "high": [699, 701, 702, 703], "independence_witness": {"boundary": "before-inputs-with-helper-correction-deferred", "determinant": "-1/256", "initial_scalar_columns": [1, 3, 4, 5, 8, 22, 23, 24, 696, 697, 698, 699, 700, 701, 702, 703], "minor": [["0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0"], ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1"], ["0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0"], ["1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "0", "-1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], ["0", "0", "1/2", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]], "registers": [696, 697, 698, 699, 700, 701, 702, 703, 482, 483, 506, 507, 518, 519, 494, 495], "removed_correction_indices": [307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318], "scalar_prefix_length": 4773}, "input_arrays": [482, 483, 506, 507, 518, 519, 494, 495], "input_frames": [[388, 67, 33, 18, 12], [451, 33, 18, 8, 4], [385, 70, 33, 18, 12], [454, 32, 18, 12, 1], [262, 193, 33, 18, 12], [321, 134, 33, 18, 12], [259, 196, 33, 18, 12], [324, 131, 33, 18, 12]], "input_gate_indices": [1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165], "kernel_projection_ranks": [{"count": 8, "rank": 1, "size": 1}, {"count": 28, "rank": 2, "size": 2}, {"count": 56, "rank": 3, "size": 3}, {"count": 12, "rank": 3, "size": 4}, {"count": 58, "rank": 4, "size": 4}], "low": [696, 697, 698, 700], "output_entry_indices": [1836, 1837, 1832, 1833], "output_gate_indices": [1832, 1833, 1836, 1837, 1840, 1841, 1844, 1845], "profile": {"1": 24, "2": 8, "3": 4}, "rank_seven_kernel_frames": [{"eligible_targets": [], "frame": [388, 67, 33, 18, 12, 4, 1], "indices": [0, 1, 2, 3]}, {"eligible_targets": [], "frame": [388, 130, 67, 33, 18, 12, 4], "indices": [0, 1, 4, 5]}, {"eligible_targets": [], "frame": [388, 130, 67, 33, 18, 12, 5], "indices": [0, 2, 4, 6]}, {"eligible_targets": [222], "frame": [388, 197, 67, 33, 18, 12, 5], "indices": [0, 2, 5, 7]}, {"eligible_targets": [159], "frame": [388, 130, 67, 33, 18, 12, 1], "indices": [0, 3, 4, 7]}, {"eligible_targets": [], "frame": [388, 197, 67, 33, 18, 12, 1], "indices": [0, 3, 5, 6]}, {"eligible_targets": [], "frame": [451, 197, 66, 33, 18, 8, 4], "indices": [1, 2, 4, 7]}, {"eligible_targets": [133], "frame": [451, 130, 66, 33, 18, 8, 4], "indices": [1, 2, 5, 6]}, {"eligible_targets": [149], "frame": [451, 197, 33, 18, 8, 4, 1], "indices": [1, 3, 4, 6]}, {"eligible_targets": [], "frame": [451, 130, 33, 18, 8, 4, 1], "indices": [1, 3, 5, 7]}, {"eligible_targets": [], "frame": [385, 130, 70, 33, 18, 12, 1], "indices": [2, 3, 6, 7]}, {"eligible_targets": [], "frame": [262, 193, 71, 33, 18, 12, 5], "indices": [4, 5, 6, 7]}], "subset_spectrum": [{"count": 8, "frame_rank": 5, "matrix_rank": 1, "size": 1}, {"count": 28, "frame_rank": 6, "matrix_rank": 2, "size": 2}, {"count": 56, "frame_rank": 7, "matrix_rank": 3, "size": 3}, {"count": 12, "frame_rank": 7, "matrix_rank": 3, "size": 4}, {"count": 2, "frame_rank": 7, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 8, "matrix_rank": 4, "size": 4}, {"count": 56, "frame_rank": 8, "matrix_rank": 4, "size": 5}, {"count": 28, "frame_rank": 8, "matrix_rank": 4, "size": 6}, {"count": 8, "frame_rank": 8, "matrix_rank": 4, "size": 7}, {"count": 1, "frame_rank": 8, "matrix_rank": 4, "size": 8}], "target_arrays": [133, 149, 159, 222], "target_caps": [[257, 128, 64, 33, 16, 8, 4, 2], [258, 128, 64, 32, 18, 8, 4, 1], [260, 128, 64, 32, 16, 12, 2, 1], [257, 128, 64, 33, 17, 9, 5, 3]], "target_entry_frames": [[261, 128, 64, 33, 16, 12, 2], [258, 128, 64, 33, 18, 9, 5], [261, 128, 64, 33, 16, 12, 2], [258, 128, 64, 33, 18, 9, 5]]}]}]} \ No newline at end of file diff --git a/research/t74-low-alias-borrowing/inputs/extra.canonical.json.gz b/research/t74-low-alias-borrowing/inputs/extra.canonical.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e0d670d4351229ce6921ecfbecf180070b17616b GIT binary patch literal 87680 zcmaI71#BB#v^5%LW^$O?Ff(HtZkQPxW=X{3fcnTI|=#^{$tQ=~e#b(!|A=V#46xP7EUk z@e=Ot&PkPi{?R|+H<|Zs5ICrvRUoUv__?6u@7++qd>k}(;&x_NMHH`^C1bs8d~+P`|z97&7W?P)Q3~sA2!I#6w;*% zFyZ%0jykZRJXC0kR!>%wA$hRm=#}_=0Fd6nF7yO9OCK=oP=HbCSorB+? zl_=pEhXq1snD(lXZV(zil`$*6He1KB-#XSh{)I@U`rpZ%)&U)ARD*2afd($f8&x* zuhxx~ZrU2{AHV2grEn_jA>D$1((2QqFh=7sR^XO!uHk2si}Z|>p2*|z3QE0SEwg)l zh{Wcs87#c;kCQb%j)@#3wH)sz5&xvV1l-lUFR9_Ijf1?z=@etHDV~Xg+2{ZwI$k;@ybAJS1=mBDk|LMBcjFFUp)EXsrqDL^6OC*m*=9+#4YLOnRZX-Vp zorF#hafECWUF{bD4b={Q$S_dZI-MA*5IWWgNpwxouza5(!xW)r$7lvD1Gh#bfq+4< zx|yy`Wl5sf%inPfAIl7N1(VOwLZal&=kCdO`g%F|62x%;#a~%(OfLj;1(R@%5QQd9 zQ0}0l07*AbM=tQRbciy^LwM6q-7l0dhi9Dxs+idOgBc466Sd72h%k;VIf-aI(=*%? zG@tRaN$e({3}o+SdD^)03^2~g#hMD=T9&V6dg@&wcrpp_sPBt^VTajd9yHRZ(;Mcn)ZbEWLSb%i-s( zgof84-3P7X>t|dFAzR3lm^?s)#pF*KuzO7AH;*xLmat@BIOuH z$qUBpW-jJ1r4Hi3a&)MK-(TpC5Jfl1Tuwzd<3UVONPiZjBI)~jcKR6N^$~4A1R)BW z1DeiRlr$V#&&L@c#b8y~qJ%NI3U?c#(0lg0qUk>oG0U9Ifh7TiKaBPhrG2`Lb47?6AS>MV=6}~IwKTHcyggLl3La3L22lA^V58Tes2k~=_Nqg@z z;U_aDAP|;{RWbh9l`uq~bf{eTtZKhP)PnM5H~R__T0hBPd%J4bp5;c<9! zg;eIaH%S%=M4e0ImWu7=m1YEM6fyYdLd@ai(C{iJD^QQoQv0UeSv>Y;ZLU1tZups( zikyHBp)FYTnNZ@pM*n-8UHxyH<)59xh7~Aa`~*`j`}GQQ1p*7aB~)_qOD2`oNJt@V zqa|;o3%sdRz_MyP3sq=g1(DVkI>Pa5wExp$6Nb+V-b12hpaeYvVknCm$R$Bm?M*C^ zV5?nm;t8)H&%K}yv!ru@uIm)TUKJwBc2%%xgMc?(5yvg$A~h=kNqj3j_v&|nC{hzI zlOo+Hi^-v6NIhsoY>wSFRxk!S#+OUcOVOxZtZCubSg+4PK;ca}L=^Ex$YXC;kIC+Q z!tVI?s>DV0NGNL6;&66(j6(tPU?{dt<$Lo0q_AE{-ei}I&m9f`vGHwQH5ad0s?jm1 zwC6Pf!RzoV>`((~|m~fKFQ_lBDMb{h5A*{p_X(@SW3#SLNMbn@Q6K;#A z@G|lg-Dkw&G;YXHG?HTLeB+((ge4WrzeMl{}WqZK44L2Q(QWt6H68yOi5=wDbtIY*CIWcs z5D+CHJx@isFC%Z_C&4w4M5=;^taq7a_;Ifhd7n8Eu+thM zvF6Uo(~whZDM$Va*o%2{B-Elld7=T5h9e{rfn4zA=^F(44S*O(jNOi=C_i&|U-Jt% z9VcdTi~y-1LxUI-Ac_c7qR5fxhn7^29LNrVx<4aMQ62Ll96E{8~;mw(lgG zH^5i7wliT9`+zklu;vbm)bXS;c|4HPT@dFDuoC&$-JaCSmY&om9@3P(Ih{-Sx)PT7`tlre zZzbjaS5nIm!FJ4Jm9`M4H!hV%K*r_}THg&cML5wIBJU}P3oldp;$t@B?v+8FeNnq9 zi-NgMGi6e{Nav9wI4Iw{^KAw?7~Y^+L@x{5*v+KK=i}{X=V7Cv7zr2**i~323S&ov zmOL7mBzPUhv_N+o(Na|`!Rt5W53zwJ5NZ`T@wb8-U@*|EU!2c|l`T@lG|wjg&C^<9 zD9Xr#W502li6mo`p4V9BfVSsEQbwWVE%^zrd8c^eW0;_+k2e-cFgxPWZxYV4O;2u& zzi3y|My}m#iai{TZ6ey&DdTJ~TFy25=T!eVRy6r;h50t6=OSeX^>ml7dd$VZ-H1>6 z&e`{McL}`fo6hX8%Hoij@Av4;XF%&A!-4VUPcp@{Tv>ay{C#X3GW+P80_ojL_<0jx z4`%o5h&eHzMIH6ylA%RAKn*7hv#3KJ6N5iegh`M6$Zh7;cp)tUDH#E@zzPM8y zTczc7R?D;)g1V_NBVW-SMt1p@39CNAU|iS$H+C%olqaTpmr#TuWito*Iv$*5!pLJ3 zslj~g-o&{KHmqf0#OAp)m6<4ye~yL);s3+Y#QbwK>I2Y8b04)sWYP)ck!%%S+R9jV{@19- zk=?>zvaeceJLZXJRxQGfU^JfIzQjNjun*S2X*$`+ws zw&npBgSX?ouD^`F$JOi^Eg#7H4Ft}ioXiFDH>h$f&&l6%CIKeQWH^>*fk5K!088HW1jR8>@otXvwbWonth1fm#@v5=BR>Ey0@+}v;&MiV_{Z&sCCt@W+2 zHx^tn0rL^(o6&J|QCoy!xf4qXSNmvuw`LCM=xGXy$-r)K!-xwWi~@mOdNBLwRXH>s z+`Hk?`@ap(TbuqL!&6+{i$#K)t^b?6D8ueS)ICXgIb>vtqnEAyR=7bay?9I6HssB0 za+FY_w>y>#%EG2Di~1oZ{a&D3VRpa{;ppUir(Qi>Vw|A8m6Z}(wlp;08}06Ydm~<> z_qV>Ed=MBV1|Do%@R*9aBwZL0OA zqbo1dD3O}&RovC(l}PdOIh3PVm31?yXofrYHf7L8&R^{lKlRxLgCYgYd;pmx>cN8A0i6>zcB@u(%Dm~nn!s{WV zA{cOY{324sIct&Lg)nRhKhz*rxycrYQGqS_)~L%piNR9k97oC!c!?5CpjB;!@`(-1 z+XE?Zbf8f-`LSZ(?eAk$7x(3GiYHryJ$T8y6nxo7FYLtAwmTls4*J5IVh#oOBfMz+V&w!5R|y6GSV_O4$7z!eChxjJ>B$6})AGPeC5cp9}~i zklI+-#Cjp!r)^xiXTICl?VN_Yq}Hp$IF}z;OoRC`8 zFDnzcyB;a8R`_;DGBN`*mou0e!m^lC$+Kj4?!LzdHTuL5U#O6A22^+MgdlKW4YY9h ztl}aY;S5C6R!jc!x!IF5sj@Rlh65DYRp0bQ0ivBt4RY5`kgt=wytb{L4MYIq7fL5( zX}Ym8xf_?;5-8~L51xlP$kjT-Dq^6P*in)m^MbkA8WJidzqMr1B*zZwA~&FSa^OKSFwehpM`C-v3^uX%grSL8+J>oS}H1#v>%!Y_h3%8^Q$)`lSLdhbvP zRBqG~*2L#NKG=NSH4WqjZ>8DQ@i*>SU6~ruE}PJn?DTIRH@Ug}CJl*$TnUNVxcnrh zC}1~jhvFOcN92_ zvi4T#rzVL_YccU91#S5%x_Tgmo17lkJZ+`e)~Qkt_StV?r4h^EZ6DEcQT=u_CMMH3 zFhR4rIVNhk?GuDngtw?qC@0wF(VSp3n@lsb_rVCGmaR*m=*y z2(M_+_`H46_7KnMs!oMg!-WD`(PteDj%~{jC7w`*m_Nyw7OwlD0T;-#i>RvN{BKF% z;&(LXgeiG=-n#tk0K2JbFUb?sNR1NTfZ_lJt8iXv&^PyD2}8Ia61c8{p4wyZHGd|B?po?Y`Leqk4%lUlRgxNJU3V zs!b5YPKcYULvtl#e~HO1&K|n_`T8&IzOo>2TQhp4i6yb;*g1EmTApv3ThJ0sp>F^`*SQ2Z&~Jw~>bOk@-(sBtl#9PNLYrv9I;- z!RCgMkGD2scWk0r=Qq#=%@wqTAG(Uu-oeEpQhQK3Z11KL+bJvpXNAq|FV5tQiql)@ zU`ZnU?|h7mjt}~5gic;_vi51pjp@58h^~sYr}Ha6VsGcvp?UDbiaPDb`w!>2$6xI& z_=ZkJG{x}TWoq}dgcTh5dga^jwWYsrR~$FJ{XMWG%mAw*{ z_=Mv+PrukQAtz?;L7Ti#6er!{e%`8;eRQfM`kB%K+HI4n_nByoX zsiANctX{%JW(aq&Jp3{}Th^vs<+8a>!2%@1e`IPPJY`RDzTY+v*gbFgij~r?Kq;od zU5{&^Xo|PI4HLr9gu$OhJSVu)uBEP+W%i43VJIpV4=^(r2(LMgnyOo%xZ# z%ANn(T$Ei+Y!JHcxsrmqp?OS7Xa%zvLTpgx)p@Tl*y5ynl38rp-eUmIflrgXn8!4K zch@jx*U%IWsGq6G&{og#?8qHoO403FLjQQBgw4$6Cl+K%VKk`37qoVY0dtS^xF_Q- z|HLGo>c*Gq)-!d;vncNv*l`APSrhpCK`}f3gSK6PgHFVTaEKLAAG*7vNkU0M)^{m* zP;W1((7ubGyKD-qVmL%_4G%k1C+dJbZ$+WNqPhMc6Teo~6+G?z9$+ILDa_@2Gb|pO ziGe)qC=KsY$IsiU)$+)E2Qaxiu&w$*9oJw3Q52)?m%+M}ih6m2fE6vsJPHRwmA)v`w0h5F3WMg(qxg3I z|IT1C^dN3Z?JRMG;Vcq6#wCd?Q(UTTqBMxJ{JQ7Fezz)V8~fR5x){ivuG~H_j#r;O zV*SLzm37wO=4u;M82Qv7rl45mu4QOYN{D23cX3-cQ}m}j^)?1==!-!|L$eR$$FDwC z5`Ec$Nt`FxNs{w=F_(Yx+lA|P*MQ2HNTY3w1#UiVDR1m|FKuhJfT!s$;b+NuLZ60> z&p~yjdYBXKn&)I=;(q^3S`jDp6_~2w?soJCAAE!Q!ViCH*94rf+TeZyhiWQ49atL* z99Uv(j3*mTJueSJ%{J@#nT=%pCAB z6;$wC%R=7CuTg_hR-gJXC08dwBV%e90nsFhITcqIbB9;&%_lkHo)r|qG84q^M@%iNaF5}~;O2P`w7HuptZpYB_cORr-{RTp2dzMU&({HtJ zEn!=ZdGKJ#<{S(%Hut^1BkbrwmR?2h7O2!^!nog`JOPVXo~1RPWBe(T3tdpk@?+Fi+m%`mkpO_ z@zCgwW{D=OlVzIC-H-u!vGvfYG(HnMiFK536Io4;qbdPKtn+uPC~kaQ)I35vPrhXR zN4-A+@DOHfva89EiT;cPm|enR2Cvh}H#4EdKjK26W(QPnxl0B5RHLfAMevYh@uyG_ zzUDl7!0(yn2fAJ)hkX1Q@|?Yi5xZABq@pBx6bgfB5=3cmA7RVD^jL`*qAN? z;mDDqjcvkBTJTev_MmZfQ*im~_49>1g|23}QwiEZW*+fL;$4*JOg+&Kevu$1=gCtt z8E-c9yg_VUPlBc6j&DJiw`*_kslTbsHPfEvMmh%yZN2t!Xx07AS0p;0b1k?u^FT%k zx4!g8bJ5!3*IulTx2Q1)GKxK@ZSf-gVg>M6_}py^hsqlV4lfT8q0Tp%jo#B9k3Q*L zH7a;A>BUI1EmkzrXP_^=_+<#MRa46)CeIbPoPt^e$MD(x5zazKRU zqMc%(MbhZbXAfxVDxFiu?D`vuB0r*}64y%OTZ>}@(yitvz@fM{aW)w`N5tHzw=9n9 zBI}g7d7Kl^u1D(}+SLy=Z2A+Ivz%WIeXDdjKPx2og&8gj3t3Q6{g?(Hxv}C*vAL%w zop6}$)@T?FrDPH?HMfPm+l2-)ywc_x$N|c!|v(2C=JTBD}-$vwRpeS0Ng(DSCL_} zG_BRLj5iL2CYt|pM$+MzvrQ8B1psirwtr%Z{F=1sKQ1S## z;hL}JRi%G-P9AEy*iEwSb$*%u)_$5i*c#qN0_qxPMRRF{}*^tT=_jfycyidp*;D8L`k3sO3V@&3Rx0wu_3_YdcG1M^?HGq6dV{$4=|u~Xg( zvsmuPS=65g6Ra$r(P!_Umv6LQ&7*ruUCyzZ8jdU#M&w-Mrz%(G=Z{>%$oE7w#*?AM z>WjCwK~%f0@b67t;d762MdGL9YW-ocz2;76Y*mqh-d8to)BM5?Dr)Y#w ze-sTT9sa7M@~eS?vyDCtSBpk=9xKoTmSXs9nMJu0-P0VhTNe#)IOY0{(ynvbD4@hO zx|KuA3*%s^wgxn=f9-!E`G4sT3Bfe?AN>_@A8dWlD=Wiwno>4iD%0qHxnmam{ORdA zb)oe0CzJt06PCOkzgM{@#5<#-_!I|8UoKifH3#bUUnO*ZOBzQYMu9!X!(G z*k$SV4R;;RABjGPSa~Yz5<;IERCmTG4UO(k-XqA^Aw;3FJviQM5<-Z5tBW!)+^ovU zonea(D$?w~Oofz!YD-$F9ey2~c^Q-6X4L`>xCQvXdX~k%xqnZaa{r9{|Cn!?gZQ2K z2)S|qE1ON(wqH*65OnmMnV7*2*P3aHp3`e_<0*bo5A!m6D8VE4cx(y}M~gU$?thNX z;P|X{h5rifETwT9$=7zhj^dT^h=KemOEzH*hv_KCV<@QfJ!mFi%Xo9%pmb5g%7z=Z zQB7!ku9&V3GAy$Y-(erdXfJ$f?92O1+u!!e3dc8YFji57pRy(~B!Q2tb~Je54+k}r z5+7RT2I+xU_{`kv{aLz_XfT+Jn_v)5`!DU$P!Q&YK%A8M-SkZonJRHr<~#8j=CVPE zFBl{T+cVso_Jn)Z;u34L-b-dnY{pIui9;T2Wk4Dqj<%}zL_M7qkRQS&a&P3iPbB%K z(x0G->R3$yUuA7E>3I*e*KeX6-{3ZOs=Z@-9QG}8C(XcPipo+Nl%iy!E1rLx7FL+v z;CDx!U{?He`m4Z`W54xwgk;x6o`}@{M5o{QPDG`%@&_1vw?O>q(ZcA*LsDA0yF=bF z+i?-eCmoF?y2fnLoZDsmLQZu4){Zi?88?4@Su1M5qfVi`rtpxH5RV(c5bEbqE2zPC z$??z8r_v+WrLP1{_?MjK2yLH`|HxAK(&_g|3m|YwOBYHs!j)#;H=9#VvnqA{D%)7M zaovgj(P?d2uOj$*PBnW|hEzbzaa8BUj*I zZUk{WhN?_oN9wFo7RefTd@+q0?;=_48fQoIX$0uq7F*sQ{L|bEWsPTUF`gBgGyHEs zmR!Ru@?KDfbutWVn2CQx8`G$)9Mdcv)2cz#v0f3tD zZ7$FuSl4BB0^}mK)Osb6Q>y3Pjd&ew9Tw4O?v})e^=c|YU9~VhZTxY{IXbNC)&55D z96NX=snE}#5uwg#?6GYYA7CJZvp?lt;`6<0si8vxJ9+!ArBpM~l?6zOExp3~PMr%p<&A;$ zO%h0Lh%!#yH9dD`$=EWQ(O{-Q>X^R$+bxnfmQOh7hDRXXit3a_xkqojxNYywOcUWD zl?FZTV7vuv^fRUkc2YE*aaK1smapP&JZGJ(-mKpzDD@zh(&mX(Flb zzGJd9&A*9lioQ<8Z3!CBst`b&v%^1~oKf(9)i%znyN?QR{eiKmZ$Ik;I(mpqfAEfV zCtIB{?#q7cIrQaoV+zAH+hu zE=X^aGPIO<-?wG7CZXyTpJQB^c12{{)OmnLuySE^|Bu? zHN#rd2TvD*sH3=pRl%(?u`!KCQ{A1fY^2;?z3G6(ptr#Xn+^8LIHLd|R(g3c{2_0{ z>+}kq#d=vtCAnZ>%~J9rdme5h_hXd|r|gC_qxtI&jeQ$k)X{

@TF{KjHXg+@A9D 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

Mk-?6PB*5 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 avHZV3mh=DiSk>R@KmHSc@tVi2eF*@L4~4t{ literal 0 HcmV?d00001 diff --git a/research/t74-low-alias-borrowing/inputs/gauge44.canonical.json.gz b/research/t74-low-alias-borrowing/inputs/gauge44.canonical.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..4abb6e28f02c95b41ed345d4e4401d16d58ae791 GIT binary patch literal 87678 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

@TF{KjHXg+@A9D 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

Mk-?6PB*5 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 Ye}63J|Lw7=zteyGCk8c>a 47 + 1: PR2269 b no longer admissible", + "ok": true, + "rejected_by": "moment.accept" + }, + { + "name": "PR2269 complex_lower + 1e-90 claimed admissible", + "ok": true, + "rejected_by": "moment.accept" + }, + { + "name": "idle with one extra rank-48 child (mass identity)", + "ok": true, + "rejected_by": "compose.mass" + }, + { + "name": "W off by one", + "ok": true, + "rejected_by": "compose.mass" + }, + { + "name": "local mass != 1856 + widths", + "ok": true, + "rejected_by": "local.identity" + }, + { + "name": "48 rank-52 children replace 52 rank-48 children (halving guard 2*52^2 > 73^2)", + "ok": true, + "rejected_by": "compose.halving" + }, + { + "name": "explicit idle with the wrong mass", + "ok": true, + "rejected_by": "compose.mass" + } + ], + "out_of_sample": { + "T74": { + "E": 138198, + "models": { + "C": { + "b": "0.0016962471390584742207696225394800943861", + "fraction_of_realized_gain_over_pre": "1.0000", + "minus_realized": "0" + }, + "C8": { + "b": "0.0016985683481814001130001349768856017636", + "fraction_of_realized_gain_over_pre": "1.1400", + "minus_realized": "928483649170356892204974962202951/400000000000000000000000000000000000000" + }, + "F": { + "b": "0.0017179343748109897999540913070267178655", + "fraction_of_realized_gain_over_pre": "2.3084", + "minus_realized": "108436178762577895922343837733117397/5000000000000000000000000000000000000000" + }, + "P": { + "b": "0.0016536954596193558629070622431148614171", + "fraction_of_realized_gain_over_pre": "-1.5672", + "minus_realized": "-42551679439118357862560296365232969/1000000000000000000000000000000000000000" + } + }, + "predecessor_b": "0.0016796717955047376215420758089648538525", + "realized_b": "0.0016962471390584742207696225394800943861", + "start": "PR2269 pre-borrow (top-level SPEC.json, 480 helpers; stale assembly, 1e-24 endpoint)", + "target": "PR2269 realized (43 high aliases, 437 helpers, window-exact owner fill)" + }, + "T8": { + "E": 19080, + "models": { + "C": { + "b": "0.0016854237962255183965805921001940048938", + "fraction_of_realized_gain_over_pre": "1.0645", + "minus_realized": "5028012014781495956654212580729601/2500000000000000000000000000000000000000" + }, + "C8": { + "b": "0.0016885917759833641906873140760084475527", + "fraction_of_realized_gain_over_pre": "1.1660", + "minus_realized": "51791845637583924893836608467344993/10000000000000000000000000000000000000000" + }, + "F": { + "b": "0.0017130702907503100752557179018212026951", + "fraction_of_realized_gain_over_pre": "1.9505", + "minus_realized": "296576993307042770577874866594896417/10000000000000000000000000000000000000000" + }, + "P": { + "b": "0.0016323380736247241790559234493734262889", + "fraction_of_realized_gain_over_pre": "-0.6368", + "minus_realized": "-102149035589763238284013931576573529/2000000000000000000000000000000000000000" + } + }, + "predecessor_b": "0.0016522089943684118249476894444598958005", + "realized_b": "0.0016834125914196057981979304151617130534", + "start": "PR2260 actual hosted parent R492 (owners/inputs/HOSTED-PARENT.json.gz)", + "target": "PR2260 realized (44 high aliases, 436 helpers, multi-bin repacking)" + } + }, + "pr2260": { + "b_40": "0.0016834125914196057981979304151617130534", + "equals": "PR2260 arithmetic/EXPECTED.json certified_complex_saving 8417/5000000", + "floor_7_root_conservative": "0.0016834", + "floor_7_root_native": "0.0016834" + }, + "pr2269": { + "bisection_steps": 292, + "derived_b": "floor_90(root) - 1e-100 = PR2269 outer/B.json b exactly", + "floor_90_root": "0.001696247139058474220769622539480094386128460370682171660721081525827226194556117859271672" + }, + "pr2269_models_E0": "F, C, C8, P with PR2269 own profiles: E = 0, idle unchanged, b_30 = floor_30(b) for all", + "pr2269_preborrow": { + "equals": "PR2269 SPEC.json / evidence/ASSEMBLY.json complex_lower (stale pre-borrow assembly)", + "floor_24_root": "0.001679671795504737621542" + } + }, + "credits": "PR2226 Cinna Davis / 1337isnot1337 (anticipatory dirty borrowing, 80-alias T8 word); PR2269 Jeremy Kothe / jeremykothe2 (T74 borrow43 words, fill, b); PR2260 Dugongue (T8 44-high supplier, fill); PR2312 (reference claim only); T74 lineage PR1319/PR1297 (Rohan Arun), PR1625 (mdumitrean), pivot-554 kernel; PR547/548/559 moment engines. Evaluator adapted from our own iteration-3 price_check.py (fork commit 4a2f20ea). Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0.", + "demo_t74_proxy": { + "base": "PR2269 realized (43 high aliases, 437 helpers, window-exact owner fill)", + "digits": 40, + "extra_freed_mass": 72594, + "family": "T74", + "helpers": { + "extra": 401, + "gauge44": 401 + }, + "idle_mass": 1302696, + "label": "PROXY: T8 transfer delta (PR2226 80-alias word minus PR2260 44-high word) applied to both PR2269 T74 words; not a constructed word", + "local_mass": { + "extra": 5276, + "gauge44": 5276 + }, + "local_profiles": { + "extra": { + "1": 2297, + "2": 536, + "3": 395, + "4": 112, + "5": 42, + "8": 8 + }, + "gauge44": { + "1": 2309, + "2": 528, + "3": 391, + "4": 116, + "5": 42, + "8": 8 + } + }, + "models": [ + { + "b": "0.0017218366992355269771124747258848462552", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "2.5589560177052756342E-5", + "gain_vs_pr2269_pct": "+1.5086%", + "gain_vs_pr2312": "2.4945631993908977112E-5", + "gain_vs_pr2312_pct": "+1.4701%", + "global_children": 2318340, + "idle": { + "1": 23976, + "18": 1, + "3": 8673, + "48": 25991, + "5": 813, + "7": 150 + }, + "idle_children": 59604, + "max_child": 48, + "model": "F", + "text": "favorable: base idle + all extra mass in rank-48 children (+ one remainder child)" + }, + { + "b": "0.0017103172480541537909827271624895096611", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "1.4070108995679570213E-5", + "gain_vs_pr2269_pct": "+0.8295%", + "gain_vs_pr2312": "1.3426180812535790982E-5", + "gain_vs_pr2312_pct": "+0.7912%", + "global_children": 2335412, + "idle": { + "1": 36592, + "3": 13228, + "48": 25388, + "5": 1240, + "7": 228 + }, + "idle_children": 76676, + "max_child": 48, + "model": "C", + "text": "calibrated on T74 (PR2269 pre-borrow {48:22748} -> PR2269 realized idle split by rank)" + }, + { + "b": "0.0017115683222828929235466373825296556943", + "bisection_steps": 127, + "bit_bound": false, + "gain_vs_pr2269": "1.5321183224418702777E-5", + "gain_vs_pr2269_pct": "+0.9032%", + "gain_vs_pr2312": "1.4677255041274923546E-5", + "gain_vs_pr2312_pct": "+0.8649%", + "global_children": 2327648, + "idle": { + "1": 28543, + "3": 8673, + "39": 19, + "48": 25255, + "5": 4876, + "6": 49, + "7": 1497 + }, + "idle_children": 68912, + "max_child": 48, + "model": "C8", + "text": "sensitivity: calibrated on T8 (R492 hosted parent -> PR2260 realized idle, net top-rank share)" + }, + { + "b": "0.0016873289910183340236296230287693352781", + "bisection_steps": 127, + "bit_bound": false, + "gain_vs_pr2269": "-8.9181480401401971399E-6", + "gain_vs_pr2269_pct": "-0.5258%", + "gain_vs_pr2312": "-9.5620762232839763703E-6", + "gain_vs_pr2312_pct": "-0.5635%", + "global_children": 2389421, + "idle": { + "1": 96570, + "3": 8673, + "48": 24479, + "5": 813, + "7": 150 + }, + "idle_children": 130685, + "max_child": 48, + "model": "P", + "text": "pessimistic: base idle + all extra mass in rank-1 children" + } + ] + }, + "demo_t8_pr2226": { + "base": "PR2260 realized (44 high aliases, 436 helpers, multi-bin repacking)", + "digits": 40, + "extra_freed_mass": 7848, + "family": "T8", + "gain_vs_pr2260_realized": { + "C": "1.3790943116751707048E-5", + "C8": "1.4878227578232000775E-5", + "F": "2.5184297008484224506E-5", + "P": "-8.7839191939722229764E-6" + }, + "helpers": { + "gauge44": 400 + }, + "idle_mass": 140832, + "label": "PR2226 actual 80-alias T8 word priced on PR2260 realized fill (model)", + "local_mass": { + "gauge44": 5276 + }, + "local_profiles": { + "gauge44": { + "1": 2382, + "2": 445, + "3": 406, + "4": 128, + "5": 42, + "8": 8 + } + }, + "models": [ + { + "b": "0.0017085968884280900227042764728291650410", + "bisection_steps": 127, + "bit_bound": false, + "gain_vs_pr2269": "1.2349749369615801934E-5", + "gain_vs_pr2269_pct": "+0.7281%", + "gain_vs_pr2312": "1.1705821186472022704E-5", + "gain_vs_pr2312_pct": "+0.6898%", + "global_children": 251992, + "idle": { + "1": 1724, + "24": 1, + "3": 20, + "32": 11, + "39": 7, + "48": 2656, + "5": 1469, + "6": 18, + "7": 494 + }, + "idle_children": 6400, + "max_child": 48, + "model": "F", + "text": "favorable: base idle + all extra mass in rank-48 children (+ one remainder child)" + }, + { + "b": "0.0016972035345363575052465493608079996758", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "9.5639547788328447692E-7", + "gain_vs_pr2269_pct": "+0.0564%", + "gain_vs_pr2312": "3.1246729473950524654E-7", + "gain_vs_pr2312_pct": "+0.0184%", + "global_children": 253854, + "idle": { + "1": 3106, + "3": 512, + "32": 11, + "39": 7, + "48": 2591, + "5": 1515, + "6": 18, + "7": 502 + }, + "idle_children": 8262, + "max_child": 48, + "model": "C", + "text": "calibrated on T74 (PR2269 pre-borrow {48:22748} -> PR2269 realized idle split by rank)" + }, + { + "b": "0.0016982908189978377989731806688655597489", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "2.0436799393635782035E-6", + "gain_vs_pr2269_pct": "+0.1205%", + "gain_vs_pr2312": "1.3997517562197989731E-6", + "gain_vs_pr2312_pct": "+0.0825%", + "global_children": 253048, + "idle": { + "1": 2270, + "3": 20, + "32": 11, + "39": 9, + "48": 2576, + "5": 1908, + "6": 23, + "7": 639 + }, + "idle_children": 7456, + "max_child": 48, + "model": "C8", + "text": "sensitivity: calibrated on T8 (R492 hosted parent -> PR2260 realized idle, net top-rank share)" + }, + { + "b": "0.0016746286722256335752215090736504007219", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "-2.1618466832840645548E-5", + "gain_vs_pr2269_pct": "-1.2745%", + "gain_vs_pr2312": "-2.2262395015984424778E-5", + "gain_vs_pr2312_pct": "-1.3120%", + "global_children": 259676, + "idle": { + "1": 9572, + "3": 20, + "32": 11, + "39": 7, + "48": 2493, + "5": 1469, + "6": 18, + "7": 494 + }, + "idle_children": 14084, + "max_child": 48, + "model": "P", + "text": "pessimistic: base idle + all extra mass in rank-1 children" + } + ] + }, + "elapsed_s": 6.9, + "model": "1. Composition (as in PR2269 code/assemble.py and PR2260 arithmetic/verify.py):\n H = sum_p calls_p * P_p + idle, T74: 249 P_gauge44 + 417 P_extra + idle, T8: 72 P + idle.\n 2. Mass identity: mass(H) = m W - D is invariant (T74: 73*66304 - 23680 = 4816512; T8: 73*7168 - 2560\n = 520704). Hence idle mass' = (m W - D) - sum_p calls_p mass(P_p'), and the extra freed mass relative\n to the realized base is E = idle mass' - idle mass(base). If helper_width_sum is given, the local\n identity mass(P) = 1856 + sum of helper widths is checked (it holds for PR2269, PR2260, PR2226 and\n the R492 parent).\n 3. Idle-refill models (base = the realized idle of the record being extended; for T74 that is\n PR2269's {1:23976, 3:8673, 5:813, 7:150, 48:24479}). For E >= 0:\n F favorable: base + floor(E/48) children of rank 48 + one child of rank E mod 48 (if nonzero).\n C calibrated: shares s_r derived exactly from a realized (pre, post) idle pair:\n delta_r = r (post_r - pre_r), E_ref = sum_r delta_r, s_48 = delta_48 / E_ref,\n small ranks r < 48 with delta_r > 0 share 1 - s_48 in proportion to delta_r.\n (For T74, pre = {48:22748} = PR2269's pre-borrow idle, every delta_r >= 0 and\n s_r = delta_r / E_ref exactly: s_48 = 83088/138198, s_1 = 23976/138198,\n s_3 = 26019/138198, s_5 = 4065/138198, s_7 = 1050/138198.)\n Allocation: n_r += floor(E s_r / r); the leftover mass (< 64) becomes rank-1\n children (conservative rounding). With E = E_ref on the pre base this reproduces\n the post profile exactly (control).\n C8 sensitivity: same rule calibrated on the T8 transition R492 hosted parent -> PR2260\n (net top-rank share 9792/19080; the parent's small residues were repacked).\n P pessimistic: base + E children of rank 1.\n For E < 0 (supplier heavier than the base): F removes mass from the smallest idle children first,\n P from the rank-48 children first (shrinking the last touched child), C/C8 remove ceil(|E| s_r / r)\n children per rank where present, take any shortfall from the largest children and return any\n over-removed mass as rank-1 children.\n Not modelled: changes of the window/owner geometry, the 76 private cleanup zero buffers per call\n (outside the moment under PR2269's dedicated-family charge), any re-optimised fill.\n 4. Moment (native complex side, no surcharge; the side of PR2269 outer/B.json b and PR2260 b):\n mu(a) = sum_r n_r (r/m)^(1-a) / W; root rho: the unique a > 0 with mu(a) = 1.\n Optional conservative side (--conservative): mu(a) + 32 m N m^a / (10^16 W), N = number of children.\n b_D(H) := floor of rho on the decimal grid 10^-D, certified by mu(b_D) < 1 < mu(b_D + 10^-D).\n PR2269 packages b = b_90 - 10^-100; PR2260 packages b = 8417/5000000 (accepted on both sides).\n 5. Certified evaluation (exact integers on the grid 2^-PREC, directed rounding; iteration-3 evaluator):\n log via atanh series with the remainder bound z^(2N+1)/((2N+1)(1-z^2)); exp by its Taylor series with\n the remainder bound x^N/N! (N+1)/(N+1-x); comparisons with 1 are exact rational comparisons.\n 6. Gains are b_D(model) - reference, an exact rational known to lie within 10^-D below the model's root\n gain. References: PR2269 claimed b (= complex_lower - 1e-100; its outer-ledger kappa differs from b\n by about 2e-100) and the PR2312 claimed kappa 0.001696891067241618 (reference value only, not\n re-derived). The bit endpoint 0.001733427039589844234749 (PR2269 ledger) caps any kappa: a model\n b above it would be bit-bound (flagged, never the case in the demo).", + "prec_bits": 800, + "python": "3.14.4", + "references": { + "bit_lower": "1733427039589844234749/1000000000000000000000000", + "pr2269_b": "0.0016962471390584742207696225394800943861284603706821716607210815258272261945561178592716719999999999", + "pr2312_kappa": "848445533620809/500000000000000000" + }, + "result": "PASS_T74_EXT_PRICE_HARNESS", + "sources": { + "blobs": { + "b479fc55:research/gmx-t74-borrow43/SPEC.json": { + "git_blob": "5158049eeff8240d59528441d3f1fcfd8f420783", + "sha256": "da49a85190eac2b553fe982ed295b15fcde6d2dd449d976b503de25c277f2029" + }, + "b479fc55:research/gmx-t74-borrow43/new/SPEC.json": { + "git_blob": "2431d1cebbb2e155356d2da160d60808498bc33d", + "sha256": "bd091ed9e7f4939d06abb467d0d2c56ce0f34ba800d74132669f7b667e125d2d" + }, + "b479fc55:research/gmx-t74-borrow43/outer/B.json": { + "git_blob": "a66501df3178012477b4c54fb6888e986b52a25e", + "sha256": "631d89563be62a156c2b0119f9d4ba5a31cbf36380768bf8748825cf361bb525" + }, + "dacaf3d8:research/anticipatory-dirty-borrowing/RESULT.json": { + "git_blob": "081e326e91c172a9426245712cb9087997edd1bf", + "sha256": "f03f05fe272e0df991edc81874fe32a417c2571fc082a3e8166890be9e1fc7ec" + }, + "fde6b107:research/selective-borrowing-kappa/arithmetic/EXPECTED.json": { + "git_blob": "e904b407023b13ce6c9b462a00db77c34240cc29", + "sha256": "f7e7548796b8888baea2ede61f95bc383aa32242bf669637fe19fcbe829ad614" + }, + "fde6b107:research/selective-borrowing-kappa/local/data/forward.json": { + "git_blob": "63c20f0bd59d712744b46ebea6b1cd12659c3ef5", + "sha256": "a9d513bc1d85eb11184d73242a4016119f3968bb2a1ff9b365e78109778c17ee" + }, + "fde6b107:research/selective-borrowing-kappa/owners/EXPECTED.json": { + "git_blob": "4997a677bae7528dcfddde9141e0446fb92e4dfa", + "sha256": "c4ad5debab3f3bd5cba68b91e28a6a8fa64febcbeb892b1fd1d27e3977a76cb1" + }, + "fde6b107:research/selective-borrowing-kappa/owners/inputs/HOSTED-PARENT.json.gz": { + "git_blob": "424c2df489364ea5b29e0df9841e6fe91a517df4", + "sha256": "f713f8e66aaeaebb8202fe72bf36c7d23497152497342c27892e0fda3092f95b" + } + }, + "repo": "", + "result": "every hard-coded constant equals the pinned PR blobs" + }, + "tool": "price_ext.py" +} diff --git a/research/t74-low-alias-borrowing/price_ext.ext80.receipt.json b/research/t74-low-alias-borrowing/price_ext.ext80.receipt.json new file mode 100644 index 0000000000..bec19b8e2c --- /dev/null +++ b/research/t74-low-alias-borrowing/price_ext.ext80.receipt.json @@ -0,0 +1,141 @@ +{ + "credits": "PR2226 Cinna Davis / 1337isnot1337 (anticipatory dirty borrowing, 80-alias T8 word); PR2269 Jeremy Kothe / jeremykothe2 (T74 borrow43 words, fill, b); PR2260 Dugongue (T8 44-high supplier, fill); PR2312 (reference claim only); T74 lineage PR1319/PR1297 (Rohan Arun), PR1625 (mdumitrean), pivot-554 kernel; PR547/548/559 moment engines. Evaluator adapted from our own iteration-3 price_check.py (fork commit 4a2f20ea). Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0.", + "elapsed_s": 1.5, + "model": "1. Composition (as in PR2269 code/assemble.py and PR2260 arithmetic/verify.py):\n H = sum_p calls_p * P_p + idle, T74: 249 P_gauge44 + 417 P_extra + idle, T8: 72 P + idle.\n 2. Mass identity: mass(H) = m W - D is invariant (T74: 73*66304 - 23680 = 4816512; T8: 73*7168 - 2560\n = 520704). Hence idle mass' = (m W - D) - sum_p calls_p mass(P_p'), and the extra freed mass relative\n to the realized base is E = idle mass' - idle mass(base). If helper_width_sum is given, the local\n identity mass(P) = 1856 + sum of helper widths is checked (it holds for PR2269, PR2260, PR2226 and\n the R492 parent).\n 3. Idle-refill models (base = the realized idle of the record being extended; for T74 that is\n PR2269's {1:23976, 3:8673, 5:813, 7:150, 48:24479}). For E >= 0:\n F favorable: base + floor(E/48) children of rank 48 + one child of rank E mod 48 (if nonzero).\n C calibrated: shares s_r derived exactly from a realized (pre, post) idle pair:\n delta_r = r (post_r - pre_r), E_ref = sum_r delta_r, s_48 = delta_48 / E_ref,\n small ranks r < 48 with delta_r > 0 share 1 - s_48 in proportion to delta_r.\n (For T74, pre = {48:22748} = PR2269's pre-borrow idle, every delta_r >= 0 and\n s_r = delta_r / E_ref exactly: s_48 = 83088/138198, s_1 = 23976/138198,\n s_3 = 26019/138198, s_5 = 4065/138198, s_7 = 1050/138198.)\n Allocation: n_r += floor(E s_r / r); the leftover mass (< 64) becomes rank-1\n children (conservative rounding). With E = E_ref on the pre base this reproduces\n the post profile exactly (control).\n C8 sensitivity: same rule calibrated on the T8 transition R492 hosted parent -> PR2260\n (net top-rank share 9792/19080; the parent's small residues were repacked).\n P pessimistic: base + E children of rank 1.\n For E < 0 (supplier heavier than the base): F removes mass from the smallest idle children first,\n P from the rank-48 children first (shrinking the last touched child), C/C8 remove ceil(|E| s_r / r)\n children per rank where present, take any shortfall from the largest children and return any\n over-removed mass as rank-1 children.\n Not modelled: changes of the window/owner geometry, the 76 private cleanup zero buffers per call\n (outside the moment under PR2269's dedicated-family charge), any re-optimised fill.\n 4. Moment (native complex side, no surcharge; the side of PR2269 outer/B.json b and PR2260 b):\n mu(a) = sum_r n_r (r/m)^(1-a) / W; root rho: the unique a > 0 with mu(a) = 1.\n Optional conservative side (--conservative): mu(a) + 32 m N m^a / (10^16 W), N = number of children.\n b_D(H) := floor of rho on the decimal grid 10^-D, certified by mu(b_D) < 1 < mu(b_D + 10^-D).\n PR2269 packages b = b_90 - 10^-100; PR2260 packages b = 8417/5000000 (accepted on both sides).\n 5. Certified evaluation (exact integers on the grid 2^-PREC, directed rounding; iteration-3 evaluator):\n log via atanh series with the remainder bound z^(2N+1)/((2N+1)(1-z^2)); exp by its Taylor series with\n the remainder bound x^N/N! (N+1)/(N+1-x); comparisons with 1 are exact rational comparisons.\n 6. Gains are b_D(model) - reference, an exact rational known to lie within 10^-D below the model's root\n gain. References: PR2269 claimed b (= complex_lower - 1e-100; its outer-ledger kappa differs from b\n by about 2e-100) and the PR2312 claimed kappa 0.001696891067241618 (reference value only, not\n re-derived). The bit endpoint 0.001733427039589844234749 (PR2269 ledger) caps any kappa: a model\n b above it would be bit-bound (flagged, never the case in the demo).", + "prec_bits": 800, + "price": { + "base": "PR2269 realized (43 high aliases, 437 helpers, window-exact owner fill)", + "digits": 40, + "extra_freed_mass": 80586, + "family": "T74", + "helpers": { + "extra": 400, + "gauge44": 400 + }, + "idle_mass": 1310688, + "label": "CONSTRUCTED BORROW-WORD-80{base,extra} (48 high + 32 low aliases); local profiles recounted by check_ext.py; idle refill MODELLED (owner fill not rebuilt)", + "local_mass": { + "extra": 5264, + "gauge44": 5264 + }, + "local_profiles": { + "extra": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "gauge44": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + } + }, + "models": [ + { + "b": "0.0017255088890837212072813976419618582057", + "b_conservative": "0.0017255088861992047617724230796997597019", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "2.9261750025246986511E-5", + "gain_vs_pr2269_pct": "+1.7251%", + "gain_vs_pr2312": "2.8617821842103207281E-5", + "gain_vs_pr2312_pct": "+1.6865%", + "global_children": 2311510, + "idle": { + "1": 23976, + "3": 8673, + "42": 1, + "48": 26157, + "5": 813, + "7": 150 + }, + "idle_children": 59770, + "max_child": 48, + "model": "F", + "text": "favorable: base idle + all extra mass in rank-48 children (+ one remainder child)" + }, + { + "b": "0.0017126737497248571464349222053077804286", + "b_conservative": "0.0017126737468384233802906688749666422316", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "1.6426610666382925665E-5", + "gain_vs_pr2269_pct": "+0.9684%", + "gain_vs_pr2312": "1.5782682483239146434E-5", + "gain_vs_pr2312_pct": "+0.9301%", + "global_children": 2330462, + "idle": { + "1": 37980, + "3": 13730, + "48": 25488, + "5": 1287, + "7": 237 + }, + "idle_children": 78722, + "max_child": 48, + "model": "C", + "text": "calibrated on T74 (PR2269 pre-borrow {48:22748} -> PR2269 realized idle split by rank)" + }, + { + "b": "0.0017140567316684824711264204715713101470", + "b_conservative": "0.0017140567287903532610785433539703089262", + "bisection_steps": 126, + "bit_bound": false, + "gain_vs_pr2269": "1.7809592610008250356E-5", + "gain_vs_pr2269_pct": "+1.0499%", + "gain_vs_pr2312": "1.7165664426864471126E-5", + "gain_vs_pr2312_pct": "+1.0116%", + "global_children": 2321863, + "idle": { + "1": 29065, + "3": 8673, + "39": 21, + "48": 25340, + "5": 5324, + "6": 55, + "7": 1645 + }, + "idle_children": 70123, + "max_child": 48, + "model": "C8", + "text": "sensitivity: calibrated on T8 (R492 hosted parent -> PR2260 realized idle, net top-rank share)" + }, + { + "b": "0.0016871233700042746562989725665814138063", + "b_conservative": "0.0016871233670879834795804369952323227555", + "bisection_steps": 127, + "bit_bound": false, + "gain_vs_pr2269": "-9.1237690541995644706E-6", + "gain_vs_pr2269_pct": "-0.5379%", + "gain_vs_pr2312": "-9.7676972373433437010E-6", + "gain_vs_pr2312_pct": "-0.5756%", + "global_children": 2390417, + "idle": { + "1": 104562, + "3": 8673, + "48": 24479, + "5": 813, + "7": 150 + }, + "idle_children": 138677, + "max_child": 48, + "model": "P", + "text": "pessimistic: base idle + all extra mass in rank-1 children" + } + ] + }, + "python": "3.14.4", + "references": { + "bit_lower": "1733427039589844234749/1000000000000000000000000", + "pr2269_b": "0.0016962471390584742207696225394800943861284603706821716607210815258272261945561178592716719999999999", + "pr2312_kappa": "848445533620809/500000000000000000" + }, + "result": "PASS_T74_EXT_PRICE_HARNESS", + "tool": "price_ext.py" +} diff --git a/research/t74-low-alias-borrowing/price_ext.py b/research/t74-low-alias-borrowing/price_ext.py new file mode 100644 index 0000000000..59ef458967 --- /dev/null +++ b/research/t74-low-alias-borrowing/price_ext.py @@ -0,0 +1,961 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Pricing harness for an extended T74 (or T8) complex supplier under explicit idle-refill models. + +Question it answers: if the two T74 pivot-566+554 borrow words of PR2269 (gauge44 and extra) are +replaced by extended words P_gauge44', P_extra' (for example with PR2226-style LOW / anticipatory +aliases added), what complex saving b does the native moment certify, given that the owner fill +(and hence the idle remainder profile) has NOT been rebuilt? The idle profile is therefore modelled, +not constructed. Every number printed for a model is a MODEL PRICE, not a certified supplier and +not a kappa claim. Only the positive controls price realized (constructed) profiles. + +Credit: PR2226 (Cinna Davis / 1337isnot1337, with OpenAI Codex) for anticipatory dirty borrowing and +the 80-alias (48 high + 32 low) T8 word whose profile defines the demo delta; PR2269 (Jeremy Kothe / +jeremykothe2) for the T74 borrow43 words, fill, profile and the claimed b; PR2260 (Dugongue) for the +T8 44-high selective-borrowing supplier, its fill and profile; PR2312 for the current top open claim +used as a reference value only; the T74 lineage (PR1319/PR1297 Rohan Arun, PR1625 mdumitrean, +pivot-554 kernel) and the retained PR547/PR548/PR559 moment engines. The certified evaluator is +adapted from our own iteration-3 checker (fork commit 4a2f20ea339e30348448096ca789d0efe55df9bb, +research/t74-borrow43-independent-check/price_check.py, Apache-2.0, same authors). No PR code is +imported or run; PR constants are written here and can be re-checked against the pinned PR blobs +with the `sources` subcommand. + +Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0. + +Usage (Python 3.10+, standard library only): + python3 -I -B price_ext.py controls [--out] positive/negative controls (exact reproduction) + python3 -I -B price_ext.py price INPUT.json [--digits D] [--out] + python3 -I -B price_ext.py demo [--digits D] [--out] T8-transferred delta proxy on both T74 words + python3 -I -B price_ext.py sources [--repo PATH] re-read every hard-coded PR constant from git + python3 -I -B price_ext.py all [--out] sources + controls + demo + +INPUT.json (see demo-t8-delta-proxy.json): + {"family": "T74" | "T8", "label": "...", + "providers": {"gauge44": {"profile": {"1": n1, ...}, "helpers": h, "helper_width_sum": w}, "extra": {...}}} + or, instead of explicit profiles, "delta": {"1": d1, ...} (applied to every base word) or + "delta": {"gauge44": {...}, "extra": {...}}; "helpers" may then be given per provider or once. + Optional "idle": {...}: an explicitly constructed idle profile, priced as model X (no modelling). + +MODEL (stated precisely; also written to receipts). + 1. Composition (as in PR2269 code/assemble.py and PR2260 arithmetic/verify.py): + H = sum_p calls_p * P_p + idle, T74: 249 P_gauge44 + 417 P_extra + idle, T8: 72 P + idle. + 2. Mass identity: mass(H) = m W - D is invariant (T74: 73*66304 - 23680 = 4816512; T8: 73*7168 - 2560 + = 520704). Hence idle mass' = (m W - D) - sum_p calls_p mass(P_p'), and the extra freed mass relative + to the realized base is E = idle mass' - idle mass(base). If helper_width_sum is given, the local + identity mass(P) = 1856 + sum of helper widths is checked (it holds for PR2269, PR2260, PR2226 and + the R492 parent). + 3. Idle-refill models (base = the realized idle of the record being extended; for T74 that is + PR2269's {1:23976, 3:8673, 5:813, 7:150, 48:24479}). For E >= 0: + F favorable: base + floor(E/48) children of rank 48 + one child of rank E mod 48 (if nonzero). + C calibrated: shares s_r derived exactly from a realized (pre, post) idle pair: + delta_r = r (post_r - pre_r), E_ref = sum_r delta_r, s_48 = delta_48 / E_ref, + small ranks r < 48 with delta_r > 0 share 1 - s_48 in proportion to delta_r. + (For T74, pre = {48:22748} = PR2269's pre-borrow idle, every delta_r >= 0 and + s_r = delta_r / E_ref exactly: s_48 = 83088/138198, s_1 = 23976/138198, + s_3 = 26019/138198, s_5 = 4065/138198, s_7 = 1050/138198.) + Allocation: n_r += floor(E s_r / r); the leftover mass (< 64) becomes rank-1 + children (conservative rounding). With E = E_ref on the pre base this reproduces + the post profile exactly (control). + C8 sensitivity: same rule calibrated on the T8 transition R492 hosted parent -> PR2260 + (net top-rank share 9792/19080; the parent's small residues were repacked). + P pessimistic: base + E children of rank 1. + For E < 0 (supplier heavier than the base): F removes mass from the smallest idle children first, + P from the rank-48 children first (shrinking the last touched child), C/C8 remove ceil(|E| s_r / r) + children per rank where present, take any shortfall from the largest children and return any + over-removed mass as rank-1 children. + Not modelled: changes of the window/owner geometry, the 76 private cleanup zero buffers per call + (outside the moment under PR2269's dedicated-family charge), any re-optimised fill. + 4. Moment (native complex side, no surcharge; the side of PR2269 outer/B.json b and PR2260 b): + mu(a) = sum_r n_r (r/m)^(1-a) / W; root rho: the unique a > 0 with mu(a) = 1. + Optional conservative side (--conservative): mu(a) + 32 m N m^a / (10^16 W), N = number of children. + b_D(H) := floor of rho on the decimal grid 10^-D, certified by mu(b_D) < 1 < mu(b_D + 10^-D). + PR2269 packages b = b_90 - 10^-100; PR2260 packages b = 8417/5000000 (accepted on both sides). + 5. Certified evaluation (exact integers on the grid 2^-PREC, directed rounding; iteration-3 evaluator): + log via atanh series with the remainder bound z^(2N+1)/((2N+1)(1-z^2)); exp by its Taylor series with + the remainder bound x^N/N! (N+1)/(N+1-x); comparisons with 1 are exact rational comparisons. + 6. Gains are b_D(model) - reference, an exact rational known to lie within 10^-D below the model's root + gain. References: PR2269 claimed b (= complex_lower - 1e-100; its outer-ledger kappa differs from b + by about 2e-100) and the PR2312 claimed kappa 0.001696891067241618 (reference value only, not + re-derived). The bit endpoint 0.001733427039589844234749 (PR2269 ledger) caps any kappa: a model + b above it would be bit-bound (flagged, never the case in the demo). +""" + +import sys + +if sys.flags.optimize: + sys.stdout.write('refusing to run under python -O\n') + sys.exit(2) + +import argparse +import gzip +import hashlib +import json +import os +import subprocess +import time +from fractions import Fraction + +HERE = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_REPO = os.path.dirname(os.path.dirname(HERE)) +PASS_LINE = 'PASS_T74_EXT_PRICE_HARNESS' +FAIL_LINE = 'FAIL_T74_EXT_PRICE_HARNESS' +CREDITS = ('PR2226 Cinna Davis / 1337isnot1337 (anticipatory dirty borrowing, 80-alias T8 word); PR2269 ' + 'Jeremy Kothe / jeremykothe2 (T74 borrow43 words, fill, b); PR2260 Dugongue (T8 44-high supplier, fill); ' + 'PR2312 (reference claim only); T74 lineage PR1319/PR1297 (Rohan Arun), PR1625 (mdumitrean), pivot-554 ' + 'kernel; PR547/548/559 moment engines. Evaluator adapted from our own iteration-3 price_check.py ' + '(fork commit 4a2f20ea). Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0.') + + +class HarnessError(Exception): + def __init__(self, check, msg): + Exception.__init__(self, '[%s] %s' % (check, msg)) + self.check = check + self.msg = msg + + +def need(cond, check, msg): + if not cond: + raise HarnessError(check, msg) + + +# ---------------------------------------------------------------------------- +# PR constants (written from the PR packages; `sources` re-reads every one of them from git) +# ---------------------------------------------------------------------------- + +PR2269_COMMIT = 'b479fc5567bc09ab9185bffe89b62594f36d74e5' +PR2269_PKG = 'research/gmx-t74-borrow43/' +PR2260_COMMIT = 'fde6b107e26a14da5bac5b66913c914708ea6901' +PR2260_PKG = 'research/selective-borrowing-kappa/' +PR2226_COMMIT = 'dacaf3d81f1936bb55b8454b1244e5d014272754' +PR2226_PKG = 'research/anticipatory-dirty-borrowing/' + +B_2269 = Fraction('16962471390584742207696225394800943861284603706821716607210815258272261945561178592716719999999999/' + '1' + '0' * 100) +COMPLEX_LOWER_2269 = Fraction('212030892382309277596202817435011798266057546335271457590135190728403274319514732408959/' + '125' + '0' * 87) +KAPPA_2312 = Fraction('0.001696891067241618') +BIT_LOWER = Fraction('1733427039589844234749/1' + '0' * 24) + +FAMILIES = { + 'T74': dict( + name='T74', source='PR2269 head %s, %s' % (PR2269_COMMIT[:8], PR2269_PKG), + m=73, W=66304, deficit=23680, calls={'gauge44': 249, 'extra': 417}, fixed_per_call=1856, top=48, + base=dict(label='PR2269 realized (43 high aliases, 437 helpers, window-exact owner fill)', + local={'gauge44': {1: 2351, 2: 501, 3: 414, 4: 129, 5: 42, 8: 8}, + 'extra': {1: 2339, 2: 509, 3: 418, 4: 125, 5: 42, 8: 8}}, + helpers={'gauge44': 437, 'extra': 437}, width_sum={'gauge44': 3529, 'extra': 3529}, + idle={1: 23976, 3: 8673, 5: 813, 7: 150, 48: 24479}), + pre=dict(label='PR2269 pre-borrow (top-level SPEC.json, 480 helpers; stale assembly, 1e-24 endpoint)', + local={'gauge44': {1: 2346, 2: 504, 3: 414, 4: 130, 5: 82, 8: 8}, + 'extra': {1: 2338, 2: 512, 3: 418, 4: 126, 5: 82, 8: 8}}, + helpers={'gauge44': 480, 'extra': 480}, width_sum={'gauge44': 3734, 'extra': 3738}, + idle={48: 22748}, + complex_lower=Fraction('839835897752368810771/5' + '0' * 23), grid=24), + claim=dict(b=B_2269, complex_lower=COMPLEX_LOWER_2269, grid=90, + global_profile={1: 1584738, 2: 337002, 3: 286065, 4: 84246, 5: 28785, 7: 150, 8: 5328, + 48: 24479})), + 'T8': dict( + name='T8', source='PR2260 head %s, %s' % (PR2260_COMMIT[:8], PR2260_PKG), + m=73, W=7168, deficit=2560, calls={'gauge44': 72}, fixed_per_call=1856, top=48, + base=dict(label='PR2260 realized (44 high aliases, 436 helpers, multi-bin repacking)', + local={'gauge44': {1: 2424, 2: 418, 3: 429, 4: 141, 5: 42, 8: 8}}, + helpers={'gauge44': 436}, width_sum={'gauge44': 3529}, + idle={1: 1724, 3: 20, 5: 1469, 6: 18, 7: 494, 32: 11, 39: 7, 48: 2493}), + pre=dict(label='PR2260 actual hosted parent R492 (owners/inputs/HOSTED-PARENT.json.gz)', + local={'gauge44': {1: 2514, 2: 404, 3: 448, 4: 160, 5: 56, 8: 8}}, + helpers={'gauge44': 492}, width_sum={'gauge44': 3794}, + idle={1: 85, 2: 76, 3: 173, 7: 7, 8: 6, 12: 13, 16: 33, 19: 1, 20: 2, 28: 4, 32: 62, 36: 1, + 40: 1, 44: 6, 48: 2289}), + claim=dict(b=Fraction(8417, 5000000), grid=7, + global_profile={1: 176252, 2: 30096, 3: 30908, 4: 10152, 5: 4493, 6: 18, 7: 494, 8: 576, + 32: 11, 39: 7, 48: 2493})), +} + +# PR2226 (T8, 80 aliases = 48 high + 32 low, 400 helpers): RESULT.json replay.local_profile +PR2226_LOCAL = {1: 2382, 2: 445, 3: 406, 4: 128, 5: 42, 8: 8} +PR2226_HELPERS = 400 +# T8 transfer delta = PR2226 - PR2260 local profile (both on the selected T8 word) +T8_DELTA = {1: -42, 2: 27, 3: -23, 4: -13} + +CALIBRATIONS = {'C': 'T74', 'C8': 'T8'} # model name -> family whose (pre -> base) idle transition calibrates it +MODEL_ORDER = ['F', 'C', 'C8', 'P'] +MODEL_TEXT = { + 'F': 'favorable: base idle + all extra mass in rank-48 children (+ one remainder child)', + 'C': 'calibrated on T74 (PR2269 pre-borrow {48:22748} -> PR2269 realized idle split by rank)', + 'C8': 'sensitivity: calibrated on T8 (R492 hosted parent -> PR2260 realized idle, net top-rank share)', + 'P': 'pessimistic: base idle + all extra mass in rank-1 children', + 'X': 'explicit idle profile supplied by the input (constructed fill, no modelling)', +} + + +# ---------------------------------------------------------------------------- +# Profiles +# ---------------------------------------------------------------------------- + +def clean(prof): + return dict((r, prof[r]) for r in sorted(prof) if prof[r]) + + +def plain(prof): + return dict((str(r), prof[r]) for r in sorted(prof) if prof[r]) + + +def mass_of(prof): + return sum(r * n for r, n in prof.items()) + + +def int_profile(mapping, what, allow_negative=False): + out = {} + need(isinstance(mapping, dict), 'input', what + ': profile must be a JSON object') + for k, v in mapping.items(): + need(str(int(k)) == str(k).strip() and int(k) > 0, 'input', '%s: bad rank %r' % (what, k)) + need(type(v) is int and (allow_negative or v >= 0), 'input', '%s: bad count %r for rank %s' % (what, v, k)) + out[int(k)] = out.get(int(k), 0) + v + return out + + +def add_profiles(*terms): + out = {} + for coef, prof in terms: + for r, n in prof.items(): + out[r] = out.get(r, 0) + coef * n + return clean(out) + + +def compose(fam, local, idle): + terms = [(fam['calls'][p], local[p]) for p in sorted(fam['calls'])] + return add_profiles(*(terms + [(1, idle)])) + + +def total_mass(fam): + return fam['m'] * fam['W'] - fam['deficit'] + + +def check_global(fam, H, what): + m = fam['m'] + need(all(type(r) is int and 0 < r < m and type(n) is int and n > 0 for r, n in H.items()), 'compose', + what + ': every child must have 0 < rank < m and positive count') + need(mass_of(H) == total_mass(fam), 'compose.mass', '%s: mass %d != m W - D = %d' % ( + what, mass_of(H), total_mass(fam))) + need(m * m > 2 * max(H) ** 2, 'compose.halving', what + ': halving guard m^2 > 2 maxchild^2 fails') + + +# ---------------------------------------------------------------------------- +# Idle-refill models +# ---------------------------------------------------------------------------- + +def calibration_shares(pre, post, top): + """Exact rank shares of the freed mass realized between two idle profiles (rule in MODEL 3).""" + ranks = sorted(set(pre) | set(post)) + delta = dict((r, r * (post.get(r, 0) - pre.get(r, 0))) for r in ranks) + e_ref = sum(delta.values()) + need(e_ref > 0, 'calibration', 'calibration pair frees no mass') + need(all(delta[r] == 0 for r in ranks if r > top), 'calibration', 'idle child above the top rank') + s_top = Fraction(delta.get(top, 0), e_ref) + pos = dict((r, delta[r]) for r in ranks if r < top and delta[r] > 0) + tot = sum(pos.values()) + shares = {top: s_top} + for r, d in pos.items(): + shares[r] = (1 - s_top) * Fraction(d, tot) + need(sum(shares.values()) == 1 and all(s >= 0 for s in shares.values()), 'calibration', 'shares do not sum to 1') + exact = all(delta[r] >= 0 for r in ranks) + return dict(shares=clean(shares), E_ref=e_ref, delta_mass=clean(delta), all_increments_nonnegative=exact, + top_share=s_top) + + +def remove_mass(idle, amount, ascending): + """Remove `amount` mass from idle children, smallest (ascending) or largest ranks first.""" + out = dict(idle) + left = amount + for r in sorted(out, reverse=not ascending): + while left > 0 and out.get(r, 0) > 0: + out[r] -= 1 + if r <= left: + left -= r + else: + out[r - left] = out.get(r - left, 0) + 1 + left = 0 + if left == 0: + break + need(left == 0, 'model', 'not enough idle mass to absorb a heavier supplier') + return clean(out) + + +def model_idle(name, base_idle, E, top, shares=None): + idle = dict(base_idle) + if name == 'F': + if E >= 0: + q, rem = divmod(E, top) + idle[top] = idle.get(top, 0) + q + if rem: + idle[rem] = idle.get(rem, 0) + 1 + return clean(idle) + return remove_mass(idle, -E, ascending=True) + if name == 'P': + if E >= 0: + idle[1] = idle.get(1, 0) + E + return clean(idle) + return remove_mass(idle, -E, ascending=False) + if name in ('C', 'C8'): + need(shares is not None, 'model', 'calibrated model without shares') + if E >= 0: + placed = 0 + for r, s in shares.items(): + t = E * s / r + k = t.numerator // t.denominator # place at most E s_r in rank r + idle[r] = idle.get(r, 0) + k + placed += r * k + leftover = E - placed + need(0 <= leftover, 'model', 'calibrated allocation overshoots') + idle[1] = idle.get(1, 0) + leftover # rounding remainder -> rank 1 (conservative) + return clean(idle) + removed = 0 + for r, s in shares.items(): # remove at least |E| s_r per rank where present + t = -E * s / r + k = min(-(-t.numerator // t.denominator), idle.get(r, 0)) + idle[r] = idle.get(r, 0) - k + removed += r * k + if removed < -E: # shortfall (rank absent in the base): top ranks first + return remove_mass(clean(idle), -E - removed, ascending=False) + idle[1] = idle.get(1, 0) + (removed + E) # over-removed mass returned as rank-1 children + return clean(idle) + raise HarnessError('model', 'unknown model ' + name) + + +# ---------------------------------------------------------------------------- +# Certified rational enclosures (adapted from our iteration-3 price_check.py) +# ---------------------------------------------------------------------------- + +PREC = 800 +ONE = 1 << PREC +MAX_TERMS = 4 * PREC + + +def cdiv(a, b): + return -((-a) // b) + + +def atanh_enclosure(p, q, terms=None, tail=True): + """Integers (lo, hi) with lo <= 2^PREC atanh(p/q) <= hi, for 0 <= p/q <= 1/3 (positive series + remainder).""" + need(q > 0 and 0 <= 3 * p <= q, 'evaluator', 'atanh argument outside [0, 1/3]') + if p == 0: + return 0, 0 + p2, q2 = p * p, q * q + pl, pu = (ONE * p) // q, cdiv(ONE * p, q) + sl = su = 0 + j = 0 + while (pl > 0) if terms is None else (j < terms): + need(j < MAX_TERMS, 'evaluator', 'atanh series did not terminate') + sl += pl // (2 * j + 1) + su += cdiv(pu, 2 * j + 1) + pl = (pl * p2) // q2 + pu = cdiv(pu * p2, q2) + j += 1 + if tail: + su += cdiv(pu * q2, (2 * j + 1) * (q2 - p2)) + return sl, su + + +_LOG2 = [] + + +def log2_enclosure(): + if not _LOG2: + lo, hi = atanh_enclosure(1, 3) + _LOG2.append((2 * lo, 2 * hi)) + return _LOG2[0] + + +def log_enclosure(p, q): + """Integers (lo, hi) enclosing 2^PREC log(p/q) for p/q >= 1.""" + need(p >= q > 0, 'evaluator', 'log argument below 1') + k = (p // q).bit_length() - 1 + a, b = p, q << k + zl, zu = atanh_enclosure(a - b, a + b) + l2l, l2u = log2_enclosure() + return k * l2l + 2 * zl, k * l2u + 2 * zu + + +def exp_enclosure(xl, xu, terms=None, tail=True): + """Integers (lo, hi) with lo <= 2^PREC exp(x) <= hi on [xl, xu] / 2^PREC, 0 <= xl <= xu < 2^PREC.""" + need(0 <= xl <= xu < ONE, 'evaluator', 'exp argument outside [0, 1)') + t = s = ONE + j = 1 + while (t > 0) if terms is None else (j < terms): + need(j < MAX_TERMS, 'evaluator', 'exp series did not terminate') + t = ((t * xl) >> PREC) // j + s += t + j += 1 + lo = s + t = s = ONE + j = 1 + while True: + need(j < MAX_TERMS, 'evaluator', 'exp series did not terminate') + t = cdiv(cdiv(t * xu, ONE), j) + if (t <= 1) if terms is None else (j >= terms): + break + s += t + j += 1 + if tail: + s += cdiv(t * (j + 1) * ONE, (j + 1) * ONE - xu) + return lo, s + + +_LOGS = {} + + +def log_m_over_r(m, r): + key = (m, r) + if key not in _LOGS: + _LOGS[key] = log_enclosure(m, r) + return _LOGS[key] + + +class Moment(object): + """Certified enclosures of mu(a) for one global profile.""" + + def __init__(self, H, m, W, surcharge=False): + need(all(type(r) is int and 0 < r < m and type(n) is int and n > 0 for r, n in H.items()), 'moment', + 'every child must have 0 < rank < m') + self.H, self.m, self.W, self.surcharge = dict(H), m, W, surcharge + self.N = sum(H.values()) + + def bounds(self, a): + a = Fraction(a) + need(a >= 0, 'moment', 'negative saving') + an, ad = a.numerator, a.denominator + slo = shi = 0 + for r in sorted(self.H): + ll, lu = log_m_over_r(self.m, r) + el, eu = exp_enclosure((an * ll) // ad, cdiv(an * lu, ad)) + slo += self.H[r] * r * el + shi += self.H[r] * r * eu + lo = Fraction(slo, self.m * self.W * ONE) + hi = Fraction(shi, self.m * self.W * ONE) + if self.surcharge: + ll, lu = log_m_over_r(self.m, 1) + el, eu = exp_enclosure((an * ll) // ad, cdiv(an * lu, ad)) + c = 32 * self.m * self.N + lo += Fraction(c * el, 10 ** 16 * self.W * ONE) + hi += Fraction(c * eu, 10 ** 16 * self.W * ONE) + need(lo <= hi, 'evaluator', 'empty enclosure') + return lo, hi + + def side(self, a): + lo, hi = self.bounds(a) + if hi < 1: + return -1 + if lo > 1: + return 1 + return 0 + + def floor_root(self, digits, hint=None): + """(b_D, steps): b_D on the grid 10^-digits with mu(b_D) < 1 < mu(b_D + 10^-digits), both certified. + A hint (any rational) only narrows the starting bracket after it is itself certified.""" + scale = 10 ** digits + lo, hi = 0, scale // 100 + need(self.side(Fraction(lo, scale)) < 0, 'moment', 'mu(0) >= 1: no positive saving') + need(self.side(Fraction(hi, scale)) > 0, 'moment', 'mu(1/100) <= 1') + steps = 0 + if hint is not None: + for w in (10 ** max(0, digits - 12), 10 ** max(0, digits - 6)): + c = int(Fraction(hint) * scale) + a, b = max(lo, c - w), min(hi, c + w) + if a < b and self.side(Fraction(a, scale)) < 0 and self.side(Fraction(b, scale)) > 0: + lo, hi = a, b + steps += 2 + break + while hi - lo > 1: + mid = (lo + hi) // 2 + s = self.side(Fraction(mid, scale)) + steps += 1 + need(s != 0, 'moment.bracket', 'undecided at 10^-%d grid point (raise PREC)' % digits) + if s < 0: + lo = mid + else: + hi = mid + return Fraction(lo, scale), steps + + +def require_side(ev, a, want, what): + lo, hi = ev.bounds(a) + if want < 0: + need(hi < 1, 'moment.accept', '%s: mu(a) < 1 not certified' % what) + else: + need(lo > 1, 'moment.reject', '%s: mu(a) > 1 not certified' % what) + return lo, hi + + +# ---------------------------------------------------------------------------- +# Display (display only) +# ---------------------------------------------------------------------------- + +def sci(x, sig=20): + x = Fraction(x) + if x == 0: + return '0' + neg = x < 0 + ax = -x if neg else x + e = len(str(ax.numerator)) - len(str(ax.denominator)) + while ax < Fraction(10) ** e: + e -= 1 + while ax >= Fraction(10) ** (e + 1): + e += 1 + y = ax * Fraction(10) ** (sig - 1 - e) + k = y.numerator // y.denominator + ds = str(k) + e += len(ds) - sig + return '%s%s.%sE%+d' % ('-' if neg else '', ds[0], ds[1:sig], e) + + +def dec(x, digits): + y = Fraction(x) * 10 ** digits + need(y.denominator == 1, 'display', 'not on the decimal grid') + n = y.numerator + s = str(abs(n)).rjust(digits + 1, '0') + return ('-' if n < 0 else '') + s[:-digits] + '.' + s[-digits:] + + +def pct(x, ref): + return '%+.4f%%' % float(100 * Fraction(x) / ref) + + +# ---------------------------------------------------------------------------- +# Pricing +# ---------------------------------------------------------------------------- + +def base_check(fam): + for state in ('base', 'pre'): + st = fam[state] + H = compose(fam, st['local'], st['idle']) + check_global(fam, H, '%s %s' % (fam['name'], state)) + for p in fam['calls']: + need(mass_of(st['local'][p]) == fam['fixed_per_call'] + st['width_sum'][p], 'local.identity', + '%s %s %s: local mass != 1856 + helper widths' % (fam['name'], state, p)) + need(compose(fam, fam['base']['local'], fam['base']['idle']) == fam['claim']['global_profile'], 'compose', + fam['name'] + ': base composition differs from the claimed global profile') + + +def all_shares(): + out = {} + for model, fname in CALIBRATIONS.items(): + f = FAMILIES[fname] + out[model] = calibration_shares(f['pre']['idle'], f['base']['idle'], f['top']) + return out + + +def resolve_input(spec): + """Normalise an input spec to (family, local profiles, helpers, width sums, explicit idle, label).""" + fname = spec.get('family', 'T74') + need(fname in FAMILIES, 'input', 'family must be T74 or T8') + fam = FAMILIES[fname] + base = fam['base'] + local, helpers, widths = {}, {}, {} + if 'delta' in spec: + d = spec['delta'] + per = dict((p, int_profile(d[p], 'delta ' + p, True)) for p in fam['calls']) if all( + p in d for p in fam['calls']) else dict((p, int_profile(d, 'delta', True)) for p in fam['calls']) + for p in fam['calls']: + local[p] = add_profiles((1, base['local'][p]), (1, per[p])) + need(all(n >= 0 for n in local[p].values()), 'input', 'delta makes a count negative for ' + p) + hp = spec.get('helpers') + for p in fam['calls']: + helpers[p] = hp.get(p) if isinstance(hp, dict) else hp + else: + prov = spec.get('providers', {}) + need(set(prov) == set(fam['calls']), 'input', 'providers must be exactly %s' % sorted(fam['calls'])) + for p in fam['calls']: + local[p] = clean(int_profile(prov[p]['profile'], 'profile ' + p)) + helpers[p] = prov[p].get('helpers') + if 'helper_width_sum' in prov[p]: + widths[p] = prov[p]['helper_width_sum'] + for p in fam['calls']: + need(all(0 < r < fam['m'] for r in local[p]), 'input', 'local rank outside (0, m) for ' + p) + if p in widths: + need(mass_of(local[p]) == fam['fixed_per_call'] + widths[p], 'local.identity', + '%s: local mass %d != %d + helper widths %d' % (p, mass_of(local[p]), fam['fixed_per_call'], widths[p])) + idle = clean(int_profile(spec['idle'], 'idle')) if 'idle' in spec else None + return fam, local, helpers, widths, idle, spec.get('label', '(unlabelled)') + + +def price_profiles(fam, local, digits, models=None, base=None, explicit_idle=None, conservative=False, + shares=None, hint=None): + """Price new local profiles on `base` (default: the family's realized base) under each model.""" + base = fam['base'] if base is None else base + models = MODEL_ORDER if models is None else models + shares = all_shares() if shares is None else shares + local_mass = sum(fam['calls'][p] * mass_of(local[p]) for p in fam['calls']) + idle_mass = total_mass(fam) - local_mass + need(idle_mass >= 0, 'compose.mass', 'local words pay more than m W - D') + E = idle_mass - mass_of(base['idle']) + rows = [] + todo = [(mn, None) for mn in models] + if explicit_idle is not None: + need(mass_of(explicit_idle) == idle_mass, 'compose.mass', 'explicit idle mass %d != required %d' % ( + mass_of(explicit_idle), idle_mass)) + todo.append(('X', explicit_idle)) + for mn, given in todo: + idle = given if given is not None else model_idle(mn, base['idle'], E, fam['top'], + shares[mn]['shares'] if mn in shares else None) + H = compose(fam, local, idle) + check_global(fam, H, '%s model %s' % (fam['name'], mn)) + ev = Moment(H, fam['m'], fam['W']) + b, steps = ev.floor_root(digits, hint) + row = dict(model=mn, text=MODEL_TEXT[mn], idle=plain(idle), idle_children=sum(idle.values()), + global_children=sum(H.values()), max_child=max(H), b=dec(b, digits), b_rational=b, + bisection_steps=steps, bit_bound=b >= BIT_LOWER) + if conservative: + cb, _ = Moment(H, fam['m'], fam['W'], surcharge=True).floor_root(digits, hint) + row['b_conservative'] = dec(cb, digits) + rows.append(row) + return dict(local_mass_total=local_mass, idle_mass=idle_mass, extra_freed_mass=E, rows=rows, + base_label=base['label']) + + +def gain_lines(rows, digits): + out = [] + for row in rows: + b = row['b_rational'] + g69, g12 = b - B_2269, b - KAPPA_2312 + row['gain_vs_pr2269'] = sci(g69) + row['gain_vs_pr2269_pct'] = pct(g69, B_2269) + row['gain_vs_pr2312'] = sci(g12) + row['gain_vs_pr2312_pct'] = pct(g12, KAPPA_2312) + out.append(' %-2s b_%d = %s gain vs #2269 %s (%s) vs #2312 %s (%s)%s' % ( + row['model'], digits, row['b'][:2 + min(digits, 24)] + ('...' if digits > 24 else ''), + sci(g69, 8), row['gain_vs_pr2269_pct'], sci(g12, 8), + row['gain_vs_pr2312_pct'], ' [BIT-BOUND]' if row['bit_bound'] else '')) + return out + + +def strip(rows): + return [dict((k, v) for k, v in r.items() if k != 'b_rational') for r in rows] + + +# ---------------------------------------------------------------------------- +# Subcommands +# ---------------------------------------------------------------------------- + +def git_blob(repo, commit, path): + got = subprocess.run(['git', '-C', repo, 'show', '%s:%s' % (commit, path)], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + need(got.returncode == 0, 'sources', 'cannot read %s:%s in %s' % (commit[:8], path, repo)) + data = got.stdout + h = hashlib.sha1(b'blob %d\0' % len(data)) + h.update(data) + return data, h.hexdigest() + + +def run_sources(repo, receipt): + """Re-read every hard-coded PR constant from the pinned PR commits.""" + rec = {} + + def load(commit, pkg, rel, gz=False): + data, blob = git_blob(repo, commit, pkg + rel) + rec['%s:%s%s' % (commit[:8], pkg, rel)] = dict(git_blob=blob, sha256=hashlib.sha256(data).hexdigest()) + return json.loads(gzip.decompress(data) if gz else data) + + def ip(x): + return clean(dict((int(k), v) for k, v in x.items())) + + T74, T8 = FAMILIES['T74'], FAMILIES['T8'] + spec = load(PR2269_COMMIT, PR2269_PKG, 'new/SPEC.json') + Bj = load(PR2269_COMMIT, PR2269_PKG, 'outer/B.json') + top = load(PR2269_COMMIT, PR2269_PKG, 'SPEC.json') + X = spec['expected'] + need(Fraction(Bj['b']) == B_2269 and Fraction(X['complex_lower']) == COMPLEX_LOWER_2269, 'sources', 'PR2269 b') + need(ip(Bj['profile']) == T74['claim']['global_profile'] == ip(X['global_profile']), 'sources', 'PR2269 profile') + need(ip(X['idle_remainder_profile']) == T74['base']['idle'], 'sources', 'PR2269 idle') + need(X['provider_counts'] == T74['calls'] and X['rank_mass'] == total_mass(T74) and X['live'] == T74['W'] == + Bj['live'] and spec['geometry']['dimension'] == T74['m'], 'sources', 'PR2269 geometry') + for p in T74['calls']: + cc = spec['providers'][p]['complete_contract'] + need(ip(spec['providers'][p]['expected_profile']) == T74['base']['local'][p] == ip(cc['paid_profile']), + 'sources', 'PR2269 local ' + p) + need(cc['helpers'] == T74['base']['helpers'][p] and sum(cc['widths']) == T74['base']['width_sum'][p], + 'sources', 'PR2269 helpers ' + p) + TX = top['expected'] + need(ip(TX['idle_remainder_profile']) == T74['pre']['idle'] and Fraction(TX['complex_lower']) == + T74['pre']['complex_lower'], 'sources', 'PR2269 pre-borrow idle / endpoint') + for p in T74['calls']: + need(ip(top['providers'][p]['expected_profile']) == T74['pre']['local'][p] and + top['providers'][p]['complete_contract']['helpers'] == 480 and + sum(top['providers'][p]['complete_contract']['widths']) == T74['pre']['width_sum'][p], 'sources', + 'PR2269 pre-borrow local ' + p) + ar = load(PR2260_COMMIT, PR2260_PKG, 'arithmetic/EXPECTED.json') + ow = load(PR2260_COMMIT, PR2260_PKG, 'owners/EXPECTED.json') + fw = load(PR2260_COMMIT, PR2260_PKG, 'local/data/forward.json') + hp = load(PR2260_COMMIT, PR2260_PKG, 'owners/inputs/HOSTED-PARENT.json.gz', gz=True) + need(Fraction(ar['certified_complex_saving']) == T8['claim']['b'], 'sources', 'PR2260 b') + need(ip(ar['profile']) == T8['claim']['global_profile'] == ip(ow['profile']), 'sources', 'PR2260 profile') + need(ip(ow['idle']) == T8['base']['idle'], 'sources', 'PR2260 idle') + need(ar['calls'] == T8['calls']['gauge44'] and ar['live'] == T8['W'] and ar['rank_mass'] == total_mass(T8) and + ar['deficit'] == T8['deficit'] and ar['helpers_per_call'] == T8['base']['helpers']['gauge44'], + 'sources', 'PR2260 geometry') + need(ip(fw['local_profile']) == T8['base']['local']['gauge44'] and len(fw['helper_widths']) == 436 and + sum(fw['helper_widths'].values()) == T8['base']['width_sum']['gauge44'], 'sources', 'PR2260 local') + g = hp['local_providers']['gauge44'] + pidle = {} + for c in hp['idle_children']: + pidle[c['rank']] = pidle.get(c['rank'], 0) + c.get('replicas', 1) + need(clean(pidle) == T8['pre']['idle'], 'sources', 'R492 parent idle') + for o in ('forward', 'backward'): + need(ip(g['local_program_checks'][o]['paid_profile']) == T8['pre']['local']['gauge44'], 'sources', + 'R492 parent local ' + o) + need(int(g['R']) == len(g['widths']) == 492 and sum(g['widths']) == T8['pre']['width_sum']['gauge44'] and + hp['live'] == T8['W'] and hp['m'] == T8['m'], 'sources', 'R492 parent helpers') + res = load(PR2226_COMMIT, PR2226_PKG, 'RESULT.json') + need(ip(res['replay']['local_profile']) == PR2226_LOCAL and res['replay']['local_mass'] == mass_of(PR2226_LOCAL) + and res['audit']['aliases'] == 80 and res['audit']['low_aliases'] == 32, 'sources', 'PR2226 local') + need(add_profiles((1, PR2226_LOCAL), (-1, T8['base']['local']['gauge44'])) == T8_DELTA, 'sources', 'T8 delta') + receipt['sources'] = dict(repo='', blobs=rec, result='every hard-coded constant equals the pinned PR blobs') + print('sources: %d PR blobs read at pinned commits; all hard-coded constants agree' % len(rec), flush=True) + + +def run_controls(receipt, digits_model=40): + t0 = time.time() + res = {} + # evaluator self-tests (from iteration 3) + l2 = log2_enclosure() + a1, a2, a3 = atanh_enclosure(1, 26), atanh_enclosure(1, 4801), atanh_enclosure(1, 8749) + l2b = (18 * a1[0] - 2 * a2[1] + 8 * a3[0], 18 * a1[1] - 2 * a2[0] + 8 * a3[1]) + need(max(l2[0], l2b[0]) <= min(l2[1], l2b[1]), 'evaluator', 'two log 2 enclosures are disjoint') + e2 = exp_enclosure(l2[0], l2[1]) + need(e2[0] <= 2 * ONE <= e2[1], 'evaluator', 'exp(log 2) misses 2') + bad = tuple(2 * v for v in atanh_enclosure(1, 3, terms=10, tail=False)) + need(not max(bad[0], l2b[0]) <= min(bad[1], l2b[1]), 'evaluator', 'truncated log 2 without remainder not caught') + res['evaluator'] = 'log2 two formulas overlap; exp(log 2) encloses 2; truncation without remainder is caught' + for fname in ('T74', 'T8'): + base_check(FAMILIES[fname]) + res['compositions'] = ('T74: 249 P_g + 417 P_e + idle = PR2269 B.json profile; T8: 72 P + idle = PR2260 ' + 'EXPECTED profile; pre states (PR2269 pre-borrow, R492 parent) have mass m W - D; ' + 'local mass = 1856 + helper widths in all four states') + print('controls: evaluator self-tests and exact compositions PASS', flush=True) + + # (1) PR2269 claimed b reproduced exactly: b = floor_90(root) - 1e-100 + T74 = FAMILIES['T74'] + H = compose(T74, T74['base']['local'], T74['base']['idle']) + ev = Moment(H, T74['m'], T74['W']) + b90, steps = ev.floor_root(90) + need(b90 == COMPLEX_LOWER_2269, 'control.pr2269', 'floor_90(root) %s != PR2269 complex_lower' % dec(b90, 90)) + need(b90 - Fraction(1, 10 ** 100) == B_2269, 'control.pr2269', 'derived b != PR2269 b') + require_side(ev, B_2269, -1, 'PR2269 b') + require_side(ev, B_2269 + Fraction(1, 10 ** 15), 1, 'PR2269 b + 1e-15') + res['pr2269'] = dict(floor_90_root=dec(b90, 90), derived_b='floor_90(root) - 1e-100 = PR2269 outer/B.json b ' + 'exactly', bisection_steps=steps) + print('control PR2269: floor_1e-90(root) = complex_lower, so b = %s... reproduced exactly (%d steps)' % ( + dec(B_2269, 100)[:40], steps), flush=True) + # every model with the base profiles has E = 0 and returns the realized idle + for mn in MODEL_ORDER: + idle = model_idle(mn, T74['base']['idle'], 0, 48, all_shares()[mn]['shares'] if mn in CALIBRATIONS else None) + need(idle == T74['base']['idle'], 'control.models', 'model %s changes the idle at E = 0' % mn) + pr = price_profiles(T74, T74['base']['local'], 30) + need(all(r['b_rational'] == Fraction((COMPLEX_LOWER_2269 * 10 ** 30).__floor__(), 10 ** 30) for r in pr['rows']), + 'control.models', 'models with PR2269 own profiles do not reproduce its b') + res['pr2269_models_E0'] = 'F, C, C8, P with PR2269 own profiles: E = 0, idle unchanged, b_30 = floor_30(b) for all' + print('control PR2269 via the CLI path: E = 0 for F/C/C8/P and b_30 = %s for all' % pr['rows'][0]['b'], flush=True) + + # (2) PR2269 pre-borrow stale assembly endpoint (1e-24 grid) + Hpre = compose(T74, T74['pre']['local'], T74['pre']['idle']) + bpre, _ = Moment(Hpre, T74['m'], T74['W']).floor_root(24) + need(bpre == T74['pre']['complex_lower'], 'control.preborrow', 'pre-borrow 1e-24 endpoint not reproduced') + res['pr2269_preborrow'] = dict(floor_24_root=dec(bpre, 24), equals='PR2269 SPEC.json / evidence/ASSEMBLY.json ' + 'complex_lower (stale pre-borrow assembly)') + print('control PR2269 pre-borrow: floor_1e-24(root) = %s = stale ASSEMBLY complex_lower' % dec(bpre, 24), flush=True) + + # (3) PR2260 b = 0.0016834 = floor_7(root), native and conservative + T8 = FAMILIES['T8'] + H8 = compose(T8, T8['base']['local'], T8['base']['idle']) + ev8 = Moment(H8, T8['m'], T8['W']) + ev8c = Moment(H8, T8['m'], T8['W'], surcharge=True) + b7, _ = ev8.floor_root(7) + b7c, _ = ev8c.floor_root(7) + need(b7 == T8['claim']['b'] == b7c, 'control.pr2260', 'floor_7(root) %s / conservative %s != 0.0016834' % ( + dec(b7, 7), dec(b7c, 7))) + r8, _ = ev8.floor_root(40) + res['pr2260'] = dict(floor_7_root_native=dec(b7, 7), floor_7_root_conservative=dec(b7c, 7), + b_40=dec(r8, 40), equals='PR2260 arithmetic/EXPECTED.json certified_complex_saving 8417/5000000') + print('control PR2260: floor_1e-7(root) = %s (native and conservative) = claimed b; b_40 = %s' % ( + dec(b7, 7), dec(r8, 40)), flush=True) + + # (4) calibrated model in-sample identity: PR2269 pre-borrow base + PR2269 local -> PR2269 idle exactly + sh = all_shares() + need(sh['C']['all_increments_nonnegative'], 'control.calibration', 'T74 split has a negative increment') + E_t74 = total_mass(T74) - sum(T74['calls'][p] * mass_of(T74['base']['local'][p]) for p in T74['calls']) - \ + mass_of(T74['pre']['idle']) + need(E_t74 == sh['C']['E_ref'] == 138198, 'control.calibration', 'E_ref') + idle_c = model_idle('C', T74['pre']['idle'], E_t74, 48, sh['C']['shares']) + need(idle_c == T74['base']['idle'], 'control.calibration', 'C does not reproduce PR2269 idle in-sample') + res['calibration'] = dict( + C=dict(E_ref=sh['C']['E_ref'], shares=dict((str(r), str(s)) for r, s in sh['C']['shares'].items()), + top_share=float(sh['C']['top_share']), + in_sample='PR2269 pre-borrow idle {48:22748} + E_ref under C = PR2269 realized idle exactly'), + C8=dict(E_ref=sh['C8']['E_ref'], shares=dict((str(r), str(s)) for r, s in sh['C8']['shares'].items()), + top_share=float(sh['C8']['top_share']), delta_mass=plain(sh['C8']['delta_mass']), + note='R492 parent residues (ranks 2..44) were repacked away; net top-rank share kept')) + print('control calibration: T74 shares s48=%s (%.4f), C reproduces PR2269 idle in-sample exactly; T8 top share ' + '%s (%.4f)' % (sh['C']['top_share'], float(sh['C']['top_share']), sh['C8']['top_share'], + float(sh['C8']['top_share'])), flush=True) + + # (5) out-of-sample model check: predict each realized record from its own predecessor + oos = {} + for fname in ('T74', 'T8'): + fam = FAMILIES[fname] + pr = price_profiles(fam, fam['base']['local'], digits_model, base=fam['pre']) + Hr = compose(fam, fam['base']['local'], fam['base']['idle']) + rb, _ = Moment(Hr, fam['m'], fam['W']).floor_root(digits_model) + rows = {} + for row in pr['rows']: + rows[row['model']] = dict(b=row['b'], minus_realized=str(row['b_rational'] - rb), + fraction_of_realized_gain_over_pre=None) + pre_b, _ = Moment(compose(fam, fam['pre']['local'], fam['pre']['idle']), fam['m'], fam['W']).floor_root( + digits_model) + for row in pr['rows']: + rows[row['model']]['fraction_of_realized_gain_over_pre'] = '%.4f' % float( + (row['b_rational'] - pre_b) / (rb - pre_b)) + oos[fname] = dict(start=fam['pre']['label'], target=fam['base']['label'], E=pr['extra_freed_mass'], + realized_b=dec(rb, digits_model), predecessor_b=dec(pre_b, digits_model), models=rows) + print('out-of-sample %s (%s -> realized, E=%d): realized b %s' % ( + fname, fam['pre']['label'].split(' (')[0], pr['extra_freed_mass'], dec(rb, digits_model)[:24]), flush=True) + for mn in MODEL_ORDER: + print(' %-2s model b %s (model - realized %s; share of realized gain %s)' % ( + mn, rows[mn]['b'][:24], sci(Fraction(rows[mn]['minus_realized']), 6), rows[mn]['fraction_of_realized_gain_over_pre']), + flush=True) + res['out_of_sample'] = oos + + # (6) negative controls + neg = [] + + def expect(name, target, fn): + try: + fn() + except HarnessError as e: + neg.append(dict(name=name, rejected_by=e.check, ok=e.check == target)) + return + neg.append(dict(name=name, rejected_by=None, ok=False)) + + split = dict(H) + split[48] -= 1 + split[47] = 1 + split[1] += 1 + expect('one idle 48 -> 47 + 1: PR2269 b no longer admissible', 'moment.accept', + lambda: require_side(Moment(clean(split), 73, 66304), B_2269, -1, 'split')) + expect('PR2269 complex_lower + 1e-90 claimed admissible', 'moment.accept', + lambda: require_side(ev, COMPLEX_LOWER_2269 + Fraction(1, 10 ** 90), -1, 'endpoint + 1e-90')) + bad_idle = dict(T74['base']['idle']) + bad_idle[48] += 1 + expect('idle with one extra rank-48 child (mass identity)', 'compose.mass', + lambda: check_global(T74, compose(T74, T74['base']['local'], bad_idle), 'tampered')) + expect('W off by one', 'compose.mass', lambda: check_global(dict(T74, W=66305), H, 'W+1')) + expect('local mass != 1856 + widths', 'local.identity', + lambda: resolve_input({'family': 'T74', 'providers': { + 'gauge44': {'profile': plain(T74['base']['local']['gauge44']), 'helper_width_sum': 3528}, + 'extra': {'profile': plain(T74['base']['local']['extra'])}}})) + expect('48 rank-52 children replace 52 rank-48 children (halving guard 2*52^2 > 73^2)', 'compose.halving', + lambda: check_global(T74, add_profiles((1, H), (1, {52: 48}), (-1, {48: 52})), 'rank52')) + expect('explicit idle with the wrong mass', 'compose.mass', + lambda: price_profiles(T74, T74['base']['local'], 8, models=[], explicit_idle={48: 1})) + ok = all(x['ok'] for x in neg) + res['negative_controls'] = neg + print('negative controls: %d/%d rejected by their targeted checks' % (sum(x['ok'] for x in neg), len(neg)), + flush=True) + need(ok, 'controls', 'a negative control was not rejected by its target: %r' % neg) + res['elapsed_s'] = round(time.time() - t0, 1) + receipt['controls'] = res + + +def report_price(spec, digits, conservative, receipt, key): + fam, local, helpers, widths, idle, label = resolve_input(spec) + pr = price_profiles(fam, local, digits, explicit_idle=idle, conservative=conservative) + print('%s [%s]: %s' % (key, fam['name'], label), flush=True) + for p in sorted(fam['calls']): + print(' %s x%d: profile %s mass %d helpers %s' % (p, fam['calls'][p], plain(local[p]), mass_of(local[p]), + helpers.get(p)), flush=True) + print(' idle mass %d, extra freed mass vs %s: E = %d' % (pr['idle_mass'], pr['base_label'].split(' (')[0], + pr['extra_freed_mass']), flush=True) + lines = gain_lines(pr['rows'], digits) + for ln in lines: + print(ln, flush=True) + if fam['name'] == 'T8': + print(' (T8 gains are printed against the T74 references only for orientation; compare with the T8 base ' + 'b instead)', flush=True) + receipt[key] = dict(family=fam['name'], label=label, local_profiles=dict((p, plain(local[p])) for p in local), + local_mass=dict((p, mass_of(local[p])) for p in local), helpers=helpers, + idle_mass=pr['idle_mass'], extra_freed_mass=pr['extra_freed_mass'], digits=digits, + base=pr['base_label'], models=strip(pr['rows'])) + return pr + + +def demo_spec(): + return {'family': 'T74', 'label': 'PROXY: T8 transfer delta (PR2226 80-alias word minus PR2260 44-high word) ' + 'applied to both PR2269 T74 words; not a constructed word', + 'delta': plain(T8_DELTA), 'helpers': {'gauge44': 401, 'extra': 401}} + + +def run_demo(digits, conservative, receipt): + spec = demo_spec() + with open(os.path.join(HERE, 'demo-t8-delta-proxy.json'), 'w') as fh: + json.dump(spec, fh, indent=1, sort_keys=True) + fh.write('\n') + report_price(spec, digits, conservative, receipt, 'demo_t74_proxy') + # T8 analogue: PR2226's actual word on PR2260's realized fill (same models; still a model price) + t8 = {'family': 'T8', 'label': 'PR2226 actual 80-alias T8 word priced on PR2260 realized fill (model)', + 'providers': {'gauge44': {'profile': plain(PR2226_LOCAL), 'helpers': PR2226_HELPERS, + 'helper_width_sum': mass_of(PR2226_LOCAL) - 1856}}} + pr = report_price(t8, digits, conservative, receipt, 'demo_t8_pr2226') + T8 = FAMILIES['T8'] + b8, _ = Moment(compose(T8, T8['base']['local'], T8['base']['idle']), 73, 7168).floor_root(digits) + for row in pr['rows']: + row_t8 = '%s (%s)' % (sci(row['b_rational'] - b8, 8), pct(row['b_rational'] - b8, b8)) + print(' %-2s T8 gain over PR2260 realized b: %s' % (row['model'], row_t8), flush=True) + receipt['demo_t8_pr2226']['gain_vs_pr2260_realized'] = dict( + (row['model'], sci(row['b_rational'] - b8)) for row in pr['rows']) + + +def main(): + ap = argparse.ArgumentParser(description='Extended T74/T8 supplier pricing under explicit idle-refill models') + ap.add_argument('cmd', choices=['controls', 'price', 'demo', 'sources', 'all']) + ap.add_argument('input', nargs='?', help='profiles JSON for `price`') + ap.add_argument('--digits', type=int, default=40, help='decimal grid 10^-D for model prices (default 40)') + ap.add_argument('--conservative', action='store_true', help='also price the surcharge (conservative) side') + ap.add_argument('--repo', default=DEFAULT_REPO, help='git checkout holding the pinned PR commits (sources)') + ap.add_argument('--out', nargs='?', const='', default=None, + help='write a JSON receipt next to this script (default price_ext..receipt.json)') + args = ap.parse_args() + need(8 <= args.digits <= 200, 'input', '--digits must be in [8, 200]') + receipt = dict(tool='price_ext.py', python=sys.version.split()[0], prec_bits=PREC, credits=CREDITS, + model=__doc__.split('MODEL (stated precisely; also written to receipts).')[1].strip(), + references=dict(pr2269_b=dec(B_2269, 100), pr2312_kappa=str(KAPPA_2312), bit_lower=str(BIT_LOWER))) + t0 = time.time() + ok = True + try: + if args.cmd in ('sources', 'all'): + run_sources(args.repo, receipt) + if args.cmd in ('controls', 'all'): + run_controls(receipt) + if args.cmd in ('demo', 'all'): + run_demo(args.digits, args.conservative, receipt) + if args.cmd == 'price': + need(args.input is not None, 'input', 'price needs an INPUT.json') + with open(args.input) as fh: + spec = json.load(fh) + report_price(spec, args.digits, args.conservative, receipt, 'price') + except HarnessError as e: + ok = False + receipt['failure'] = str(e) + print('FAILED: %s' % e, flush=True) + receipt['result'] = PASS_LINE if ok else FAIL_LINE + receipt['elapsed_s'] = round(time.time() - t0, 1) + if args.out is not None: + path = args.out or os.path.join(HERE, 'price_ext.%s.receipt.json' % args.cmd) + with open(path, 'w') as fh: + json.dump(receipt, fh, indent=1, sort_keys=True, default=str) + fh.write('\n') + print('receipt written: %s' % path) + print('elapsed %.1f s' % (time.time() - t0)) + print(PASS_LINE if ok else FAIL_LINE) + return 0 if ok else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/research/t74-low-alias-borrowing/receipts/AUDIT-80base.json b/research/t74-low-alias-borrowing/receipts/AUDIT-80base.json new file mode 100644 index 0000000000..fc16634cfd --- /dev/null +++ b/research/t74-low-alias-borrowing/receipts/AUDIT-80base.json @@ -0,0 +1,43 @@ +{ + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD", + "input_file": "BORROW-WORD-80base.json.gz", + "content_sha256": "16d864123e3357ed02ff4c96f2eddef31eeb41b8b56becd1720533b0b517a4ce", + "compressed_sha256": "61290abffd8c8225e0abb3958c1506674e256de688fc4cdf358bbe7c981df493", + "v": 112, + "h": 9, + "R": 480, + "removed_helpers": 80, + "independent_inputs": 624, + "warps": 80, + "corrections": 64, + "restored_cold": 44, + "zero_buffers": 44, + "entering": 112, + "local_profile": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "local_mass": 5264, + "width_inventory": { + "4": 4, + "5": 4, + "7": 36, + "8": 84, + "9": 272 + }, + "orientations": { + "forward": "PASS", + "dual": "PASS" + }, + "base": { + "base_sha256": "65c6d17ffee2eacf27bff438f37fc549c9ed0c909cbc7a52976cc75cf2d15b91", + "sections_match_minus_removed": true + }, + "checked_columns": 624, + "elapsed_seconds": 0.8755109640005685, + "scope": "Exact free-operator-algebra replay (every remaining input is an independent column): K_G warps with G invertible, G(from)=to, symplectic form fixing L_0/L_FULL and sending L_from to L_to (rank 0), literal frame chain with warps, relaxed fixed initial compensation, derived inverse-reverse cleanup at FULL with inverse warps and private zero buffers. No Clifford phase/Gaussian product, no owner admission, no repricing." +} diff --git a/research/t74-low-alias-borrowing/receipts/AUDIT-80extra.json b/research/t74-low-alias-borrowing/receipts/AUDIT-80extra.json new file mode 100644 index 0000000000..b1b0c4d69e --- /dev/null +++ b/research/t74-low-alias-borrowing/receipts/AUDIT-80extra.json @@ -0,0 +1,43 @@ +{ + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD", + "input_file": "BORROW-WORD-80extra.json.gz", + "content_sha256": "a77502a685a6b8bb4b5d36803f3369aaabf9b9d199f86e91e6109c3298e7cf72", + "compressed_sha256": "1dd2d6f2ae5b5a27b5f89fb830203f0cca7a78d0323a7845e85e1e80f8f6d1a5", + "v": 112, + "h": 9, + "R": 480, + "removed_helpers": 80, + "independent_inputs": 624, + "warps": 80, + "corrections": 64, + "restored_cold": 44, + "zero_buffers": 44, + "entering": 112, + "local_profile": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "local_mass": 5264, + "width_inventory": { + "4": 4, + "5": 4, + "7": 36, + "8": 84, + "9": 272 + }, + "orientations": { + "forward": "PASS", + "dual": "PASS" + }, + "base": { + "base_sha256": "d7e48dcbafa236a2e1e41f7958244211506f7c7630fe6a2d43d2bdf17b7ae015", + "sections_match_minus_removed": true + }, + "checked_columns": 624, + "elapsed_seconds": 0.8318211419973522, + "scope": "Exact free-operator-algebra replay (every remaining input is an independent column): K_G warps with G invertible, G(from)=to, symplectic form fixing L_0/L_FULL and sending L_from to L_to (rank 0), literal frame chain with warps, relaxed fixed initial compensation, derived inverse-reverse cleanup at FULL with inverse warps and private zero buffers. No Clifford phase/Gaussian product, no owner admission, no repricing." +} diff --git a/research/t74-low-alias-borrowing/receipts/BUILD.json b/research/t74-low-alias-borrowing/receipts/BUILD.json new file mode 100644 index 0000000000..795b11a7f5 --- /dev/null +++ b/research/t74-low-alias-borrowing/receipts/BUILD.json @@ -0,0 +1,1674 @@ +{ + "pins_git_blob": { + "PR2226-WITNESS.json": "62edbcce166f7cf388231078c2cd7f75939b97e2", + "blocks.json": "c683574b3861678081fd5c5944dbd7a47309f6fd", + "extra.canonical.json.gz": "e0d670d4351229ce6921ecfbecf180070b17616b", + "gauge44.canonical.json.gz": "4abb6e28f02c95b41ed345d4e4401d16d58ae791", + "witness_43_base.json": "9f4b93f3bc52d4f4ffaa128cfd7ae574fd36c462", + "witness_43_extra.json": "864ba533f50c2f1f639a6a3559b185bd321b923a" + }, + "seconds": 48.6, + "status": "PASS_T74_LOW_ALIAS_EXTENSION", + "words": { + "extra": { + "base_43": { + "helpers": 437, + "local_mass": 5385, + "local_profile": { + "1": 2339, + "2": 509, + "3": 418, + "4": 125, + "5": 42, + "8": 8 + } + }, + "controls_rc": 0, + "ext80": { + "controls": "omitted compensation and one flipped sign rejected", + "helpers": 400, + "independent_input_columns": 624, + "initial_corrections": 64, + "local_mass": 5264, + "local_profile": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "low": 32, + "pairs": 80, + "zero_FULL_cleanup_buffers": 44 + }, + "high5": { + "controls": "n/a", + "helpers": 432, + "independent_input_columns": 656, + "initial_corrections": 0, + "local_mass": 5360, + "local_profile": { + "1": 2339, + "2": 509, + "3": 418, + "4": 125, + "5": 37, + "8": 8 + }, + "low": 0, + "pairs": 48, + "zero_FULL_cleanup_buffers": 76 + }, + "independent_audit": { + "corrections": 64, + "independent_inputs": 624, + "local_mass": 5264, + "local_profile": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "orientations": { + "dual": "PASS", + "forward": "PASS" + }, + "removed_helpers": 80, + "restored_cold": 44, + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD", + "warps": 80, + "width_inventory": { + "4": 4, + "5": 4, + "7": 36, + "8": 84, + "9": 272 + } + }, + "low32": { + "controls": "omitted compensation and one flipped sign rejected", + "helpers": 405, + "independent_input_columns": 629, + "initial_corrections": 64, + "local_mass": 5289, + "local_profile": { + "1": 2287, + "2": 535, + "3": 386, + "4": 125, + "5": 42, + "8": 8 + }, + "low": 32, + "pairs": 75, + "zero_FULL_cleanup_buffers": 44 + }, + "low_candidates": { + "592": { + "deleted_prefix_indices": [ + 56, + 57, + 58, + 59 + ], + "early_prefix_rewrites": {}, + "lender": 298, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "593": { + "deleted_prefix_indices": [ + 60, + 61, + 62, + 63 + ], + "early_prefix_rewrites": {}, + "lender": 291, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "594": { + "deleted_prefix_indices": [ + 64, + 65, + 66, + 67 + ], + "early_prefix_rewrites": {}, + "lender": 289, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "596": { + "deleted_prefix_indices": [ + 68, + 69, + 70, + 71 + ], + "early_prefix_rewrites": {}, + "lender": 314, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "600": { + "deleted_prefix_indices": [ + 72, + 73, + 74, + 75 + ], + "early_prefix_rewrites": {}, + "lender": 305, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "601": { + "deleted_prefix_indices": [ + 76, + 77, + 78, + 79 + ], + "early_prefix_rewrites": {}, + "lender": 325, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "602": { + "deleted_prefix_indices": [ + 80, + 81, + 82, + 83 + ], + "early_prefix_rewrites": {}, + "lender": 330, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "604": { + "deleted_prefix_indices": [ + 84, + 85, + 86, + 87 + ], + "early_prefix_rewrites": {}, + "lender": 323, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "608": { + "deleted_prefix_indices": [ + 88, + 89, + 90, + 91 + ], + "early_prefix_rewrites": {}, + "lender": 346, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "609": { + "deleted_prefix_indices": [ + 92, + 93, + 94, + 95 + ], + "early_prefix_rewrites": {}, + "lender": 339, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "610": { + "deleted_prefix_indices": [ + 96, + 97, + 98, + 99 + ], + "early_prefix_rewrites": {}, + "lender": 337, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "612": { + "deleted_prefix_indices": [ + 100, + 101, + 102, + 103 + ], + "early_prefix_rewrites": {}, + "lender": 362, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "624": { + "deleted_prefix_indices": [ + 122, + 123, + 124, + 125 + ], + "early_prefix_rewrites": {}, + "lender": 378, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "625": { + "deleted_prefix_indices": [ + 126, + 127, + 128, + 129 + ], + "early_prefix_rewrites": {}, + "lender": 371, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "626": { + "deleted_prefix_indices": [ + 130, + 131, + 132, + 133 + ], + "early_prefix_rewrites": {}, + "lender": 369, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "628": { + "deleted_prefix_indices": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141 + ], + "early_prefix_rewrites": { + "136": [ + [ + "add", + 214, + 566, + -1, + 1, + 3 + ] + ], + "140": [ + [ + "add", + 151, + 567, + 1, + 1, + 3 + ] + ] + }, + "lender": 394, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "632": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 142, + 143, + 144, + 145 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "633": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 146, + 147, + 148, + 149 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "634": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 150, + 151, + 152, + 153 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "636": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "640": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 162, + 163, + 164, + 165 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "641": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "642": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 174, + 175, + 176, + 177 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "644": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 178, + 179, + 180, + 181 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "648": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 182, + 183, + 184, + 185 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "649": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 186, + 187, + 188, + 189 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "650": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 190, + 191, + 192, + 193 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "652": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 194, + 195, + 196, + 197 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "656": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 198, + 199, + 200, + 201 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "657": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 202, + 203, + 204, + 205 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "658": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 206, + 207, + 208, + 209 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "660": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 210, + 211, + 212, + 213 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "672": { + "deleted_prefix_indices": [ + 6, + 230, + 231, + 232, + 233, + 234 + ], + "early_prefix_rewrites": { + "230": [ + [ + "add", + 117, + 566, + 1, + 1, + 3 + ] + ], + "231": [ + [ + "add", + 181, + 566, + -1, + 1, + 3 + ] + ] + }, + "lender": 385, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "673": { + "deleted_prefix_indices": [ + 235, + 236, + 237, + 238 + ], + "early_prefix_rewrites": {}, + "lender": 387, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "674": { + "deleted_prefix_indices": [ + 239, + 240, + 241, + 242 + ], + "early_prefix_rewrites": {}, + "lender": 389, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "676": { + "deleted_prefix_indices": [ + 243, + 244, + 245, + 246, + 247, + 248 + ], + "early_prefix_rewrites": { + "245": [ + [ + "add", + 181, + 566, + 1, + 1, + 3 + ] + ] + }, + "lender": 373, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "680": { + "deleted_prefix_indices": [ + 249, + 250, + 251, + 252 + ], + "early_prefix_rewrites": {}, + "lender": 353, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "681": { + "deleted_prefix_indices": [ + 253, + 254, + 255, + 256 + ], + "early_prefix_rewrites": {}, + "lender": 355, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "682": { + "deleted_prefix_indices": [ + 257, + 258, + 259, + 260 + ], + "early_prefix_rewrites": {}, + "lender": 357, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "684": { + "deleted_prefix_indices": [ + 261, + 262, + 263, + 264 + ], + "early_prefix_rewrites": {}, + "lender": 341, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "688": { + "deleted_prefix_indices": [ + 265, + 266, + 267, + 268 + ], + "early_prefix_rewrites": {}, + "lender": 321, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "689": { + "deleted_prefix_indices": [ + 269, + 270, + 271, + 272 + ], + "early_prefix_rewrites": {}, + "lender": 277, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "690": { + "deleted_prefix_indices": [ + 273, + 274, + 275, + 276 + ], + "early_prefix_rewrites": {}, + "lender": 282, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "692": { + "deleted_prefix_indices": [ + 277, + 278, + 279, + 280 + ], + "early_prefix_rewrites": {}, + "lender": 307, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "696": { + "deleted_prefix_indices": [ + 281, + 282, + 283, + 284 + ], + "early_prefix_rewrites": {}, + "lender": 275, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "697": { + "deleted_prefix_indices": [ + 285, + 286, + 287, + 288 + ], + "early_prefix_rewrites": {}, + "lender": 273, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "698": { + "deleted_prefix_indices": [ + 289, + 290, + 291, + 292 + ], + "early_prefix_rewrites": {}, + "lender": 309, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "700": { + "deleted_prefix_indices": [ + 293, + 294, + 295, + 296 + ], + "early_prefix_rewrites": {}, + "lender": 293, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + } + }, + "low_lender_pool": [ + 273, + 275, + 277, + 282, + 289, + 291, + 293, + 298, + 305, + 307, + 309, + 314, + 321, + 323, + 325, + 330, + 337, + 339, + 341, + 346, + 353, + 355, + 357, + 362, + 369, + 371, + 373, + 378, + 385, + 387, + 389, + 394 + ], + "mass_identity_1856_plus_width_sum": true, + "omitted_high": { + "606": { + "T8_lender": 395, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 12, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 13 + }, + "635": { + "T8_lender": 363, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 6, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 14 + }, + "637": { + "T8_lender": 530, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 31, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 12 + }, + "638": { + "T8_lender": 331, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 4, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 15 + }, + "639": { + "T8_lender": 299, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 1, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 16 + } + }, + "width_sum": 3408, + "word": { + "content_sha256": "a77502a685a6b8bb4b5d36803f3369aaabf9b9d199f86e91e6109c3298e7cf72", + "path": "words/BORROW-WORD-80extra.json.gz" + } + }, + "gauge44": { + "base_43": { + "helpers": 437, + "local_mass": 5385, + "local_profile": { + "1": 2351, + "2": 501, + "3": 414, + "4": 129, + "5": 42, + "8": 8 + } + }, + "controls_rc": 0, + "ext80": { + "controls": "omitted compensation and one flipped sign rejected", + "helpers": 400, + "independent_input_columns": 624, + "initial_corrections": 64, + "local_mass": 5264, + "local_profile": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "low": 32, + "pairs": 80, + "zero_FULL_cleanup_buffers": 44 + }, + "high5": { + "controls": "n/a", + "helpers": 432, + "independent_input_columns": 656, + "initial_corrections": 0, + "local_mass": 5360, + "local_profile": { + "1": 2351, + "2": 501, + "3": 414, + "4": 129, + "5": 37, + "8": 8 + }, + "low": 0, + "pairs": 48, + "zero_FULL_cleanup_buffers": 76 + }, + "independent_audit": { + "corrections": 64, + "independent_inputs": 624, + "local_mass": 5264, + "local_profile": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 37, + "8": 8 + }, + "orientations": { + "dual": "PASS", + "forward": "PASS" + }, + "removed_helpers": 80, + "restored_cold": 44, + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD", + "warps": 80, + "width_inventory": { + "4": 4, + "5": 4, + "7": 36, + "8": 84, + "9": 272 + } + }, + "low32": { + "controls": "omitted compensation and one flipped sign rejected", + "helpers": 405, + "independent_input_columns": 629, + "initial_corrections": 64, + "local_mass": 5289, + "local_profile": { + "1": 2303, + "2": 527, + "3": 386, + "4": 125, + "5": 42, + "8": 8 + }, + "low": 32, + "pairs": 75, + "zero_FULL_cleanup_buffers": 44 + }, + "low_candidates": { + "592": { + "deleted_prefix_indices": [ + 56, + 57, + 58, + 59 + ], + "early_prefix_rewrites": {}, + "lender": 298, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "593": { + "deleted_prefix_indices": [ + 60, + 61, + 62, + 63 + ], + "early_prefix_rewrites": {}, + "lender": 291, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "594": { + "deleted_prefix_indices": [ + 64, + 65, + 66, + 67 + ], + "early_prefix_rewrites": {}, + "lender": 289, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "596": { + "deleted_prefix_indices": [ + 68, + 69, + 70, + 71 + ], + "early_prefix_rewrites": {}, + "lender": 314, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "600": { + "deleted_prefix_indices": [ + 72, + 73, + 74, + 75 + ], + "early_prefix_rewrites": {}, + "lender": 305, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "601": { + "deleted_prefix_indices": [ + 76, + 77, + 78, + 79 + ], + "early_prefix_rewrites": {}, + "lender": 325, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "602": { + "deleted_prefix_indices": [ + 80, + 81, + 82, + 83 + ], + "early_prefix_rewrites": {}, + "lender": 330, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "604": { + "deleted_prefix_indices": [ + 84, + 85, + 86, + 87 + ], + "early_prefix_rewrites": {}, + "lender": 323, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "608": { + "deleted_prefix_indices": [ + 88, + 89, + 90, + 91 + ], + "early_prefix_rewrites": {}, + "lender": 346, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "609": { + "deleted_prefix_indices": [ + 92, + 93, + 94, + 95 + ], + "early_prefix_rewrites": {}, + "lender": 339, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "610": { + "deleted_prefix_indices": [ + 96, + 97, + 98, + 99 + ], + "early_prefix_rewrites": {}, + "lender": 337, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "612": { + "deleted_prefix_indices": [ + 100, + 101, + 102, + 103 + ], + "early_prefix_rewrites": {}, + "lender": 362, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "624": { + "deleted_prefix_indices": [ + 122, + 123, + 124, + 125 + ], + "early_prefix_rewrites": {}, + "lender": 378, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "625": { + "deleted_prefix_indices": [ + 126, + 127, + 128, + 129 + ], + "early_prefix_rewrites": {}, + "lender": 371, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "626": { + "deleted_prefix_indices": [ + 130, + 131, + 132, + 133 + ], + "early_prefix_rewrites": {}, + "lender": 369, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "628": { + "deleted_prefix_indices": [ + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141 + ], + "early_prefix_rewrites": { + "136": [ + [ + "add", + 214, + 566, + -1, + 1, + 3 + ] + ], + "140": [ + [ + "add", + 151, + 567, + 1, + 1, + 3 + ] + ] + }, + "lender": 394, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "632": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 142, + 143, + 144, + 145 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "633": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 146, + 147, + 148, + 149 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "634": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 150, + 151, + 152, + 153 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "636": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "640": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 162, + 163, + 164, + 165 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "641": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "642": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 174, + 175, + 176, + 177 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "644": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 178, + 179, + 180, + 181 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "648": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 182, + 183, + 184, + 185 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "649": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 186, + 187, + 188, + 189 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "650": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 190, + 191, + 192, + 193 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "652": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 194, + 195, + 196, + 197 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "656": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 198, + 199, + 200, + 201 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "657": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 202, + 203, + 204, + 205 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "658": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 206, + 207, + 208, + 209 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "660": { + "blocker": "no eligible lender: the set of non-target registers that are retired before the handoff, have a zero-dimensional entrance frame (so K_G z is free to read into the frame-zero target) and equal their own initial dirty input at the handoff has exactly 32 members at every one of the 12 handoffs; all 32 are consumed by the 32 transferred low aliases (free now: 0)", + "prefix_events_deleted": [ + 210, + 211, + 212, + 213 + ], + "prefix_plan_legal": true, + "status": "BLOCKED" + }, + "672": { + "deleted_prefix_indices": [ + 6, + 230, + 231, + 232, + 233, + 234 + ], + "early_prefix_rewrites": { + "230": [ + [ + "add", + 117, + 566, + 1, + 1, + 3 + ] + ], + "231": [ + [ + "add", + 181, + 566, + -1, + 1, + 3 + ] + ] + }, + "lender": 385, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "673": { + "deleted_prefix_indices": [ + 235, + 236, + 237, + 238 + ], + "early_prefix_rewrites": {}, + "lender": 387, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "674": { + "deleted_prefix_indices": [ + 239, + 240, + 241, + 242 + ], + "early_prefix_rewrites": {}, + "lender": 389, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "676": { + "deleted_prefix_indices": [ + 243, + 244, + 245, + 246, + 247, + 248 + ], + "early_prefix_rewrites": { + "245": [ + [ + "add", + 181, + 566, + 1, + 1, + 3 + ] + ] + }, + "lender": 373, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "680": { + "deleted_prefix_indices": [ + 249, + 250, + 251, + 252 + ], + "early_prefix_rewrites": {}, + "lender": 353, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "681": { + "deleted_prefix_indices": [ + 253, + 254, + 255, + 256 + ], + "early_prefix_rewrites": {}, + "lender": 355, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "682": { + "deleted_prefix_indices": [ + 257, + 258, + 259, + 260 + ], + "early_prefix_rewrites": {}, + "lender": 357, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "684": { + "deleted_prefix_indices": [ + 261, + 262, + 263, + 264 + ], + "early_prefix_rewrites": {}, + "lender": 341, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "688": { + "deleted_prefix_indices": [ + 265, + 266, + 267, + 268 + ], + "early_prefix_rewrites": {}, + "lender": 321, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "689": { + "deleted_prefix_indices": [ + 269, + 270, + 271, + 272 + ], + "early_prefix_rewrites": {}, + "lender": 277, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "690": { + "deleted_prefix_indices": [ + 273, + 274, + 275, + 276 + ], + "early_prefix_rewrites": {}, + "lender": 282, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "692": { + "deleted_prefix_indices": [ + 277, + 278, + 279, + 280 + ], + "early_prefix_rewrites": {}, + "lender": 307, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "696": { + "deleted_prefix_indices": [ + 281, + 282, + 283, + 284 + ], + "early_prefix_rewrites": {}, + "lender": 275, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "697": { + "deleted_prefix_indices": [ + 285, + 286, + 287, + 288 + ], + "early_prefix_rewrites": {}, + "lender": 273, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "698": { + "deleted_prefix_indices": [ + 289, + 290, + 291, + 292 + ], + "early_prefix_rewrites": {}, + "lender": 309, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + }, + "700": { + "deleted_prefix_indices": [ + 293, + 294, + 295, + 296 + ], + "early_prefix_rewrites": {}, + "lender": 293, + "lender_source": "PR2226 lender transfers", + "status": "ALIASED" + } + }, + "low_lender_pool": [ + 273, + 275, + 277, + 282, + 289, + 291, + 293, + 298, + 305, + 307, + 309, + 314, + 321, + 323, + 325, + 330, + 337, + 339, + 341, + 346, + 353, + 355, + 357, + 362, + 369, + 371, + 373, + 378, + 385, + 387, + 389, + 394 + ], + "mass_identity_1856_plus_width_sum": true, + "omitted_high": { + "606": { + "T8_lender": 395, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 12, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 13 + }, + "635": { + "T8_lender": 363, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 6, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 14 + }, + "637": { + "T8_lender": 530, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 31, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 12 + }, + "638": { + "T8_lender": 331, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 4, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 15 + }, + "639": { + "T8_lender": 299, + "T8_lender_blocker": "paid dimension-drop handoff 5->4 (outside PR2226 rank-zero scope)", + "T8_lender_dim_at_handoff": 5, + "helper_entrance_dim_T74": 4, + "helper_first_frame_dim_T74": 4, + "lender": 1, + "lender_dim_at_handoff": 4, + "lender_final_dim": 9, + "status": "ALIASED", + "zero_rank_candidates": 16 + } + }, + "width_sum": 3408, + "word": { + "content_sha256": "16d864123e3357ed02ff4c96f2eddef31eeb41b8b56becd1720533b0b517a4ce", + "path": "words/BORROW-WORD-80base.json.gz" + } + } + } +} diff --git a/research/t74-low-alias-borrowing/receipts/CONTROLS-80base.json b/research/t74-low-alias-borrowing/receipts/CONTROLS-80base.json new file mode 100644 index 0000000000..9c6a9e8dc0 --- /dev/null +++ b/research/t74-low-alias-borrowing/receipts/CONTROLS-80base.json @@ -0,0 +1,148 @@ +{ + "all_controls_rejected_for_expected_reason": true, + "controls": [ + { + "control": "unmutated", + "rejected": false, + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + { + "control": "wrong G (invertible, G(from)!=to)", + "rejected": true, + "reason": "G(from)!=to", + "expected_reason_match": true + }, + { + "control": "non-invertible G", + "rejected": true, + "reason": "G not invertible", + "expected_reason_match": true + }, + { + "control": "non-invertible G (zero column)", + "rejected": true, + "reason": "G not invertible", + "expected_reason_match": true + }, + { + "control": "frame mismatch (from frame differs from current)", + "rejected": true, + "reason": "G(from)!=to", + "expected_reason_match": true + }, + { + "control": "frame mismatch (consistent G, from frame differs from lender current frame)", + "rejected": true, + "reason": "warp frame mismatch (1, 243, (261, 133, 85, 45), (260, 133, 85, 45))", + "expected_reason_match": true + }, + { + "control": "frame mismatch (warp moved to a position where the lender frame differs)", + "rejected": true, + "reason": "frame not monotone (243, (261, 133, 85, 45), (320, 192, 45, 30))", + "expected_reason_match": true + }, + { + "control": "missing inverse warp in cleanup", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "all inverse warps missing", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "algebra without inverse warps does not restore inputs", + "failed_inputs": 190, + "rejected": true + }, + { + "control": "dim(from)!=dim(to)", + "rejected": true, + "reason": "dim(from)!=dim(to)", + "expected_reason_match": true + }, + { + "control": "inverse warp not at FULL", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "cleanup uses real restored input instead of private buffer", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "restoration gate dropped (derived cleanup)", + "rejected": true, + "reason": "paid profile mismatch {1: 2303, 2: 525, 3: 386, 4: 126, 5: 37, 8: 8}", + "expected_reason_match": true + }, + { + "control": "false cold-restoration claim (register not restored)", + "rejected": true, + "reason": "frame not monotone (273, (257, 128, 64, 33, 16, 8, 4, 2), (1,))", + "expected_reason_match": true + }, + { + "control": "restoration gate dropped", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "gate on removed helper", + "rejected": true, + "reason": "register out of range or removed helper referenced", + "expected_reason_match": true + }, + { + "control": "initial correction omitted", + "rejected": true, + "reason": "target map failed 2", + "expected_reason_match": true + }, + { + "control": "initial correction sign flipped", + "rejected": true, + "reason": "target map failed 2", + "expected_reason_match": true + }, + { + "control": "initial correction reads a non-lender", + "rejected": true, + "reason": "correction source is not the lender of its operator", + "expected_reason_match": true + }, + { + "control": "initial correction reads an entering helper", + "rejected": true, + "reason": "correction source has nonzero entrance frame", + "expected_reason_match": true + }, + { + "control": "wrong claimed profile", + "rejected": true, + "reason": "paid profile mismatch {1: 2303, 2: 527, 3: 386, 4: 125, 5: 37, 8: 8}", + "expected_reason_match": true + }, + { + "control": "wrong claimed width inventory", + "rejected": true, + "reason": "width inventory mismatch {4: 4, 5: 4, 7: 36, 8: 84, 9: 272}", + "expected_reason_match": true + }, + { + "control": "frame chain not monotone", + "rejected": true, + "reason": "frame not monotone (641, (30,), ())", + "expected_reason_match": true + } + ], + "seconds": 26783.436781504 +} diff --git a/research/t74-low-alias-borrowing/receipts/CONTROLS-80extra.json b/research/t74-low-alias-borrowing/receipts/CONTROLS-80extra.json new file mode 100644 index 0000000000..e090679cf9 --- /dev/null +++ b/research/t74-low-alias-borrowing/receipts/CONTROLS-80extra.json @@ -0,0 +1,148 @@ +{ + "all_controls_rejected_for_expected_reason": true, + "controls": [ + { + "control": "unmutated", + "rejected": false, + "status": "PASS_INDEPENDENT_EXACT_BORROWING_WORD" + }, + { + "control": "wrong G (invertible, G(from)!=to)", + "rejected": true, + "reason": "G(from)!=to", + "expected_reason_match": true + }, + { + "control": "non-invertible G", + "rejected": true, + "reason": "G not invertible", + "expected_reason_match": true + }, + { + "control": "non-invertible G (zero column)", + "rejected": true, + "reason": "G not invertible", + "expected_reason_match": true + }, + { + "control": "frame mismatch (from frame differs from current)", + "rejected": true, + "reason": "G(from)!=to", + "expected_reason_match": true + }, + { + "control": "frame mismatch (consistent G, from frame differs from lender current frame)", + "rejected": true, + "reason": "warp frame mismatch (1, 243, (261, 133, 85, 45), (260, 133, 85, 45))", + "expected_reason_match": true + }, + { + "control": "frame mismatch (warp moved to a position where the lender frame differs)", + "rejected": true, + "reason": "frame not monotone (243, (261, 133, 85, 45), (320, 192, 45, 30))", + "expected_reason_match": true + }, + { + "control": "missing inverse warp in cleanup", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "all inverse warps missing", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "algebra without inverse warps does not restore inputs", + "failed_inputs": 190, + "rejected": true + }, + { + "control": "dim(from)!=dim(to)", + "rejected": true, + "reason": "dim(from)!=dim(to)", + "expected_reason_match": true + }, + { + "control": "inverse warp not at FULL", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "cleanup uses real restored input instead of private buffer", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "restoration gate dropped (derived cleanup)", + "rejected": true, + "reason": "paid profile mismatch {1: 2287, 2: 533, 3: 386, 4: 126, 5: 37, 8: 8}", + "expected_reason_match": true + }, + { + "control": "false cold-restoration claim (register not restored)", + "rejected": true, + "reason": "frame not monotone (273, (257, 128, 64, 33, 16, 8, 4, 2), (1,))", + "expected_reason_match": true + }, + { + "control": "restoration gate dropped", + "rejected": true, + "reason": "explicit cleanup differs from derived inverse-reverse at FULL", + "expected_reason_match": true + }, + { + "control": "gate on removed helper", + "rejected": true, + "reason": "register out of range or removed helper referenced", + "expected_reason_match": true + }, + { + "control": "initial correction omitted", + "rejected": true, + "reason": "target map failed 2", + "expected_reason_match": true + }, + { + "control": "initial correction sign flipped", + "rejected": true, + "reason": "target map failed 2", + "expected_reason_match": true + }, + { + "control": "initial correction reads a non-lender", + "rejected": true, + "reason": "correction source is not the lender of its operator", + "expected_reason_match": true + }, + { + "control": "initial correction reads an entering helper", + "rejected": true, + "reason": "correction source has nonzero entrance frame", + "expected_reason_match": true + }, + { + "control": "wrong claimed profile", + "rejected": true, + "reason": "paid profile mismatch {1: 2287, 2: 535, 3: 386, 4: 125, 5: 37, 8: 8}", + "expected_reason_match": true + }, + { + "control": "wrong claimed width inventory", + "rejected": true, + "reason": "width inventory mismatch {4: 4, 5: 4, 7: 36, 8: 84, 9: 272}", + "expected_reason_match": true + }, + { + "control": "frame chain not monotone", + "rejected": true, + "reason": "frame not monotone (641, (30,), ())", + "expected_reason_match": true + } + ], + "seconds": 26806.408921092 +} diff --git a/research/t74-low-alias-borrowing/replay_core.py b/research/t74-low-alias-borrowing/replay_core.py new file mode 100644 index 0000000000..fc6a894f01 --- /dev/null +++ b/research/t74-low-alias-borrowing/replay_core.py @@ -0,0 +1,344 @@ +#!/usr/bin/env python3 +"""Exact free-operator replay of an anticipatory dirty-borrowing witness (function form). + +This is the replay of PR2226 "anticipatory dirty borrowing" (Cinna Davis, @1337isnot1337, +with OpenAI Codex assistance; research/anticipatory-dirty-borrowing/replay.py, Apache-2.0), +as vendored byte-identically by PR2269 (Jeremy Kothe, research/gmx-t74-borrow43/new/code/ +borrow/vendor/pr2226_replay.py). The semantics are unchanged. The only differences are: + + * it is a function returning a dict instead of a CLI writing a file; + * the PR2226-specific assertion ``len(pairs)==80 and sum(low)==32`` is replaced by + caller-supplied expected counts (PR2269's T74 witnesses carry 43 pairs); + * when ``diagnose=True`` the Y-row residuals (actual minus Y+X) are returned instead of + raising, so that a construction script can read off the late target response of a + nominated alias. The verification mode (``diagnose=False``) raises exactly as PR2226. + +Every low-pair condition of PR2226 is enforced verbatim: + - initial corrections: target in Y, source active, not in Y, source entrance frame of + dimension zero, operator words in range, dyadic coefficient; + - low lender is exactly its restored initial input at the handoff; + - retirement_B_event < handoff_B; handoff_paid_rank equals the frame-dimension gap; + - deleted prefix indices / early prefix rewrites are applied only for low pairs; + - every climb is nested (frame chronology), Y'=Y+X over the free operator algebra, + full inverse cleanup with private zero buffers restores every non-target input, and the + omitted-inverse-warp negative control must fail. + +Adaptation prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0. +Credits: PR2226 (Cinna Davis), PR2269 (Jeremy Kothe), PR2260 (Dugongue). +""" +from collections import Counter +from fractions import Fraction as Q + + +def span(basis): + s = {0} + for x in basis: + s |= {t ^ x for t in s.copy()} + return frozenset(s) + + +def incident(e): + return e[1:3] if e[0] == 'add' else e[1:2] + + +def add(dst, src, c): + for key, value in list(src.items()): + z = dst.get(key, Q(0)) + c * value + if z: + dst[key] = z + elif key in dst: + del dst[key] + + +def warp(row, op): + out = {} + for (var, word), value in row.items(): + word = word[1:] if word and word[0] == -op else (op,) + word + out[var, word] = value + return out + + +def frame_basis(F): + b = {} + for x in F: + while x: + j = x.bit_length() + if j not in b: + b[j] = x + break + x ^= b[j] + return [b[j] for j in sorted(b, reverse=True)] + + +class ReplayError(ValueError): + pass + + +def replay(w, blocks, inv, *, recover_cold=True, diagnose=False, expect_pairs=None, + expect_low=None, stop_after_B=False, trace_handoff=None, probe=None): + pairs = inv['pairs'] + if expect_pairs is not None: + assert len(pairs) == expect_pairs, (len(pairs), expect_pairs) + if expect_low is not None: + assert sum(x['low'] for x in pairs) == expect_low + v = w['v']; n = 2 * v + w['R']; full = span([1 << i for i in range(w['h'])]) + frames = list(map(span, w['frames'])) + removed = {x['register'] for x in pairs} + assert len(removed) == len(pairs), 'duplicate removed register' + active = [r for r in range(n) if r not in removed] + val = {r: {(r, ()): Q(1)} for r in active} + cur = {r: frames[w['start'][r]] for r in active} + anticipation = inv['initial_corrections'] + for term in anticipation: + target = term['target']; source = term['source']; word = tuple(term['operator_word']) + coefficient = Q(term['coefficient']) + assert v <= target < 2 * v and source in active and not (v <= source < 2 * v) + assert len(w['frames'][w['start'][source]]) == 0 + assert all(1 <= abs(op) <= len(pairs) for op in word) + assert coefficient.denominator & (coefficient.denominator - 1) == 0 + add(val[target], {(source, word): Q(1)}, coefficient) + mapping = {}; profile = Counter(); reverse = []; warps = [] + lender_check = [] + + def resolve(r): + return mapping.get(r, r) + + def climb(r, f): + if not cur[r] <= f: + raise ReplayError(('nonnested climb', r, len(cur[r]), len(f))) + d = (len(f).bit_length() - 1) - (len(cur[r]).bit_length() - 1) + if d: + profile[d] += 1 + cur[r] = f + + def scalar(e, framed=True, record=True): + rs = [resolve(r) for r in incident(e)] + if any(r not in val for r in rs): + raise ReplayError(('unallocated borrowed field', e)) + if framed: + for r in rs: + climb(r, frames[e[-1]]) + if e[0] == 'add': + c = Q(e[3], e[4]); add(val[rs[0]], val[rs[1]], c) + if record and not (v <= rs[0] < 2 * v): + reverse.append(('add', rs[0], rs[1], c)) + else: + c = Q(e[2], e[3]); val[rs[0]] = {k: c * x for k, x in val[rs[0]].items()} + if record and not (v <= rs[0] < 2 * v): + reverse.append(('scale', rs[0], c)) + + original_target_levels = {r: w['start'][r] for r in range(v, 2 * v)} + for e in w['precondition'] + w['compensation']: + for r in incident(e): + if v <= r < 2 * v: + original_target_levels[r] = e[-1] + if e[0] == 'add' and e[2] in removed: + continue + scalar(e, record=False) + for e in w['A']: + scalar(e) + for r, f in original_target_levels.items(): + climb(r, frames[f]) + for r, f in zip(w['centers'], w['center_frames']): + assert cur[r] == frames[f] + profile[len(w['frames'][f])] += 1 + for e in w['cut']: + scalar(e, framed=False, record=False) + deferred = {}; skip = set() + for b in blocks: + ss = set(b['helpers']); part = [] + for i in range(b['first_correction'], b['first_input']): + e = w['B'][i] + if set(incident(e)) <= ss: + part.append(e); skip.add(i) + deferred[b['first_input']] = part + starts = {} + for i, x in enumerate(pairs): + starts.setdefault(x.get('handoff_B', x['deadline']), []).append((i + 1, x)) + removed_early_echoes = {i for x in pairs if x['low'] + for i in x.get('deleted_prefix_indices', x['deleted_echo_indices'])} + early_rewrites = {} + for x in pairs: + if x['low']: + for i, gates in x.get('early_prefix_rewrites', {}).items(): + assert int(i) not in early_rewrites, ('two rewrites at one index', i) + early_rewrites[int(i)] = gates + early_tail = {} + for e in inv.get('early_tail_events', []): + early_tail.setdefault(e['before_B'], []).append(e['gate']) + for i, e in enumerate(w['B']): + for t in early_tail.get(i, []): + scalar(t) + if probe is not None and i in probe: + probe[i] = {'pristine': {r for r in active if val[r] == {(r, ()): Q(1)}}, + 'cur': {r: frame_basis(cur[r]) for r in active}} + if i in starts: + for op, x in starts[i]: + old = x['borrow_from']; new = x['register'] + assert x['retirement_B_event'] < i + if x['low']: + ok = val[old] == {(old, ()): Q(1)} + lender_check.append((op, old, ok)) + if not ok and not diagnose: + raise ReplayError(('low lender is not its restored initial input', op, old)) + if trace_handoff is not None: + trace_handoff.append((op, old, new, i, dict(val[old]), frame_basis(cur[old]))) + E_basis = x.get('handoff_basis', x['common_basis'][:x['retirement_dimension']]) + E = span(E_basis) + paid = abs(len(E_basis) - (len(cur[old]).bit_length() - 1)) + assert paid == x.get('handoff_paid_rank', 0), ('paid handoff', op, paid) + if paid: + profile[paid] += 1 + val[old] = warp(val[old], op); reverse.append(('warp', old, op)); cur[old] = E + mapping[new] = old + warps.append({'operator': op, 'borrow_from': old, 'removed': new, + 'from_basis': w['frames'][x['retirement_frame']] if 'retirement_frame' in x else None, + 'to_basis': E_basis, 'physical_handoff_rank': paid}) + assert not x.get('handoff_echo_coefficients') + for d in deferred.get(i, []): + scalar(d) + for d in early_rewrites.get(i, []): + scalar(d) + if i not in skip and i not in removed_early_echoes: + scalar(e) + for t in early_tail.get(len(w['B']), []): + scalar(t) + for r in range(v, 2 * v): + climb(r, frames[w['final'][r]]) + residual = {} + for r in range(v, 2 * v): + expected = {(r, ()): Q(1), (r - v, ()): Q(1)} + if val[r] != expected: + d = dict(val[r]); add(d, expected, Q(-1)); residual[r] = d + if residual and not diagnose: + raise ReplayError(('output map failed in exact free operator algebra', sorted(residual)[:12])) + if diagnose: + return {'residual': residual, 'lender_check': lender_check, 'profile': dict(profile), + 'val': val, 'cur': cur, 'active': active, 'mapping': mapping} + # ---- cold restoration + full inverse cleanup (verbatim PR2226 semantics) ---- + cold = [r for r in active if not (v <= r < 2 * v) and len(w['frames'][w['final'][r]]) < w['h']] + prime = 65521; modular_cache = {}; cold_clearable = [] + for c in cold: + V = frames[w['final'][c]] + pool = tuple(r for r in active if not (v <= r < 2 * v) and cur[r] <= V <= frames[w['final'][r]]) + if pool not in modular_cache: + piv = {} + for r in pool: + x = {k: (q.numerator * pow(q.denominator, -1, prime)) % prime for k, q in val[r].items()} + while x: + j = min(x) + if j not in piv: + z = pow(x[j], -1, prime); piv[j] = {k: t * z % prime for k, t in x.items()}; break + z = x[j] + for k, t in piv[j].items(): + y = (x.get(k, 0) - z * t) % prime + if y: + x[k] = y + elif k in x: + del x[k] + modular_cache[pool] = piv + x = {(c, ()): 1}; piv = modular_cache[pool] + while x: + j = min(x) + if j not in piv: + break + z = x[j] + for k, t in piv[j].items(): + y = (x.get(k, 0) - z * t) % prime + if y: + x[k] = y + elif k in x: + del x[k] + if not x: + dependents = [r for r in active if not (v <= r < 2 * v) and any(var == c for var, word in val[r])] + if all(cur[r] <= V and all(not word for var, word in val[r] if var == c) for r in dependents): + cold_clearable.append(c) + restored = []; cold_witnesses = [] + + def exact_combination(pool, goal): + piv = {} + for r in pool: + x = dict(val[r]); code = {r: Q(1)} + while x: + j = min(x) + if j not in piv: + z = x[j]; piv[j] = ({k: t / z for k, t in x.items()}, {k: t / z for k, t in code.items()}); break + row, coeff = piv[j]; z = x[j]; add(x, row, -z); add(code, coeff, -z) + x = dict(goal); code = {} + while x: + j = min(x) + if j not in piv: + return None + row, coeff = piv[j]; z = x[j]; add(x, row, -z); add(code, coeff, z) + return code + + def dyadic(q): + return q.denominator & (q.denominator - 1) == 0 + + def unit(q): + return q and dyadic(q) and abs(q.numerator) & (abs(q.numerator) - 1) == 0 + + def cleanup_add(d, s, c, V): + climb(d, V); climb(s, V); add(val[d], val[s], c); reverse.append(('add', d, s, c)) + + if recover_cold: + for c in sorted(cold_clearable, key=lambda r: (len(frames[w['final'][r]]), r)): + V = frames[w['final'][c]] + pool = [r for r in active if not (v <= r < 2 * v) and r not in restored and cur[r] <= V] + solution = exact_combination(pool, {(c, ()): Q(1)}) + if solution is None or not all(dyadic(z) for z in solution.values()): + continue + pivot = c if unit(solution.get(c, Q(0))) else next((r for r, z in solution.items() if unit(z)), None) + if pivot is None: + continue + for r in set(solution) | {c}: + climb(r, V) + factor = solution[pivot] + if factor != 1: + val[pivot] = {k: factor * z for k, z in val[pivot].items()}; reverse.append(('scale', pivot, factor)) + for r, z in solution.items(): + if r != pivot: + cleanup_add(pivot, r, z, V) + if pivot != c: + val[c], val[pivot] = val[pivot], val[c]; reverse.append(('swap', c, pivot)) + assert val[c] == {(c, ()): Q(1)} + for r in active: + if v <= r < 2 * v or r == c: + continue + assert all(not word for var, word in val[r] if var == c) + z = val[r].get((c, ()), Q(0)) + if z: + cleanup_add(r, c, -z, V) + assert all(not any(var == c for var, word in val[r]) for r in active if not (v <= r < 2 * v) and r != c) + restored.append(c) + cold_witnesses.append({'register': c, 'frame': w['final'][c], + 'preparation': {str(r): str(z) for r, z in solution.items()}}) + for r in active: + if not (v <= r < 2 * v) and r not in restored: + climb(r, full) + work = {r: ({} if r in restored else dict(row)) for r, row in val.items()} + negative = {r: dict(work[r]) for r in active if not (v <= r < 2 * v)} + for e in reversed(reverse): + if e[0] == 'add': + _, d, s, c = e; add(work[d], work[s], -c); add(negative[d], negative[s], -c) + elif e[0] == 'scale': + _, d, c = e; work[d] = {k: x / c for k, x in work[d].items()} + negative[d] = {k: x / c for k, x in negative[d].items()} + elif e[0] == 'swap': + _, d, s = e; work[d], work[s] = work[s], work[d]; negative[d], negative[s] = negative[s], negative[d] + else: + _, d, op = e; work[d] = warp(work[d], -op) + for r in active: + if not (v <= r < 2 * v) and work[r] != ({} if r in restored else {(r, ()): Q(1)}): + raise ReplayError(('cleanup failed', r)) + rejected = [r for r, row in negative.items() if row != ({} if r in restored else {(r, ()): Q(1)})] + if warps and not rejected: + raise ReplayError('missing inverse warp negative control did not fail') + mass = sum(r * c for r, c in profile.items()) + return {'status': 'PASS_EXACT_FREE_OPERATOR_BORROWING_REPLAY', 'original_registers': n, + 'remaining_registers': len(active), 'removed_helper_registers': len(removed), + 'independent_input_columns': len(active), 'symbolic_warps': warps, 'target_map': 'Y+=X', + 'omitted_inverse_warps_rejected_registers': len(rejected), + 'zero_FULL_cleanup_buffers': len(restored), 'exact_cold_restoration': cold_witnesses, + 'lender_check': lender_check, + 'local_profile': dict(sorted(profile.items())), 'local_mass': mass} diff --git a/research/t74-low-alias-borrowing/run_all.py b/research/t74-low-alias-borrowing/run_all.py new file mode 100644 index 0000000000..6e8cfbe4cc --- /dev/null +++ b/research/t74-low-alias-borrowing/run_all.py @@ -0,0 +1,258 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Run the independent word check and the model pricing of the extended T74 borrow words; print one PASS line. + +Steps (each child runs as `python3 -I -B`, and its last stdout line must be its PASS line): + 0. (optional, --build) build_ext.py --controls, the construction with its own oracle, PR2269's auditor and + PR2226 Gaussian products. Needs numpy on PYTHONPATH (--numpy-site DIR). The pinned words/ and witness/ + files must come out byte-identical (determinism); otherwise the run fails. + 1. check_ext.py --out: independent check of BORROW-WORD-80{base,extra} (no PR or construction code). + 2. price_ext.py sources, price_ext.py controls: the pricing harness re-reads its PR constants from git and + runs its positive/negative controls. + 3. price-input-ext80.json is written from the profiles RECOUNTED by check_ext.py (not from the word reports), + then priced: price_ext.py price price-input-ext80.json --digits 40 --conservative --out + price_ext.ext80.receipt.json. Models F (favourable), C (calibrated on PR2269's realized refill), + C8 (calibrated on the T8 PR2260 refill) and P (pessimistic). These are MODEL prices of an idle refill + that has NOT been constructed: not a supplier, not a kappa claim. + 4. Cross-checks here: the priced local profiles equal the recount; every model's composed global profile + 249 P_gauge44 + 417 P_extra + idle has mass m W - D = 4816512; a plain float bisection of + mu(a) = sum_r n_r (r/m)^(1-a) / W = 1 agrees with each certified b to 1e-12. + 5. Runner negative controls: a price input whose width sum breaks mass = 1856 + widths, and a check_ext + receipt whose recount differs from the priced profile, must both be rejected. + +Credit: PR2226 (Cinna Davis / @1337isnot1337, with OpenAI Codex) anticipatory dirty borrowing; PR2269 +(Jeremy Kothe / jeremykothe2) T74 borrow43 words, fill and b; PR2260 (Dugongue) T8 44-high supplier and fill; +PR2312 reference claim only. Prepared with substantial AI assistance (Claude Code, Anthropic); Apache-2.0. + +Usage: python3 -I -B run_all.py [--out] [--build --numpy-site DIR] +Final line: PASS_T74_LOW_ALIAS_RUN_ALL ... or FAIL_T74_LOW_ALIAS_RUN_ALL ... +""" + +import sys + +if sys.flags.optimize: + sys.stdout.write('refusing to run under python -O\nFAIL_T74_LOW_ALIAS_RUN_ALL\n') + sys.exit(2) + +import argparse +import hashlib +import json +import math +import os +import subprocess +import tempfile +import time + +HERE = os.path.dirname(os.path.abspath(__file__)) +PASS_LINE = 'PASS_T74_LOW_ALIAS_RUN_ALL' +FAIL_LINE = 'FAIL_T74_LOW_ALIAS_RUN_ALL' +PRICE_INPUT = 'price-input-ext80.json' +PRICE_RECEIPT = 'price_ext.ext80.receipt.json' +CHECK_RECEIPT = 'check_ext.receipt.json' +PINNED_OUTPUTS = { # same pins as check_ext.LOCAL_PINS (sha256) + 'words/BORROW-WORD-80base.json.gz': '61290abffd8c8225e0abb3958c1506674e256de688fc4cdf358bbe7c981df493', + 'words/BORROW-WORD-80extra.json.gz': '1dd2d6f2ae5b5a27b5f89fb830203f0cca7a78d0323a7845e85e1e80f8f6d1a5', + 'witness/witness_80_base.json': '9380f74c032b0616d5b13e8ef94b6d9f80cac36239e329357e7d5fcab5283ad0', + 'witness/witness_80_extra.json': '6737072dcca47c6e6526bd62a41585dd09026549550c9e62eb53e64b265a6709', +} +T74 = dict(m=73, W=66304, D=23680, calls={'gauge44': 249, 'extra': 417}) + + +def run(argv, env=None, timeout=1800): + t0 = time.time() + got = subprocess.run([sys.executable, '-I', '-B'] + argv, cwd=HERE, capture_output=True, text=True, + env=env, timeout=timeout) + lines = got.stdout.strip().splitlines() + return got.returncode, lines, got.stderr, round(time.time() - t0, 1) + + +def sha(path): + with open(os.path.join(HERE, path), 'rb') as fh: + return hashlib.sha256(fh.read()).hexdigest() + + +def step(name, argv, token, failures, log, env=None): + rc, lines, err, dt = run(argv, env=env) + last = lines[-1] if lines else '' + ok = rc == 0 and last.startswith(token) + log[name] = dict(argv=argv, rc=rc, last_line=last, seconds=dt) + print('[%s] %s (rc=%d, %.1f s): %s' % (name, 'PASS' if ok else 'FAIL', rc, dt, last), flush=True) + if not ok: + failures.append('%s:%d:%s' % (name, rc, last[:80])) + for ln in (lines[-15:] + err.strip().splitlines()[-10:]): + print(' | ' + ln) + return ok, lines + + +def float_root(H, m, W): + """Plain float bisection of mu(a) = sum n_r (r/m)^(1-a) / W = 1 (cross-check only, not certified).""" + mu = lambda a: sum(n * math.exp((1 - a) * math.log(r / m)) for r, n in H.items()) / W + lo, hi = 0.0, 0.01 + assert mu(lo) < 1 < mu(hi) + for _ in range(200): + mid = (lo + hi) / 2 + if mu(mid) < 1: + lo = mid + else: + hi = mid + return lo + + +def crosscheck(pr, recount): + """Priced profiles == recount; composed global mass == m W - D; float root == certified b (1e-12).""" + out, bad = [], [] + if pr['local_profiles'] != dict((p, recount[p]['profile']) for p in ('gauge44', 'extra')): + bad.append('crosscheck:priced profiles != recount') + total = T74['m'] * T74['W'] - T74['D'] + for row in pr['models']: + H = {} + for p, c in T74['calls'].items(): + for r, n in recount[p]['profile'].items(): + H[int(r)] = H.get(int(r), 0) + c * n + for r, n in row['idle'].items(): + H[int(r)] = H.get(int(r), 0) + n + mass = sum(r * n for r, n in H.items()) + froot = float_root(H, T74['m'], T74['W']) + good = mass == total and abs(froot - float(row['b'])) < 1e-12 + out.append(dict(model=row['model'], b=row['b'], b_conservative=row.get('b_conservative'), + gain_vs_pr2269=row['gain_vs_pr2269'], gain_vs_pr2269_pct=row['gain_vs_pr2269_pct'], + gain_vs_pr2312=row['gain_vs_pr2312'], gain_vs_pr2312_pct=row['gain_vs_pr2312_pct'], + idle=row['idle'], global_mass=mass, float_root=repr(froot), crosscheck_ok=good, + bit_bound=row['bit_bound'])) + if not good: + bad.append('crosscheck:%s mass=%d float=%r' % (row['model'], mass, froot)) + return out, bad + + +FETCH_URL = 'https://github.com/CrocSwap/integer-mult-bounds' +FETCH_PRS = {2269: 'b479fc5567bc09ab9185bffe89b62594f36d74e5', 2226: 'dacaf3d81f1936bb55b8454b1244e5d014272754', + 2260: 'fde6b107e26a14da5bac5b66913c914708ea6901'} + + +def fetch_missing(): + repo = os.path.dirname(os.path.dirname(HERE)) + for pr, commit in sorted(FETCH_PRS.items()): + have = subprocess.run(['git', '-C', repo, 'cat-file', '-t', commit], capture_output=True, text=True) + if have.returncode == 0 and have.stdout.strip() == 'commit': + continue + print('fetching refs/pull/%d/head (commit %s absent)' % (pr, commit[:8]), flush=True) + got = subprocess.run(['git', '-C', repo, 'fetch', '--no-tags', '--quiet', FETCH_URL, 'refs/pull/%d/head' % pr], + capture_output=True, text=True) + if got.returncode != 0: + print('fetch of #%d failed: %s' % (pr, got.stderr.strip())) + + +def main(): + ap = argparse.ArgumentParser(description='Run check_ext.py and the model pricing; print one PASS line') + ap.add_argument('--out', action='store_true', help='write run_all.receipt.json next to this script') + ap.add_argument('--build', action='store_true', help='first re-run build_ext.py --controls (needs numpy)') + ap.add_argument('--numpy-site', default=None, help='directory to put on PYTHONPATH for build_ext.py') + ap.add_argument('--fetch', action='store_true', + help='fetch refs/pull/{2269,2226,2260}/head from %s if their pinned commits are absent ' + '(every input blob is still verified against its pin)' % FETCH_URL) + args = ap.parse_args() + if args.fetch: + fetch_missing() + t0 = time.time() + failures, log = [], {} + summary = {} + try: + if args.build: + before = dict((p, sha(p)) for p in PINNED_OUTPUTS) + env = dict(os.environ) + if args.numpy_site: + env['PYTHONPATH'] = args.numpy_site + # build_ext.py imports replay_core/vendor modules from its own directory, so it is run without -I + t1 = time.time() + got = subprocess.run([sys.executable, '-B', 'build_ext.py', '--controls'], cwd=HERE, capture_output=True, + text=True, env=env, timeout=3600) + lines = got.stdout.strip().splitlines() + ok = got.returncode == 0 and any('PASS_T74_LOW_ALIAS_EXTENSION' in ln for ln in lines[-5:]) + after = dict((p, sha(p)) for p in PINNED_OUTPUTS) + same = after == before == PINNED_OUTPUTS + log['build'] = dict(rc=got.returncode, last_line=lines[-1] if lines else '', deterministic=same, + seconds=round(time.time() - t1, 1)) + print('[build] %s (rc=%d): outputs byte-identical to pins: %s' % ('PASS' if ok else 'FAIL', got.returncode, + same), flush=True) + if not (ok and same): + failures.append('build:%d:deterministic=%s' % (got.returncode, same)) + else: + mism = [p for p in PINNED_OUTPUTS if sha(p) != PINNED_OUTPUTS[p]] + if mism: + failures.append('pins:%s' % ','.join(mism)) + ok1, _ = step('check_ext', ['check_ext.py', '--out'], 'PASS_T74_LOW_ALIAS_WORDS_INDEPENDENT', failures, log) + ok2, _ = step('price_sources', ['price_ext.py', 'sources'], 'PASS_T74_EXT_PRICE_HARNESS', failures, log) + ok3, _ = step('price_controls', ['price_ext.py', 'controls'], 'PASS_T74_EXT_PRICE_HARNESS', failures, log) + if ok1: + with open(os.path.join(HERE, CHECK_RECEIPT)) as fh: + rec = json.load(fh) + recount = rec['recounted'] + spec = {'family': 'T74', + 'label': 'CONSTRUCTED BORROW-WORD-80{base,extra} (48 high + 32 low aliases); local profiles recounted ' + 'by check_ext.py; idle refill MODELLED (owner fill not rebuilt)', + 'providers': dict((p, dict(profile=recount[p]['profile'], helpers=recount[p]['helpers'], + helper_width_sum=recount[p]['helper_width_sum'])) for p in ('gauge44', 'extra'))} + with open(os.path.join(HERE, PRICE_INPUT), 'w') as fh: + json.dump(spec, fh, indent=1, sort_keys=True) + fh.write('\n') + ok4, lines = step('price_ext80', ['price_ext.py', 'price', PRICE_INPUT, '--digits', '40', '--conservative', + '--out', PRICE_RECEIPT], + 'PASS_T74_EXT_PRICE_HARNESS', failures, log) + if ok4: + for ln in lines: + if ln.startswith(' ') and ('b_40' in ln or 'idle mass' in ln or 'x249' in ln or 'x417' in ln): + print(ln) + with open(os.path.join(HERE, PRICE_RECEIPT)) as fh: + pr = json.load(fh)['price'] + xc, bad_xc = crosscheck(pr, recount) + failures.extend(bad_xc) + summary = dict(extra_freed_mass=pr['extra_freed_mass'], idle_mass=pr['idle_mass'], models=xc) + print('[crosscheck] %s: priced profiles = recount; global mass = %d for every model; float roots agree ' + 'with certified b to 1e-12' % ('FAIL' if bad_xc else 'PASS', T74['m'] * T74['W'] - T74['D']), + flush=True) + # runner negative controls + nc = [] + with tempfile.TemporaryDirectory() as td: + bad = json.loads(json.dumps(spec)) + bad['providers']['extra']['helper_width_sum'] += 1 + path = os.path.join(td, 'bad.json') + with open(path, 'w') as fh: + json.dump(bad, fh) + rc, lines, _, _ = run(['price_ext.py', 'price', path, '--digits', '12']) + nc.append(dict(control='price input with helper_width_sum + 1 (breaks mass = 1856 + widths)', + rejected=rc != 0 and lines[-1].startswith('FAIL') and + any('local.identity' in ln for ln in lines))) + if ok4: + moved = json.loads(json.dumps(recount)) + moved['gauge44']['profile']['1'] -= 1 + moved['gauge44']['profile']['2'] += 1 + _, bad_xc = crosscheck(pr, moved) + nc.append(dict(control='crosscheck with a recount that moves one rank-1 child to rank 2', + rejected=bool(bad_xc), by=bad_xc[:2])) + for c in nc: + print('[runner control] %-80s %s' % (c['control'], 'REJECTED-OK' if c['rejected'] else 'NOT-OK')) + if not c['rejected']: + failures.append('runner_control:%s' % c['control'][:40]) + log['runner_controls'] = nc + except Exception as e: # noqa: BLE001 - report any runner error as a failure line + failures.append('runner:%s' % e) + elapsed = round(time.time() - t0, 1) + if failures: + line = '%s failures=%s' % (FAIL_LINE, ';'.join(failures)) + else: + models = ','.join('%s:%s' % (x['model'], x['b'][:14]) for x in summary['models']) + line = '%s check=PASS price=PASS crosscheck=PASS runner_controls=%d E=%d b_40[%s]' % ( + PASS_LINE, len(log['runner_controls']), summary['extra_freed_mass'], models) + if args.out: + with open(os.path.join(HERE, 'run_all.receipt.json'), 'w') as fh: + json.dump(dict(runner='run_all.py', python=sys.version.split()[0], steps=log, pricing=summary, + note='Model prices of a modelled idle refill; no owner fill was rebuilt; no kappa claim.', + elapsed_s=elapsed, result=line), fh, indent=1, sort_keys=True) + fh.write('\n') + print('elapsed %.1f s' % elapsed) + print(line) + return 0 if not failures else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/research/t74-low-alias-borrowing/run_all.receipt.json b/research/t74-low-alias-borrowing/run_all.receipt.json new file mode 100644 index 0000000000..be6a0345bb --- /dev/null +++ b/research/t74-low-alias-borrowing/run_all.receipt.json @@ -0,0 +1,154 @@ +{ + "elapsed_s": 22.0, + "note": "Model prices of a modelled idle refill; no owner fill was rebuilt; no kappa claim.", + "pricing": { + "extra_freed_mass": 80586, + "idle_mass": 1310688, + "models": [ + { + "b": "0.0017255088890837212072813976419618582057", + "b_conservative": "0.0017255088861992047617724230796997597019", + "bit_bound": false, + "crosscheck_ok": true, + "float_root": "0.001725508889083682", + "gain_vs_pr2269": "2.9261750025246986511E-5", + "gain_vs_pr2269_pct": "+1.7251%", + "gain_vs_pr2312": "2.8617821842103207281E-5", + "gain_vs_pr2312_pct": "+1.6865%", + "global_mass": 4816512, + "idle": { + "1": 23976, + "3": 8673, + "42": 1, + "48": 26157, + "5": 813, + "7": 150 + }, + "model": "F" + }, + { + "b": "0.0017126737497248571464349222053077804286", + "b_conservative": "0.0017126737468384233802906688749666422316", + "bit_bound": false, + "crosscheck_ok": true, + "float_root": "0.0017126737497248912", + "gain_vs_pr2269": "1.6426610666382925665E-5", + "gain_vs_pr2269_pct": "+0.9684%", + "gain_vs_pr2312": "1.5782682483239146434E-5", + "gain_vs_pr2312_pct": "+0.9301%", + "global_mass": 4816512, + "idle": { + "1": 37980, + "3": 13730, + "48": 25488, + "5": 1287, + "7": 237 + }, + "model": "C" + }, + { + "b": "0.0017140567316684824711264204715713101470", + "b_conservative": "0.0017140567287903532610785433539703089262", + "bit_bound": false, + "crosscheck_ok": true, + "float_root": "0.0017140567316684117", + "gain_vs_pr2269": "1.7809592610008250356E-5", + "gain_vs_pr2269_pct": "+1.0499%", + "gain_vs_pr2312": "1.7165664426864471126E-5", + "gain_vs_pr2312_pct": "+1.0116%", + "global_mass": 4816512, + "idle": { + "1": 29065, + "3": 8673, + "39": 21, + "48": 25340, + "5": 5324, + "6": 55, + "7": 1645 + }, + "model": "C8" + }, + { + "b": "0.0016871233700042746562989725665814138063", + "b_conservative": "0.0016871233670879834795804369952323227555", + "bit_bound": false, + "crosscheck_ok": true, + "float_root": "0.001687123370004262", + "gain_vs_pr2269": "-9.1237690541995644706E-6", + "gain_vs_pr2269_pct": "-0.5379%", + "gain_vs_pr2312": "-9.7676972373433437010E-6", + "gain_vs_pr2312_pct": "-0.5756%", + "global_mass": 4816512, + "idle": { + "1": 104562, + "3": 8673, + "48": 24479, + "5": 813, + "7": 150 + }, + "model": "P" + } + ] + }, + "python": "3.14.4", + "result": "PASS_T74_LOW_ALIAS_RUN_ALL check=PASS price=PASS crosscheck=PASS runner_controls=2 E=80586 b_40[F:0.001725508889,C:0.001712673749,C8:0.001714056731,P:0.001687123370]", + "runner": "run_all.py", + "steps": { + "check_ext": { + "argv": [ + "check_ext.py", + "--out" + ], + "last_line": "PASS_T74_LOW_ALIAS_WORDS_INDEPENDENT", + "rc": 0, + "seconds": 15.8 + }, + "price_controls": { + "argv": [ + "price_ext.py", + "controls" + ], + "last_line": "PASS_T74_EXT_PRICE_HARNESS", + "rc": 0, + "seconds": 4.1 + }, + "price_ext80": { + "argv": [ + "price_ext.py", + "price", + "price-input-ext80.json", + "--digits", + "40", + "--conservative", + "--out", + "price_ext.ext80.receipt.json" + ], + "last_line": "PASS_T74_EXT_PRICE_HARNESS", + "rc": 0, + "seconds": 1.6 + }, + "price_sources": { + "argv": [ + "price_ext.py", + "sources" + ], + "last_line": "PASS_T74_EXT_PRICE_HARNESS", + "rc": 0, + "seconds": 0.4 + }, + "runner_controls": [ + { + "control": "price input with helper_width_sum + 1 (breaks mass = 1856 + widths)", + "rejected": true + }, + { + "by": [ + "crosscheck:priced profiles != recount", + "crosscheck:F mass=4816761 float=0.0017073314403578952" + ], + "control": "crosscheck with a recount that moves one rank-1 child to rank 2", + "rejected": true + } + ] + } +} diff --git a/research/t74-low-alias-borrowing/vendor/pr2226/NOTICE.md b/research/t74-low-alias-borrowing/vendor/pr2226/NOTICE.md new file mode 100644 index 0000000000..5ea70357a0 --- /dev/null +++ b/research/t74-low-alias-borrowing/vendor/pr2226/NOTICE.md @@ -0,0 +1,22 @@ +# Attribution and license + +New construction, proof text and checkers: Cinna Davis (@1337isnot1337), with +substantial OpenAI Codex assistance, Apache-2.0. + +The selected complex canonical word is the PR1042 ancestry retained in PR1094. +Jeremy Kothe, Rohan Arun, Hao Yan, Chafik Boukhalfa, icekylinx, Jonathan Capalbo +and the source package's full provider/frame/controller lineage retain credit. +Ali Romman supplied the source-bound fixed-block theorem and certificate; +Thomas DiFiore supplied the earlier block discovery. The borrowing construction +does not attribute its changed interface to those predecessor results. + +`price_engine.py` is an unchanged copy of the incorporated +`research/complex-local-word-ceiling/ceiling.py`: Douglas Colkitt, with Claude +(Anthropic) assistance; original SPDX/license context and docstring retained. +General Clifford frame and exact Gaussian normal forms are inherited from +`notes/general-clifford-frames.tex` and the repository's credited phase/compiler +lineage. The package independently checks its actual local Gaussian products. + +Source hashes, base commits and the copied engine's Git blob are in SOURCES.json. +No full native supplier, all-size compiler, precision theorem or new kappa is +claimed. No independent human review is claimed. diff --git a/research/t74-low-alias-borrowing/vendor/pr2226/operators.py b/research/t74-low-alias-borrowing/vendor/pr2226/operators.py new file mode 100644 index 0000000000..5c4fbe8cce --- /dev/null +++ b/research/t74-low-alias-borrowing/vendor/pr2226/operators.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +"""Exact Gaussian-integer checks of every nominated rank-zero handoff. + +Each complete512-column operator is evaluated with a shared power-of-two +denominator. No floating approximation or binary-frame equality is substituted +for the actual Gaussian operator product. +""" +import argparse,hashlib,json +from pathlib import Path +import numpy as np + + +def linear(cols,x): + out=0 + for i,c in enumerate(cols): + if x>>i&1:out^=c + return out + + +def rank(xs): + b={} + for x in xs: + while x: + i=x.bit_length() + if i not in b:b[i]=x;break + x^=b[i] + return len(b) + + +def extend(xs,h): + out=list(xs) + for i in range(h): + if rank(out+[1<len(out):out.append(1<>i)&1)<>i&1)==(M[i]>>j&1) for i in range(h) for j in range(h)) + perm=np.array([linear(cols,x) for x in range(1<>i)&1)*(x>>i&1) for i in range(h))+ + 2*sum(((M[j]>>i)&1)*(x>>i&1)*(x>>j&1) for i in range(h) for j in range(i+1,h)) + for x in perm],dtype=np.int64)%4 + return perm,phase + + +def apply_mono(z,recipe,sign=1): + re,im,exp=z;perm,phase=recipe;rr=np.empty_like(re);ii=np.empty_like(im) + if sign==1: + for p in range(4): + mask=phase==p;r=re[mask];i=im[mask] + if p==0:a,b=r,i + elif p==1:a,b=-i,r + elif p==2:a,b=-r,-i + else:a,b=i,-r + rr[perm[mask]]=a;ii[perm[mask]]=b + else: + r=re[perm];i=im[perm] + for p in range(4): + mask=phase==p + if p==0:a,b=r[mask],i[mask] + elif p==1:a,b=i[mask],-r[mask] + elif p==2:a,b=-r[mask],-i[mask] + else:a,b=-i[mask],r[mask] + rr[mask]=a;ii[mask]=b + return rr,ii,exp + + +def coord(z,axes,sign=1): + re,im,exp=z + for j in axes: + p=np.array([x for x in range(len(re)) if not(x>>j&1)]);q=p^(1< + explicit chronological word with warps, cold restoration and inverse cleanup). +- `audit_local.py`: independent exact scalar/frame/free-algebra auditor (header credits icekylinx + with OpenAI GPT-6 Astra assistance for the base auditor; BORROW-WORD extension by PR2269). +- `borrow_controls.py`: negative controls for the auditor. + +The mechanism they implement is PR2226 anticipatory dirty borrowing (Cinna Davis, @1337isnot1337, +with OpenAI Codex assistance). Unmodified; git blob ids are pinned in ../../SOURCES-PR.json. diff --git a/research/t74-low-alias-borrowing/vendor/pr2269/audit_local.py b/research/t74-low-alias-borrowing/vendor/pr2269/audit_local.py new file mode 100644 index 0000000000..a90b00e023 --- /dev/null +++ b/research/t74-low-alias-borrowing/vendor/pr2269/audit_local.py @@ -0,0 +1,483 @@ +"""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)<(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<>i&1:Q[t]^=Ub[i] + G2=[al.gmul(G,Q[t]) for t in range(h)] + require(al.basis([al.gmul(G2,x) for x in W])==al.basis(r[4]) and al.ginv(G2,h) is not None,'control G consistent') + r[2]=G2;r[3]=W + good&=expect('frame mismatch (consistent G, from frame differs from lender current frame)',w,basep,tmp,'warp frame mismatch',results) + # frame mismatch with a consistent G: the warp is moved to a B position where the lender is in another frame + # (explicit cleanup removed so the derived cleanup follows the moved warp; the frame audit itself must fire) + found=False + for k in range(K): + r=w0['warps'][k];nxt=next((i for i in range(r[0],len(w0['B'])) if r[1] in al.registers(w0['B'][i])),None) + if nxt is None:continue + w=mut();w.pop('cleanup');w['warps'][k][0]=nxt+1 + try:run_word(w,basep,tmp) + except RuntimeError as e: + if 'warp frame mismatch' in str(e) or 'frame not monotone' in str(e):found=True;break + good&=found + good&=expect('frame mismatch (warp moved to a position where the lender frame differs)',w,basep,tmp,('warp frame mismatch','frame not monotone'),results) + # 4 missing inverse warp + w=mut();i=next(i for i,g in enumerate(w['cleanup']) if g[0]=='warp');del w['cleanup'][i] + good&=expect('missing inverse warp in cleanup',w,basep,tmp,'explicit cleanup differs',results) + w=mut();w['cleanup']=[g for g in w['cleanup'] if g[0]!='warp'];good&=expect('all inverse warps missing',w,basep,tmp,'explicit cleanup differs',results) + # 4b the algebra itself (not just the derivation comparison) rejects a cleanup without inverse warps + w=mut();n=2*w['report']['v']+w['report']['R'];v=w['report']['v'] + removed=set(w['removed']);live=[r for r in range(n) if r not in removed];restored={int(q) for q in w['helper_final']} + DS=10**6;rows={r:{(r,()):al.F(1)} for r in live} + for c in restored:rows[c+n]={} + program=[['corr',t['target'],t['source'],tuple(t['operator_word']),al.F(t['coefficient'])] for t in w['initial_corrections']]+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,[]):program.append(['warp',w['warps'][op-1][1],op]) + if p=2*v if rows[r]!={(r,()):al.F(1)}] + results.append(dict(control='algebra without inverse warps does not restore inputs',failed_inputs=len(bad),rejected=bool(bad)));print('algebra-level missing inverse warp: failing restored inputs',len(bad)) + good&=bool(bad) + # 5 dimension mismatch + w=mut();w['warps'][5][4]=w['warps'][5][4][:-1];good&=expect('dim(from)!=dim(to)',w,basep,tmp,'dim(from)!=dim(to)',results) + # 6 inverse warp not at FULL + w=mut();i=next(i for i,g in enumerate(w['cleanup']) if g[0]=='warp');w['cleanup'][i][3]=w['cleanup'][i][3][:-1] + good&=expect('inverse warp not at FULL',w,basep,tmp,'explicit cleanup differs',results) + # 7 zero-buffer rule: cleanup touches the real restored register, not its buffer + w=mut();i=next(i for i,g in enumerate(w['cleanup']) if g[0]=='add' and g[1]>=n) + w['cleanup'][i][1]-=n;good&=expect('cleanup uses real restored input instead of private buffer',w,basep,tmp,'explicit cleanup differs',results) + w=mut();w.pop('cleanup');w['restore']=w['restore'][1:];good&=expect('restoration gate dropped (derived cleanup)',w,basep,tmp,('restored cold','cleanup did not restore','endpoint failure','target map','frame','paid profile mismatch'),results) + # restored real register not decoupled: its buffer is dropped from the restored set while cleanup still derived + w=mut();w.pop('cleanup');c0=next(iter(w['helper_final']));w['helper_final'].pop(c0);good&=expect('restored cold input demoted (needs FULL, was decoupled by FULL-less rows)',w,basep,tmp,('',),results) if False else True + # 8 restored claim without restoration + touched={r for g in w0['precondition']+w0['compensation'] for r in al.registers(g)} + w=mut();w.pop('cleanup');c=next(r for r in range(2*v,n) if r not in removed and str(r) not in w['helper_final'] and r not in touched) + w['helper_final'][str(c)]=[1] + good&=expect('false cold-restoration claim (register not restored)',w,basep,tmp,('restored cold','frame not monotone'),results) + # 9 dropped restoration gate + w=mut();w['restore']=w['restore'][1:];good&=expect('restoration gate dropped',w,basep,tmp,'explicit cleanup differs',results) + # 10 removed helper referenced / alias missing + w=mut();r=w['removed'][0];w['B'].append(['add',r,2*v+1,1,1,[]]);good&=expect('gate on removed helper',w,basep,tmp,'removed helper referenced',results) + # 11 initial corrections (only if present) + if w0['initial_corrections']: + w=mut();del w['initial_corrections'][0];good&=expect('initial correction omitted',w,basep,tmp,'target map failed',results) + w=mut();w['initial_corrections'][0]['coefficient']=str(-al.F(w['initial_corrections'][0]['coefficient']));good&=expect('initial correction sign flipped',w,basep,tmp,'target map failed',results) + w=mut();w['initial_corrections'][0]['source']=next(r for r in range(2*v,n) if r not in removed and r!=w['initial_corrections'][0]['source'] and str(r) not in w['start_extra']) + good&=expect('initial correction reads a non-lender',w,basep,tmp,'not the lender',results) + w=mut();s=w['initial_corrections'][0]['source'];w['start_extra'][str(s)]=[1] + good&=expect('initial correction reads an entering helper',w,basep,tmp,'nonzero entrance frame',results) + # 12 wrong profile claim + w=mut();w['report']['local_profile']['1']+=1;good&=expect('wrong claimed profile',w,basep,tmp,'paid profile mismatch',results) + w=mut();w['report']['width_inventory']['9']+=1;good&=expect('wrong claimed width inventory',w,basep,tmp,'width inventory mismatch',results) + # 13 non-monotone frame / frame cut below start: lender warped to a frame not above its current chain + w=mut();w['B'][100][-1]=[];good&=expect('frame chain not monotone',w,basep,tmp,'frame not monotone',results) + Path(outp).write_text(json.dumps(dict(all_controls_rejected_for_expected_reason=bool(good),controls=results,seconds=time.monotonic()-t),indent=1)+'\n') + print('ALL CONTROLS OK' if good else 'CONTROL FAILURE');return 0 if good else 1 +if __name__=='__main__':sys.exit(main(*sys.argv[1:])) diff --git a/research/t74-low-alias-borrowing/vendor/pr2269/build_word.py b/research/t74-low-alias-borrowing/vendor/pr2269/build_word.py new file mode 100644 index 0000000000..8684d54b31 --- /dev/null +++ b/research/t74-low-alias-borrowing/vendor/pr2269/build_word.py @@ -0,0 +1,39 @@ +import sys,json,gzip +from collections import Counter +sys.path.insert(0,'.') +from emit_word import * +def main(canon,blocksf,witf,out,base_name): + w=json.loads(gzip.decompress(Path(canon).read_bytes())) + blocks=json.loads(Path(blocksf).read_text())['sources'][0]['blocks'] + wit=json.loads(Path(witf).read_text()) + S=build(w,blocks,wit);S=finish(S) + word=assemble(S,base_name) + ops=[x[5] for x in sorted(S['warps'],key=lambda x:x[5])];assert ops==list(range(1,len(ops)+1)),ops + del word['warp_order'] + v=S['v'];n=S['n'];restored=set(S['restored']);full=frame_basis(S['full']) + # explicit cleanup: inverse-reverse at FULL + fw=[] + byp={} + for x in S['warps']:byp.setdefault(x[0],[]).append(x[5]) + for g in word['A']:fw.append(g) + for p in range(len(word['B'])+1): + for op in sorted(byp.get(p,[])):fw.append(['warp',S['warps'][[x[5] for x in S['warps']].index(op)][1],op]) + if p=du else fb;E=span(E_basis) + assert len(E_basis)==du,'paid handoff not supported' + assert x['handoff_basis']==E_basis or span(x['handoff_basis'])==E,(op,) + warps.append([len(B),old,gauss[op],frame_basis(cur[old]),E_basis,op]) + val[old]=warp(val[old],op);cur[old]=E;mapping[new]=old + for target,c in x.get('handoff_echo_coefficients',{}).items(): + target=int(target);climb(target,E);add(val[target],val[old],Q(c));raise NotImplementedError('echo') + for d in deferred.get(i,[]):scalar(d) + for d in early_rewrites.get(i,[]):scalar(d) + if i not in skip and i not in removed_early_echoes:scalar(e) + for t in early_tail.get(len(w['B']),[]):scalar(t) + for r in range(v,2*v):climb(r,frames[w['final'][r]]) + return dict(w=w,out=out,corr=corr,warps=warps,val=val,cur=cur,removed=removed,active=active,frames=frames, + full=full,target_levels=target_levels,n=n,v=v,h=h,mapping=mapping) + +def finish(S,cold_restore=True): + """cold restoration (rp.py semantics, exact modular nomination replaced by direct exact solve).""" + w=S['w'];v=S['v'];n=S['n'];h=S['h'];val=S['val'];cur=S['cur'];frames=S['frames'];full=S['full'];active=S['active'] + out=S['out'] + def dyadic(q):return q.denominator&(q.denominator-1)==0 + def unit(q):return q and dyadic(q) and abs(q.numerator)&(abs(q.numerator)-1)==0 + cold=[r for r in active if not(v<=r<2*v) and len(w['frames'][w['final'][r]])6mY}xl2 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
@ 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