From ce6b3b1b2ebeab7b0ad4b112dd864814260e376c Mon Sep 17 00:00:00 2001 From: Dugongue <49054532+Dugongue@users.noreply.github.com> Date: Sun, 11 Oct 2026 19:57:52 -0700 Subject: [PATCH 01/10] Add files via upload --- .../appendix/static44/LICENSE | 201 +++ .../appendix/static44/META-SOURCES.json | 24 + .../appendix/static44/NOTICE-upstream.md | 70 + .../appendix/static44/PROOF.md | 61 + .../appendix/static44/README.md | 7 + .../appendix/static44/RECIPE.json | 168 +++ .../appendix/static44/SOURCE-MANIFEST.json | 16 + .../appendix/static44/audit_scalar.py | 55 + .../appendix/static44/build.py | 30 + .../appendix/static44/gk/gk_common.py | 94 ++ .../appendix/static44/gk/gk_word.py | 194 +++ .../appendix/static44/inputs/BASE535.json.gz | Bin 0 -> 36660 bytes .../appendix/static44/inputs/OLD-RECIPE.json | 1163 +++++++++++++++++ .../appendix/static44/inputs/RAW504.json.gz | Bin 0 -> 32146 bytes .../appendix/static44/replay.py | 9 + .../code/assemble_meta.py | 177 +++ .../code/audit_curvature.py | 35 + .../code/build_preload60.py | 48 + .../code/build_static44_portable.py | 30 + .../code/run_global.py | 24 + .../code/run_native.py | 40 + .../code/transport_compensation.py | 44 + .../docs/CONTEXT-SOURCES.json | 22 + .../docs/CONTEXT-SUBSTITUTION.md | 58 + .../docs/CURVATURE-CONE.md | 48 + .../docs/FILTERED-TRANSPORT.md | 61 + .../docs/PR535-README.md | 142 ++ .../docs/PRIVACY-ADAPTATIONS.json | 12 + .../docs/PROVENANCE.md | 26 + .../trace-curvature-preload/docs/RESEARCH.md | 13 + .../docs/TRACE-REFINEMENT.md | 92 ++ .../docs/TRACE-SOURCES.json | 17 + .../docs/TRANSPORT-NOTES.md | 11 + .../docs/TRANSPORT-SOURCES.json | 24 + .../evidence/ALL-TEXT-PREFLIGHT.json | 9 + .../evidence/BIT-INVOICE.json | 49 + .../evidence/CONSTRUCTION.json | 468 +++++++ .../evidence/CRLF-REPLAY.json | 64 + .../evidence/CURVATURE.json | 31 + .../evidence/EXACT-ASSEMBLY.json | 191 +++ 40 files changed, 3828 insertions(+) create mode 100644 research/trace-curvature-preload/appendix/static44/LICENSE create mode 100644 research/trace-curvature-preload/appendix/static44/META-SOURCES.json create mode 100644 research/trace-curvature-preload/appendix/static44/NOTICE-upstream.md create mode 100644 research/trace-curvature-preload/appendix/static44/PROOF.md create mode 100644 research/trace-curvature-preload/appendix/static44/README.md create mode 100644 research/trace-curvature-preload/appendix/static44/RECIPE.json create mode 100644 research/trace-curvature-preload/appendix/static44/SOURCE-MANIFEST.json create mode 100644 research/trace-curvature-preload/appendix/static44/audit_scalar.py create mode 100644 research/trace-curvature-preload/appendix/static44/build.py create mode 100644 research/trace-curvature-preload/appendix/static44/gk/gk_common.py create mode 100644 research/trace-curvature-preload/appendix/static44/gk/gk_word.py create mode 100644 research/trace-curvature-preload/appendix/static44/inputs/BASE535.json.gz create mode 100644 research/trace-curvature-preload/appendix/static44/inputs/OLD-RECIPE.json create mode 100644 research/trace-curvature-preload/appendix/static44/inputs/RAW504.json.gz create mode 100644 research/trace-curvature-preload/appendix/static44/replay.py create mode 100644 research/trace-curvature-preload/code/assemble_meta.py create mode 100644 research/trace-curvature-preload/code/audit_curvature.py create mode 100644 research/trace-curvature-preload/code/build_preload60.py create mode 100644 research/trace-curvature-preload/code/build_static44_portable.py create mode 100644 research/trace-curvature-preload/code/run_global.py create mode 100644 research/trace-curvature-preload/code/run_native.py create mode 100644 research/trace-curvature-preload/code/transport_compensation.py create mode 100644 research/trace-curvature-preload/docs/CONTEXT-SOURCES.json create mode 100644 research/trace-curvature-preload/docs/CONTEXT-SUBSTITUTION.md create mode 100644 research/trace-curvature-preload/docs/CURVATURE-CONE.md create mode 100644 research/trace-curvature-preload/docs/FILTERED-TRANSPORT.md create mode 100644 research/trace-curvature-preload/docs/PR535-README.md create mode 100644 research/trace-curvature-preload/docs/PRIVACY-ADAPTATIONS.json create mode 100644 research/trace-curvature-preload/docs/PROVENANCE.md create mode 100644 research/trace-curvature-preload/docs/RESEARCH.md create mode 100644 research/trace-curvature-preload/docs/TRACE-REFINEMENT.md create mode 100644 research/trace-curvature-preload/docs/TRACE-SOURCES.json create mode 100644 research/trace-curvature-preload/docs/TRANSPORT-NOTES.md create mode 100644 research/trace-curvature-preload/docs/TRANSPORT-SOURCES.json create mode 100644 research/trace-curvature-preload/evidence/ALL-TEXT-PREFLIGHT.json create mode 100644 research/trace-curvature-preload/evidence/BIT-INVOICE.json create mode 100644 research/trace-curvature-preload/evidence/CONSTRUCTION.json create mode 100644 research/trace-curvature-preload/evidence/CRLF-REPLAY.json create mode 100644 research/trace-curvature-preload/evidence/CURVATURE.json create mode 100644 research/trace-curvature-preload/evidence/EXACT-ASSEMBLY.json diff --git a/research/trace-curvature-preload/appendix/static44/LICENSE b/research/trace-curvature-preload/appendix/static44/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/trace-curvature-preload/appendix/static44/META-SOURCES.json b/research/trace-curvature-preload/appendix/static44/META-SOURCES.json new file mode 100644 index 0000000000..8cbd32f8bd --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/META-SOURCES.json @@ -0,0 +1,24 @@ +{ + "scope": "Actual source statements inspected as structural analogues; no Lean compilation or source theorem directly certifies the new circuit.", + "sources": [ + { + "relative_source": "Mathlib/LinearAlgebra/Matrix/Transvection.lean", + "sha256": "c8c60dfbda7a09877a884aa2c7ce385f24f5370bb2a456cc20aae872c7dd41ef", + "statements": [ + "mul_transvection_apply_same", + "mul_transvection_apply_of_ne", + "TransvectionStruct.reverse_inv_prod_mul_prod", + "TransvectionStruct.prod_mul_reverse_inv_prod" + ] + }, + { + "relative_source": "OAI/GroupTheory/Congruence/Elementary.lean", + "sha256": "dde2c70e97566d678e96c126476314c994ce4b68858b9aa6c484b9820e950bd8", + "statements": [ + "OAI.CoboundaryExpanders.Elementary.E_mul_apply", + "OAI.CoboundaryExpanders.Elementary.upper_E_mul", + "OAI.CoboundaryExpanders.Elementary.clear_step" + ] + } + ] +} diff --git a/research/trace-curvature-preload/appendix/static44/NOTICE-upstream.md b/research/trace-curvature-preload/appendix/static44/NOTICE-upstream.md new file mode 100644 index 0000000000..f42e0eed85 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/NOTICE-upstream.md @@ -0,0 +1,70 @@ +# Attribution and dependency notice + +Package: **`integer_mult_round21_rank4_delta`**. + +Copyright 2026 icekylinx. Local review and packaging used OpenAI Codex. + +## New work + +Prepared by **icekylinx with GPT-6 Astra assistance**. The new contribution is +the post-center timing and ordered composition of dirty gauges with rank-four +response kernels, including the 14 disjoint M-helper groups, explicit scalar +word, frame and cleanup treatment, independent local argument, physical global +integration, paid accounting, and combined conditional κ assembly. + +The same helper can first serve its own gauge and then donate to a larger +kernel because compensation occurs before the new pivot dirt is injected. +This ordering, its actual frame nesting, and its global use are the substantive +delta. Earlier gauge/kernel primitives and the SAME504 scalar construction +retain their original authorship. + +## Baseline + +[PR531](https://github.com/CrocSwap/integer-mult-bounds/pull/531), by icekylinx +with the disclosed GPT-6 Astra assistance, supplies the SAME504 construction +and the baseline package `research/direct-delivery504-global`. The final +baseline head is `e07a8a3f9f79c22113398a0c5dbbc7601f489b3e`; the scientific +files used here match the original Round20 pins. + +**The original PR531 NOTICE is retained separately and remains applicable.** +That notice records the scalar, geometry, controller, phase, wrapper, hosting, +and analytic ancestry. This short incremental notice does not replace it. + +In particular, DreamingOfClouds's PR484 response/kernel implementation and its +predecessors retain their source notices. Zhihao Chen's PR425 mutable-basis +lemma, the PR425/433/514 scalar lineage, and the previously credited source +and delivery contributions remain attributed through PR531's notice. + +## Adopted bit supplier + +[PR510](https://github.com/CrocSwap/integer-mult-bounds/pull/510), pinned to +`64edee18af02aab0c1696b677a0287dd0146381b`, is by **DreamingOfClouds with +Claude Opus 5.5 assistance via Claude Code**, as disclosed by that package. +Its R480 nine-stage bit endpoint is adopted as a cited conditional dependency. +It is not a new bit-side research result of this delta, and no cold replay +of that full bit pipeline was performed here. + +**The original PR510 NOTICE is retained separately and remains applicable.** +Its ancestry includes eumemic's PR493 carrier-skeleton word; PR503's R480 +dead-total change; chafreaky's PR443/444 replication pipeline; DaysSky's PR442 +whole-residual hosting and PR381 column checker; Zhihao Chen's PR386 geometry; +DreamingOfClouds's PR315 moment engines and pipeline adaptations; and Dylan +Crow's PR370 framework, with the assistance disclosures in those sources. + +The present PR510 mutable-source carryover exposition is by icekylinx with +GPT-6 Astra assistance. It expands the role-independent common-label argument +already present in PR472 and the mutable-basis lemma of PR425; it does not +claim those underlying ideas as new. + +## Comparison, evidence, and licenses + +PR493 is also retained as the former-bit-supplier control. PR533 is used only +for numerical comparison. A cited rate, reused certificate, or prior notice +does not imply a fresh replay in this package; the README states the completed +validation scope. + +Original source headers, notices, licenses, and pinned provenance remain in +force. This incremental notice does not relicense upstream material. New +Python research/audit files carry the Apache-2.0 notice stated in their source +headers. All reported bounds remain conditional on the listed inherited +interfaces. diff --git a/research/trace-curvature-preload/appendix/static44/PROOF.md b/research/trace-curvature-preload/appendix/static44/PROOF.md new file mode 100644 index 0000000000..1d43cf78f4 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/PROOF.md @@ -0,0 +1,61 @@ +# Filtered elimination and state-version transport + +These are sufficient compilation theorems. They do not assert that a desired low-cost factorization exists, that the searched family is complete, or that scalar rank alone determines the recurrence exponent. Every elementary operation and changed frame transition remains part of the actual invoice. + +## Theorem 1: elimination with reusable donors and reversed execution + +Let C be the observed target-response matrix on helper coordinates over a field. Suppose we have stages j=1,...,k. At stage j choose new pivots P_j, donor indices D_j disjoint from P_j, and relations between the current response columns + + C_j[:,p] = sum_{d in D_j} q[d,p] C_j[:,d]. + +No previously eliminated pivot may be used again as a new pivot or a donor. A donor may become a pivot at a later stage. Form U_j from the commuting shears d <- d-q[d,p]p. Then right multiplication by U_j changes only the pivot columns, setting them to zero, and leaves all other columns unchanged. Thus, by induction, C U_1 ... U_k has zero columns at every selected pivot, including pivots which previously served as donors. The products are invertible, with explicit inverse obtained by reversing the elementary operations and their signs. + +The actual physical prefix must execute the stage blocks in order k,...,1, since column states are multiplied on the left while the response map is on the right. This reversal is essential: merely concatenating algebraic discovery order is generally wrong. The numerical relations at later stages can be evaluated on the original remaining columns because only already-eliminated columns changed. + +For each helper, collect the frames of every stage touching it in physical execution order, followed by its original first-touch frame. Require this list to be nested. A pivot starts at its own elimination frame; other helpers start at their specified old entrance. Require all initial frames to be contained in their first physical touch. These are finite sufficient geometric tests. Regenerate the inverse background cleanup. If the background subsystem never reads output target registers, this cleanup restores every background coordinate for arbitrary initial dirt. Zero response of every warm pivot ensures its dirt never needs a forbidden zero-frame output compensation. Existing gauges may be retained only under explicitly checked separation or a proved read-before-injection order, not by ignoring overlap. + +The exact local resource signature is obtained register by register from the successive dimension differences in this list. Repeated equal frames cost zero; every positive difference contributes one child of that rank. A pivot's residual width decreases by its entrance dimension. This chain invoice is valid even when supports overlap and the simple sum of disjoint component invoices is not. Full wrapper and physical owner costs remain separate. + +Proof of the response assertion is the elementary column-update identity above and induction. Proof of geometric legality is exactly the nested-chain test at every instruction. Proof of restoration is inversion of the explicitly changed background product. There is no existential oracle in the construction. + +## Concrete application: the PR535 static quotient presentation + +The frozen PR535 construction has 40 static rank-one pivots, 112 post-center gauges and 56 rank-four post-center pivots. We leave its post-center construction unchanged and replace only the static response presentation. The new selection uses six line classes: + +| Frame | Pivots | Active donor list size | +| --- | ---: | ---: | +| 96 | 8 | 8 | +| 102 | 8 | 8 | +| 120 | 8 | 8 | +| 126 | 8 | 8 | +| 480 | 10 | 14 | +| 486 | 2 | 6 | + +This gives 44 static pivots. The actual scalar word loses exactly four rank-one children; all other local rank multiplicities remain identical. Residual inventory changes from 56 width-five, 152 width-eight, 296 width-nine to 56 width-five, 156 width-eight, 292 width-nine. + +This witness is a depth-one special case of the staged theorem: its selected supports do not need donor-to-pivot reuse. The broader nested search generated it, but we do not attribute its numerical change to deeper nesting. The gain here comes from choosing a different joint response presentation across line classes, rather than maximizing each public component in isolation. + +`build_static44_portable.py` recomputes every selected rational relation, retains the original downstream scalar operations and frame labels, regenerates cleanup, and checks source/result semantic hashes. It checks the actual nested frames, complete local histogram and dyadic scalar contract. `STATIC44-SCALAR-AUDIT.json` independently checks every one of the 728 formal columns in both orientations and rejects all 44 omitted-static-correction controls with the correct compensation held fixed. Arbitrary helper dirt is included among these columns. This is a checked local construction, not a claimed globally hosted bound. The final package may continue to use unchanged PR535 if the bit supplier still binds. + +## Theorem 2: compensation transport along exact register versions + +Split state into background X and outputs Y. Let an invertible background prefix act by X -> A X and leave Y unchanged. The old compensation is Y -> Y+D X. Then the exact identity + + [A on X] after [add D X to Y] + = [add (D A^{-1}) X to Y] after [A on X] + +holds on every input, including arbitrary helper dirt. Therefore compensation may be moved to another program cut by computing the inverse-version response D A^{-1}. One must factor the transported map into actual allowed scalar gates and check that every source and target frame can reach the chosen common frame and still reach their next uses. If those finite checks pass, the transformed program has precisely the same full scalar endpoint. It is not enough to compare clean-input columns or to reuse D without the inverse-version factor. + +For a sequence of elementary background gates, D A^{-1} is computed by the opposite column update, in the original prefix order. Thus this theorem supplies a constructive compiler pass with an exact rejection test. The untouched-register case gives a useful safe normal form: each dirty compensation read can be delayed up to the first instruction that touches its helper, while the target remains at frame zero. This special case needs no extra storage and preserves the frame-chain invoice. It is not claimed as an exponent improvement. `transport_compensation.py` implements this normal form on R480: all 480 helper dirt reads move to their last untouched versions, all 720 scalar columns agree exactly, and every deduplicated register frame chain is unchanged. The exact receipt is `transport-bit510/TRANSPORT.json`. This appendix does not claim a new native phase or global-program replay. + +## Bounded screens and scope + +On the original filtered504 source, 100 native nested-elimination trials were preserved; they reached up to 92 pivots and rank188, but became secondary when PR535 moved the frontier. No whole-profile gain is inferred from those counts. + +On the new binding R480 bit source, the exact post-center compensation screen rejected every individual helper under its specified first-B-frame schedule: 448 failed because a transported source frame was already above the target frame, and 23 failed the next-use containment test. The full transported compensator had 1273 incompatible support entries in that schedule. A separate exact screen of 120 additional non-root sum/difference lines, together with all 120 root lines, found no entry response circuit. These are bounded family failures, not a theorem excluding other cuts, joint cancellation, general frames, or other schedules. + +On PR535, all 112 post-center gauges already attain rank one in the intersection of their actual first frames, target first-use caps and donor-kernel caps. The remaining static census examined 27195 first-frame subspaces and found 12 nonzero-nullity line classes and no higher-rank candidate in that restricted interface. A bounded 100-seed presentation search yielded the checked 44-pivot witness above. No optimality claim follows. + +## Structural source references + +Mathlib's matrix transvection file supplies explicit left/right elementary update identities and reverse-inverse product identities. OpenAI's congruence elementary-matrix development supplies `clear_step`: an elementary update clears another entry while preserving an already-cleared prefix. We inspected these actual statements as structural models for the inductive invariant and product order. The new geometric compilation theorem and its changed provider were proved and checked here; they are not asserted to be direct imports or newly Lean-certified theorems. Exact source hashes are in META-SOURCES.json. diff --git a/research/trace-curvature-preload/appendix/static44/README.md b/research/trace-curvature-preload/appendix/static44/README.md new file mode 100644 index 0000000000..6aed83ec92 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/README.md @@ -0,0 +1,7 @@ +# Static44 local construction appendix + +Run `python -B replay.py --out NEW_DIRECTORY` from any working directory. This reconstructs the exact new static response presentation and checks all 728 scalar columns in both orientations, including arbitrary helper dirt, plus44 omitted-correction controls. Python standard library only. The output directory must not exist. + +The local profile changes by -4 rank-one children relative to PR535. The residual inventory becomes56 width-five,156 width-eight,292 width-nine. The global controller, owner charts, phase recipes and outer assembly are NOT replayed here. This appendix does not contribute a claimed final kappa gain. + +The attributed raw and baseline words and old recipe come from PR535 post-center-rank4-global. The gauge/kernel primitives come from PR531's attributed PR484 lineage; their original copyright/assistance notices are preserved. The new selection, replacement proof and constructor are our contribution. No new all-size or analytic interfaces are claimed discharged. diff --git a/research/trace-curvature-preload/appendix/static44/RECIPE.json b/research/trace-curvature-preload/appendix/static44/RECIPE.json new file mode 100644 index 0000000000..68c751bb56 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/RECIPE.json @@ -0,0 +1,168 @@ +{ + "selection": { + "kernel": [ + { + "E": [ + 96 + ], + "donors": [ + 250, + 251, + 256, + 257, + 266, + 267, + 302, + 303 + ], + "pivots": [ + 264, + 265, + 312, + 313, + 314, + 315, + 350, + 351 + ] + }, + { + "E": [ + 102 + ], + "donors": [ + 252, + 253, + 254, + 255, + 278, + 279, + 290, + 291 + ], + "pivots": [ + 276, + 277, + 324, + 325, + 326, + 327, + 338, + 339 + ] + }, + { + "E": [ + 120 + ], + "donors": [ + 238, + 239, + 244, + 245, + 268, + 269, + 292, + 293 + ], + "pivots": [ + 262, + 263, + 322, + 323, + 328, + 329, + 352, + 353 + ] + }, + { + "E": [ + 126 + ], + "donors": [ + 240, + 241, + 242, + 243, + 280, + 281, + 304, + 305 + ], + "pivots": [ + 274, + 275, + 310, + 311, + 316, + 317, + 340, + 341 + ] + }, + { + "E": [ + 480 + ], + "donors": [ + 286, + 287, + 288, + 289, + 298, + 300, + 334, + 335, + 336, + 337, + 346, + 348, + 358, + 360 + ], + "pivots": [ + 299, + 301, + 347, + 349, + 359, + 361, + 370, + 371, + 372, + 373 + ] + }, + { + "E": [ + 486 + ], + "donors": [ + 362, + 363, + 364, + 365, + 374, + 376 + ], + "pivots": [ + 375, + 377 + ] + } + ] + }, + "raw_semantic": "e00e571c80795516eff434392fe48f64ff430a866afd42608808e2f302064275", + "base_semantic": "39a1b5a6b237f52f59ebf55f39b22dc06292bc43403c04aa1f086a0277128b33", + "output_semantic": "f6183f32b354e0feec39170ee29bfad577af23e4697e9f25a0ad9dc2d5c2d9d4", + "profile": { + "1": 2204, + "4": 280, + "8": 8, + "3": 184, + "2": 728, + "6": 56, + "5": 56 + } +} diff --git a/research/trace-curvature-preload/appendix/static44/SOURCE-MANIFEST.json b/research/trace-curvature-preload/appendix/static44/SOURCE-MANIFEST.json new file mode 100644 index 0000000000..468918ea58 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/SOURCE-MANIFEST.json @@ -0,0 +1,16 @@ +{ + "audit_scalar.py": "d22159087c1d0df0edf452aae3a1a7a45bf2cde4ce6e177850e415f9620151e1", + "build.py": "31d68795916985e2abb3207b07c1d3e39ed3560f1b46f18ade0a509278c710dc", + "LICENSE": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "META-SOURCES.json": "b30c82ad1d707b68e84af85e90b1bab0e41e49ccacda3069b952c790092be920", + "NOTICE-upstream.md": "1547136e6d269fdcef2b68c10a97a786a79a4732a12738363f679bfb282430cd", + "PROOF.md": "d1dafe41a1698d6df575ec86f796bcba08c54fe14b6d69e78f5f6cff8b55de4a", + "README.md": "c4b3ce02012fe97598e76a77877541a8f3387ba4305cee600ee557a48b3493e8", + "RECIPE.json": "973f1975213398f2b711e8ce4eddece181d4cbea83be5b6b650115b9bc43f2eb", + "replay.py": "5b12ea184b3afde41b1028d1926a0d158f2f05585dae6d9024e31424c290bccf", + "gk/gk_common.py": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "gk/gk_word.py": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b", + "inputs/BASE535.json.gz": "edfffb8e8735e0d1f07c81d818022b705ef0889c2bccc193a2f7a661b9f7d390", + "inputs/OLD-RECIPE.json": "7e5c179246261edd9e1019e81e6e979537f02559da773b993a318f771cb7d763", + "inputs/RAW504.json.gz": "1c6144791dbedf6427e3ee7b4c24fb05b5bf407f6346592f50f8dd8d9638108d" +} diff --git a/research/trace-curvature-preload/appendix/static44/audit_scalar.py b/research/trace-curvature-preload/appendix/static44/audit_scalar.py new file mode 100644 index 0000000000..834e8b5103 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/audit_scalar.py @@ -0,0 +1,55 @@ +"""Independent exact scalar witness for a selected complex kernel word. +Uses immutable correct-word compensation for omission controls; no repaired +compensation is silently supplied to a mutant. No physical-hosting claim. +""" +import sys,json,gzip,hashlib,copy +from pathlib import Path +from fractions import Fraction as Q +from collections import Counter +p=Path(__file__).resolve().parent +path=Path(sys.argv[1]);selection=Path(sys.argv[2]);out=Path(sys.argv[3]);w=json.loads(gzip.decompress(path.read_bytes()));sel=json.loads(selection.read_text());v=len(w['ports']);n=2*v+w['report']['R'] +def ident():return[{r:Q(1)}for r in range(n)] +def apply(e,rows): + if e[0]=='scale': + _,t,a,b,*_=e;q=Q(a,b);rows[t]={j:q*x for j,x in rows[t].items()};return + _,t,s,a,b,*_=e;q=Q(a,b) + for j,x in list(rows[s].items()): + z=rows[t].get(j,Q(0))+q*x + if z:rows[t][j]=z + else:rows[t].pop(j,None) +def inv(e,dual=False): + e=copy.deepcopy(e) + if e[0]=='add': + e[3]*=-1 + if dual:e[1],e[2]=e[2],e[1] + else:e[2],e[3]=e[3],e[2] + return e +def replay(es): + rows=ident() + for e in es:apply(e,rows) + return rows +main=w['A']+w['cut']+w['B'];mx=replay(main);dirty=[{}for _ in range(n)] +for r in range(v,2*v):dirty[r]={j:x for j,x in mx[r].items()if j>=2*v} +for e in w['precondition']:apply(e,dirty) +comp=[] +for r in range(v,2*v): + for j,x in sorted(dirty[r].items()): + assert not w.get('start_extra',{}).get(str(j)),('nonzero-frame compensation',j) + comp.append(['add',r,j,-x.numerator,x.denominator,[]]) +cleanup=[inv(e)for e in reversed(w['A']+w['B'])if not v<=e[1]<2*v] +assert[e[:-1]for e in cleanup]==[e[:-1]for e in w['cleanup']] +program=w['precondition']+comp+main+cleanup;expected=ident() +for t in range(v):expected[v+t][t]=Q(1) +assert replay(program)==expected +back=ident() +for t in range(v):back[t][v+t]=Q(-1) +assert replay([inv(e,True)for e in program])==back +controls={} +for cl in sel['kernel']: + for h in cl['pivots']: + aa=[e for e in w['A']if not(e[0]=='add'and e[2]==2*v+h and e[1]>=2*v and e[-1]==cl['E'])] + assert len(aa)> p & 1: x ^= b[p] + if x: + p = x.bit_length() - 1 + for q in b: + if b[q] >> p & 1: b[q] ^= x + b[p] = x + return tuple(b[p] for p in sorted(b, reverse=True)) + + +def widths_of(word): + """residual width of every helper: 9 - dim(entrance frame); 9 when the word has no extension""" + R = word['report']['R'] if 'R' not in word else word['R'] + w = [L] * R + for r, E in word.get('start_extra', {}).items(): + assert 2 * V <= int(r) < 2 * V + R + w[int(r) - 2 * V] = L - len(basis(E)) + return w + + +def split_pad(p): + """a pad of rank p is paid as nested commuting children of rank <= 51 (so that 73^2 > 2*child^2); rank 1 stays 1""" + if p == 0: return [] + n = -(-p // 51); return [p // n + (1 if i < p % n else 0) for i in range(n)] + + +def tile(items): + """Bank tiling of unhosted residuals. items: list of (rep, helper, width); a bank has M = 73 cells. + * width-9 residuals (no wrapper acts on them): first fit in the given order, packed from offset 0, eight per bank, pad rank 1 + (PR #433/#442's tiling and routes [2, slot]); + * ENTERING residuals (width w < 9, paid wrappers, e = 9 - w spectators): banks of their own in which every entering helper is the ONLY + owner of its bank family in its invocation (the one-helper rule of PR #458 extended to banks): bank j holds the j-th entering + helper of each replica, residuals packed from offset 0 in replica order (at most one helper per replica, hence per invocation). + The spectators of an entering helper are the first e cells of the bank beyond every residual cell of the bank (the pad, which no call + uses for a residual, is paid as before: rank 73 - sum of widths; the spectators are borrowed inside it and not deducted). + Returns (assign, banks, pads): assign[(rep, helper)] = (bank, offset, width, pure, spectators) with pure = the bank holds only width-9 + residuals and spectators = () for width 9; pads = Counter of pad ranks (split into children of rank <= 51).""" + assign = {}; pads = Counter(); fill = [] + for z, (rep, h, w) in enumerate(items): # width 9: first fit, as PR #433 (all widths 9 reproduces it exactly) + if w != L: continue + for b, f in enumerate(fill): + if f + w <= M: break + else: + b = len(fill); fill.append(0) + assign[(rep, h)] = (b, fill[b], w, True, ()); fill[b] += w + nwide = len(fill); byrep = {} + for rep, h, w in items: + if w < L: byrep.setdefault(rep, []).append((h, w)) + cells = [0] * max((len(v) for v in byrep.values()), default=0); emax = [0] * len(cells); place = {} + for rep in sorted(byrep): # the j-th entering helper of every replica goes to entering bank j + for j, (h, w) in enumerate(byrep[rep]): + place[(rep, h)] = (nwide + j, cells[j], w); cells[j] += w; emax[j] = max(emax[j], L - w) + for j in range(len(cells)): assert cells[j] + emax[j] <= M, ('entering bank without room for its spectators', j) + for (rep, h), (b, off, w) in place.items(): + assign[(rep, h)] = (b, off, w, False, tuple(range(cells[b - nwide], cells[b - nwide] + L - w))) + fill += cells + for f in fill: + for part in split_pad(M - f): pads[part] += 1 + return assign, len(fill), pads + + +def route(off, w, pure, sp=()): + """owner route of a banked helper residual: PR #433's [2, slot] for width 9 (pure width-9 bank); an entering helper (w < 9) is + [2, offset, width, [spectator cells]] with e = 9 - w spectators""" + if w == L: assert pure and not sp; return [2, off // L] + assert not pure and len(sp) == L - w; return [2, off, w, list(sp)] + + +def unhosted_stock(widths): + """live stock and padding histogram of the unhosted (parent) template, per stage x nine""" + R = len(widths) + _, nb, pads = tile([(rep, h, widths[h]) for rep in range(T) for h in range(R)]) + return DATA + L * nb, Counter({r: z * L for r, z in pads.items()}) diff --git a/research/trace-curvature-preload/appendix/static44/gk/gk_word.py b/research/trace-curvature-preload/appendix/static44/gk/gk_word.py new file mode 100644 index 0000000000..15782ba625 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/gk/gk_word.py @@ -0,0 +1,194 @@ +"""Apply a frozen selection (shared-donor kernel + entrance gauges) to PR #433's complex word. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +usage: gk_word.py BASE_FULL-WORD.json.gz SELECTION.json OUT_FULL-WORD.json.gz +An empty selection ({}) copies the input byte for byte (regression anchor). + +selection = {"kernel": [{"E": [x], "donors": [h..], "pivots": [h..]}..], "gauge": {"h": [x..]}} (h = helper index 0..R-1) +Kernel (PR #417/#435/#434/#440): a pivot starts at E; every donor receives donor += -q * pivot at frame E before the main +word, where col(pivot) = sum q_d col(d) are the exact dirty-response columns; the pivot's frame-zero compensation vanishes. +Gauge (#401/#408-#416): the compensation target += -C[t,h] * helper of helper h is executed at frame E_h as the first gates +of the main word; h starts at E_h and its targets climb to the level L_t = largest E over their entering helpers. +The exact verification is the arbitrary-dirt replay of audit_gk.py; this module also checks the structural conditions.""" +import copy, gzip, hashlib, json, sys +from collections import Counter, defaultdict +from fractions import Fraction as Q +from pathlib import Path +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from gk_common import * + + +def apply_op(e, rows): + if e[0] == 'scale': + _, t, a, b, *_ = e; q = Q(a, b); rows[t] = {j: q * x for j, x in rows[t].items()} + else: + _, t, s, a, b, *_ = e; q = Q(a, b) + for j, x in list(rows[s].items()): + z = rows[t].get(j, Q(0)) + q * x + if z: rows[t][j] = z + else: rows[t].pop(j, None) + + +def inverse(e, F): + e = copy.deepcopy(e) + if e[0] == 'add': e[3] *= -1 + else: e[2], e[3] = e[3], e[2] + e[-1] = list(F); return e + + +def responses(word): + """dirty-response columns col[h] = {target: coefficient} of the unmodified word (after the frame-zero preconditioner)""" + R = word['report']['R']; n = 2 * V + R + rows = [{r: Q(1)} for r in range(n)] + for e in word['A'] + word['cut'] + word['B']: apply_op(e, rows) + dirty = [{} for _ in range(n)] + for r in range(V, 2 * V): dirty[r] = {j: x for j, x in rows[r].items() if j >= 2 * V} + for e in word['precondition']: apply_op(e, dirty) + col = [{} for _ in range(R)] + for r in range(V, 2 * V): + for j, x in dirty[r].items(): col[j - 2 * V][r - V] = x + return col + + +def first_frames(word): + first = {} + for seq in (word['A'], word['B']): + for e in seq: + F = basis(e[-1]) + for r in [e[1]] + ([e[2]] if e[0] == 'add' else []): + if r >= 2 * V: first.setdefault(r - 2 * V, F) + return first + + +def solve_relation(col, donors, p): + """exact rational c with col[p] = sum_d c_d col[d]; None if p is not in the span""" + ts = sorted({t for d in donors for t in col[d]} | set(col[p])) + idx = {t: i for i, t in enumerate(ts)} + Mx = [[Q(0)] * (len(donors) + 1) for _ in ts] + for ci, d in enumerate(donors): + for t, x in col[d].items(): Mx[idx[t]][ci] = x + for t, x in col[p].items(): Mx[idx[t]][-1] = x + piv = []; r = 0 + for c in range(len(donors)): + pr = next((i for i in range(r, len(Mx)) if Mx[i][c]), None) + if pr is None: continue + Mx[r], Mx[pr] = Mx[pr], Mx[r]; q = Mx[r][c]; Mx[r] = [x / q for x in Mx[r]] + for i in range(len(Mx)): + if i != r and Mx[i][c]: + f = Mx[i][c]; Mx[i] = [a - f * b for a, b in zip(Mx[i], Mx[r])] + piv.append(c); r += 1 + if any(Mx[i][-1] for i in range(r, len(Mx))): return None + assert r == len(donors), 'donors must have independent response columns' + return {donors[c]: Mx[i][-1] for i, c in enumerate(piv) if Mx[i][-1]} + + +def span(U): + s = {0} + for b in U: s |= {x ^ b for x in s} + return s + + +def perp(x): return basis([z for z in range(1, 512) if not (x & z).bit_count() % 2]) + + +def profile(word): + """local paid profile of a gk word by direct simulation of the frame chains (second implementation: audit_gk.py)""" + R = word['report']['R']; n = 2 * V + R; P = word['ports'] + cur = {} + for r in range(n): + cur[r] = (P[r],) if r < V else ((basis(word['start_extra'][str(r)]) if str(r) in word.get('start_extra', {}) else ()) if r >= 2 * V else ()) + paid = Counter() + def climb(r, F): + F = basis(F); o = cur[r] + assert basis(list(o) + list(F)) == F, ('frame violation', r, o, F) + if o != F: paid[len(F) - len(o)] += 1; cur[r] = F + lev = {int(t): basis(E) for t, E in word.get('target_levels', {}).items()} + for seq, part in ((word['A'], 'A'), (word['B'], 'B')): + if part == 'B': + for r, f in zip(word['centers'], word['center_frames']): + assert cur[r] == basis(f), 'centre frame' + served = sorted({lev.get(e[1] - V, ()) for e in word['cut'] if e[2] == r}, key=lambda E: -len(E)) + o = basis(f) + for Lv in served: + assert span(Lv) <= span(o), 'served levels must descend inside the centre frame' + if Lv != o: paid[len(o) - len(Lv)] += 1; o = Lv + for t in range(V): assert cur[V + t] == lev.get(t, ()), 'target level at the centre scatter' + for e in seq: + for r in [e[1]] + ([e[2]] if e[0] == 'add' else []): climb(r, e[-1]) + for r in range(n): climb(r, FULL if (r < V or r >= 2 * V) else perp(P[r - V])) + return paid + + +def global_profile(local, widths): + """unhosted nine-stage profile: local x (stages*replicas) + the 240*8 idle children per rank + bank pads""" + live, pads = unhosted_stock(widths) + g = Counter({r: z * L * T for r, z in local.items()}) + for r in (16, 8, 32, 8, 48, 8, 48, 32, 16): g[r] += 240 * T + g.update(pads) + return live, g + + +def build(word, sel, check=True): # check=False only for the mutation controls that must be caught by the certifying scripts + if not sel: return word + w = copy.deepcopy(word); R = w['report']['R'] + col = responses(word); first = first_frames(word) + gauge = {int(h): basis(E) for h, E in sel.get('gauge', {}).items()} + classes = sel.get('kernel', []) + pivots = {p for c in classes for p in c['pivots']}; donors = {d for c in classes for d in c['donors']} + assert not (pivots & donors) and not (pivots | donors) & set(gauge) and len(pivots) == sum(len(c['pivots']) for c in classes) + # --- structural conditions ------------------------------------------------------------------------------------- + for h, E in gauge.items(): + assert not check or span(E) <= span(first[h]), ('gauge entrance outside the first frame', h) + levels = defaultdict(list) + for h, E in gauge.items(): + for t in col[h]: levels[t].append(E) + for t, Es in levels.items(): # pairwise nested comps per target + for a in Es: + for b in Es: assert not check or span(a) <= span(b) or span(b) <= span(a), ('non-nested gauges at target', t) + lev = {t: max(Es, key=len) for t, Es in levels.items()} + for k, r in enumerate(w['centers']): # chain per centre, inside the centre frame + served = {lev.get(e[1] - V, ()) for e in w['cut'] if e[2] == r} + for a in served: + for b in served: assert not check or span(a) <= span(b) or span(b) <= span(a), ('centre chain', k) + top = max(served, key=len) + assert not check or span(top) <= span(basis(w['center_frames'][k])), ('level outside centre frame', k) + # --- gates ---------------------------------------------------------------------------------------------------------- + gates = [] + for h, E in sorted(gauge.items(), key=lambda kv: (len(kv[1]), kv[0])): + for t, x in sorted(col[h].items()): + c = -x; gates.append(['add', V + t, 2 * V + h, c.numerator, c.denominator, list(E)]) + pre = [] + start = {2 * V + h: list(E) for h, E in gauge.items()} + for cl in sorted(classes, key=lambda c: (len(c['E']), c['E'])): + E = basis(cl['E']) + for x in [*cl['donors'], *cl['pivots']]: assert span(E) <= span(first[x]), ('kernel entrance outside the first frame', x) + for p in cl['pivots']: + rel = solve_relation(col, cl['donors'], p) + assert rel is not None, ('pivot response not in the donor span', p) + start[2 * V + p] = list(E) + for d, c in rel.items(): + q = -c; pre.append(['add', 2 * V + d, 2 * V + p, q.numerator, q.denominator, list(E)]) + w['A'] = gates + pre + w['A'] + w['cleanup'] = [inverse(e, FULL) for e in reversed(w['A'] + w['B']) if not V <= e[1] < 2 * V] + w['start_extra'] = {str(r): list(E) for r, E in sorted(start.items())} + w['target_levels'] = {str(t): list(E) for t, E in sorted(lev.items()) if E} + if not check: return w + prof = profile(w); widths = widths_of(w) + live, g = global_profile(prof, widths) + w['report']['local_profile'] = {str(k): z for k, z in sorted(prof.items())} + w['report']['global_profile'] = {str(k): z for k, z in sorted(g.items())} + w['report']['live'] = live + w['report']['entrance_rank'] = sum(L - x for x in widths); w['report']['entering_helpers'] = sum(1 for x in widths if x < L) + w['report']['selection_sha256'] = hashlib.sha256(json.dumps(sel, sort_keys=True).encode()).hexdigest() + return w + + +def dump(w): return gzip.compress(json.dumps(w, sort_keys=True, separators=(',', ':')).encode(), mtime=0) + + +if __name__ == '__main__': + src, selp, out = map(Path, sys.argv[1:4]) + sel = json.loads(selp.read_text()) + if not sel: out.write_bytes(src.read_bytes()); print('empty selection: copied byte for byte'); sys.exit(0) + word = json.load(gzip.open(src)); w = build(word, sel); out.write_bytes(dump(w)) + print('gk word: entering helpers', w['report']['entering_helpers'], 'entrance rank', w['report']['entrance_rank'], + 'local profile', w['report']['local_profile'], 'unhosted live', w['report']['live']) diff --git a/research/trace-curvature-preload/appendix/static44/inputs/BASE535.json.gz b/research/trace-curvature-preload/appendix/static44/inputs/BASE535.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..bcc1647b7d4ad8ae3ae2acbb31d3591c0d49467f GIT binary patch literal 36660 zcmYhi1yCJL&@Oy%LU0Jd-GjTkySuv`+}+*XCAho01PJZ~cXx+_{k-3IZ{2@uYJ0Y7 zr+as&Yx#M1N%MO>)Bn6}{ruSabmT0iFP(e{>sWYD$GP(R ze5wqbz$m&?uZ+8d*`EK=+psuYjs!vNu#~1HXsrz=ZI0=z%!7jUby} zGw2wLI&0~E9m9kqknKJ<_Pt>F9)AWLTqrV24veyzFYvO4h|TXVOt%T0*<$d8Iri67 zK_`;MAg6Z|ioVv}Pn6q{SiM!r0e;W=OL~FSdn4%T#XtO9Erq3z_e-be7pB4)_m?fa zqd-BTFJlt?@pUEUE&1ChEW+6yMVAYwB<6D%`?ip@gcyWoFA1vJ@$;~&*GJ3o!SO%Z z#U;3rua7oTdl6ut@2*OiSxj3Az|Q*haBiSFO?@B&5n)>K;);7rJZ*nPZnwT8_)1RO z@`JxrKhV#A*Y?Emfi9+P{NMyW(3W!AmSW6UyHlN*P==O4SKLiq$2@h+v!)ev$7W5Q+X{;~8zS3!~f z9axup_mguTz~IN?FQ9!2;2|8?i`jm}Gi74o{?+Zz z2ZDuA=O=^b1>}^*>j~N|l&iCbiO~+|m&Xc(jH&V!iSQ1bg`rz0WJKDcm1hNCr!Au# zD**NJO7s1<-!@>C|9z4#JM{5X=-@E&N=t+x_F%SJodZCg_#MPMt?z;^5k1lR%DmaZ zSZ6YxYb8F7x?9p)Wx1tHJCBqEA|Ge`ACGx{pVEqTyx-h}ZcLN!Q^ho*=O-+l&Gv&N zF2+ka>`~W{#2h@Hh59^HSyZd?YWyL<|hI6ygm~ zBn`f044;ke#`cX1bel=;xJ2eKtQR1i3Vk2^EdZ3exs}t`t)62x zDTwT*t>C6paVAb%mQ-|G1qz^4RC$W{=43LU!>_RVM0#({d?laP;WGcCv%Pt6R)>eH zW;JYtxR%Iy3Cs?;_hQ|$g#}tW9lg)vu^YPaIJW6;uKP|Su83gNDC6ujG1*3_unioI zX3YPES*bH;!=xba;rOFDyiE`n$j=pUuvv2Ey~#u6*x`HgFN^WqCnfi|v-g*FGXxKd zUJOfUJQH`{plG}4%Excp4aDnpb3K>&ieC7Cbr3vhkx!3hXqG%cz~#xyFYJR?M6PCt zzV1V);2sBaSN|g}bO_`FE&jDJP$hZ;ItBlR)|#s#a30Z` zt08DwSn1ixLS!_!r`-x7@9ZSVQiQ3d2-<@Ix^)obWK|Tl1i(-8Qua7iPv=(TwUnRL z6WsUm+ydlttvXyQjNMI^JLD9Y<*`%hV+O0@@L?Ke(?g6Df8oSPG8*!1EWoMS{FZFA zLekn1VBaPRB2{t4Ig>L%hoI_~Jwf6!;|ydTKOCB&C|Iox za<|{y+M*d@j_icVS(TW{5j)FLxJX$|JW;$?mzKuM%ZPvp<^PLr#@De?fcuYi>oz2T zhuK=LfmM9g*I>cYV_32DgD2@kf^1gRjF;yGMr7=G$SG}_<8-K+)2NFg_<=iq67j5cIR|n1%V&5wH zb;Zy>Q4i@m%e=bC`UvVN-)c;pUL#!3g}9d4t#$%-qRcxf2fq6@dZ84&JKmCq87HHo z!@5DPpp(6oTeEWLy?D?bv*BfDC&$rF<5=ez%*b6D!SgHY!1_K0imQLvs5LYpba>Mn z&iV1xlAsN-!M^^-XS5k3+{XTg-me`A{lB?HhV}FFb~}J zM}KG+=K}fm@0P4dF9AxT>h3 z)z^{+4B2|Da^g8qIn*7TuxL$_XVjD5Y!tdrN0K%@=6$3K5EsiWIGRVPg41f02#?$4 zRcEPazI@OTGLy#%r%?r!VQ%UPBmpCStR@nO+p{V9*l}XP}H}wqB<0kM)(67G%F1wUVoccbuIrzM$YY%Pga+xV-P% zwjp+%Djb(VJ54E}^ASXEyL=BgEgj_L&gs)z6wv49ATuH#gj7ykt#~LulO1o1*}OnL zg6sjw3qNQ3+ftHaFFu}$UoP)+C=a}3{Nks}MKhn)sh_Kr(H+E}os*yTzv=0&_AT&T z{Yw{(gh+Hs9zJghlxn)``8R~!m$0wjv@Z)f%rOT3E&CsVUN!}kr>&i{KJ)aJ+ql7D ztp%2kj`$Wf`W98`=FtH`OYYr&*`W)rcoPN;RDO-*dYhtX)DGfNK9GoZ9prr~$7o`{ zo!_8zRzUjH`ud(J=n#@qQYt5)0$y<%9ARzs6VL7nfn`V`%Pf?Uh&{$>zSy^QDe^Gt zC~=q$v9WtA_8+{Eu_H#S=>_D!Y%S-N zLY8KofvW*4s5KF{IPP$4m8R_bDo;lET5o(iLPaC9zc|TnpW~+u-y-9`|3iZ+k#dS* z)^L-J+r4*T>n`M$V_S9dixwz1MOYR)2~vET9EC|( zO_O&h6EYm3tU=L-^)SmgBdmS?-^exbzmaRPaaT^J%+As$zO42V)JNw0P#MDH{#cc+jjJd_Qt9TPfdD%1v zeJBL#&V+GVU!CyyWEqkDhZ~1`n8x0^)hNuC(0;Zs?C`RMT5i)eoxq*z{hKdu7yN3! z5UG@767y|O@midsZhg%@XF7{Q6mgjz-%Fp5L1{l`oUrwv35RN;0oBeX=F!&wSptJf3K8#Z)DNUSNP(kzxf%#lDhBE>7L&sVr zGTI9*Y+T9CBGI<)l>Z8Ln{Ntex58%;;_*{H*o8k!JfJqOF;u?$y~W3 zl5o2gG}EZnbVvvX~+!`flUKPAZNa((KbG zx8RWuvv5CBXP>0I`oEmIKci&KIZdCmAKkAz4d1od<93En1oox-n}fZ0Q0X(^)%Xc0 z2aueM#v?07=JqS>G7M=T#c{mAKP8pFy{ZMb{1}dE)XIG-xwGwGS4KC^8L3Wd4JBYt zN$23UGrG8o=zl`_CNFyu=5=MaIh<8fcE>fq$(kXr5sNY81^2Ao0<;8>4S^D zw8P}svgCGRbj#DI*8a;i-mFc-gO&ch5!CMDVvK%T zzV~*}>u-+mMwlsa`}b5V^A(tU!D}BnKKfAP|8XUjz~U3q0Yv0l1vIOt&(ed>xH9c6 z+e{Wlz`e^iOal(@7~|9RZM161;`EHyFb1Mf!d>I~e)|X}LEKb%m3)*GFO@AR)_PVFV$X1ORoTbNgPaMQaCJHIe)+j4kLSq!+N-LYu9#6LDVMvr>X9T`1`b1fA<1?_;HrSN^QVye;AgD_x*@7c|1oU2RIbdVlH?g7IF}evSp9bz`ysD zAg4A@*)6BSOLy!id7+TJxLh|%irA9{Z6wO5JtQGASOL6{w~)D5dUH~j%b!(0DTKmV z=y)r8)Ypz`QK-B5|8f#+5*I#Elq_PE;#$Ox4`cmZ$3^*Li}Gp2t^4Uej4B*|W%6EL z*GNbbR9I+~^;-51_kiBKHBaVrtDURq;<~OUwfL?}9PbHX=@2}t#PGbQYw@kE)8fyH z&kyrb^=OhHqwKUVkiE6l9_MDnvfNJPq!-B#tLi&psBz|TGBiE86XxPOKN55@sf0NE z?P=ub@4B0t1LC}SvD-4z)FVCrN5#+4kE^;5?ko7`k2BEcJjgE#$;N`8__K2Ia~i5f zr1st~>tXAW+HO(u;Xf$#;YdbLWyxyu5vTr5u3fV8Yd!0%)#~oFTP{ENbURxRE%H|F z90M@;z`%|YUB6rT_Zxsx?;C^MgPW7{@X81XwdC(BOf_L(EyN%2?C%GxP_!DnJ8pWi zYG(M(>BqqWF1Q^Ne4D;I=Ql_OV4z@EqF30rot7pOjLzD=+A1+vlwXi$mc?dhiJF6B zt5p2vf?yyP`fJW5gmCg`;<#Pbq!n;PrA%_GEeRtN%UBH?zy5r5{9Ud>ExZF z$Y=m+xDcYoa$Ew%t|E%q)CeXrowpC7WOzS(q{+HSTP9Y~z~!109n_S#;ioAwRt;;e)BWI|1G;sif<0~?&}4o#6w63+*l=Y-2`=fTexd!QZFfhj(-$D^`LpBK7i z+}CLOO&uX$`nR-zqmTXWNe%0wDq2;+W?wh~cMM4E3g6g1oh_686HDMSqMJkziS4Bn4EG^*ljjRr1 zuzvzOV?}4Y4dMD!l2Mk4BD;=}OOmyhkLU4oa9L$5kX~AmE zWs)htN>wZZ&Fa2$q*ogb{BR#`n`xEFh%EyGoh`<(89R0gXem^>*!Y@EqcArBigiM& zl{QI+*I+2v%ji}LwZG=kkC6**WJcHvIIzbXMQAEal16!EP+%GdHDXGceSTFkJ{bQB z@?1-hmnyKd0vh3Za66WVMXdb&{b-D=LCJiNc9x~G;$t;+%}X@cH=tU$@3^7lxW{q% z>?&T;Be}SlGh{L-eH3J8J4mz_UXaNk zoR{%P_H@=m<&{o?ls#C_JB5T3`?h)q4~I+YbeY0E4~FZ7$9?H5QgXlU=xNKz+nRmD zLx-E%Xq%nD6QqQ(n_%ho4w2~yPjtu$G8QaErwuCTGo;kvUwV1^zhJ22M{eqZTQkp< z?9oPGYbgh`a@zyb^7UTHZ8LXs&T`$O#~>#Y=2ZFLH~Xvi$u;*Ra$~%m?92g*^07p2 z1bYMA{dlrTqX@V7`6J_sLrb`$p;sgh9WxXL3_<9`Jwk`fpt?Uw&jTnV!m9wn#=gpt zAybmF$xrOx3DbVz|#F$gO`Q^?|d0!hnU%E_P-^Zt)Y zf}B85kUC#cP$`NYe-W+LLKPdv5GDW>=n`aBCroBtC>VMgkY3|F0~;C;Yif;E^zmk= z^^)fxfof$BOz|y8E?|}7ccF}YQkK~iE_NuqReffu!hosOO#8XF4AVhB!jSkFA@!$% z)$YuhFpI7y25pzY1Hv-P8zG>Twc2|Jh#W`dWEXcQS#nNIn+6J%;M(=~gq-JLQ9G|- z)6!qBuruTPyKuMLsv$t(^R|l-`hhdpb+)W%ABF-VRenu!74d|BpWTy7d5VVoq-~)m zR?XOrSVXS1lN&5mF@)f~#X>|ypa{4`S^Z0lS2|fhu_IE*uWQqZ?VBNTQpx|cnD=@* zUFe$r7FM&(hZj44LW;~!*Y#a(@L^DFK(pe85+!xwEg`|#Y`-lQkKy*)sXE2MRr)e8 zD{|Q*hWi4)R5hphwsJ2s8i&~Y4=>F-U(VCu&_B2Ngf$4bT+KNo*P*SJdN!a!Y4f(X z86$zoDMQ7Tq0Go0+9OAAJU`!<=}T6WgD>xtsMCK4hM*Ao;W0O$z*Y~{5T@u(*v0F+SCx3G7Uz{_pfktLKA zx~!f3=KBQ#SRt96Q}s|02Qa`LnoKdnX$t72N9Sdh<(W*TKg-GfD9qcd4gbJoluXd0 zp;EyU6k~w*xBwHdR6>h^y;#Es-FG7v6{_zZeQF_@1!Gm^IJP3exY`X_Y$2Y9lJod0 zxgroZ*-2i*7uCvlSm8qnnU<@qS_B(0fl8VnxEQ+$;yoJ_M%_g|pk`#hQ zjLw*aItG-|H^w$53bMFU#CHRK%2q_;%-{-Br*305Ja3p7?-yJf%HA=}gsJE6zMmv1 ztORO3-r`}oiH)88$s%%S3u&%da} zw6*`JMf2s(#e*Q6KJL-$B!y~w!#J8!cHp_Vu=8m(O!A)_n1am7!EBBXq4K2UfPKt& zC37LHlb$Ibb$((MFFz;G|5~HiLz4|Icd9(tDGv-5aYv`$v> zu!|EH3sL+KRDPS*xF%2jaHWH{>gukcKR)NNSs42YZS52w%gpGiziH*WuFL0IZu{ht zowLap3m@yC=g7b6>vzPr8NsM?R5IW}^+Ble@~za6_2>@g)|m6HZpsei&d^MAV32L^ z=bby@BmeV=!AA|`{Jw4T3EjA^PRq5gi=^THlH*ey#0=3FY#_NeE)9MC$fOR>T2?#Z^5˟K1kR3_R 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∋=w3A^sLSjPY%Bh? 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 literal 0 HcmV?d00001 diff --git a/research/trace-curvature-preload/appendix/static44/inputs/OLD-RECIPE.json b/research/trace-curvature-preload/appendix/static44/inputs/OLD-RECIPE.json new file mode 100644 index 0000000000..52d4b5f382 --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/inputs/OLD-RECIPE.json @@ -0,0 +1,1163 @@ +{ + "source_sha256": "1c6144791dbedf6427e3ee7b4c24fb05b5bf407f6346592f50f8dd8d9638108d", + "selection": { + "kernel": [ + { + "E": [ + 510 + ], + "donors": [ + 242, + 243, + 244, + 245, + 254, + 256, + 266, + 267, + 268, + 269, + 270, + 271, + 278, + 280, + 282, + 283, + 290, + 292, + 294, + 295, + 306, + 307 + ], + "pivots": [ + 255, + 257, + 279, + 281, + 291, + 293, + 302, + 303, + 304, + 305 + ] + }, + { + "E": [ + 504 + ], + "donors": [ + 238, + 239, + 240, + 241, + 250, + 252, + 314, + 315, + 316, + 317, + 318, + 319, + 326, + 328, + 330, + 331, + 338, + 340, + 342, + 343, + 354, + 355 + ], + "pivots": [ + 251, + 253, + 327, + 329, + 339, + 341, + 350, + 351, + 352, + 353 + ] + }, + { + "E": [ + 486 + ], + "donors": [ + 262, + 263, + 264, + 265, + 274, + 276, + 310, + 311, + 312, + 313, + 322, + 324, + 362, + 364 + ], + "pivots": [ + 275, + 277, + 323, + 325, + 363, + 365, + 374, + 375, + 376, + 377 + ] + }, + { + "E": [ + 480 + ], + "donors": [ + 286, + 287, + 288, + 289, + 298, + 300, + 334, + 335, + 336, + 337, + 346, + 348, + 358, + 360 + ], + "pivots": [ + 299, + 301, + 347, + 349, + 359, + 361, + 370, + 371, + 372, + 373 + ] + } + ], + "gauge": { + "224": [ + 6 + ], + "225": [ + 6 + ], + "226": [ + 24 + ], + "227": [ + 24 + ], + "228": [ + 30 + ], + "229": [ + 30 + ], + "230": [ + 30 + ], + "231": [ + 30 + ], + "232": [ + 24 + ], + "233": [ + 24 + ], + "234": [ + 6 + ], + "235": [ + 6 + ], + "236": [ + 6 + ], + "237": [ + 6 + ], + "246": [ + 6 + ], + "247": [ + 6 + ], + "248": [ + 6 + ], + "249": [ + 6 + ], + "258": [ + 6 + ], + "259": [ + 6 + ], + "260": [ + 24 + ], + "261": [ + 24 + ], + "272": [ + 24 + ], + "273": [ + 24 + ], + "284": [ + 30 + ], + "285": [ + 30 + ], + "296": [ + 30 + ], + "297": [ + 30 + ], + "308": [ + 30 + ], + "309": [ + 30 + ], + "320": [ + 30 + ], + "321": [ + 30 + ], + "332": [ + 24 + ], + "333": [ + 24 + ], + "344": [ + 24 + ], + "345": [ + 24 + ], + "356": [ + 6 + ], + "357": [ + 6 + ], + "366": [ + 6 + ], + "367": [ + 6 + ], + "368": [ + 6 + ], + "369": [ + 6 + ], + "378": [ + 6 + ], + "379": [ + 6 + ], + "380": [ + 6 + ], + "381": [ + 6 + ], + "382": [ + 24 + ], + "383": [ + 24 + ], + "384": [ + 30 + ], + "385": [ + 30 + ], + "386": [ + 30 + ], + "387": [ + 30 + ], + "388": [ + 24 + ], + "389": [ + 24 + ], + "390": [ + 6 + ], + "391": [ + 6 + ], + "392": [ + 6 + ], + "393": [ + 6 + ], + "394": [ + 6 + ], + "396": [ + 6 + ], + "400": [ + 6 + ], + "401": [ + 6 + ], + "402": [ + 6 + ], + "404": [ + 6 + ], + "408": [ + 6 + ], + "409": [ + 6 + ], + "410": [ + 6 + ], + "412": [ + 6 + ], + "416": [ + 24 + ], + "417": [ + 24 + ], + "418": [ + 24 + ], + "420": [ + 24 + ], + "424": [ + 24 + ], + "425": [ + 24 + ], + "426": [ + 24 + ], + "428": [ + 24 + ], + "432": [ + 30 + ], + "433": [ + 30 + ], + "434": [ + 30 + ], + "436": [ + 30 + ], + "440": [ + 30 + ], + "441": [ + 30 + ], + "442": [ + 30 + ], + "444": [ + 30 + ], + "448": [ + 30 + ], + "449": [ + 30 + ], + "450": [ + 30 + ], + "452": [ + 30 + ], + "456": [ + 30 + ], + "457": [ + 30 + ], + "458": [ + 30 + ], + "460": [ + 30 + ], + "464": [ + 24 + ], + "465": [ + 24 + ], + "466": [ + 24 + ], + "468": [ + 24 + ], + "472": [ + 24 + ], + "473": [ + 24 + ], + "474": [ + 24 + ], + "476": [ + 24 + ], + "480": [ + 6 + ], + "481": [ + 6 + ], + "482": [ + 6 + ], + "484": [ + 6 + ], + "488": [ + 6 + ], + "489": [ + 6 + ], + "490": [ + 6 + ], + "492": [ + 6 + ], + "496": [ + 6 + ], + "497": [ + 6 + ], + "498": [ + 6 + ], + "500": [ + 6 + ] + } + }, + "rank4_groups": [ + { + "E": [ + 389, + 96, + 24, + 3 + ], + "donors": [ + 472, + 473, + 474, + 476 + ], + "pivots": [ + 475, + 477, + 478, + 479 + ], + "relations": { + "475": { + "472": "1", + "473": "1", + "474": "-1" + }, + "477": { + "472": "-1", + "473": "1", + "476": "1" + }, + "478": { + "472": "-1", + "474": "1", + "476": "1" + }, + "479": { + "473": "1", + "474": "-1", + "476": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 401, + 96, + 9, + 6 + ], + "donors": [ + 480, + 481, + 482, + 484 + ], + "pivots": [ + 483, + 485, + 486, + 487 + ], + "relations": { + "483": { + "480": "1", + "481": "1", + "482": "-1" + }, + "485": { + "480": "-1", + "481": "1", + "484": "1" + }, + "486": { + "480": "-1", + "482": "1", + "484": "1" + }, + "487": { + "481": "1", + "482": "-1", + "484": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 449, + 33, + 24, + 6 + ], + "donors": [ + 496, + 497, + 498, + 500 + ], + "pivots": [ + 499, + 501, + 502, + 503 + ], + "relations": { + "499": { + "496": "1", + "497": "1", + "498": "-1" + }, + "501": { + "496": "-1", + "497": "1", + "500": "1" + }, + "502": { + "496": "-1", + "498": "1", + "500": "1" + }, + "503": { + "497": "1", + "498": "-1", + "500": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 297, + 169, + 120, + 6 + ], + "donors": [ + 488, + 489, + 490, + 492 + ], + "pivots": [ + 491, + 493, + 494, + 495 + ], + "relations": { + "491": { + "488": "1", + "489": "1", + "490": "-1" + }, + "493": { + "488": "-1", + "489": "1", + "492": "1" + }, + "494": { + "488": "-1", + "490": "1", + "492": "1" + }, + "495": { + "489": "1", + "490": "-1", + "492": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 291, + 163, + 102, + 24 + ], + "donors": [ + 464, + 465, + 466, + 468 + ], + "pivots": [ + 467, + 469, + 470, + 471 + ], + "relations": { + "467": { + "464": "1", + "465": "1", + "466": "-1" + }, + "469": { + "464": "-1", + "465": "1", + "468": "1" + }, + "470": { + "464": "-1", + "466": "1", + "468": "1" + }, + "471": { + "465": "1", + "466": "-1", + "468": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 390, + 75, + 45, + 30 + ], + "donors": [ + 456, + 457, + 458, + 460 + ], + "pivots": [ + 459, + 461, + 462, + 463 + ], + "relations": { + "459": { + "456": "1", + "457": "1", + "458": "-1" + }, + "461": { + "456": "-1", + "457": "1", + "460": "1" + }, + "462": { + "456": "-1", + "458": "1", + "460": "1" + }, + "463": { + "457": "1", + "458": "-1", + "460": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 267, + 139, + 96, + 30 + ], + "donors": [ + 448, + 449, + 450, + 452 + ], + "pivots": [ + 451, + 453, + 454, + 455 + ], + "relations": { + "451": { + "448": "1", + "449": "1", + "450": "-1" + }, + "453": { + "448": "-1", + "449": "1", + "452": "1" + }, + "454": { + "448": "-1", + "450": "1", + "452": "1" + }, + "455": { + "449": "1", + "450": "-1", + "452": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 390, + 96, + 20, + 10 + ], + "donors": [ + 440, + 441, + 442, + 444 + ], + "pivots": [ + 443, + 445, + 446, + 447 + ], + "relations": { + "443": { + "440": "1", + "441": "1", + "442": "-1" + }, + "445": { + "440": "2", + "441": "-2", + "444": "1" + }, + "446": { + "440": "2", + "442": "-2", + "444": "1" + }, + "447": { + "441": "-2", + "442": "2", + "444": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 298, + 170, + 102, + 30 + ], + "donors": [ + 432, + 433, + 434, + 436 + ], + "pivots": [ + 435, + 437, + 438, + 439 + ], + "relations": { + "435": { + "432": "1", + "433": "1", + "434": "-1" + }, + "437": { + "432": "2", + "433": "-2", + "436": "1" + }, + "438": { + "432": "2", + "434": "-2", + "436": "1" + }, + "439": { + "433": "-2", + "434": "2", + "436": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 390, + 68, + 34, + 24 + ], + "donors": [ + 424, + 425, + 426, + 428 + ], + "pivots": [ + 427, + 429, + 430, + 431 + ], + "relations": { + "427": { + "424": "1", + "425": "1", + "426": "-1" + }, + "429": { + "424": "2", + "425": "-2", + "428": "1" + }, + "430": { + "424": "2", + "426": "-2", + "428": "1" + }, + "431": { + "425": "-2", + "426": "2", + "428": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 260, + 132, + 96, + 24 + ], + "donors": [ + 416, + 417, + 418, + 420 + ], + "pivots": [ + 419, + 421, + 422, + 423 + ], + "relations": { + "419": { + "416": "1", + "417": "1", + "418": "-1" + }, + "421": { + "416": "2", + "417": "-2", + "420": "1" + }, + "422": { + "416": "2", + "418": "-2", + "420": "1" + }, + "423": { + "417": "-2", + "418": "2", + "420": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 408, + 80, + 40, + 6 + ], + "donors": [ + 400, + 401, + 402, + 404 + ], + "pivots": [ + 403, + 405, + 406, + 407 + ], + "relations": { + "403": { + "400": "1", + "401": "1", + "402": "-1" + }, + "405": { + "400": "-1", + "401": "1", + "404": "1" + }, + "406": { + "400": "-1", + "402": "1", + "404": "1" + }, + "407": { + "401": "1", + "402": "-1", + "404": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 272, + 144, + 96, + 6 + ], + "donors": [ + 408, + 409, + 410, + 412 + ], + "pivots": [ + 411, + 413, + 414, + 415 + ], + "relations": { + "411": { + "408": "1", + "409": "1", + "410": "-1" + }, + "413": { + "408": "-1", + "409": "1", + "412": "1" + }, + "414": { + "408": "-1", + "410": "1", + "412": "1" + }, + "415": { + "409": "1", + "410": "-1", + "412": "1" + } + }, + "donor_gauge_lines_fit": true + }, + { + "E": [ + 320, + 192, + 24, + 6 + ], + "donors": [ + 392, + 393, + 394, + 396 + ], + "pivots": [ + 395, + 397, + 398, + 399 + ], + "relations": { + "395": { + "392": "1", + "393": "1", + "394": "-1" + }, + "397": { + "392": "-1", + "393": "1", + "396": "1" + }, + "398": { + "392": "-1", + "394": "1", + "396": "1" + }, + "399": { + "393": "1", + "394": "-1", + "396": "1" + } + }, + "donor_gauge_lines_fit": true + } + ], + "rank4_anchor_after_post_gauge_additions": 320, + "operation_order": [ + "A with original static40 kernels", + "center cut", + "112 post-center gauge compensations", + "56 rank-four pivot injections", + "native B", + "inverse source/helper cleanup" + ], + "report": { + "R": 504, + "borrowed_output_pairs": 56, + "centre_ranks": [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ], + "cst": 64, + "first_load_join_counts": { + "4": 112 + }, + "h": 9, + "local_profile": { + "1": 2240, + "2": 888, + "3": 216, + "4": 168, + "5": 56, + "6": 56, + "8": 8 + }, + "local_rank_mass": 6016, + "m": 73, + "scope": "Clean scalar identity and all literal monotone local frames only; arbitrary-dirt compensation, entrance kernels, exact phase recipes, and global hosting/pricing are not yet certified.", + "selected_load_join_counts": { + "6": 112 + }, + "selected_partitions": [ + 0, + 0 + ], + "source_and_helper_cleanup_exact_on_clean_columns": true, + "source_columns_exact": 112, + "status": "EXACT_RELATIONS_AND_FRAMES_PENDING_INDEPENDENT_REPLAY", + "v": 112, + "width_inventory": { + "5": 56, + "8": 152, + "9": 296 + }, + "post_center_gauges": 112, + "post_center_compensation_additions": 320, + "entrance_rank": 376, + "entering_helpers": 208, + "rank4_kernel_groups": 14, + "rank4_kernel_pivots": 56, + "rank4_kernel_additions": 168, + "post_gauge_kernel_anchor": 320 + }, + "output_sha256": "5d510cf5588450b520cd6481d328b3849a31d56dfb250b7c542a5edf9f06052f", + "output_uncompressed_sha256": "66ce5aab59b0469229ab4cf1d7e01a92b06170472618ff6256c9f1f15a367f68" +} diff --git a/research/trace-curvature-preload/appendix/static44/inputs/RAW504.json.gz b/research/trace-curvature-preload/appendix/static44/inputs/RAW504.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..903eeb216176a7c5fd6d26f875a63e89a79b37bb GIT binary patch literal 32146 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 literal 0 HcmV?d00001 diff --git a/research/trace-curvature-preload/appendix/static44/replay.py b/research/trace-curvature-preload/appendix/static44/replay.py new file mode 100644 index 0000000000..ef5642ccfd --- /dev/null +++ b/research/trace-curvature-preload/appendix/static44/replay.py @@ -0,0 +1,9 @@ +"""Standalone exact local-only static44 reconstruction and scalar audit.""" +from pathlib import Path +import argparse,subprocess,sys +if not __debug__:raise SystemExit('Assertions must remain enabled.') +p=Path(__file__).resolve().parent +ap=argparse.ArgumentParser();ap.add_argument('--out',type=Path,required=True);a=ap.parse_args();assert not a.out.exists() +subprocess.run([sys.executable,'-B',str(p/'build.py'),'--raw',str(p/'inputs/RAW504.json.gz'),'--base',str(p/'inputs/BASE535.json.gz'),'--old-recipe',str(p/'inputs/OLD-RECIPE.json'),'--recipe',str(p/'RECIPE.json'),'--gk-dir',str(p/'gk'),'--out',str(a.out)],check=True) +subprocess.run([sys.executable,'-B',str(p/'audit_scalar.py'),str(a.out/'FULL-WORD.json.gz'),str(a.out/'SELECTION.json'),str(a.out/'SCALAR-AUDIT.json')],check=True) +print('PASS standalone local-only appendix') diff --git a/research/trace-curvature-preload/code/assemble_meta.py b/research/trace-curvature-preload/code/assemble_meta.py new file mode 100644 index 0000000000..cf01fe20f2 --- /dev/null +++ b/research/trace-curvature-preload/code/assemble_meta.py @@ -0,0 +1,177 @@ +"""Compose fresh preload60 bit with the pinned, unchanged PR535 complex supplier. + +Prepared for icekylinx with GPT-6 Astra assistance, Apache-2.0. +Adapted from the attributed PR531 assembly. Both rational moment engines and +the 47-constraint outer engine remain pinned inherited implementations. +The complex operator is a cited conditional dependency; the changed bit operator is freshly reconstructed. +Adaptation: fresh bit invoice and source hashes replace the cited bit receipt. +Usage: assemble_meta.py PACKAGE BIT_RESULT OUTDIR +""" +import hashlib +import importlib.util +import json +import sys +from fractions import Fraction as Q +from pathlib import Path + +if not __debug__: + raise SystemExit('Run with assertions enabled.') +assert __debug__, 'Run with assertions enabled.' +ROOT, B, O = map(Path, sys.argv[1:4]); O.mkdir(parents=True, exist_ok=True) +BIT_COMMIT = '64edee18af02aab0c1696b677a0287dd0146381b' +BIT_EXPECTED_SHA256 = '19b861f69f7602e47b390d472b487d044bff4230b250520807537c213ad0249f' + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def load(name): + path = ROOT / 'vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines' / (name + '.py') + spec = importlib.util.spec_from_file_location('combined_' + name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def decimal(value, places): + scaled = value * 10 ** places + assert scaled.denominator == 1 + digits = str(scaled.numerator).zfill(places + 1) + return digits[:-places] + '.' + digits[-places:] + + +M, Other, Outer = [load(name) for name in ['moment', 'base_two_moment', 'outer']] +owner = json.loads((ROOT / 'inputs/PR535-OWNERS-AND-PROFILE.json').read_text()) +inv = json.loads((ROOT / 'inputs/PR535-PREFIX-AND-INVOICE.json').read_text()) +host = json.loads((ROOT / 'inputs/PR535-HOSTED.json').read_text()) +assert owner['template_sha256'] == inv['template_sha256'] == host['template_sha256'] +assert inv['owner_audit_sha256'] == sha(ROOT / 'inputs/PR535-OWNERS-AND-PROFILE.json') +assert all(inv['strict_checks'].values()) +P = {int(rank): count for rank, count in owner['paid_profile'].items()} +m, W = 73, owner['live'] +assert m * W - sum(rank * count for rank, count in P.items()) == 2560 + + +def two_moments(profile, dimension, live, lower): + """Keep the full rational sign intervals for both independent engines.""" + fallback = 32 * dimension * dimension * sum(profile.values()) + receipts = [] + for endpoint, accept in [(lower, True), (lower + Q(1, 10**24), False)]: + lo, hi = M.moment(profile, dimension, live, endpoint, True) + a, b = Other.moment(dimension, live, list(profile.items()), endpoint) + f, g = Other.moment(dimension, live, [(1, fallback)], endpoint) + a += f / 10**16 + b += g / 10**16 + assert (hi < 1 and b < 1) if accept else (lo > 1 and a > 1) + receipts.append(dict(endpoint=str(endpoint), accept=accept, + mercator=[str(lo - 1), str(hi - 1)], + base_two=[str(a - 1), str(b - 1)])) + return receipts + + +cert = M.certify(P, m, W, True) +b, bp = Q(cert['lower']), Q(cert['upper']) +assert bp - b == Q(1, 10**24) +complex_receipts = two_moments(P, m, W, b) + +# These checks bind and reprice the freshly reconstructed bit invoice. +# Native local and global physical admission are separately source-bound. +bit = json.loads(B.read_text()) +assert bit['status'] == 'PASS_NINE_STAGE_WHOLE_HOSTED_BIT_PRICE_AND_CITED_ASSEMBLY' +bitP = {int(rank): count for rank, count in bit['bit_profile'].items()} +bit_inv = bit['bit'] +bm, bW = 64, bit_inv['live'] +assert (bm, bW, bit['stages'], bit['replicas']) == (64, 30720, 9, 32) +assert sum(rank * count for rank, count in bitP.items()) == bit_inv['rank_mass'] +assert bm * bW - bit_inv['rank_mass'] == 9984 +assert max(bitP) == bit_inv['maxchild'] == 8 +assert bm * bm > 2 * 64 * max(bitP) +assert bit_inv['physical'] == bW + 9 == 30729 +assert bit_inv['hosted_residuals'] == 480 * 9 * 32 +assert bit_inv['bank_assignments'] == 0 +assert bit_inv['prefix_bits'] < 256 +assert bit_inv['prefix_bits'] < bit_inv['charged_prefix_bits'] == 256 +assert bit_inv['two_level_coefficient_bits'] < bit_inv['charged_two_level_coefficient_bits'] == 512 +assert bit_inv['row_coefficient'] < 20161 +c = Q(bit['bit_lower']) +assert c == Q(bit['bit_lower_decimal']) +bit_receipts = two_moments(bitP, bm, bW, c) + +eta = beta = grid = Q(1, 10**18) +s = min(c, (1 - beta) * b) - Q(1, 10**24) +assert 0 < s < c and s < (1 - beta) * b +coeff = bit_inv['charged_two_level_coefficient_bits'] +row = max(20161, bit_inv['row_coefficient'], inv['finite']['physical_row_coefficient']) +chain, cuts = [Q(384599, 10**10)], [] + + +def ceil(value): + return -(-value.numerator // value.denominator) + + +for _ in range(6): + old = chain[-1] + a = (1 - s) * s + s * old + gap = min(s - a, 1 - a - s, 1 - a - s * (1 - old), 1 - s) + assert old < a < s < 1 - a and gap > 0 + cut = max(ceil(36 / gap**2), ceil(2 * (4 + coeff) / gap)) + assert cut * gap**2 >= 36 and cut * gap >= 2 * (4 + coeff) + cuts.append(dict(gap=str(gap), cutoff_log2=str(cut))) + chain.append(a) +q = chain[-1] * (1 - 2 * eta) +margin = (1 - eta) * q / (1 + q) +ticks = margin / grid +kap = grid * ((ticks.numerator - 1) // ticks.denominator) +bridge = {'semantic': {'C0': {'base': 2, 'exponent': 210000}, 'strict_literal_gap': 1}, + 'rows': {'degree_gap': Q(10**6) - Q(51 * row, 25)}} +assembly = Outer.assembly(chain[-1], b, bridge, kap, eta=eta, beta=beta) +assert len(assembly['strict_constraints']) == 47 +assert all(value > 0 for value in assembly['strict_constraints'].values()) +controls = [] +for name, k, e, be in [('next_grid', kap + grid, eta, beta), + ('zero_eta', kap, Q(0), beta), + ('zero_beta', kap, eta, Q(0)), + ('unit_beta', kap, eta, Q(1))]: + try: + Outer.assembly(chain[-1], b, bridge, k, eta=e, beta=be) + except AssertionError: + controls.append(name) + else: + raise AssertionError(name) + +baselines = {'PR535': Q('0.001584931111785787'), 'prior_tn22': Q('0.001538356846647141'), + 'PR531': Q('0.001517760977820331'), + 'rejected_POST208_checkpoint': Q('0.001543640781718742'), + 'PR533': Q('0.001524207950793244')} +res = dict( + status='PASS_FRESH_PRELOAD60_BIT_AND_PINNED_PR535_COMPLEX', + complex_lower=str(b), complex_decimal=decimal(b, 24), + next_b_rejected=str(bp), exact_moment_receipts=complex_receipts, + bit_lower=str(c), bit_decimal=decimal(c, 24), + bit_exact_moment_receipts=bit_receipts, + bit_result_sha256=sha(B), + complex_dependency={'pull_request':535,'commit':'0d343e2f813f962405481f83d8935299812a7a1c','path':'research/post-center-rank4-global'}, + bit_dependency={'pull_request':510,'commit':BIT_COMMIT,'changed_word':'preload60','fresh_bit_receipt_sha256':sha(B)}, + bit_prefix_bits=bit_inv['charged_prefix_bits'], + bit_charged_two_level_coefficient_bits=coeff, + external_row_allowance=row, + kappa=str(kap), kappa_decimal=decimal(kap, 18), + binding_component='bit' if c < (1 - beta) * b else 'complex', + improvements={name: {'baseline': str(value), + 'relative_gain': str(kap / value - 1), + 'percent_display': f'{float(100 * (kap / value - 1)):.8f}'} + for name, value in baselines.items()}, + strict_outer_constraints={k: str(v) for k, v in assembly['strict_constraints'].items()}, + outer_controls=controls, bootstrap=cuts, + complex_template_sha256=host['template_sha256'], + owner_audit_sha256=sha(ROOT / 'inputs/PR535-OWNERS-AND-PROFILE.json'), + invoice_sha256=sha(ROOT / 'inputs/PR535-PREFIX-AND-INVOICE.json'), + bit_scope='The changed bit word is freshly reconstructed, replayed and admitted by the native local and hosted-global checkers. The unchanged complex supplier is the pinned PR535 cited dependency.', + scope='Conditional finite witness under the retained all-size compiler, ' + 'common-label/mutable-basis, whole-call hosting, restored-work, ' + 'precision/tape and analytic-transfer contracts. Fresh changed-bit admission ' + 'and finite invoice are separately hash-bound; the unchanged complex supplier is cited, not reconstructed. No unconditional theorem is claimed.') +(O / 'EXACT-ASSEMBLY.json').write_text(json.dumps(res, indent=2) + '\n') +print(res['status'], 'b', res['complex_decimal'], 'kappa', res['kappa_decimal']) +print(json.dumps(res['improvements'], sort_keys=True)) diff --git a/research/trace-curvature-preload/code/audit_curvature.py b/research/trace-curvature-preload/code/audit_curvature.py new file mode 100644 index 0000000000..64090bd040 --- /dev/null +++ b/research/trace-curvature-preload/code/audit_curvature.py @@ -0,0 +1,35 @@ +"""Exact finite curvature-cone certificate; independent of moment engines.""" +import json,sys +from pathlib import Path + +def certificate(old,new): + old={int(r):n for r,n in old.items()};new={int(r):n for r,n in new.items()} + assert all(isinstance(n,int) and n>=0 for n in list(old.values())+list(new.values())) + assert all(r>=1 for r in [*old,*new]) + R=max([1,*old,*new]);d={r:new.get(r,0)-old.get(r,0) for r in range(1,R+1)} + assert sum(d.values())==sum(r*n for r,n in d.items())==0 + C={j:sum((j-r)*d[r]for r in range(1,j))for j in range(1,R+1)} + assert C[1]==C[R]==0 and all(x>=0 for x in C.values()) + assert all(d[r]==C.get(r-1,0)-2*C[r]+C.get(r+1,0)for r in d) + assert any(C.values()) + return {'delta':{str(r):n for r,n in d.items()if n},'curvature':{str(r):n for r,n in C.items()if n},'count':sum(new.values()),'rank_mass':sum(r*n for r,n in new.items())} + +def main(): + baseline,local,invoice,out=map(Path,sys.argv[1:5]);old=json.loads(baseline.read_text())['nine']['profile'] + loc=json.loads(local.read_text());new=json.loads(invoice.read_text())['bit_profile'] + # Native legality receipt carries the actual regenerated frame-chain profile. + for key in ['paid_histogram','profile','paid_profile','histogram','rank_histogram']: + if key in loc:loc=loc[key];break + if isinstance(loc,list):loc=dict(loc) + if not all(str(k).isdigit()for k in loc):raise AssertionError(('unknown native histogram schema',list(loc))) + localold={1:1200,2:1440,4:180,6:120,8:9} + a=certificate(localold,loc);b=certificate(old,new) + assert a['curvature']=={'2':60} and b['curvature']=={'2':17280} + assert b['delta']=={r:288*n for r,n in a['delta'].items()} + controls=[] + for name,x,y in [('reverse',new,old),('missing_rank3',old,{**new,'3':int(new['3'])-1})]: + try:certificate(x,y) + except AssertionError:controls.append(name) + else:raise AssertionError(('control accepted',name)) + out.write_text(json.dumps({'status':'PASS_CURVATURE_CONE','local':a,'global':b,'negative_controls':controls},indent=2)+'\n') +if __name__=='__main__':main() diff --git a/research/trace-curvature-preload/code/build_preload60.py b/research/trace-curvature-preload/code/build_preload60.py new file mode 100644 index 0000000000..5a1b518a58 --- /dev/null +++ b/research/trace-curvature-preload/code/build_preload60.py @@ -0,0 +1,48 @@ +from pathlib import Path +from fractions import Fraction as Q +from collections import Counter +import json,gzip,hashlib,copy,sys,argparse +parser=argparse.ArgumentParser();parser.add_argument('--input',type=Path,required=True);parser.add_argument('--out',type=Path,required=True);args=parser.parse_args();src,out=args.input,args.out;w=json.loads(gzip.decompress(src.read_bytes()));V=w['v'];N=2*V+w['R'];old=copy.deepcopy(w);prefix=[];moves=[];A=[];assert hashlib.sha256(json.dumps(w,sort_keys=True,separators=(',',':')).encode()).hexdigest()=='8639e22008c24a5690dd250eba702fe5fca85ddd036dcbec20baba77b7e213ba', 'pinned source word' +for i,(f,t,ss)in enumerate(w['A']): + if len(ss)==2 and all(sdim[a]:H[dim[f]-dim[a]]+=1 + cur[r]=f + def gates(sec): + for f,t,ss in z[sec]: + assert len({t,*ss})==1+len(ss) + for r in [t,*ss]:climb(r,f) + for s in ss:val[t]^=val[s] + gates('D');gates('A');tops.extend(dim[cur[q]]for q in z['ret']);snap=[val[q]for q in z['ret']] + for t,ks in enumerate(z['scatter']): + for k in ks:val[V+t]^=snap[k] + gates('B');gates('C') + for r,f in enumerate(z['final']):climb(r,f) + for r in range(N):assert val[r]==((1<=2*v;pending[s].append([f,t,[s]]) +assert all(not v<=r<2*v for f,t,ss in w['A']for r in [t]+ss) +a=[];delayed=0 +for e in w['A']: + for r in [e[1]]+e[2]: + if r in pending:a.extend(pending.pop(r));delayed+=1 + a.append(e) +assert not pending;z['D']=[];z['A']=a + +def chain(q): + hist=[[q['start'][r]]for r in range(n)] + for sec in ('D','A','B','C'): + for f,t,ss in q[sec]: + for r in [t]+ss: + if hist[r][-1]!=f:hist[r].append(f) + for r in range(n): + if hist[r][-1]!=q['final'][r]:hist[r].append(q['final'][r]) + return hist +assert chain(z)==chain(w) +def replay(q): + row=[1<= a(1-a) 3^(a-2) > 0. + +Consequently n such replacements lower the normalized moment by at least + + n a(1-a) 3^(a-2) / (W m^a). + +This is a uniform strict inequality for every admissible recurrence exponent, not a first-order entropy approximation or a fit at one floating-point value. The recurrence moment is strictly increasing as saving b=1-a increases, so its unique positive root strictly increases. The theorem does not authorize adding numeric kappa gains from separate constructions. + +## Concrete PR510-context application + +The PR510 R480 bit signature has 480 helpers, all width 8, 120 ports, m=64, 32 replicas, and nine complete calls per replica. The unchanged literal selection hosts every one of 138,240 residual occurrences and uses no banks. The changed source word moves 60 source additions to admissible early rank-one frames. Its exact local profile, including the nine rank-eight copies, is + + {1:1260, 2:1320, 3:60, 4:180, 6:120, 8:9}. + +Its local difference is 60(e_1-2e_2+e_3), hence the complete difference is 17,280(e_1-2e_2+e_3). The existing idle remainder multiset is retained. The new full profile is + + {1:362880, 2:395520, 3:17280, 4:67200, + 6:49920, 7:23040, 8:2592}. + +Live stock is 30,720 and the rank deficit is 9,984. Exact rational interval pricing with the inherited bad-class envelope gives + + 0.001589735702947998836661 < root < 0.001589735702947998836662. + +The left endpoint is a strict valid lower saving bound. This price is conditional on the changed finite native/physical/invoice checks, which are recorded separately by the main replay. It is not by itself a final assembled kappa. + +## Provenance and bounded alternatives + +The source analogy was the explicit endpoint-and-budget handoff in OAI's DirectedFeedback/Machines/MachineSubstitution.lean, notably stepAux_pushWord, statementPushBound_pushWord, and MachineSequential.compose. Its supplied theorem concerns Turing-machine composition, not multiplication suppliers. The weighted-gap organization in SoftChannel/JensenGaps.lean motivated retaining a quantitative gap; the elementary power-function proof above is proved here independently. Neither source was recompiled in this round. + +A separate bounded screen tested whole-width-eight controllers with seven through seventeen stages. Nine stages remained best. It also explains why merely enlarging the replica count cannot improve its fixed histogram: every rank-14, rank-28 and rank-42 idle bin is already maximally filled by width-eight residuals, leaving residues 6,4,2, while rank-seven bins cannot hold them. This bounded outcome does not exclude different providers, new interfaces, or different endpoint factorizations. + +## Completed changed-word finite replay + +The changed native local word and the nine-stage whole-owner physical pipeline subsequently passed. The independently reconstructed profile is exactly the displayed profile. All 17 parent mutations and 16 hosting mutations reject. There are 10,631,808 streamed events, 138,240 whole residual occurrences, and no bank assignments. The retained strict invoice gives prefix 193 bits charged at 256, a two-level coefficient of 425 bits charged at 512, row coefficient 18,355 below 20,161, and halving depth 2. Both independent rational moment engines certify the stated bit lower bound. These close the finite premises for this application under the explicitly retained all-size interfaces; the main package separately records outer assembly with the selected complex supplier. + +Direct public construction lineage is PR510 (nine-stage R480 price and whole residual selection), PR503 (dead-total R480 word), PR493 (bit carrier skeleton), PR463 (generalized stage pipeline), PR442/444 (whole residual hosting and audit), and PR386 (compressed nine-stage geometry). PR535 supplies the separately cited complex saving. The OpenAI source modules are mathematical provenance only, not hidden runtime dependencies. diff --git a/research/trace-curvature-preload/docs/CURVATURE-CONE.md b/research/trace-curvature-preload/docs/CURVATURE-CONE.md new file mode 100644 index 0000000000..1bcbd47f86 --- /dev/null +++ b/research/trace-curvature-preload/docs/CURVATURE-CONE.md @@ -0,0 +1,48 @@ +# A complete finite curvature calculus for profile comparison + +This is an elementary discrete-concavity theorem, proved here for the supplier interface. We do not claim it was unknown in mathematics. Its useful application is a proof certificate for an entire continuum of recurrence exponents and for every compatible future controller, rather than a floating-point price at one chosen exponent. + +## Theorem (curvature cone and constructive completeness) + +Let H and H' be finite nonnegative rank histograms supported on the integers 1,...,R. Set delta_r=H'_r-H_r. Assume both child count and rank mass agree: + + sum delta_r=0, sum r delta_r=0. + +For j=1,...,R put C_j=sum_{r0 and f is strictly concave at that index, the inequality is strict. This is a sufficient, explicitly computable criterion. It does not require knowing the eventual exponent or querying an optimization oracle. + +Proof. Difference the defining prefix sums twice to get the reconstruction formula. The mass and count identities give C_R=0 and the two right boundary identities. Substitute that second-difference expression into sum delta_r f(r), shift the finite summation indices, and cancel the zero boundary terms. Concavity proves A implies B. Conversely, fix an interior j and choose the concave function f_j(r)=-max(j-r,0). Its second difference is -1 at j and zero elsewhere. The displayed identity gives sum delta_r f_j(r)=-C_j. Property B therefore implies C_j>=0 for every j. All identities are finite exact rational arithmetic. QED. + +## Algebra of certificates + +Histograms compose by disjoint union. Thus a nonnegative integer sum of certified deltas has certificate equal to that same sum of their C vectors. If H0->H1 and H1->H2 are certified, H0->H2 is certified by C01+C12. A width-preserving provider substitution in N complete compatible contexts multiplies C by N. This gives a cone closed under program composition and substitution. It turns an optimizer's proposal into a short independently checkable quantitative proof. + +The theorem compares costs; it does not manufacture a legal word. The trace-refinement constructor and physical checks separately prove realizability. In particular C>=0 alone cannot replace a source-word, memory, ownership or scalar-prefix audit. + +## Strict improvement for the published recurrence interface + +Fix the same W,m and child count for both suppliers, with every used rank smaller than m. For 0 A X and leave Y unchanged. The old compensation is Y -> Y+D X. Then the exact identity + + [A on X] after [add D X to Y] + = [add (D A^{-1}) X to Y] after [A on X] + +holds on every input, including arbitrary helper dirt. Therefore compensation may be moved to another program cut by computing the inverse-version response D A^{-1}. One must factor the transported map into actual allowed scalar gates and check that every source and target frame can reach the chosen common frame and still reach their next uses. If those finite checks pass, the transformed program has precisely the same full scalar endpoint. It is not enough to compare clean-input columns or to reuse D without the inverse-version factor. + +For a sequence of elementary background gates, D A^{-1} is computed by the opposite column update, in the original prefix order. Thus this theorem supplies a constructive compiler pass with an exact rejection test. The untouched-register case gives a useful safe normal form: each dirty compensation read can be delayed up to the first instruction that touches its helper, while the target remains at frame zero. This special case needs no extra storage and preserves the frame-chain invoice. It is not claimed as an exponent improvement. `transport_compensation.py` implements this normal form on R480: all 480 helper dirt reads move to their last untouched versions, all 720 scalar columns agree exactly, and every deduplicated register frame chain is unchanged. The exact receipt is `transport-bit510/TRANSPORT.json`. This appendix does not claim a new native phase or global-program replay. + +## Bounded screens and scope + +On the original filtered504 source, 100 native nested-elimination trials were preserved; they reached up to 92 pivots and rank188, but became secondary when PR535 moved the frontier. No whole-profile gain is inferred from those counts. + +On the new binding R480 bit source, the exact post-center compensation screen rejected every individual helper under its specified first-B-frame schedule: 448 failed because a transported source frame was already above the target frame, and 23 failed the next-use containment test. The full transported compensator had 1273 incompatible support entries in that schedule. A separate exact screen of 120 additional non-root sum/difference lines, together with all 120 root lines, found no entry response circuit. These are bounded family failures, not a theorem excluding other cuts, joint cancellation, general frames, or other schedules. + +On PR535, all 112 post-center gauges already attain rank one in the intersection of their actual first frames, target first-use caps and donor-kernel caps. The remaining static census examined 27195 first-frame subspaces and found 12 nonzero-nullity line classes and no higher-rank candidate in that restricted interface. A bounded 100-seed presentation search yielded the checked 44-pivot witness above. No optimality claim follows. + +## Structural source references + +Mathlib's matrix transvection file supplies explicit left/right elementary update identities and reverse-inverse product identities. OpenAI's congruence elementary-matrix development supplies `clear_step`: an elementary update clears another entry while preserving an already-cleared prefix. We inspected these actual statements as structural models for the inductive invariant and product order. The new geometric compilation theorem and its changed provider were proved and checked here; they are not asserted to be direct imports or newly Lean-certified theorems. Exact source hashes are in META-SOURCES.json. diff --git a/research/trace-curvature-preload/docs/PR535-README.md b/research/trace-curvature-preload/docs/PR535-README.md new file mode 100644 index 0000000000..62abfa1591 --- /dev/null +++ b/research/trace-curvature-preload/docs/PR535-README.md @@ -0,0 +1,142 @@ +# Rank-four post-center kernels: a global κ delta from PR531 + +**Conditional global saving: `κ = 0.001584931111785787`.** This is +**4.42560686% above PR531** (`0.001517760977820331`) and **3.98391577% above +PR533**. The package is named `integer_mult_round21_rank4_delta` and contains +an incremental construction and its component evidence, using the scientifically +unchanged PR531 package as its baseline. + +| Quantity | Exact certified lower endpoint | +|---|---:| +| New complex supplier, rank-four kernel construction | `b = 0.001589991533606044174031` | +| Adopted PR510 bit supplier | `c = 0.001587447106092548137108` | +| Combined conditional global saving | **`κ = 0.001584931111785787`** | +| Control: new complex supplier with the former PR493 bit supplier | `κ = 0.001562995248531632` | + +The new complex supplier exceeds the old bit endpoint. The bit side now binds, +so the final composition adopts PR510's already published nine-stage R480 bit +supplier. Its exact rational endpoint is +`396861776523137034277 / 250000000000000000000000`. The PR493 control records +the gain available without this dependency change. The final κ is also +2.67486649% above the earlier post-center-only checkpoint. + +## New construction and adopted components + +The new contribution is by **icekylinx with GPT-6 Astra assistance**. It +composes post-center dirty compensation with larger response kernels: + +1. Helpers that are untouched by the source prefix and center cut still contain + exactly their initial dirt at the start of delivery. Their compensation can + therefore be performed there, after the center cut. +2. The 112 ordinary-M helpers form 14 disjoint groups of eight. Within each + group, four response columns span the other four, and all eight first native + frames contain a common frame of rank four. +3. Execute the retained gauge compensations first. Then inject each pivot into + its donors at the common rank-four frame. A donor may itself have been gauged: + the earlier compensation reads its original dirt, and the later injection + cancels the pivot's response without changing the donor's initial column. + +The scalar relations are exact, the frame containments are paid, and the new +source/helper operations are included in full-frame inverse cleanup. The word +retains 112 ports, 504 helpers, local dimension 9, and the existing center cut. +The original whole-call owner intervals remain in force. + +The entrance inventory is **40 rank-one kernel pivots, 112 rank-one gauges, +and 56 rank-four pivots**, for total entrance rank **376**. Residual widths are +**56 × 5, 152 × 8, and 296 × 9**. The coalesced local paid profile is + +```text +rank 1 2 3 4 5 6 8 +count 2208 728 184 280 56 56 8 +``` + +Its rank mass is **6016**. The global evidence includes actual whole-residual +owners, the paid invoice, and exact outer assembly; the reported κ is not +inferred from the local inventory alone. + +PR531 supplies the SAME504 scalar architecture, source/target geometry, +coalescing construction, and unchanged certificates. PR510 supplies the bit +rate and its conditional interfaces. **PR510's bit improvement is adopted and +credited; it is not presented as a new bit construction here.** No cold bit +replay was performed for this delta. PR533 is a numerical comparison source. + +## Fast incremental replay + +Provide the baseline package from PR531 at final head +`e07a8a3f9f79c22113398a0c5dbbc7601f489b3e`. Its relevant scientific files match +the original Round20 baseline pins. The baseline argument is the package +directory `research/direct-delivery504-global`, not the repository root. + +```sh +python -B replay_delta.py \ + --baseline /path/research/direct-delivery504-global \ + --work /tmp/rank4-check +``` + +Use a fresh work directory. The default mode reuses the completed phase evidence +bound to the packaged word and pinned baseline. The default replay uses the Python standard library. `--delta-phases` also +requires NumPy. Optional flags are: + +- `--rebuild-local`: reconstruct the changed local word. +- `--delta-phases`: repeat the targeted phase check for the changed frame pairs. + +For example: + +```sh +python -B replay_delta.py \ + --baseline /path/research/direct-delivery504-global \ + --work /tmp/rank4-check-rebuild \ + --rebuild-local --delta-phases +``` + +## Checks completed and their scope + +The component checks completed before packaging include exact scalar/frame +replay (**2.15 seconds**), the targeted phase delta (**2.29 seconds**), and +the independent check (**6.88 seconds**). Phase coverage consists of **126 new +frame pairs, 2801 pairs reused from bound baseline evidence, and 224 endpoint +adapters**. The new global owner/invoice checks and the combined exact outer +assembly passed. A separate small exact adjoint audit checks all 56 rank-four +response relations and every gauge-to-kernel-to-native frame containment. + +These timings describe completed component runs on the preparation machine. +The assembled `replay_delta.py` default wrapper passed end to end in +**22.71 seconds**, including all dependency bindings, the small rank-four +adjoint check, changed scalar/frame replay, actual owner reconstruction and +admission, fresh finite invoice, and both moments plus the 47 outer constraints. +See `evidence/fast-replay/RESULT.json`. The optional reconstruction and phase +flags have separate component evidence; they were not repeated by this wrapper run. The default fast mode also does not imply that predecessor +phase certificates or PR510's full bit pipeline were freshly rerun. + +## Conditional scope and sources + +This is a **finite conditional global witness**. It retains the all-size +compiler, common-label/mutable-basis and target-label realization, normalized +Lemma A realization, whole-call correlated-helper hosting, compressed-window, +restored-work, common-grid/tape, precision, row, and analytic transfer contracts. +The included PR510 carryover note explains why source-register writes use the +same role-independent address pullback at nine stages. It does not replace +those all-size assumptions with a finite scalar replay. No unconditional +multiplication theorem or Lean formalization is asserted. + +- [PR531: baseline SAME504 global construction](https://github.com/CrocSwap/integer-mult-bounds/pull/531). +- [PR510: adopted R480 nine-stage bit supplier](https://github.com/CrocSwap/integer-mult-bounds/pull/510), pinned to `64edee18af02aab0c1696b677a0287dd0146381b`. +- [PR510 pinned README and declared interfaces](https://github.com/DreamingOfClouds/integer-mult-bounds/blob/64edee18af02aab0c1696b677a0287dd0146381b/research/e8-r480-nine-stage/README.md). +- [PR493: former bit supplier and the mutable-source word](https://github.com/CrocSwap/integer-mult-bounds/pull/493). +- [PR484: attributed gauge/kernel primitives](https://github.com/CrocSwap/integer-mult-bounds/pull/484). +- [PR472: common-label and whole-call realization argument](https://github.com/CrocSwap/integer-mult-bounds/pull/472). +- [PR533: latest numerical comparison](https://github.com/CrocSwap/integer-mult-bounds/pull/533). + +The original PR531 and PR510 notices are retained separately. See `NOTICE.md` +and the packaged proof/evidence files for the contribution boundary and pins. + +## Submission validation + +The optional local reconstruction and changed-phase replay passed on Python +3.14.8 with NumPy 2.3.5 in 15.68 seconds. The intermediate checkpoint phase +delta was also freshly checked against the merged #531 baseline (194 edges), +followed by the final 126-edge delta. Independent emitted-program and all 21 +residual-wrapper checks passed. See `LOCAL-VALIDATION.json`. + +The submission starts from main at `f19cb621be2caf3a7291a37c343c1c55afe935e0`. +Logs remain outside the committed package and its manifest. diff --git a/research/trace-curvature-preload/docs/PRIVACY-ADAPTATIONS.json b/research/trace-curvature-preload/docs/PRIVACY-ADAPTATIONS.json new file mode 100644 index 0000000000..cb1322ba3b --- /dev/null +++ b/research/trace-curvature-preload/docs/PRIVACY-ADAPTATIONS.json @@ -0,0 +1,12 @@ +{ + "scope": "Only user-identifying attribution metadata is redacted from inherited explanatory files. PR numbers and head/source hashes are retained. Other upstream author attribution is retained. No numerical values or checker acceptance rules are changed. Historical subordinate manifests describe the original public trees; the root MANIFEST.json binds the actual adapted package.", + "changed_files": [ + "vendor/e8-bit-carrier-skeleton/NOTICE.md", + "vendor/e8-bit-carrier-skeleton/README.md", + "vendor/e8-bit-carrier-skeleton/SOURCE-pr471.json", + "vendor/e8-bit-carrier-skeleton/SOURCE-pr478.json", + "vendor/e8-bit-carrier-skeleton/SOURCE-pr483.json", + "vendor/e8-bit-carrier-skeleton/data/complex-b.json", + "vendor/e8-r480-dead-totals/README.md" + ] +} diff --git a/research/trace-curvature-preload/docs/PROVENANCE.md b/research/trace-curvature-preload/docs/PROVENANCE.md new file mode 100644 index 0000000000..2a0179ac67 --- /dev/null +++ b/research/trace-curvature-preload/docs/PROVENANCE.md @@ -0,0 +1,26 @@ +# Sources, attribution and adaptation + +The public refresh downloaded85 recent/updated PR conversations. New PR532-536 and the changed PR531 head were read. Changed-file trees were pinned for510,531-536. The strongest assembled claim in that snapshot was PR535, not PR536. The package is frozen to that snapshot and makes no live leaderboard claim. + +Direct numerical dependencies: + +- [PR535](https://github.com/CrocSwap/integer-mult-bounds/pull/535), head0d343e2f813f962405481f83d8935299812a7a1c: unchanged complex operator/profile/finite invoice; b=0.001589991533606044174031. +- [PR510](https://github.com/CrocSwap/integer-mult-bounds/pull/510), head64edee18af02aab0c1696b677a0287dd0146381b: nine-stage32-replica bit owner context. Our scalar word and resulting bit profile change. +- [PR503](https://github.com/CrocSwap/integer-mult-bounds/pull/503): R480 dead-total source word, as pinned inside510. +- [PR493](https://github.com/CrocSwap/integer-mult-bounds/pull/493): E8 bit carrier/native legality, all-column, mutable-source and prefix checks, as pinned inside510. + +Inherited implementation lineage: + +- [PR463](https://github.com/CrocSwap/integer-mult-bounds/pull/463): variable-stage global emitter and invoice. +- [PR442](https://github.com/CrocSwap/integer-mult-bounds/pull/442) and [PR444](https://github.com/CrocSwap/integer-mult-bounds/pull/444): literal whole-residual owner hosting. +- [PR386](https://github.com/CrocSwap/integer-mult-bounds/pull/386): nine-stage geometry. +- [PR531](https://github.com/CrocSwap/integer-mult-bounds/pull/531):504-helper complex foundation and exact assembly infrastructure. +- [PR533](https://github.com/CrocSwap/integer-mult-bounds/pull/533), [PR534](https://github.com/CrocSwap/integer-mult-bounds/pull/534), [PR536](https://github.com/CrocSwap/integer-mult-bounds/pull/536): response-presentation/frame-chain comparison; inspiration for the local-only appendix, not added final gains. + +Exact new/changed PR pins are in inputs/UPSTREAM-PINS.json. Vendored SOURCE files and licenses retain original authors, upstream hashes and subordinate lineage. No upstream C++ acceptance condition is weakened. The existing PR510 adapt.py retains its documented mutable-source compatibility and inapplicable-route-control adjustment; our wrapper invokes that same code. + +New code: commuting preload constructor, curvature certificate checker, orchestration, and source-bound exact composition. assemble_meta.py is adapted from the attributed PR535 assemble_combined.py: it consumes the fresh bit invoice while retaining pinned535complex receipts and the original rational engines. The verifier LF-normalizes a scratch copy before invoking scripts whose raw hashes matter. Generated gzip is deterministic. Upstream full-verifier entrypoints are retained for attribution, but not called because that would redundantly replay unrelated public stages. + +The cached nine-stage geometry is validated against all120label vectors and then by actual projector/route checks in the source-bound global pipeline. It is not trusted merely because its header says PASS. + +Source-read structural analogies are recorded with paths/declaration names/hashes in TRACE-SOURCES.json, CONTEXT-SOURCES.json and TRANSPORT-SOURCES.json. They include Mathlib transvections and the OpenAI ordered-product, machine-substitution, congruence-clearing and Jensen-gap developments. These were discovery guidance, not newly kernel-certified imports. No exhaustive-search or global-novelty claim is made. diff --git a/research/trace-curvature-preload/docs/RESEARCH.md b/research/trace-curvature-preload/docs/RESEARCH.md new file mode 100644 index 0000000000..e2ac24c0db --- /dev/null +++ b/research/trace-curvature-preload/docs/RESEARCH.md @@ -0,0 +1,13 @@ +# Preserved research and bounded outcomes + +The scalar trace and frame chains should be optimized together. The successful60-cell witness changes a representation while holding the full operator, boundary signature, residual widths, rank mass, child count and workspace fixed. The curvature vector detects a strict cost change that those aggregate invariants cannot detect. + +A first native screen of1,237,484complex insertion positions found no strict gain. Switching to the newly binding bit supplier screened1,431,669positions with1,388,956legal placements and68,400positive nominations. The exact60-cell batch passed independent rational/column checks. A second1,451,628-position single-move screen found no additional gain. This is a bounded neighborhood result, not optimality. + +Whole-width-eight stage profiles for7through17stages favored nine; seven was infeasible under this restricted whole-owner context. Scaling replica count alone does not improve its normalized profile. Alternative providers and schedules remain open. + +The response lane tested transport of dirty compensation to the post-center/pre-B cut. Its specified frame gate failed; this does not disprove other cuts or joint cancellations. Exact untouched-version transport was still constructed as a neutral 720-column example. A separate100-seed nested-response search yielded a40-to44static-pivot complex presentation, then full728-column checks in both orientations and44omission controls passed. It removes four rank-one children locally but needs complete new owner/physical admission before any independent complex bound may be claimed. The final kappa uses unchanged535complex. + +Four proof layers are included: trace equivalence with frame reassignment; complete-context resource substitution; a complete finite cone for all concave profile costs; and staged/versioned response compilation. They are not four independent exponent bonuses. Future workers can search for legal scalar/frame transformations whose profile differences lie in the proven cone, then reuse the same context theorem and finite pipeline. + +The promising next sufficient target is another concrete trace/frame rewrite or a complete version-transport factorization improving the binding bit profile while preserving the actual owner interface. Every proposed gain still needs a source word and its finite bill. No hypothetical gadget is treated as proved. diff --git a/research/trace-curvature-preload/docs/TRACE-REFINEMENT.md b/research/trace-curvature-preload/docs/TRACE-REFINEMENT.md new file mode 100644 index 0000000000..62096bee18 --- /dev/null +++ b/research/trace-curvature-preload/docs/TRACE-REFINEMENT.md @@ -0,0 +1,92 @@ +# Frame-sensitive trace refinement and the preload60 construction + +## Sufficient meta-theorem + +Let a finite reversible scalar program act on registers indexed by I over a field K. A scalar addition is T(t,s,q)=I+q e_t e_s^T, with t != s. Each register has an explicit initial frame, an explicit terminal frame, and a monotone chain of finite subspaces at its actual uses. Certain observation checkpoints (for example retained totals at a scatter) are fixed. + +Construct another program by the following certified operations: + +1. Factor a multi-source addition into elementary additions with the same destination and unchanged coefficients. +2. Permute elementary additions only through explicitly checked commuting gates, without crossing protected observation checkpoints. +3. Assign a new common frame to each relocated addition. Require that every touched register's predecessor frame is contained in it and that it is contained in that register's successor frame, including fixed initial, terminal and observation frames. +4. Rebuild the inverse background cleanup literally. Recompute every actual frame transition, retained-copy rank, scalar prefix bound and finite realization invoice. + +Then the new scalar program has exactly the same complete arbitrary-input endpoint. Its framed program satisfies the retained native frame-realization interface, and its exact recursive profile is the profile recomputed from those new chains, together with all retained-copy children. If the entrance and terminal signatures stay fixed, every old whole-owner allocation remains usable with unchanged residual-width and idle-remainder accounting. The changed physical finite realization still requires its actual phase/compiler and prefix checks; the theorem does not make those checks or inherited all-size hypotheses disappear. + +This is a calculus of representations of the SAME scalar word: it searches the trace-equivalence class and then selects a different legal frame labeling. A fixed event-order frame optimizer cannot expose every member of that class. A scalar-only optimizer cannot see the cost of its frame chains. Their joint finite certificate is the sufficient object. + +## Algebraic proof + +For t distinct from all s_i, the elementary additions to destination t commute, since e_(s_i)^T e_t=0. Hence + + I + sum_i q_i e_t e_(s_i)^T = product_i T(t,s_i,q_i). + +For distinct-source/destination elementary additions T(t,s,q) and T(u,v,r), the sufficient commuting condition is t != v and u != s. Expanding both products gives the same identity, two linear terms and zero cross terms. (There are further special commuting cases; they are not needed.) A scale on register u commutes with T(t,s,q) when u is neither t nor s. + +Every allowed adjacent exchange therefore preserves the entire linear operator. Induction on the explicit exchange list proves equality of the reordered body. It holds on arbitrary source, target and dirty-helper columns, not merely clean inputs. A word can be moved through a whole interval if it commutes with every gate crossed. Protected checkpoints are preserved because no move crosses them. + +If background updates do not read target registers, the background transformation is independent of targets. Reversing the order and inverting each actual new background gate gives its exact inverse, restoring all source/helper inputs. For an addition this negates its coefficient; over F2 the coefficient is unchanged. The body's target output is unchanged by the trace identity. Thus the full dirty-register endpoint is unchanged. Existing compensation can be retained because the body map itself, on every column, is unchanged. + +At a relocated instruction, the explicit predecessor/common/successor inclusions establish native frame legality. All other chains retain their previous inclusions. Applying the existing compiler interface to the actual changed word gives the same final labeled endpoint, with exactly the newly listed transition ranks. This last statement is conditional on that pre-existing all-size compiler interface; finite column replay is not an independent proof of the all-size interface. + +## Critical pair: splitting plus scheduling plus reframing + +Consider a two-source cell h += x+y first formed at a rank2 frame containing the rank1 source frames. Suppose its x addition commutes through the entire prefix, h initially has frame0, and the prefix does not observe h. Factor the gate into h += x followed by h += y. Move h += x to the beginning and perform it at x's rank1 frame. The later h += y remains at the original rank2 frame. + +The scalar map is identical. In the actual selected instance, the helper's former rank2 climb splits into two rank1 climbs. Meanwhile x no longer needs a formerly unique intermediate rank2 use between rank1 and rank4: its two climbs of ranks1 and2 coalesce into a rank3 climb. Therefore the net child-profile change is + + +delta1 - 2 delta2 + delta3. + +This is why neither a fixed-position scalar rewrite nor a fixed-order frame-coalescing pass alone finds the gain. The seam is moved before the frame assignment is simplified. The general theorem does not assume this particular delta: it always recomputes the actual changed chains. + +For every 07zx?_61%v=G*uP)TXQxG<8vS$<%!Xm)`5@xg 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 0 and replicas % 8 == 0 + by_width = {} + for rep in range(replicas): + for helper, width in enumerate(widths): + assert 0 < width <= 8 + by_width.setdefault(width, deque()).append((rep, helper)) + patterns = tile({w: len(q) for w, q in by_width.items()}, 64) + result = {} + bank = 0 + for widths_in_bank, count in patterns: + for _ in range(count): + offset = 0 + for width in widths_in_bank: + key = by_width[width].popleft() + result[key] = (bank, offset, width) + offset += width + assert offset == 64 + bank += 1 + assert all(not q for q in by_width.values()) + assert len(result) == replicas * len(widths) + return result, bank + + +def validate_isometries(rows, frames, roots, dimensions): + seen = set() + dot = lambda a, b: sum(x*y for x, y in zip(a, b)) + for record in rows: + f = record['frame'] + assert f not in seen + seen.add(f) + e = record['entrance_rank'] + assert e == dimensions[f] and record['denominator'] == 2 + basis = record['entrance_basis'] + record['residual_basis'] + matrix = record['orthogonal_rows_numerator'] + assert len(basis) == len(matrix) == 8 + assert matrix == [roots[i] for i in basis] + assert all(len(r) == 8 and all(type(x) is int for x in r) for r in matrix) + assert all(dot(a,b) == 4*(i==j) for i,a in enumerate(matrix) for j,b in enumerate(matrix)) + # The first e rows span precisely the frame, not only its dimension. + for i in frames[f]: + assert sum(dot(roots[i], q)**2 for q in matrix[:e]) == 4*dot(roots[i], roots[i]) + assert len(record['entrance_basis']) == e + # This selected family needs coordinate permutations only. Checking the + # elementary reduction also bounds the literal route cost and primes. + reduced = [[x // 2 for x in row] for row in matrix] + assert all(x % 2 == 0 for row in matrix for x in row) + operations = record['gaussian_reduction'] + assert len(operations) <= 7 + for kind, i, j, scalar in operations: + assert kind == 'swap' and scalar is None and 0 <= i < 8 and 0 <= j < 8 + reduced[i], reduced[j] = reduced[j], reduced[i] + assert reduced == [[int(i == j) for j in range(8)] for i in range(8)] + return seen diff --git a/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/e8core.py b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/e8core.py new file mode 100644 index 0000000000..78983b3687 --- /dev/null +++ b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/e8core.py @@ -0,0 +1,203 @@ +"""Our own engine for bitE8/1 words (E8 root-line labels, h = 8): frame algebra over Q via root-line masks, +legality/F2 replay, five-stage histogram, exact bit coarse saving and PR #315 outer assembly (our engine copies). +Chafik Boukhalfa (chafreaky) with Anthropic Claude assistance; Apache-2.0.""" +import gzip, json, os, importlib.util +from fractions import Fraction as Q +from collections import Counter + +HERE = os.path.dirname(os.path.abspath(__file__)) +def _load(n): + s = importlib.util.spec_from_file_location('e8_' + n, os.path.join(HERE, "engines", n + ".py")) + m = importlib.util.module_from_spec(s); s.loader.exec_module(m); return m +moment = _load('moment'); other = _load('base_two_moment'); outer = _load('outer') + +B2 = Q(876248285600677, 10**18) # Sussman E8 five-stage (PR #352) +B3 = Q(932783231884153, 10**18) # DaysSky seven-stage B_3 (PR #363; no Lean proof) + + +def load_word(p): + with (gzip.open(p, 'rt') if p.endswith('.gz') else open(p)) as f: + return json.load(f) + + +def save_word(c, p): + with gzip.open(p, 'wt') as f: + json.dump(c, f, separators=(',', ':')) + + +def rank(vecs): + rows = [[Q(x) for x in r] for r in vecs]; rk = 0 + n = len(rows[0]) if rows else 0 + for col in range(n): + p = next((i for i in range(rk, len(rows)) if rows[i][col] != 0), None) + if p is None: continue + rows[rk], rows[p] = rows[p], rows[rk] + for i in range(len(rows)): + if i != rk and rows[i][col] != 0: + f = rows[i][col] / rows[rk][col]; rows[i] = [a - f * b for a, b in zip(rows[i], rows[rk])] + rk += 1 + return rk + + +class Lat: + """Root-spanned subspaces of Q^8 represented by the mask of root lines they contain.""" + def __init__(self, lines): + self.lines = [tuple(x) for x in lines]; self.v = len(lines) + self._dim = {0: 0}; self._close = {} + # Gram (form /2) for orthogonality + self.ip = [[sum(a * b for a, b in zip(x, y)) // 2 for y in self.lines] for x in self.lines] + + def close(self, mask): + """mask of all root lines in span(roots of mask)""" + if mask in self._close: return self._close[mask] + idx = [i for i in range(self.v) if mask >> i & 1] + basis = [] + for i in idx: + if rank([self.lines[j] for j in basis] + [self.lines[i]]) > len(basis): basis.append(i) + d = len(basis); out = 0 + if d == 8: out = (1 << self.v) - 1 + elif d: + B = [self.lines[j] for j in basis] + for i in range(self.v): + if rank(B + [self.lines[i]]) == d: out |= 1 << i + self._close[mask] = out; self._close[out] = out; self._dim[out] = d + return out + + def dim(self, mask): + if mask not in self._dim: self.close(mask) + return self._dim[mask] + + def basis(self, mask): + b = [] + for i in range(self.v): + if mask >> i & 1 and rank([self.lines[j] for j in b] + [self.lines[i]]) > len(b): b.append(i) + return b + + def perp(self, t): + return self.close(sum(1 << j for j in range(self.v) if self.ip[t][j] == 0)) + + +def to_masks(c, L): + return [L.close(sum(1 << i for i in fr)) for fr in c['frames']] + + +PHASES = ('D', 'A', 'B', 'C') + + +def replay(c, L=None, masks=None, check_f2=True, span=True, span_mode='z'): + """Exact legality + F2 replay + histogram of a bitE8/1 word. Returns dict(H_local, steps, ...). + Legality: each register's frames nested (mask inclusion = exact Q-subspace inclusion for root-spanned frames) and + strictly increasing at each move; every gate at one common frame; D compensation at frame 0; y at frame 0 at the + scatter; COPY of retained totals; final frames (x, helpers FULL; y_t at its cap t-perp). + Source-span: every non-target operand's x-support lies in the gate frame.""" + L = L or Lat(c['lines']); masks = masks or to_masks(c, L) + v, R, h = c['v'], c['R'], c['h']; n = 2 * v + R; FULL = (1 << v) - 1 + cur = [masks[f] for f in c['start']] + for r in range(v): assert cur[r] == L.close(1 << r), 'x start' + for r in range(v, 2 * v): assert cur[r] == 0, 'y start at 0' + sig = [L.dim(cur[r]) for r in range(n)] + H = Counter(); steps = 0; viol = [] + val = [1 << i for i in range(n)] + zsupp = [{i: 1} if i < v else {} for i in range(n)] # integer support of each register over the x columns (all ADDs are +1) + def climb(r, m): + nonlocal steps + if cur[r] == m: return + assert cur[r] & ~m == 0 and cur[r] != m, ('not nested', r) + H[L.dim(m) - L.dim(cur[r])] += 1; steps += 1; cur[r] = m + def run(gates, ph): + for k, (f, d, srcs) in enumerate(gates): + m = masks[f] + assert d >= v and d not in srcs and len(set(srcs)) == len(srcs), (ph, k) + for x in [d] + srcs: climb(x, m) + for s in srcs: + val[d] ^= val[s] + if span: + if s < v or s >= 2 * v: + ms = sum(1 << i for i in zsupp[s]) + if ms & ~m: viol.append((ph, k, s)) + zd = zsupp[d] + for i, a in zsupp[s].items(): + w = zd.get(i, 0) + a + if w: zd[i] = w + else: zd.pop(i, None) + if span_mode == 'f2': + zsupp[d] = {i: 1 for i in range(v) if val[d] >> i & 1} + if span and d >= 2 * v: + md = sum(1 << i for i in zsupp[d]) + if md & ~m: viol.append((ph, k, d)) + run(c['D'], 'D') + for r in range(v, n): assert cur[r] == masks[c['start'][r]], 'D compensation at frame 0 (helpers untouched otherwise)' + run(c['A'], 'A') + for t in range(v): assert cur[v + t] == 0, 'y at frame 0 at the scatter' + copies = [val[q] for q in c['ret']] + for q in c['ret']: + assert q >= 2 * v; H[L.dim(cur[q])] += 1 + for t, row in enumerate(c['scatter']): + for k in row: val[v + t] ^= copies[k] + run(c['B'], 'B'); run(c['C'], 'C') + for r in range(n): climb(r, masks[c['final'][r]]) + for r in range(v): assert cur[r] == FULL + for r in range(2 * v, n): assert cur[r] == FULL + for t in range(v): assert cur[v + t] == L.perp(t), 'y final at cap' + if check_f2: + for s in range(v): assert val[s] == 1 << s + for t in range(v): assert val[v + t] == (1 << (v + t)) | (1 << t), ('target', t) + for r in range(2 * v, n): assert val[r] == 1 << r, ('helper', r) + return dict(sig=sig, viol=viol, H=H, steps=steps, n=n, v=v, R=R, h=h, L=L, masks=masks, ncopy=len(c['ret'])) + + +def profile(H_local, v, h=8): + prof = Counter({j: 5 * c for j, c in H_local.items()}) + for j in (2 * h - 2, h - 1, 2 * h + 2, 4): prof[j] += 2 * v + return prof + + +def coarse(H, m, W): + grid = Q(1, 10**18) + root = moment.certify(dict(H), m, W, True); c = Q(int(Q(root['lower']) * 10**18), 10**18) + assert moment.moment(H, m, W, c, True)[1] < 1 < moment.moment(H, m, W, c + grid, True)[0] + fb = 32 * m * m * sum(H.values()) + _, up = other.moment(m, W, list(H.items()), c); _, bad = other.moment(m, W, [(1, fb)], c) + lo, _ = other.moment(m, W, list(H.items()), c + grid); blo, _ = other.moment(m, W, [(1, fb)], c + grid) + assert up + Q(1, 10**16) * bad < 1 < lo + Q(1, 10**16) * blo + return c + + +def kappa(c, b): + grid = Q(1, 10**18); eta = Q(1, 10**12); beta = Q(1, 10**9); cap = (1 - beta) * b + sv = min(c, Q(((cap - grid) * 10**18).__floor__(), 10**18)); binding = 'bit' if sv == c else 'complex' + chain = [Q(384599, 10**10)] + for _ in range(3): + a = (1 - sv) * sv + sv * chain[-1]; assert chain[-1] < a < sv < 1 - a; chain.append(a) + bit = chain[-1] + bridge = dict(proof='PROOF.md', representation='Exact powers with source-bound finite overcharges', + semantic=dict(G=dict(base=2, exponent=30000), E=dict(base=2, exponent=100000), B_upper=dict(base=2, exponent=100001), + C0=dict(base=2, exponent=210000), C1=1, strict_literal_gap=1, induction_gap_lower=1), + rows=dict(coefficient=20161, degree=10**6, suffix_slope=4 * 10**6, degree_gap=Q(10**6) - Q(51 * 20161, 25))) + q = bit * (1 - 2 * eta); mn = (1 - eta) * q / (1 + q); t = mn * 10**18; k = Q((t.numerator - 1) // t.denominator, 10**18) + asm = outer.assembly(bit, b, bridge, k, eta=eta, beta=beta) + assert len(asm['strict_constraints']) == 47 and min(asm['strict_constraints'].values()) > 0 + try: + outer.assembly(bit, b, bridge, k + grid, eta=eta, beta=beta); raise SystemExit('ADJACENT ADMITTED') + except AssertionError: pass + return k, binding + + +def price_word(c, **kw): + r = replay(c, **kw) + v, h, R = r['v'], r['h'], r['R']; m = 5 * h + resid = sum(h - r['sig'][x] for x in range(2 * v, 2 * v + R)) + T = 1 if resid % h == 0 else h + W = (4 * v * h + resid) * T // h; assert (4 * v * h + resid) * T % h == 0 + prof = Counter({j: T * k for j, k in profile(r['H'], v, h).items()}); mass = sum(a * b for a, b in prof.items()) + L_copy = h * r['ncopy'] + assert m * W - mass == T * (4 * v - 5 * L_copy), ('deficit', m * W - mass) + assert 2 * max(prof) < m + cc = coarse(prof, m, W) + return dict(c=cc, H=r['H'], prof=prof, W=W, T=T, resid=resid, m=m, deficit=m * W - mass, replay=r) + + +def phi_fn(m, W, a): + """linearized moment term per child of rank r (float), for search scoring""" + import math + return lambda r: r / (m * W) * math.exp(a * math.log(m / r)) diff --git a/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines/base_two_moment.py b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines/base_two_moment.py new file mode 100644 index 0000000000..14a90fa0e7 --- /dev/null +++ b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines/base_two_moment.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +"""Maintainer arithmetic cross-check of the pinned PR39 certificate. + +Uses no producer/checker imports. Counts are inputs, not proved by this script. +80-term rational logarithms and 12-term exponentials independently enclose +the two moments. The accompanying written review addresses their realization. +""" +import argparse +from fractions import Fraction as Q +from hashlib import sha256 +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +GRID = 10**30 + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def log_unit(x): + require(1 <= x <= 2, "logarithm range") + z = (x-1)/(x+1) + lo = 2*sum((z**(2*j+1)/(2*j+1) for j in range(80)), Q(0)) + return lo, lo+2*z**161/(161*(1-z*z)) + + +def log_bounds(x): + k = 0 + while x > 2: + x /= 2 + k += 1 + lo, hi = log_unit(x) + l2, u2 = log_unit(Q(2)) + lo, hi = lo+k*l2, hi+k*u2 + # Outward rational rounding keeps later certificates compact. + return Q((lo*GRID).__floor__(), GRID), Q((hi*GRID).__ceil__(), GRID) + + +def exp_bounds(x): + require(0 <= x < 1, "exponential range") + term = total = Q(1) + for j in range(1, 13): + term *= x/j + total += term + tail = term*x/13/(1-x/14) + return total, total+tail + + +def moment(m, W, entries, saving): + lo = hi = Q(0) + for t, count in entries: + t, count = int(t), int(count) + require(0 < t < m and count > 0, "improper child") + l, u = log_bounds(Q(m, t)) + lower = exp_bounds(saving*l)[0] + upper = exp_bounds(saving*u)[1] + lo += Q(t*count, m*W)*lower + hi += Q(t*count, m*W)*upper + return Q((lo*GRID).__floor__(), GRID), Q((hi*GRID).__ceil__(), GRID) + diff --git a/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines/moment.py b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines/moment.py new file mode 100644 index 0000000000..7d697cb452 --- /dev/null +++ b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/engines/moment.py @@ -0,0 +1,113 @@ +"""Independent prospective ordinary five-stage cost, never supplier admission. + +Consumes a raw one-invocation ledger made from the actual source/internal/target +paths. No packed profile is used as an input. Missing physical/finite/compiler +obligations must remain explicit in the accompanying report. +""" +from collections import Counter +from decimal import Decimal, localcontext, ROUND_FLOOR +from fractions import Fraction as F +from functools import lru_cache +from math import factorial +import hashlib, json, sys +from pathlib import Path + +DYAD = 1 << 224 + +def floor(x): return F(x.numerator*DYAD//x.denominator, DYAD) +def ceil(x): return -floor(-x) + +@lru_cache(None) +def logarithm(x): + """Mercator bounds after binary reduction; ln(2) via two Mercator sums. + + For 1 <= y < 2, log(y) is an alternating series in z=y-1. + We instead reduce to 1 <= y < 3/2, and bound log(3/2) and + log(2) by the same alternating series at z=1/2 and z=1/3, + using log(2)=log(3/2)+log(4/3). All sums are exact rationals. + """ + assert x >= 1 + k = 0 + while x >= 2: x /= 2; k += 1 + j = int(x >= F(3, 2)) + if j: x /= F(3, 2) + def mercator(y): + z=y-1 + assert 0 <= z <= F(1,2) + # An even partial sum is below log; the next term bounds its tail. + t=z; s=F(0) + for n in range(1, 225): + s += (t if n & 1 else -t)/n + t *= z + return s, s+t/225 + a,b=mercator(x); c,d=mercator(F(3,2)); e,f=mercator(F(4,3)) + return floor(a+(k+j)*c+k*e), ceil(b+(k+j)*d+k*f) + +def exponential(l,u): + assert 0 <= l <= u < F(1,10) + def poly(x): + s=t=F(1) + for j in range(1,25): t=t*x/j; s+=t + return s,t + lo,_=poly(l);hi,last=poly(u) + return floor(lo),ceil(hi+last*u/25/(1-u/26)) + +def moment(H,m,W,a,bad=False): + lo=hi=F(0) + for r,n in H.items(): + assert 0 < r < m and n > 0 + l,u=logarithm(F(m,r)); e,f=exponential(a*l,a*u) + p=F(r*n,m*W);lo+=p*e;hi+=p*f + if bad: + # Existing envelope shape, only conditionally portable to the new cover. + l,u=logarithm(F(m));e,f=exponential(a*l,a*u) + p=F(32*m*sum(H.values()),10**16*W) + lo+=p*e;hi+=p*f + return floor(lo),ceil(hi) + +def decimal(x): + with localcontext() as c: + c.prec=70 + return str(Decimal(x.numerator)/Decimal(x.denominator)) + +def certify(H,m,W,bad=False): + with localcontext() as c: + c.prec=70 + terms=[(Decimal(r*n)/Decimal(m*W),(Decimal(m)/Decimal(r)).ln()) for r,n in H.items()] + fallback=Decimal(32*m*sum(H.values()))/Decimal(10**16*W) if bad else Decimal(0) + lm=Decimal(m).ln();lo=Decimal(0);hi=Decimal('.003') + for _ in range(210): + a=(lo+hi)/2 + if sum(p*(a*l).exp() for p,l in terms)+fallback*(a*lm).exp()<1:lo=a + else:hi=a + q=int(((lo+hi)/2*10**24).to_integral_value(rounding=ROUND_FLOOR)) + lo=F(q,10**24);hi=lo+F(1,10**24) + lv=moment(H,m,W,lo,bad);hv=moment(H,m,W,hi,bad) + assert lv[1]<10 for v in slacks.values()),{k:str(v) for k,v in slacks.items() if v<=0} + assert min(margins.values())==minimum + assert margins['balanced_prefix']-minimum==eta and 1-eps-r==eta/2 + assert 1-eps*(1+c)==eta-eps*eta/4 + return dict(parameters=dict(a_bit=a,a_complex=b,tau=tau,sigma=sigma, + eta=eta,beta=beta,q=q,c=c,epsilon=eps,lambda_=lam, + lambda_prime=lp,alpha_squared_power=r,delta=delta, + C0=bridge['semantic']['C0'],C1=1,kappa=kappa), + strict_constraints=slacks,margins=margins,minimum_margin=minimum, + absorption_gap=minimum-kappa, + recurrence=dict(internal=internal,leaf=leaf,reservations=1-c)) diff --git a/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/tile_m.py b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/tile_m.py new file mode 100644 index 0000000000..cd5fd9b539 --- /dev/null +++ b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/code/tile_m.py @@ -0,0 +1,93 @@ +"""Residual census (8 - sigma per helper) and an exact zero-padding bank tiling of width m = (2K+1)h with T replicas: +tile() and economy_tile() verbatim from our PR #329 bank_template.py (via code/tile.py of our dtst3 package). +usage: tile_m.py WORD.json.gz M [replicas] (replicas default: the least T with T x residual sum = 0 mod M that tiles)""" +import sys,os,collections +from collections import Counter +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from e8core import * +def economy_tile(blocks, m): + """Exact zero-padding tiling used when the filler search of tile() runs out of filler blocks (the kernel pivots + and early restorations of the stage stack add many residual widths that do not divide m; the PR #299 analogue at + p = 12 was the (r^4, 24, 4^(24-r)) re-tiling). The fillers are the two most numerous widths dividing m (here the + full helper width h and the rank-4 entrance residual). Each other width w, in decreasing order, gets the bank + w^a F^c f^b (w*a + F*c + f*b = m) that spends the fewest narrow fillers f per w block (then the largest a), plus + at most one bank w^r F^c' f^b' for the remainder r = n mod a. The leftover fillers fill pure banks F^(m/F), + f^(m/f) and y residue banks F^j f^k. Every bank sums to m and every block is used exactly once (no padding).""" + from fractions import Fraction + blocks = {w: n for w, n in blocks.items() if n} + div = sorted((w for w in blocks if m % w == 0), key=lambda w: (-blocks[w], w)) + assert len(div) >= 2, ('economy tiling needs two filler widths', blocks) + F, f = sorted(div[:2], reverse=True) + + def fill(rest): + """(c, b) with F*c + f*b = rest, c maximal (fewest narrow fillers); None if impossible.""" + return next(((c, (rest - F*c)//f) for c in range(rest//F, -1, -1) if (rest - F*c) % f == 0), None) + + left = {F: blocks[F], f: blocks[f]}; out = [] + for w in sorted((x for x in blocks if x not in (F, f)), reverse=True): + n = blocks[w] + opts = [(Fraction(cb[1], a), -a, a, cb) for a in range(m//w, 0, -1) for cb in [fill(m - w*a)] if cb] + assert opts, ('no bank for width', w) + _, _, a, (c, b) = min(opts); q, r = divmod(n, a) + if q: out.append(((w,)*a + (F,)*c + (f,)*b, q)); left[F] -= q*c; left[f] -= q*b + if r: + cb = fill(m - w*r); assert cb, ('no remainder bank', w, r) + out.append(((w,)*r + (F,)*cb[0] + (f,)*cb[1], 1)); left[F] -= cb[0]; left[f] -= cb[1] + assert left[F] >= 0 and left[f] >= 0, ('fillers exhausted', left) + pF, pf = m//F, m//f + for y in range((pF*pf) + 1): + for j in range(1 if y else 0, pF if y else 1): + if (m - F*j) % f: continue + k = (m - F*j)//f; aF, af = left[F] - y*j, left[f] - y*k + if aF >= 0 and af >= 0 and aF % pF == 0 and af % pf == 0: + out += ([((F,)*j + (f,)*k, y)] if y else []) + ([((F,)*pF, aF//pF)] if aF else []) + ([((f,)*pf, af//pf)] if af else []) + return out + raise AssertionError(('no exact zero-padding tiling', blocks, m)) + + +def tile(blocks, m): + """Exact tiling of {width: number of blocks} into banks of total width m, as ((widths, banks), ...). + + A width dividing m fills pure banks. A width w not dividing m is mixed with a filler width f dividing m: + banks w^a f^b with a maximal (w*a + f*b = m), then at most one bank w^r f^t for the remainder r. Fillers + are tried in a fixed order (most blocks first) with backtracking until every pure width also divides out. + Fails (AssertionError) unless every block is used and every bank is full; there is no padding.""" + blocks = {w: n for w, n in blocks.items() if n} + assert all(0 < w <= m for w in blocks) + mixed = sorted(x for x in blocks if m % x) + + def search(i, left, out): + if i == len(mixed): + if any(left[w] % (m // w) for w in left): return None + return out + [(tuple([w]*(m // w)), left[w]//(m // w)) for w in sorted(left) if left[w]] + w = mixed[i]; n = blocks[w] + for f in sorted(left, key=lambda x: (-left[x], x)): + a = next((a for a in range(m // w, 0, -1) if (m - w*a) % f == 0), None) + if a is None: continue + b = (m - w*a)//f; q, r = divmod(n, a) + if r and (m - w*r) % f: continue + t = (m - w*r)//f if r else 0 + if q*b + t > left[f]: continue + rest = dict(left); rest[f] -= q*b + t + found = search(i + 1, rest, out + ([(tuple([w]*a + [f]*b), q)] if q else []) + ([(tuple([w]*r + [f]*t), 1)] if r else [])) + if found is not None: return found + return None + out = search(0, {w: n for w, n in blocks.items() if not m % w}, []) + if out is None: out = economy_tile(blocks, m) + assert all(sum(widths) == m and count > 0 for widths, count in out) + used = Counter() + for widths, count in out: + for x in widths: used[x] += count + assert used == Counter(blocks), 'every block used exactly once' + return tuple(out) +if __name__ == '__main__': + c = load_word(sys.argv[1]); m = int(sys.argv[2]) + L = Lat(c['lines']); M = to_masks(c, L); v = c['v']; n = 2 * v + c['R'] + res = Counter(8 - L.dim(M[c['start'][r]]) for r in range(2 * v, n)); tot = sum(k * x for k, x in res.items()) + reps = [int(sys.argv[3])] if len(sys.argv) > 3 else [t for t in range(1, 200) if t * tot % m == 0] + for T in reps: + try: pat = tile({r: T * k for r, k in res.items() if r > 0}, m); break + except AssertionError: pat = None + assert pat, 'no tiling' + print(' residual census', dict(sorted(res.items())), 'sum', tot) + print(' PASS exact width-%d tiling with %d replicas: %d banks' % (m, T, sum(k for _, k in pat)), pat) diff --git a/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/data/residual-isometries.json b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/data/residual-isometries.json new file mode 100644 index 0000000000..9b8b35cb15 --- /dev/null +++ b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/data/residual-isometries.json @@ -0,0 +1,1974 @@ +[ + { + "frame": 0, + "entrance_rank": 0, + "denominator": 2, + "entrance_basis": [], + "residual_basis": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [] + }, + { + "frame": 2, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 0 + ], + "residual_basis": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [] + }, + { + "frame": 3, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 1 + ], + "residual_basis": [ + 0, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ] + ] + }, + { + "frame": 4, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 2 + ], + "residual_basis": [ + 0, + 1, + 3, + 4, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ], + [ + "swap", + 1, + 2, + null + ] + ] + }, + { + "frame": 5, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 3 + ], + "residual_basis": [ + 0, + 1, + 2, + 4, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ], + [ + "swap", + 1, + 2, + null + ], + [ + "swap", + 2, + 3, + null + ] + ] + }, + { + "frame": 6, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 4 + ], + "residual_basis": [ + 0, + 1, + 2, + 3, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ], + [ + "swap", + 1, + 2, + null + ], + [ + "swap", + 2, + 3, + null + ], + [ + "swap", + 3, + 4, + null + ] + ] + }, + { + "frame": 7, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 5 + ], + "residual_basis": [ + 0, + 1, + 2, + 3, + 4, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ], + [ + "swap", + 1, + 2, + null + ], + [ + "swap", + 2, + 3, + null + ], + [ + "swap", + 3, + 4, + null + ], + [ + "swap", + 4, + 5, + null + ] + ] + }, + { + "frame": 8, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 6 + ], + "residual_basis": [ + 0, + 1, + 2, + 3, + 4, + 5, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ], + [ + "swap", + 1, + 2, + null + ], + [ + "swap", + 2, + 3, + null + ], + [ + "swap", + 3, + 4, + null + ], + [ + "swap", + 4, + 5, + null + ], + [ + "swap", + 5, + 6, + null + ] + ] + }, + { + "frame": 9, + "entrance_rank": 1, + "denominator": 2, + "entrance_basis": [ + 7 + ], + "residual_basis": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 1, + null + ], + [ + "swap", + 1, + 2, + null + ], + [ + "swap", + 2, + 3, + null + ], + [ + "swap", + 3, + 4, + null + ], + [ + "swap", + 4, + 5, + null + ], + [ + "swap", + 5, + 6, + null + ], + [ + "swap", + 6, + 7, + null + ] + ] + }, + { + "frame": 458, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 0, + 1, + 2, + 3 + ], + "residual_basis": [ + 4, + 5, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [] + }, + { + "frame": 461, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 0, + 2, + 4, + 6 + ], + "residual_basis": [ + 1, + 3, + 5, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 1, + 4, + null + ], + [ + "swap", + 2, + 4, + null + ], + [ + "swap", + 3, + 5, + null + ], + [ + "swap", + 5, + 6, + null + ] + ] + }, + { + "frame": 463, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 0, + 3, + 4, + 7 + ], + "residual_basis": [ + 1, + 2, + 5, + 6 + ], + "orthogonal_rows_numerator": [ + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 1, + 4, + null + ], + [ + "swap", + 2, + 5, + null + ], + [ + "swap", + 3, + 4, + null + ], + [ + "swap", + 4, + 5, + null + ], + [ + "swap", + 5, + 6, + null + ], + [ + "swap", + 6, + 7, + null + ] + ] + }, + { + "frame": 465, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 1, + 2, + 4, + 7 + ], + "residual_basis": [ + 0, + 3, + 5, + 6 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 4, + null + ], + [ + "swap", + 1, + 4, + null + ], + [ + "swap", + 2, + 4, + null + ], + [ + "swap", + 3, + 5, + null + ], + [ + "swap", + 5, + 6, + null + ], + [ + "swap", + 6, + 7, + null + ] + ] + }, + { + "frame": 466, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 1, + 2, + 5, + 6 + ], + "residual_basis": [ + 0, + 3, + 4, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 4, + null + ], + [ + "swap", + 1, + 4, + null + ], + [ + "swap", + 2, + 4, + null + ], + [ + "swap", + 3, + 5, + null + ], + [ + "swap", + 4, + 6, + null + ], + [ + "swap", + 5, + 6, + null + ] + ] + }, + { + "frame": 468, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 1, + 3, + 5, + 7 + ], + "residual_basis": [ + 0, + 2, + 4, + 6 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 4, + null + ], + [ + "swap", + 1, + 4, + null + ], + [ + "swap", + 2, + 5, + null + ], + [ + "swap", + 3, + 4, + null + ], + [ + "swap", + 4, + 6, + null + ], + [ + "swap", + 6, + 7, + null + ] + ] + }, + { + "frame": 469, + "entrance_rank": 4, + "denominator": 2, + "entrance_basis": [ + 2, + 3, + 4, + 5 + ], + "residual_basis": [ + 0, + 1, + 6, + 7 + ], + "orthogonal_rows_numerator": [ + [ + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0 + ], + [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ] + ], + "gaussian_reduction": [ + [ + "swap", + 0, + 4, + null + ], + [ + "swap", + 1, + 5, + null + ], + [ + "swap", + 2, + 4, + null + ], + [ + "swap", + 3, + 5, + null + ] + ] + } +] diff --git a/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/data/word.json.gz b/research/trace-curvature-preload/vendor/e8-bit-carrier-skeleton/code/hub/e8-r740-replica32/data/word.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..85390b07e4747feddbf2e16f94b5e0a8a308c191 GIT binary patch literal 54461 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