From 50a1c992ce28c95d83d11bc691353aaa289d9d65 Mon Sep 17 00:00:00 2001 From: DreamingOfClouds Date: Tue, 13 Oct 2026 15:21:22 -0500 Subject: [PATCH] =?UTF-8?q?The=20end-cap=20wall:=20why=20copies=20are=20fo?= =?UTF-8?q?rced=20in=20the=20E8=20skeleton=20(no=20=CE=BA=20claim)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Knowledge package research/end-cap-obstruction/: the end-cap obstruction (a direct read into a target drags the read register's accumulated frame into the target's end cap), its four prices, the measured deletion experiments on the k8 gauge-forward word, the exact unit price, the port geometry and copy census, and the closed escapes (version reconstruction, hoist and slide, rematerialisation, coded pairs, frame-conflict bound). One verify.sh with a hard-failing step 0; 27 rows (19 CHECKED, 4 ARGUED, 4 RECORDED). No kappa claim. Co-Authored-By: Claude Opus 5.5 --- research/end-cap-obstruction/LICENSE | 201 + research/end-cap-obstruction/MANIFEST.sha256 | 121 + research/end-cap-obstruction/NOTICE.md | 39 + research/end-cap-obstruction/README.md | 142 + research/end-cap-obstruction/SOURCES.json | 297 + .../end-cap-obstruction/cards/B240/price.py | 17 + .../end-cap-obstruction/cards/B240/prof.py | 49 + .../cards/B244/classify.py | 23 + research/end-cap-obstruction/cards/B244/ev.py | 61 + .../end-cap-obstruction/cards/B244/lift.py | 16 + .../end-cap-obstruction/cards/B248/ceil.py | 17 + .../end-cap-obstruction/cards/B248/climbs.py | 42 + .../cards/B248/gen/ana1.py | 92 + .../cards/B248/gen/cgx_inst.py | 495 + .../end-cap-obstruction/cards/B248/pricep.py | 29 + .../end-cap-obstruction/cards/B248/step0.py | 28 + .../end-cap-obstruction/cards/B249/cand.py | 32 + .../end-cap-obstruction/cards/B249/census.py | 117 + .../end-cap-obstruction/cards/B249/closure.py | 62 + .../end-cap-obstruction/cards/B249/feas.py | 71 + .../end-cap-obstruction/cards/B249/prog.py | 36 + .../end-cap-obstruction/cards/B249/scan.py | 45 + .../end-cap-obstruction/cards/B249/sim.py | 56 + .../end-cap-obstruction/cards/B251/cls2.py | 27 + research/end-cap-obstruction/cards/B251/ev.py | 23 + .../end-cap-obstruction/cards/B251/fin.py | 21 + .../end-cap-obstruction/cards/B251/graph.py | 29 + .../end-cap-obstruction/cards/B251/inc.py | 35 + .../end-cap-obstruction/cards/B251/mis.py | 34 + .../end-cap-obstruction/cards/B251/proj.py | 57 + .../end-cap-obstruction/cards/B251/vals.py | 32 + .../end-cap-obstruction/cards/B252/cgx_y.py | 671 + .../end-cap-obstruction/cards/B253/caps.py | 20 + .../end-cap-obstruction/cards/B253/prof.py | 8 + .../end-cap-obstruction/cards/B253/trace.py | 21 + .../end-cap-obstruction/cards/B254/joint.py | 11 + .../end-cap-obstruction/cards/B254/ops.py | 9 + .../end-cap-obstruction/cards/B254/rm161.py | 14 + .../end-cap-obstruction/cards/B254/roles2.py | 25 + .../end-cap-obstruction/cards/B254/set161.py | 13 + .../end-cap-obstruction/cards/B254/sim161.py | 25 + .../end-cap-obstruction/cards/B256/cluster.py | 27 + .../cards/B256/cluster2.py | 32 + .../end-cap-obstruction/cards/B256/dfs.py | 38 + research/end-cap-obstruction/cards/B256/e1.py | 22 + research/end-cap-obstruction/cards/B256/e2.py | 12 + research/end-cap-obstruction/cards/B256/e6.py | 25 + research/end-cap-obstruction/cards/B256/e7.py | 26 + .../end-cap-obstruction/cards/B256/leaves.py | 26 + .../end-cap-obstruction/cards/B256/lib.py | 18 + .../end-cap-obstruction/cards/B256/pair.py | 23 + .../end-cap-obstruction/cards/B256/plan.py | 55 + research/end-cap-obstruction/cards/B256/vr.py | 69 + .../end-cap-obstruction/cards/B257/cls.py | 21 + .../end-cap-obstruction/cards/B257/det.py | 16 + .../end-cap-obstruction/cards/B257/hoist.py | 66 + .../end-cap-obstruction/cards/B257/slide.py | 68 + .../end-cap-obstruction/cards/B258/endcap.py | 24 + .../cards/B258/kap_free.py | 27 + .../end-cap-obstruction/cards/B259/an1.py | 35 + .../end-cap-obstruction/cards/B259/an2.py | 17 + .../end-cap-obstruction/cards/B259/an3.py | 23 + .../end-cap-obstruction/cards/B259/an4.py | 28 + .../end-cap-obstruction/cards/B259/an5.py | 28 + .../end-cap-obstruction/cards/B259/an6.py | 23 + .../end-cap-obstruction/cards/B260/anc.py | 48 + research/end-cap-obstruction/cards/B260/cp.py | 32 + .../end-cap-obstruction/cards/B260/geo.py | 38 + .../end-cap-obstruction/cards/B260/groups.py | 41 + .../end-cap-obstruction/cards/B260/merge.py | 43 + .../end-cap-obstruction/cards/B260/pure.py | 22 + research/end-cap-obstruction/cards/B260/rd.py | 25 + .../end-cap-obstruction/cards/B260/val.py | 16 + .../end-cap-obstruction/checks/anchors.py | 38 + .../checks/dfs_exhaustive.py | 12 + research/end-cap-obstruction/checks/expect.py | 31 + .../end-cap-obstruction/checks/generated.json | 10 + .../end-cap-obstruction/checks/portdims.py | 26 + research/end-cap-obstruction/checks/units.py | 24 + .../end-cap-obstruction/checks/wordpins.py | 12 + .../evidence/B240-NOTES.md | 49 + .../evidence/B244-NOTES.md | 15 + .../evidence/B245-NOTES.md | 17 + .../evidence/B247-NOTES.md | 18 + .../evidence/B248-NOTES.md | 16 + .../evidence/B251-NOTES.md | 25 + .../evidence/B252-NOTES.md | 18 + .../evidence/B253-NOTES.md | 12 + .../evidence/B254-NOTES.md | 17 + .../evidence/B255-NOTES.md | 17 + .../evidence/B256-NOTES.md | 17 + .../evidence/B257-NOTES.md | 15 + .../evidence/B258-NOTES.md | 48 + .../evidence/B258-b252_caps.txt | 84 + .../evidence/B259-NOTES.md | 21 + .../evidence/B260-NOTES.md | 33 + .../evidence/KPR5-endcap.md | 44 + .../multicold/engines/base_two_moment.py | 63 + .../vendor/multicold/engines/moment.py | 113 + .../vendor/multicold/engines/outer.py | 58 + .../complex-local/static44/gk/gk_common.py | 94 + .../complex-local/static44/gk/gk_word.py | 194 + .../format-limits-corrected/README.md | 805 + .../construction/COMPLETION-PRIORITY.json | 746 + .../construction/leaver/CODED-CELLS-k8.json | 2826 ++ .../construction/leaver/TRI-LEAVER-k8.json | 590 + .../construction/notri/PRIO6.json | 1 + .../construction/slots/SLOT-PINS-k8.json | 47 + .../research/gauge44-slots/data/PLAN.json | 40249 ++++++++++++++++ .../gauge44-slots/data/UPSTREAM-PINS.json | 23 + .../gauge44-slots/independent/audit_local.py | 171 + .../independent/price_profile.py | 161 + .../gauge44-slots/inputs/PR589-EXPECTED.json | 222 + .../inputs/hamming/PACKET-PROGRAMS.json.gz | Bin 0 -> 3400 bytes .../pr531/inputs/hamming/PROTOTYPE.json | 21364 ++++++++ .../inputs/spec/03-motifs.tex | 700 + .../inputs/spec/04-swap.tex | 416 + .../inputs/spec/05-layers.tex | 996 + .../inputs/words/w1018.json.gz | Bin 0 -> 57222 bytes research/end-cap-obstruction/requirements.txt | 4 + .../end-cap-obstruction/scripts/provenance.py | 55 + research/end-cap-obstruction/verify.sh | 240 + 122 files changed, 74934 insertions(+) create mode 100644 research/end-cap-obstruction/LICENSE create mode 100644 research/end-cap-obstruction/MANIFEST.sha256 create mode 100644 research/end-cap-obstruction/NOTICE.md create mode 100644 research/end-cap-obstruction/README.md create mode 100644 research/end-cap-obstruction/SOURCES.json create mode 100644 research/end-cap-obstruction/cards/B240/price.py create mode 100644 research/end-cap-obstruction/cards/B240/prof.py create mode 100644 research/end-cap-obstruction/cards/B244/classify.py create mode 100644 research/end-cap-obstruction/cards/B244/ev.py create mode 100644 research/end-cap-obstruction/cards/B244/lift.py create mode 100644 research/end-cap-obstruction/cards/B248/ceil.py create mode 100644 research/end-cap-obstruction/cards/B248/climbs.py create mode 100644 research/end-cap-obstruction/cards/B248/gen/ana1.py create mode 100644 research/end-cap-obstruction/cards/B248/gen/cgx_inst.py create mode 100644 research/end-cap-obstruction/cards/B248/pricep.py create mode 100644 research/end-cap-obstruction/cards/B248/step0.py create mode 100644 research/end-cap-obstruction/cards/B249/cand.py create mode 100644 research/end-cap-obstruction/cards/B249/census.py create mode 100644 research/end-cap-obstruction/cards/B249/closure.py create mode 100644 research/end-cap-obstruction/cards/B249/feas.py create mode 100644 research/end-cap-obstruction/cards/B249/prog.py create mode 100644 research/end-cap-obstruction/cards/B249/scan.py create mode 100644 research/end-cap-obstruction/cards/B249/sim.py create mode 100644 research/end-cap-obstruction/cards/B251/cls2.py create mode 100644 research/end-cap-obstruction/cards/B251/ev.py create mode 100644 research/end-cap-obstruction/cards/B251/fin.py create mode 100644 research/end-cap-obstruction/cards/B251/graph.py create mode 100644 research/end-cap-obstruction/cards/B251/inc.py create mode 100644 research/end-cap-obstruction/cards/B251/mis.py create mode 100644 research/end-cap-obstruction/cards/B251/proj.py create mode 100644 research/end-cap-obstruction/cards/B251/vals.py create mode 100644 research/end-cap-obstruction/cards/B252/cgx_y.py create mode 100644 research/end-cap-obstruction/cards/B253/caps.py create mode 100644 research/end-cap-obstruction/cards/B253/prof.py create mode 100644 research/end-cap-obstruction/cards/B253/trace.py create mode 100644 research/end-cap-obstruction/cards/B254/joint.py create mode 100644 research/end-cap-obstruction/cards/B254/ops.py create mode 100644 research/end-cap-obstruction/cards/B254/rm161.py create mode 100644 research/end-cap-obstruction/cards/B254/roles2.py create mode 100644 research/end-cap-obstruction/cards/B254/set161.py create mode 100644 research/end-cap-obstruction/cards/B254/sim161.py create mode 100644 research/end-cap-obstruction/cards/B256/cluster.py create mode 100644 research/end-cap-obstruction/cards/B256/cluster2.py create mode 100644 research/end-cap-obstruction/cards/B256/dfs.py create mode 100644 research/end-cap-obstruction/cards/B256/e1.py create mode 100644 research/end-cap-obstruction/cards/B256/e2.py create mode 100644 research/end-cap-obstruction/cards/B256/e6.py create mode 100644 research/end-cap-obstruction/cards/B256/e7.py create mode 100644 research/end-cap-obstruction/cards/B256/leaves.py create mode 100644 research/end-cap-obstruction/cards/B256/lib.py create mode 100644 research/end-cap-obstruction/cards/B256/pair.py create mode 100644 research/end-cap-obstruction/cards/B256/plan.py create mode 100644 research/end-cap-obstruction/cards/B256/vr.py create mode 100644 research/end-cap-obstruction/cards/B257/cls.py create mode 100644 research/end-cap-obstruction/cards/B257/det.py create mode 100644 research/end-cap-obstruction/cards/B257/hoist.py create mode 100644 research/end-cap-obstruction/cards/B257/slide.py create mode 100644 research/end-cap-obstruction/cards/B258/endcap.py create mode 100644 research/end-cap-obstruction/cards/B258/kap_free.py create mode 100644 research/end-cap-obstruction/cards/B259/an1.py create mode 100644 research/end-cap-obstruction/cards/B259/an2.py create mode 100644 research/end-cap-obstruction/cards/B259/an3.py create mode 100644 research/end-cap-obstruction/cards/B259/an4.py create mode 100644 research/end-cap-obstruction/cards/B259/an5.py create mode 100644 research/end-cap-obstruction/cards/B259/an6.py create mode 100644 research/end-cap-obstruction/cards/B260/anc.py create mode 100644 research/end-cap-obstruction/cards/B260/cp.py create mode 100644 research/end-cap-obstruction/cards/B260/geo.py create mode 100644 research/end-cap-obstruction/cards/B260/groups.py create mode 100644 research/end-cap-obstruction/cards/B260/merge.py create mode 100644 research/end-cap-obstruction/cards/B260/pure.py create mode 100644 research/end-cap-obstruction/cards/B260/rd.py create mode 100644 research/end-cap-obstruction/cards/B260/val.py create mode 100644 research/end-cap-obstruction/checks/anchors.py create mode 100644 research/end-cap-obstruction/checks/dfs_exhaustive.py create mode 100644 research/end-cap-obstruction/checks/expect.py create mode 100644 research/end-cap-obstruction/checks/generated.json create mode 100644 research/end-cap-obstruction/checks/portdims.py create mode 100644 research/end-cap-obstruction/checks/units.py create mode 100644 research/end-cap-obstruction/checks/wordpins.py create mode 100644 research/end-cap-obstruction/evidence/B240-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B244-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B245-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B247-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B248-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B251-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B252-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B253-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B254-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B255-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B256-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B257-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B258-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B258-b252_caps.txt create mode 100644 research/end-cap-obstruction/evidence/B259-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/B260-NOTES.md create mode 100644 research/end-cap-obstruction/evidence/KPR5-endcap.md create mode 100644 research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/moment.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/outer.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/format-limits-corrected/README.md create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/COMPLETION-PRIORITY.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/notri/PRIO6.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/PLAN.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/UPSTREAM-PINS.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/independent/audit_local.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/independent/price_profile.py create mode 100644 research/end-cap-obstruction/inputs/repo/research/gauge44-slots/inputs/PR589-EXPECTED.json create mode 100644 research/end-cap-obstruction/inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz create mode 100644 research/end-cap-obstruction/inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PROTOTYPE.json create mode 100644 research/end-cap-obstruction/inputs/spec/03-motifs.tex create mode 100644 research/end-cap-obstruction/inputs/spec/04-swap.tex create mode 100644 research/end-cap-obstruction/inputs/spec/05-layers.tex create mode 100644 research/end-cap-obstruction/inputs/words/w1018.json.gz create mode 100644 research/end-cap-obstruction/requirements.txt create mode 100644 research/end-cap-obstruction/scripts/provenance.py create mode 100755 research/end-cap-obstruction/verify.sh diff --git a/research/end-cap-obstruction/LICENSE b/research/end-cap-obstruction/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/end-cap-obstruction/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/end-cap-obstruction/MANIFEST.sha256 b/research/end-cap-obstruction/MANIFEST.sha256 new file mode 100644 index 0000000000..a0820e9cc3 --- /dev/null +++ b/research/end-cap-obstruction/MANIFEST.sha256 @@ -0,0 +1,121 @@ +c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4 LICENSE +ad7a71b9ae3ab3000309858b46ff6313cbcce8d20d8b0528bbcaf97f94c29bcb NOTICE.md +803031c251c8e1c220a54d3c8c27ac2823e75a46dc11daa98b326636f332eb8a README.md +4d240559adc19573273634f8e02f8e29a06056b474c42f2e3b4b9d645b7fd240 SOURCES.json +0a28fac6c05b82c37c262cfe4ec86eadb3007ebc8074092e8effb02a50c0f409 cards/B240/price.py +8e258cb2ed7373903ff8e7f491579e36f9c6afd574ff2da404dc83c8f0ae8ddf cards/B240/prof.py +e005eee829a35ac5dae388386161ea55d3508f05ac14ce662c2ec4f9435a2f2f cards/B244/classify.py +aadb1eb004d172002f4058077cf8bfb50b8ccb06b8026d8cb73acf1492538ab4 cards/B244/ev.py +785eb1c8c8ecf3e4608254dfd07ca15e7348a526fb973007440e9be6d61c960a cards/B244/lift.py +223ebf28dbc62553b9d5f6428c7db487fc26d099f58c332de5fff456b3c4783d cards/B248/ceil.py +e32e25ff860f6aa1678e56c6632981de22ba3c18e7ea8baf2680a37d4bc505ae cards/B248/climbs.py +59a4d71dcdffec285afb585ad0fb7b0f3e5278ddbc8bc077461c7062226d105f cards/B248/gen/ana1.py +2445dc8d55833c5da8c440180c469c16d269556c49b6e8bc2de8c2cd51a3c1ce cards/B248/gen/cgx_inst.py +40a6e4ef9be2634611c4dadb14a0634e17cda43d4d7bb01879795d6493498bc3 cards/B248/pricep.py +ba0af309e951debcfcfd85685943975905e507b574305207150fa094d61ff229 cards/B248/step0.py +6d465038e3f9200fc0ba9657586480c3eb81572fe18b659016feed990ffcfc22 cards/B249/cand.py +f1afffcacbe938259c8d348175ef1554529fbed6c99ecf737a044043049b2017 cards/B249/census.py +d31487091b2b6d1a6fc4434a75546d0502678f858f299706875f34901c7bcb09 cards/B249/closure.py +8a80f17ecc0706f644cf0990bd5265826abacd53c63688fd01df6d6db1bf5af4 cards/B249/feas.py +7e8e9b6c5510206d1ca873bd290e37cd28f43e925991239780ee70514e1b6cb3 cards/B249/prog.py +11987cd54625228c8a0276b25ce1fc4d1d11644c204ee1290a1f7b3f2a2b3f38 cards/B249/scan.py +c668709171306d26613e9d90e4e255049b239c9780ada8e5dd060064c2da09a9 cards/B249/sim.py +a5592582e3bc97fe1cbe56e8a5c45872a82ea64603950d6c7c8704f320e72fc6 cards/B251/cls2.py +d3f20f20b12647c00315d9220df31efa8d2d0ff9b7cdd7cbf11acb1713c7ad14 cards/B251/ev.py +5900afcf84a639647a43ed1a2336cf37cd626e74f4bdd317ddcfa3e2b0c0dea2 cards/B251/fin.py +6a1ebf50f347da6820db2fde594d3b141c724ea5f7fe101c9debdef7f8d4c7e9 cards/B251/graph.py +8a0ef8c4194f4e0816f7ffe1deb0d2340afae9b7c9d1ccab4bc809bbd8fcb026 cards/B251/inc.py +0b0c348f40e3e524e429c5eaee9fd571e6bc5a69a2d0292d7066cdf74121d986 cards/B251/mis.py +04d1dd4b45069fcaa900d5a7217654eab99ed4d5cab0d592196d040bd4239150 cards/B251/proj.py +43cc65d1d09322b5cee5c6cb448a6f74bf22a6e791be97f1ffd5d2bdc880099e cards/B251/vals.py +fb44c6c351ef7eee6e3c1d6616b03d74a348d3374ba6ec92a0033b0bbd628446 cards/B252/cgx_y.py +42f3f1bbd75b644b70143827dd58f08563ff39202966066e082c3e09999ec778 cards/B253/caps.py +3166bc7d516a769d8a862e921dd6c41441d5b8b2b7e6515857877bd10e6c9d37 cards/B253/prof.py +f78ae46ab3a6c807c35c692417be483ae4ef31a7ae6168c08e0d1796a94ef5f5 cards/B253/trace.py +057e4324f354a658dc6637c61b1e4d6697c5f81cd54eee4bbd7353e43ba76561 cards/B254/joint.py +708e461096f1bdaad406f9f628c2c15052008fee7911fc114dc35abd1b648641 cards/B254/ops.py +4dfe8528b856c4e3f29a7c7cf79ea9c39f387c7d0689d366c72bec52f7483c53 cards/B254/rm161.py +d08d1db99bcb907c609e6634aa02dedca482e32dca8fdbaaf40faf10c2b0e347 cards/B254/roles2.py +367d27fbade7edd9a747b01b1067acb15d8a2dd598f575a2e74bbdbf2f0756e9 cards/B254/set161.py +c605654b4e04d99e90a09dbf214ddad416e14aad870b9cd85e620a5183975e8f cards/B254/sim161.py +27bf8f1e8bf36a9aab589684e6577b0d7169cda9781fc312adc49eaf56ec41b9 cards/B256/cluster.py +1c817870747edec090376c6c31206a1128d4c00fb3136b64298e059734dd1b15 cards/B256/cluster2.py +1a4004bbc8e8e04d1c07a0c85b1a5f8c34a9dab29fdd1e05298d8b61b6688714 cards/B256/dfs.py +f9ef71a3555ecda417aa3b8ef0f512d24fca7751c86cc33190be2caefc47ab34 cards/B256/e1.py +852db22ba820f299d7a5d280ae726c258d577b8ae84e281ef673e3bed5a9ab61 cards/B256/e2.py +cc2085c4a38da7da6e0b285af7a0dcbf35d6439555690df4ac3e5c77cf0778cd cards/B256/e6.py +03df3099e0009bb991e755cce6171826487120a15eefcf96a5e519cbd2fca907 cards/B256/e7.py +2b20a381634f8caa87e513f935bb84eae2999d917d4af2f4c6702e5ab6324cdf cards/B256/leaves.py +b8fcdb4578b8ca2f8663315a4e0436aed97903206060deee13d1957cc1a4789b cards/B256/lib.py +5777b725a028fab919b1cd659a30d0f95db514021e7c336a73d4b949c06b066f cards/B256/pair.py +6a7301f13616bba170e92219029d563d6fb8940bf18ee568dbf5b1a80a4c6a90 cards/B256/plan.py +aac3c14d740fea1b9273d4c9f989634a3d2e0c1878236376e69bea0a2007d3d2 cards/B256/vr.py +e6a5bb9fea78e33d742dbe2e9cec6c3403a39256275a14da5b4b99f20baa3086 cards/B257/cls.py +d34a7efb2b9bb67b03be103bb2c4b85da9c62694f9ca8fe1e435cbc56297772c cards/B257/det.py +1af650cf07e71315aee1eb40529a42c178b0270048e05059c9ec6c2a5ca37e91 cards/B257/hoist.py +52e6377fe98da87674599e44010c2c9b0f5882ae8b76d2cbbb9d6fffe77ebb62 cards/B257/slide.py +4fe4c87fe926805ee26f972daf33c02c06265c9f74df24d50c1ca4d663eaceed cards/B258/endcap.py +de265e66c7b700430f32c72af03281e181b14a2a2fde28bfbf471325a2e9b44e cards/B258/kap_free.py +2303cf3cb8ab3d99eab9c49a6775180284d02ddf200ae7af49ed6fbc02760a0e cards/B259/an1.py +5d974a64b6b0e1f27ee98979403e8d64525ffcfd79f9f8d9a819882e86a93aac cards/B259/an2.py +a3c4b3c929aedae5c44e753bb12628b3cce936bc12cef9c947f1f92bad04580d cards/B259/an3.py +51281d27592fb29b01f834d7f1a7d2052df2b6b99d54b2e4928ee0b97bb63f87 cards/B259/an4.py +bc5ea17b4c9548d347d610e6a1370869d43865fe14be581c19ed4240472a1429 cards/B259/an5.py +de543c7839986527901087f1dc56dce68fe42f2f076dea9a9c39754b0f76e044 cards/B259/an6.py +6e9a4a997d25799b713dc6b671e101f8dccc4a407de73b684f9cf12e222dd2ac cards/B260/anc.py +78e0fc07fd3df46fb94362c56a66424e4c219690b77ce4a60f3a13d959b53cad cards/B260/cp.py +b07eb0dcdde88556b430c95459c2f1a416210bd359ae473ee43ef7201d58ce4a cards/B260/geo.py +7c73b85be02087b9725c88697af69dbb736aa63ca7febefcf9ebcb4fe6b8055d cards/B260/groups.py +7cd0317e462cf87b32e149c267b3e708e43c194aa51a30e9a766ba17cafbd04b cards/B260/merge.py +94dca69dee6c22168ef408cfb4eeb5d50e5775c5a24fdf3d863eb22a44ff3f24 cards/B260/pure.py +03f65a436923ba33ea88b44c7956a2adc82b43d01de2fb933ac894797c30a61e cards/B260/rd.py +4eac44abe92888fefd11a4e37b3e1a42e1a0fbf0731eaf64409a8544d5d013c4 cards/B260/val.py +155820d872c9d3e54e000dfc4403f5779372ba6dbadbd986b993b39013e40fea checks/anchors.py +a6f691f4492dc266d3c35e74449235db288639fe82a6bfbc6f2e25b55506dd2c checks/dfs_exhaustive.py +fb18332a3adb4842c3662346aa7f6b5115debc04f1a392b6e9cbb423b7b83c8d checks/expect.py +285642a5ed187d9547b7b5f8c69491b4ae688e2b764b0d2ad2a4169fbd91ae53 checks/generated.json +8854c4de1ea6fe95f7eb22b11d760602aaa800bb2cb7f13600572d464535f0cc checks/portdims.py +6c07a4c5bdb76d4013be448e2bfdb3e4a1ae0e28c4c048cfebce634ef3900c7a checks/units.py +d68802c91d27d9f621b214232316b91a4c7f7ea76641e5ae7ba510b2baa5386e checks/wordpins.py +bea4258cee47cd49ee1f6ffa0b63a44d1f2db28b71fabfd58915180e327e5849 evidence/B240-NOTES.md +232ec089bb3d19f3e1cd530fbf4eab44f6d22f959ef233635b50dbd79fe40ef9 evidence/B244-NOTES.md +a5834abcea599d10ec8a74aa8a9775103b1f84efb6422d4f3a38fea2e9d9d19e evidence/B245-NOTES.md +7ce53c08ead1f4612a0e366709cafdffb1b9dd4ef57b8162932e248f8b003305 evidence/B247-NOTES.md +9681674575c92a52225d881eefdb9244dff27c5d48a185d606896d2f8f0908b4 evidence/B248-NOTES.md +480754ef1ef44c96e1786a982f732cda8a7ae5de8a394bb42d8b10b0e9198098 evidence/B251-NOTES.md +ae6c500e272f78f037188296eca4cc367df7a9d723f93bca2270b45d1746d701 evidence/B252-NOTES.md +d7db1385d23c5de3c5f4e406a5475e3bd987d7db7859773440b5d14cfde7f1c1 evidence/B253-NOTES.md +34757bb3f71fdcb6893878cb5f647962d4cd5f893ac82ea86dd929d0b82c795b evidence/B254-NOTES.md +4f269ec0ff1ed543d3d2f9e05c29dff84ffc6ad61cd6d447acd716b799126628 evidence/B255-NOTES.md +cfd5ba9b4c3313aa574e04636648fdcf944aba340bb5981161b79a2aa305c64b evidence/B256-NOTES.md +3fa646e0264ef6413e5d6b6cd6a5a9c4a723d88800e3726a3800c31d52e9df8a evidence/B257-NOTES.md +324248e9d7185bc4769117bc7c889fa37384326ea4874d8c64460f35f3990fe8 evidence/B258-NOTES.md +2b56c00e3cf80e902a99274407927878cf783c9a947ac77306df37b2b4ed780b evidence/B258-b252_caps.txt +0086ba025662c95661ab1301a2b970d8835802188f71a7affa755ac859dd27b0 evidence/B259-NOTES.md +e7132aac6efff256d54a20e2455ead7607f2bd32781f102bacfad6baebd0fb2c evidence/B260-NOTES.md +409848a1bef6ffa0250ad12adad7573126d3d5da2a5d34f3a2d7b8ac18539ccf evidence/KPR5-endcap.md +aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098 inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py +81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482 inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/moment.py +c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/outer.py +e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198 inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py +f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py +1bcd80c1cd61fddae9f3a7f00fc9d1c796410408251e576600e94c19b16b1e5e inputs/repo/research/format-limits-corrected/README.md +0274ffca1725e7460aaf7b672bc1248aa6dfdec11e5f0fec91af18b829f8ba47 inputs/repo/research/gauge44-slots/construction/COMPLETION-PRIORITY.json +7347f814850a838bd617bc7a55c307cec2b72becde2f12ea3e2e1af344b43563 inputs/repo/research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json +b22e6ecf76104de66844bd617c4ca80f5546ba0966a50e5e9aa0ffea4976cb30 inputs/repo/research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json +de0412511b0dd1af13e9717bc791126ac0e91c569b5391fd6c70268083045d15 inputs/repo/research/gauge44-slots/construction/notri/PRIO6.json +55dd229684febecb80638eff9c6b3986623e8539c6c956753b350209c3e0efe2 inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json +1dec4ca3af6d45d82286005cae4c5e56e7253adefb117d797da55c55c891af08 inputs/repo/research/gauge44-slots/data/PLAN.json +ccc37ab7fbf78947fe02c7f57ea672d2e4eae8454cb1158ed964c75bf423869b inputs/repo/research/gauge44-slots/data/UPSTREAM-PINS.json +03afcfc9da428b3f6edac81c1fee7f277ab81b64998efae78380b63498dec6cd inputs/repo/research/gauge44-slots/independent/audit_local.py +d2f548ad6b99f64a8ca5fbaf822a89560bb99359957ce3420b497f6a46fc0acf inputs/repo/research/gauge44-slots/independent/price_profile.py +b9f0e5ca038abe837b0007c8fe006f366a6f02009244ac57705a8a200e2301f4 inputs/repo/research/gauge44-slots/inputs/PR589-EXPECTED.json +d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9 inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz +327d2a868043e846381aa58a33053c24425e8cad522ff401b10ec8af1d649a3f inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PROTOTYPE.json +ed76761194988a01af77ead0ea6469cb5dcd29690ab985a0b5a4006b0f2b69bb inputs/spec/03-motifs.tex +412b170ccaab38dba96e95e3cbfae09f4876a9818f8d278776a746b0f8044906 inputs/spec/04-swap.tex +20cfc8d12099d4e4ed9e3e7eeb6162edd9b6e0e076f24693364cd24377252594 inputs/spec/05-layers.tex +49596aa4ed4fd36cd4582fd0e8ddeb09fd80370a7d8aea1ede52a135b536d289 inputs/words/w1018.json.gz +98ceb8134bfa72d99f7722be913b0b89aeeabae10c903685f793d1bc40f42665 requirements.txt +ab6af129541b72e972b4ed8faf46a253b7fb5301084a43c4480e58d02518e224 scripts/provenance.py +0decc64b7e49aa203799ff1352949bdda4b456d19d5dedb3d0394b8e427262d3 verify.sh diff --git a/research/end-cap-obstruction/NOTICE.md b/research/end-cap-obstruction/NOTICE.md new file mode 100644 index 0000000000..fda875629e --- /dev/null +++ b/research/end-cap-obstruction/NOTICE.md @@ -0,0 +1,39 @@ +# Notice + +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code; Apache-2.0 (`LICENSE`, copied from the repository root). + +## New in this package + +`README.md`, `verify.sh`, `scripts/provenance.py` (adapted from #717 and #899), `SOURCES.json`, `requirements.txt`, `MANIFEST.sha256`, everything under `checks/` and +`cards/` (the swarm's card scripts, path edits only as listed in the README), and `evidence/` (card notes, local paths removed). + +## Vendored, unchanged (git blob ids in `SOURCES.json`, checked by `scripts/provenance.py`) + +All under `inputs/repo/`, byte copies of files of main at the base commit in `SOURCES.json`; the paths mirror the repository. + +- **The #1005 / #1018 k8 line** (jeremykothe2; #1005 merged, #1018 merged; #1031, #1065, #1087 merged T16 owner packings on the same word): `research/gauge44-slots/` (`independent/audit_local.py`, the verifier AL; `independent/price_profile.py` and `data/UPSTREAM-PINS.json`, `data/PLAN.json`, `inputs/PR589-EXPECTED.json`, the price chain and the frozen #1018 invoice; `construction/slots/SLOT-PINS-k8.json`, the published hash of the #1018 word; `construction/leaver/TRI-LEAVER-k8.json`, `CODED-CELLS-k8.json`, `construction/notri/PRIO6.json`, `construction/COMPLETION-PRIORITY.json`, the inputs of the gauge-forward generator). +- **The native verifier model** `gk_word.py`, `gk_common.py` and the three price engines `moment.py`, `base_two_moment.py`, `outer.py`, from the pr552 / pr558 / multicold vendor tree under `research/complex-k492-owner-repair/`, as carried by main (PRs **#552** (Dugongue) and **#558** (eumemic) and the multicold tree). +- **The Hamming packet inputs** `PACKET-PROGRAMS.json.gz`, `PROTOTYPE.json` of the pr531 vendor tree under `research/static44-selective/` (**#531**, icekylinx). +- **The specification** `inputs/spec/03-motifs.tex`, `04-swap.tex`, `05-layers.tex` (from `upstream/build/sections/`), and `research/format-limits-corrected/README.md` (the rule census and Lemma R; DreamingOfClouds). + +## Rebuilt word (not a file of the repository) + +`inputs/words/w1018.json.gz` is the #1018 word (content hash `c2b29430…`), rebuilt locally from that PR's construction (chain steps hyb, frames, slots) and pinned by the hash that `SLOT-PINS-k8.json` publishes; `scripts/provenance.py` checks the equality. The gauge-forward words of the deletion experiments are regenerated by `verify.sh` from the vendored generator inputs and compared with `checks/generated.json`. + +## Results and constructions this package builds on (credit) + +- **#595** (DreamingOfClouds, merged), **#717** (DreamingOfClouds, open), **#446** (DreamingOfClouds, open) and **#899** (DreamingOfClouds, open): the format lemmas (Lemma R, the rule census, the sink interface), the invoice prices and censuses of the frontier words, and the minimality of the shipped helper layers (the Lawler 268/268 result for the S3/S4 copies that this package explains). +- **#593, #599** (jeremykothe2, DreamingOfClouds, merged): hyperplane-ended helpers (`helper_final`), which is why helpers are outside the wall. +- **#1005, #1018** (jeremykothe2, merged) and **#1031, #1065, #1087** (jeremykothe2, merged): the leaver cells, the seven triangle-hybrid slots and the T16 owner packings of the word analysed; **#987** (rohanarun, merged): the triangle-hybrid slot search; **#645** (icekylinx): Gauge44; **#635** (jeremykothe2): the emitter and cold14 pipeline; **#555**, **#589** (eumemic, DreamingOfClouds): the bit supplier whose cap enters the ceilings of P2. +- Lawler, Management Science 19(5):544-546 (1973), through #899 (backward rule; not re-fetched). + +## Overlap check with recent swarm PRs + +- **#698** (thakrarsagar, open): selected CK B frames are optimal at fixed boundaries. A related frame-lattice statement on a different object (the CK B phase, fixed gate order and exact end-of-B frames); here the object is the final cap of the target registers of the k8 word and the copies that serve it. No row duplicated. +- **#1037** (yonghaozheng64-commits, open): per-profile asymmetric block rank is exactly 9d. Row E9 cites the card result that asymmetric labelling does not reduce h = 9; the new-h = 8-family escape (open problem 2) is a different, unpriced object. +- **#1023** (thakrarsagar, merged): PR589 bit hosting is width-8 optimal; the width-7 residuals are bit-side headroom (+17-23% of bit c), not κ, and the complex side binds. Cited in row E9 (card B240); not repeated. +- **#1032** (woklerx, open) and **#1033** (bbMisk, open): persistent-work floors and short-window minima of the contracted complex factory. Coefficient work is not in the paid profile priced here; no row duplicated. +- **#1005** (jeremykothe2, merged) and its coded-pair mechanism: row E5 shows why it extends to the 56 selected pairs only (a cold target hosts one coded pair); the helper elimination of #1005 is not re-derived. +- **#651** (higherbeing, open): prior observation of the read-drag mechanism (the next read lifts the frame out of the cap, 112 of 112 on the K-triangle word); the general lemma, the four prices and the k8 measurements are what is added. +- **#1140** (aliromman, open): same word (c2b29430); at least 224 helpers with the op multiset not fixed. Row E4 is a weaker, fixed-order bound and is stated relative to it. +- **#1143** (woklerx, open): commuting ADD moves and the R480 frame runs; related to price (b) and row E2. **#1186** (mdumitrean, open): exact frame solver with target caps. **#620** (GamingPuzzled, open) / **#1035** (woklerx, merged): P112 free asymmetric-sink exclusions, related to S5 and T4. **#1212** (burntout76, open): rank-8 decoders are gauge-rigid, related to open problem 2. No row duplicated. diff --git a/research/end-cap-obstruction/README.md b/research/end-cap-obstruction/README.md new file mode 100644 index 0000000000..52e0b16dc3 --- /dev/null +++ b/research/end-cap-obstruction/README.md @@ -0,0 +1,142 @@ +# The end-cap wall (no κ claim): why copies are forced in the E8 skeleton's verifier model + +> **What is claimed, and what is not.** +> **Scope.** The k8 / #1018-type local word of the E8 complex unit: 112 targets with ports u_t ∈ F₂⁹ (112 distinct odd-weight vectors with u·u = 1, in 14 blocks of 8), frames are subspaces of F₂⁹, the verifier rules R1 (common frame at an ADD), R3 (monotone frames) and E (every target register ends in perp(u_t), `gk_word.py:116`, `:102`, `:117`; `audit_local.py:137-138`, `:122`, `:115`, `:142`), fixed ports, fixed decoder and fixed targets. The deletion experiments are run on the **gauge-forward word** of that skeleton (the stage that precedes the port, cold44 and layer stages of the chain), regenerated by `verify.sh` from vendored inputs; the census, bound and window rows are run on the #1018 word itself. +> **Result.** (T, argued from the cited rule lines; instances checked) A direct read `y_t += s` at time τ forces the final frame of y_t to contain D_s(τ), the join of every frame register s has had before τ. Since y_t must end inside perp(u_t), the read is legal only if D_s(τ) ⊆ perp(u_t); a word that breaks this has to pay one of four prices: a version of s that is held or reconstructed (a), a reordering that puts the offending operations on s after τ (b), a descent or FULL end on the target, which costs a rank unit per call (c), or a descent on s itself (d). (M) On the skeleton, deleting any of the 24 legal single S3 packet copies, the 16 hub copies, or any of five larger families (up to 80 copies) makes between 4 and 64 targets end FULL, one dimension outside perp(u_t); every one of the 30 distinct deleted-copy words regenerated here passes the generator's own frame check and fails the verifier's end rule E (`gk_word.profile` is run on two of them; the end-cap replay on all). (P) One unit costs −2.819% κ per call, linear to 32 units, and the exact certificate disappears at 35, against a helper worth +0.15% (all 112 S4 copies together: ≤ +3.5152%), so a copy is about 19 times cheaper than a unit and the copies are economically forced whenever the obstruction fires. (E) The escapes we could build are closed in their stated models: one-accumulator version reconstruction (0 orders in an exhaustive search of the 20-21 operation cluster, four absorption variants), the snapshot hoist and slide (0 of 64, 0 of 86), rematerialising the 161 never-read helpers (0 of 65), coded target pairs and cold-slot holds (0 of 224), the frame-conflict bound (111 helpers forced, 113 attained by the greedy cover; it does not close the rest; #1140 proves a stronger bound on the same word, see E4). +> **Not claimed.** No κ gain, no word, no proof that the 268 S3/S4 copies are necessary for every skeleton or every op multiset. The theorem is a necessary-condition and pricing statement for the verifier model above. It does not exclude version reconstruction with **two accumulators** (+1 helper per group, which B253 estimates eats most of the credit; not searched), a **new h = 8 family** with a different pairing (C.6 shows none exists at E8 window ≤ 9 with the current decoder), **joint deletion and reordering** at scale (single hoists and slides only), asymmetric pairings that unpin Lemma R, non-projection rational labels, or helpers (they have arbitrary ends via `helper_final`; the wall applies to registers that feed targets). The deletion rows are at the gauge-forward stage: no deletion word passes the chain, so no κ is computed for one and the later stages are not run on them. + +## Reading this package + +Every result has a status: + +- **CHECKED**: `verify.sh` recomputes it from the files listed below (exact arithmetic; solver and exhaustive-search results are statuses of the run, no certificate file is shipped); +- **ARGUED**: a proof or file:line argument in this README; every quantity it uses is itself checked where stated; +- **RECORDED**: the result of an earlier run that `verify.sh` does not repeat. The card note is shipped under `evidence/`; the row says what is not reproduced. + +```sh +python3 -m pip install -r research/end-cap-obstruction/requirements.txt +bash research/end-cap-obstruction/verify.sh /fresh/output/dir # from a checkout or `git archive` of the whole repository +``` + +Python ≥ 3.11 (numpy, ortools); set `PYTHON` to choose the interpreter. Step 0 checks every file of the package against `MANIFEST.sha256` and every vendored input against its pin in `SOURCES.json` (git blob ids of repository files, and for the #1018 word the canonical-JSON hash that the vendored `SLOT-PINS-k8.json` publishes) and stops with exit 1 on any mismatch. Then the gauge-forward words (eight named ones, compared with the hashes recorded in `checks/generated.json`, and 32 single-copy runs; about 1 s each) are **regenerated**, and seven check groups (G0-G6) run at once and print one `PASS`/`FAIL` line per assertion. Nothing outside the package directory is read; scratch files go to the output directory. See "Tested". + +## Setting and hypotheses + +- **S1 Word.** v = 112 targets y_t, sources x_t, helpers h; ports P ∈ (F₂⁹)¹¹², pairwise distinct, odd weight, u·u = 1 (row Q1). Registers 0..111 are the sources (start frame ⟨P_s⟩), 112..223 the targets, the rest helpers. The k8 skeleton is the #1005 leaver word (`gauge44-leaver8`), whose gauge-forward stage is generated by `cards/B252/cgx_y.py` (the #1005 generator `cgx_leaver.py` plus the deletion switches `STAG`, `GLAZY`, `CF`, `RO`, `WRC`); the unmodified switches reproduce the pre-chain base word (row M1). +- **S2 Rules (SPEC).** R1: an ADD `t += q·s` at frame F climbs both t and s to F (a common frame, `03-motifs.tex:157`; `gk_word.py:116`; `audit_local.py:137-138`). R3: a register's frame is monotone: `cur[r] ⊆ F` is asserted (`gk_word.py:102`; `audit_local.py:122`); a non-nested step is priced, not forbidden (census row 3 of `format-limits-corrected`). E: target r ends in perp(P[r−V]) (`gk_word.py:117`; `audit_local.py:115`, `:142`); only helpers have arbitrary ends (`audit_local.py:116`, `helper_final`). The sink label of Y_t is a complement hyperplane of ⟨u_t⟩, i.e. perp(w_t) with w_t·u_t = 1 (`03-motifs.tex:568-668`, `05-layers.tex:141-154`, `04-swap.tex:117-121`), and Lemma R (C.3 of `format-limits-corrected`) pins w_t = u_t when the drop-free taint of t spans u_t^⊥ (112/112 targets on #531/#569/#571). The quoted lines are read from the vendored copies by `checks/anchors.py` (19 assertions). +- **S3 Frames** are the declared frames of the operations, joined with the current frames of the operands (the lazy minimum). All bounds below are bounds on this frame lattice. FOM (fixed op multiset) is stated where a row needs it. +- **S4 Prices** use the package's own `price_profile.py` (two exact moment engines, outer 47, PR589 bit supplier) on the frozen #1018 invoice (72 calls, idle profile of `PLAN.json`); the 2560 deficit pin is replaced by the honest deficit, so added rank lowers the deficit (card B258; nothing else of the package is edited). A "unit" is one rank-1 local climb per call. +- **S5 Convention bookkeeping.** "y_t ends in perp(u_t)" is three rules stacked (card B258): the swap contract (a complement hyperplane, SPEC), the choice w_t = u_t (convention, pinned by Lemma R), and no descent edge (convention, priced). Relaxing the second is vacuous on every measured word (row T4); the third is the unit price of row P1. + +## Theorem and lemma + +**Notation.** For a register s and a time τ, D_s(τ) is the join of the start frame of s and of the frames of all operations that touch s (as destination or as source, since R1 climbs the read operand too) strictly before τ. Under R1 and R3 the frame of s at τ equals D_s(τ). cap_t = perp(u_t). + +**Lemma (read drag; ARGUED from R1, R3; anchors CHECKED).** If y_t reads s directly at τ (an ADD `y_t ±= c·s` with declared frame F), then F ⊇ D_s(τ) and the end frame of y_t contains F. This holds whether s was written or only read before τ, because a read climbs s as well. +*Proof.* R1 climbs both operands to F and R3 asserts `cur[s] ⊆ F`, so F ⊇ cur[s] = D_s(τ); monotonicity gives end(y_t) ⊇ F. ∎ + +**Theorem (end-cap obstruction; ARGUED, instances CHECKED).** In the verifier model of S2, let y_t read s directly at τ. Then +1. *(necessity)* the word is legal (E as the assertion of `gk_word.py:102`, `:117`, unpriced) only if D_s(τ) ⊆ cap_t; when D_s(τ) ⊄ cap_t the final climb of y_t to cap_t fails. Prices (c) and (d) below are the priced departures from E and R3. +2. *(the four prices)* If D_s(τ) ⊄ cap_t, a word that still delivers the value of s at τ to y_t must pay at least one of + - **(a) a version:** a register r ≠ s that holds the value of s at τ (or is reconstructed from the operands of the writes since a copy) and is read by y_t at a time with D_r ⊆ cap_t. A copy taken before the first offending operation needs no write to s in between; otherwise the copy must receive the later writes (it is then a second register, the existing S3 copy) or the value must be rebuilt by forward substitution (extra ADDs); + - **(b) a reorder:** all offending operations on s are moved after τ. This is legal only for operations that commute with the read (other reads of s, not writes); + - **(c) a unit on the target:** a FULL sink with M_in(X_t) = 0 or a descent FULL → cap_t of d = 1: at least one rank unit per call (that the minimum is one unit, rank-intrinsic, is from cards B29/B35 of the swarm, not shipped: RECORDED), −2.819% κ each (row P1); + - **(d) a descent on s itself:** d ≥ 1 per call (R3 is priced, not forbidden); reader descents were registered dead in earlier swarm rounds (R39-H, R40-C, J24-C1, about 2 rank units per call; not shipped: RECORDED). +3. *(complement sinks do not rescue)* The set of admissible sinks is {perp(w) : w·u_t = 1} (S2). A final frame that contains u_t lies in none of them. On every violating target of every measured word the final frame is FULL (dimension 9) and contains u_t (row T4). + +*Proof of 2.* By the Lemma end(y_t) ⊇ D_s(τ) ⊄ cap_t. Every legal word delivers the value of s at τ to y_t through a last hop, a register r read directly by y_t at some τ′; by part 1, D_r(τ′) ⊆ cap_t. If r = s then D_s(τ′) ⊆ cap_t while D_s(τ) ⊄ cap_t, so τ′ ≠ τ and the offending operations are after τ′ (b); if r ≠ s, r holds or rebuilds the value of s (a). Otherwise the word ends y_t outside cap_t, which is (c) or (d). ∎ + +**Corollary (versions; ARGUED).** If s is written after the offending operation and before τ, a copy taken before the drag carries the wrong value. Then (a) needs a *version*, not a snapshot: the copy also receives the later writes, or the value is reconstructed from the operands of those writes. Reconstruction is value-exact with no per-operand frame floor (row E1), but it needs the operands to be joined in an accumulator, which is where the cross-pair join of row E1 bites. + +**What this says about the skeleton (rows M, P, G).** The ≈ 268 S3/S4 packet copies of the k8 word (cards B172, B255; `cards/B260` finds 248 helper-from-register events with readers on both sides) are the version register of (a) for the readers whose targets cap the packet. Deleting a copy lets the packet serve its readers directly: its frame then grows by the late ops of the other readers (the drag), and four targets per copy end one dimension out. Price (c) is about 19 times the value of a copy (row P3; 20 to 70 times under the other conventions of the cards), so (a) is paid, and the copies are forced. + +## Results at a glance + +27 rows by primary status: 19 CHECKED, 4 ARGUED, 4 RECORDED (rows partly CHECKED say so). + +| id | result | status | +|---|---|---| +| T1 | **Read drag.** F ⊇ D_s(τ) and end(y_t) ⊇ F for a direct read; also when s was only read before τ. Rule lines quoted from `gk_word.py`, `audit_local.py`, `03-motifs.tex`, `05-layers.tex`, `04-swap.tex`, `format-limits-corrected` rows 1, 3, 6 and C.3, C.6 are present at the cited lines. | lemma ARGUED; 19 anchors CHECKED (G0) | +| T2 | **End-cap obstruction** (parts 1 and 2 above): necessity of D_s(τ) ⊆ cap_t and the four prices (a)-(d), exhaustive by the last-hop argument. | ARGUED | +| T3 | Versions: a snapshot is not enough when s is written between the drag and τ. | ARGUED | +| T4 | **No complement sink helps** on the measured words: every violating y ends at dimension 9 = FULL with u_t in the frame (a FULL frame lies in no hyperplane); sum(dim − dim(F ∩ perp)) = number of violators, i.e. each is one dimension out. Holds without Lemma R. | CHECKED (30 words, G1) | +| M1 | **Baseline.** The generator, run with the switches off, regenerates the pre-chain base word (hash recorded); it has no cap violator, `gk_word.profile` accepts it (`{1: 1928, 2: 736, 3: 336, 4: 168, 5: 168, 6: 32, 8: 8}`), NH 480; the frame-only replay of the tail of the #1018 word reproduces its profile and κ = 1.67166528321877e-3, and the word's hash equals the one #1018 publishes. | CHECKED (G0, G2, G6) | +| M2 | **Single S3 copy, 24 legal deletions** (16 copies × STAG ∈ {0, 1}, 8 refused by the generator for STAG = 0, CF ≥ 8): in every one the generator's own check says NVIOL 0 and exactly **4** targets end outside perp(u_t), all at dimension 9. | CHECKED (G1) | +| M3 | **16 hub copies** (SS16): NH 464, NVIOL 0, 16 violators (y160..y175), the native profile fails with `frame violation` at y160. For the CF = 0 copy the violators are y170, y171, y174, y175 and the mechanism is the drag of packet 283: the base word reads it at frame dimension 5 (B584, into helper 592) and 8 (B930, `171 -= 283/2`); after the deletion the reads are at 7 (B585, into helper 591) and 9 (B929), and `170 -= 591/2` (B945) enters at frames (7, 8) and needs dimension 9 > 8. | CHECKED (G1) | +| M4 | **Larger families** (rr32, Wr32, rr+SS48, rr+Wr64, all 80): 48, 48, 64, 48, 64 violators, all FULL, NVIOL 0 in every generator log. The 84-word table of card B252/B258 (`evidence/B258-b252_caps.txt`) lists the same families; the 51 words not regenerated here are RECORDED. | CHECKED (5 families); table RECORDED | +| M5 | The generator's frame check (`cgx_leaver` NVIOL: explicit-frame ops against hyper(P_t)) does not see the final cap perp(u_t) that `gk_word.profile` enforces; without the lazy widening (`GLAZY=0`) the deletion is refused at register 299 (frame violation). | CHECKED (G1) | +| P1 | **Unit price.** κ with k extra rank-1 local units per call, deficit-honest: k = 1 −2.819%, k = 4 −11.275%, k = 16 −45.061%, k = 32 −90.022%, linear (−2.8192% to −2.8132% per unit); the certificate no longer exists at k = 35. | CHECKED (G2) | +| P2 | **Break-even.** The credit of all 112 S4 copies gone is at most +3.5152% (bit cap, mass moved to idle at rank 48: κ = 1.730427e-3); spread over the 80-copy family that is ≤ 0.0439% per copy against 2.819% per violating target, so a deletion pays only if it breaks ≤ 0.0156 caps per copy; the 80-copy word breaks 64. | CHECKED (G2) | +| P3 | **A copy is cheap.** Two helpers removed, freed mass at rank 48: +0.298% (≈ 0.149% each), so one unit costs ≈ 19 helpers at this convention; at the other conventions priced on the cards a helper is worth 0.04 to 0.14%, i.e. 20 to 70 times less than a unit. | 0.149% CHECKED (G2); 0.04-0.14% range RECORDED | +| P4 | The pre-cap price bands of card B252 (SS16 +1.34% .. +2.02%, all-80 up to +3.52%) are moot: every word they price violates the cap, and the band convention lets idle absorb added target rank (wrong for data registers). | RECORDED | +| Q1 | **Port geometry.** 112 distinct odd-weight ports, self-dot 1, no three summing to zero, every block of 8 has rank 4; cross-block pairs (5824) have common perp of dimension 7, cross-block triples (186,368) dimension 6, cross-block quads (4,100,096) dimension 5 (4,080,384) or 6 (19,712 zero-sum quads); 24,276 zero-sum quads in all (196 in one block, 4,368 over two, 19,712 over four); orthogonality degree 52; 227,920 triples and 6,216 pairs with the common-perp sizes listed in `b260-geo`. | CHECKED (G3) | +| Q2 | **Today's sharing is already the minimum span.** Every register read by ≥ 2 targets has reader-port span equal to the minimum for its size: 54 h + 25 x + 24 y read by pairs (dim 2), 16 h + 16 x by triples over 3 blocks (dim 3), 56 h by in-block zero-sum quads (dim 3). Re-grouping by port removes no copy: building a port-aligned register costs 1 helper + |supp| ADDs, against 1 helper + 1 ADD for the copy it replaces: net helpers 0. | counts CHECKED (G3); bound ARGUED | +| Q3 | **Copy census.** 480 events write a helper from zero; 248 of them are followed by reads of both h and s by targets (reader groups: 200 pairs, 33 triples, 15 quads; 232 have one side unread); at the copy instant the ancestor span and the value support of s lie inside the common perp of the readers in 248/248; after the copy s fails the ancestor floor for the readers in **213/248**, through versions in all 213 (s written between the copy and its last read) and through drag in 208 of them (s read by non-targets); 35/248 pass this necessary test. | CHECKED (G3) | +| Q4 | **Second encoding.** 136 registers are read directly by targets of ≥ 2 blocks (104 with dim ∩ perp = 7, 32 with 6); the op-excess of a second encoding inside the common perp has min 1, median 3, max 13, and 0 of 136 fit; the deleted packet 283 has excess 22 (neighbours 14, 14, 16, 8, 8, 4, ...), 103 mass over the registers whose frame changes, for one copy. At 0.017% per mass this is 1.8-4% against a credit of 0.08-0.13% per copy. | excess CHECKED (G3); conversion ARGUED | +| E1 | **Version reconstruction, one accumulator (CF = 0 copy).** (i) The value of 283 at B585 expands into 4 terms (283v1, 281, 299, 297), each with a window inside perp(u_58) and perp(u_63); the pair (124, 125) alone has 128 legal orders. (ii) Absorbing all four into 591 at once or hoisting the four non-capped readers leaves 10 resp. 8 violators (124-127, 148/149-151, 170/171/174/175) in the real word; the precedence-free relaxation of the cluster has 340 of 20,000 sampled orders, 20 of them rebuilt in the real word all leave violators. (iii) Exhaustive search over the 20-21-op cluster of registers 124, 125, 148, 149, 231, 283, 281, 299, 297, 471, 483, 591 with value precedence: **0 orders**, for all four absorption variants (pre/post × pre/post). The floor is the cross-pair join: 591 holds all four terms, so each term is dragged to F283 + F281 + F299 + F297, and F281 ⊄ perp(u_12), F283 ⊄ perp(u_13), F299 ⊄ perp(u_37), F297 ⊄ perp(u_36). | (i)-(iii) CHECKED (G5), model of the cluster; the join reading ARGUED | +| E2 | **Snapshot hoist and slide on #1018.** Of the 172 algebraically removable helpers, 64 have an admissible hoist window, 0 of 64 are frame-feasible (62 die at a B-section target forced to dim 9 > 8, 2 at the target level); the slide to any position leaves 86 candidates, 0 positions (x read and s written in the window). Hoisting changes when s is dragged, not whether. | CHECKED (G4) | +| E3 | **The 161 never-read-by-Y helpers.** 96 are rotation-locked (exact algebra), 65 are algebraically removable and 0 of 65 are frame-feasible (single, joint-65, joint-53; closures: 158 bail, 3 closed sets infeasible). | CHECKED (G4) | +| E4 | **Frame-conflict bound.** The register elimination with fixed ports, fixed Y end caps and carriers of fixed content forces at least **111** helpers (CP-SAT OPTIMAL, bound 111; greedy chain cover 113; 124 registers if non-helper holders are allowed); 548 value classes need no duplication and 22 need two registers. This is one helper per Y target, **not** the 480: no class is closed by frames alone. It is a weaker, fixed-order statement than #1140 (open, same word c2b29430), which proves at least 224 helpers with the op multiset not fixed (arbitrary scalars, cancellation, undo and redo, reordering); the ~369 of the card is the gap to 480 of this bound only, and relative to #1140 about 256 helpers remain unexplained by frames. | CHECKED (G4); reading ARGUED | +| E5 | **Cold-slot capacity (coded pairs).** A coded pair on a cold target alone: 112/112; warm (after the selected loads): 0/112; a second pair on the same target: 0/224 (half frames), 0/224 (both keys), 0/224 (selected loads), 0/448 (raw halves); value gate 112/112; ordering feasibility 0/224 + 0/224, single halves 0/896. At most one coded pair per target = the 56 selected pairs. | CHECKED (G6) | +| E6 | **Partner end caps.** All 78 mergeable early-cleanup splits of the #1018 word are tail → end splits whose gate partner is a low-end helper (ends ≤ 8) while the split register ends FULL; lifting a single gate is legal for 2 of 116 gates, both profile-neutral. | CHECKED (G6); scalar rewrites RECORDED (relay, commutator: all worse, B244) | +| E7 | Cold-hold words cannot be carried through the chain: the port stage (`port_stage_x`) transfers stage frames by gate-order alignment, and any moved op breaks it; repair attempts end at the y final cap (this is the wall of M2). | RECORDED (B245) | +| E8 | Cross-block value sharing census: 0 at the end of A and at gauge-forward; the only 16 value-legal shares are the hub copies of M3. | RECORDED (B255) | +| E9 | **Asymmetry.** No verifier, SPEC or pin requires the 14 factory blocks to be uniform (a word with one slot removed audits PASS, Δκ = −3.97e-8); uniformity is a convention across providers; the windows it opens are bounded: tail-gate split merges ≤ +0.787% (not a construction), fat/lean alignment ≤ +0.161%, triangle slots +3.97e-8 each, and #1037 (asymmetric rank 9d per block) leaves h = 9. | RECORDED (B240) | +| E10 | The cap is three stacked rules (S5): the swap contract (SPEC), w_t = u_t (convention, Lemma R) and no descent (convention, priced); the two conventions are inert on every window, so nothing is unlocked by relaxing either. | ARGUED (anchors CHECKED) | + + +## The deletion experiment, in detail (rows M1-M5, T4) + +`cards/B252/cgx_y.py` is the #1005 gauge-forward generator with switches (`STAG` stagger of the hub blocks, `GLAZY` lazy widening of explicit-frame ops, `CF` the S3 copies to delete (16 copies of the hub packets of blocks (0,1,2,3) and (4,5,6,7)), `RO` and `WRC` the read-only and write-read copy roles of the larger families). `cards/B253/caps.py` replays the declared frames and lists the target registers whose final frame is not inside perp(u_t) with the first operation that breaks it; `prof.py` runs `gk_word.profile` (the native verifier model: all of `gk_word.py:100-117`); `cards/B258/endcap.py` classifies the violators (dimension, dimension of the intersection with perp, whether u_t is in the frame). The word names of `verify.sh`: `base` (switches off), `cf0` (copy 0, STAG = 0), `all16` (16 hub copies, STAG = 1), `rr`, `wr`, `rrss`, `rrwr`, `all80` (the larger families), `nogl` (GLAZY = 0), and the 32 single-copy words `sw_STAG_CF`. + +Why the pre-cap results of earlier cards (+1.3% to +2.0% for the hub copies) are void: the generator's check only looks at the explicit frames of the working ops against hyper(P_t); the final climb to perp(u_t) is what `gk_word.profile` and `audit_local` enforce. The CF = 0 deletion makes packet 283 serve its readers directly; `add 124 -= 283/2` moves from B12 (283 at dim 2) to B245 (dim 4); 283 then grows 5 → 7 → 8 through its other readers, helper 591 += 283 enters at dim 7 (the base word has 592 at dim 5) and `170 -= 591/2` needs F ⊇ cur(170) + cur(591), dimension 9. The deleted copy was exactly what absorbed that growth (`trace283`, `trace170` in the logs). + +## Prices and the copy (rows P1-P4) + +`cards/B258/kap_free.py` calls the package's `price_profile.py` with the honest deficit; `checks/units.py` prints the table of P1 and the break-even of P2 (using the ceiling of `cards/B248/ceil.py`, +3.5152%); `cards/B248/step0.py` gives the helper value (+0.298% for two helpers, freed mass at rank 48). A caveat on P3: the helper value depends on where the freed mass is credited (idle rank 48, 16, or 1: +0.298%, +0.204%, −0.031% for two helpers); a re-planned owner map is needed for an exact κ (the frozen #1018 idle is valid only while the width inventory is unchanged), so these are conventions of the cards, not κ claims. + +## Open problems and escapes + +The escapes are ranked as in the card notes. None is closed in general. + +1. **Two accumulators.** Version reconstruction with a second accumulator register (pair A, pair B), so that terms join only inside their pair and y170 reads both: avoids the cross-pair join of E1, costs +1 helper per group (a width-inventory change and an owner re-plan; B253 estimates that this eats most of the +1.3% .. +2.0% credit). The rescue check is to add a second accumulator (`ops b* → 598b`) to `cards/B256/dfs.py`; it was not run. +2. **A new h = 8 family** (puncture: merge two of the 9 source lines, so ports differing by e_i + e_j coincide). For a reader triple one merge fixes at most one pair, the triple stays dim 7 against the final frame 9; it changes h = 9 → 8, so ports collide and Lemma R and distinctness are untested; `format-limits-corrected` C.6 shows no asymmetric pairing at window ≤ 9 for the current decoder, so this needs a different decoder. (B259, RECORDED.) +3. **Joint deletion and reordering.** Singles (E2) and the single-copy cluster (E1) are closed; a joint delete + reorder over many copies (cap-ascending drag ordering, B256/B257) has not been run. The hoist and slide results do not transfer: they fix the multiset and move one op family. +4. **Snapshot hoist on the final word / join-frame relay.** Moving the read of s to a time where the frame of x is nested in the frame of s, or copying at the Y-partner frame (a relay at the join frame): the join relay adds mass at least equal to the copy it removes (B249). +5. **Reader-set-aware decoder.** Choosing the u_t so that the readers of a hub are collinear or of low rank (pairs of weight 2 are only 776 of 5,824 cross-block pairs; reader sets are triples). This changes the u_t, outside the scope of Lemma R. +6. **A decoder / motif redesign** that changes the sink interface, or a descent that is priced cheaper than a unit (the one-unit minimum is rank-intrinsic for the current format by cards B29/B35, RECORDED). +7. The frame-conflict bound (E4) leaves ~369 helpers unexplained by frames (about 256 beyond the 224 of #1140). Closing them needs the value or algebra side (rotation lock, rematerialisation cascade) or an ILP over incarnation merging with the real rewrite-op frames; not run. +8. The 144 S3 copies by consumer role (SS16, rr32, Wr32, WW32, WS8, SW8, rS8, Sr8) were tried under the generator switches (rows M3, M4): WW32 needs the copy for its value, WS/SW/rS/Sr stop at the `second` cap or at block-order cycles that need an event-level order (card B252, RECORDED). The 112 S4 slot copies are blocked by value (each slot is written by the pair mixer, so sharing breaks the value) and by the one-coded-pair-per-target matching (row E5), not by the cap. + +## Relation to other work + +The finding is the frame-side companion of #899 (the shipped helper layers are minimal for their op multiset; S3/S4 copies 268/268 fail the Lawler test), of the census of #717 and of the format lemmas of #595 and #446: those give the register lower bounds and the pairing, this gives the reason the copy registers are the cheapest way to pay the cap. #1005 (the mutable-leaver cells), #1018 (seven triangle-hybrid slots) and #1065 are the frontier words analysed or built on. Later words on the same k8 word (#1157, #1175) exist and are not analysed. **Prior and adjacent work** (all open unless stated; overlap search with `scripts/find_overlap.py --refresh`): + +- **#651** (higherbeing): on the K-triangle word the module's next read lifts the frame out of the cap in all 112 cases. This is the prior observation of the read-drag mechanism on an earlier word family; what is added here is the general lemma, the four prices and the measurements on k8. +- **#1140** (aliromman): same word (c2b29430), at least 224 helpers with the op multiset not fixed, and no target end frame contains a cold-block or centre frame; stronger than E4, which is a fixed-order frame bound. +- **#1143** (woklerx): commuting-ADD moves cannot leave the frame runs of the R480 word; related to price (b) and E2. +- **#1186** (mdumitrean): an exact frame solver that models target caps; a tool for the same lattice. +- **#620** (GamingPuzzled) and **#1035** (woklerx, merged): the free P112 asymmetric-sink screen; related to S5 rule 2 and T4. +- **#1212** (burntout76): rank-8 decoders are gauge-rigid; related to open problem 2 (the h = 8 family). + +The rest of the overlap check is in `NOTICE.md`. + +## Tested + +Fresh `git archive` of the commit, every assertion PASS, exit 0: **91 PASS lines (2 in step 0), 0 FAIL, about 8 minutes wall** on 12 cores of a shared machine. Step 0 and the regeneration of the words take under 10 s and the other groups under 90 s; the four exhaustive orderings searches of group G5 (86,369 to 523,181 states, 1 to 5 minutes each) run at once and set the wall time. A search that hits its time limit (`EO_DFS_TL`, default 3000 s) fails: `UNKNOWN` is never a PASS. + +| Python | numpy | ortools | how installed | +|---|---|---|---| +| 3.14.7 | 2.5.4 | 9.15.6755 | development venv (the pins of `requirements.txt`) | + +## Files + +- `verify.sh`, `scripts/provenance.py` (step 0; `--write-manifest` regenerates the manifest), `SOURCES.json`, `MANIFEST.sha256`, `requirements.txt`, `LICENSE`, `NOTICE.md`. +- `inputs/`: `repo/` byte copies of files of the repository at the base commit (paths mirror the repository, so the unchanged `price_profile.py` chain and the verifier run in place), `spec/` the three SPEC `.tex` files (from `upstream/build/sections/`), `words/w1018.json.gz` (the #1018 word, rebuilt from that PR's construction and pinned by the hash the PR publishes). +- `cards/`: the swarm's card scripts under their card ids (B240 prof, price; B244 tail evaluator; B248 pricing, climbs, coded-pair gate generator; B249 rematerialisation simulator; B251 frame-conflict bound; B252 the generator; B253 caps, profile, trace; B254 the 161 helpers; B256 version reconstruction; B257 hoist and slide; B258 end-cap classification and unit price; B259, B260 geometry and census). The only edits against the originals are the local path prefixes (replaced by `EO_ROOT`), the tracing of a card's input words to the regenerated words of `work/`, and `B258/kap_free.py` being imported by `checks/units.py`. +- `checks/`: `expect.py` (assertion helper), `anchors.py`, `wordpins.py` and `generated.json`, `portdims.py`, `units.py`, `dfs_exhaustive.py`. +- `evidence/`: card notes B240-B260 (local paths removed), the unified write-up `KPR5-endcap.md` and the 84-word cap table `B258-b252_caps.txt`. + +## Credits + +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code; Apache-2.0. See `NOTICE.md` for the PRs whose words, code and results are used and for the overlap check. diff --git a/research/end-cap-obstruction/SOURCES.json b/research/end-cap-obstruction/SOURCES.json new file mode 100644 index 0000000000..b74573d1b2 --- /dev/null +++ b/research/end-cap-obstruction/SOURCES.json @@ -0,0 +1,297 @@ +{ + "description": "Pins for research/end-cap-obstruction. files = byte copies of files of the repository at base_commit (main): blob = git blob id of the source file, sha256 = of the file as stored here. derived = the #1018 word rebuilt locally from that PR's construction, pinned by the canonical-JSON hash that the vendored SLOT-PINS-k8.json publishes. evidence = card notes and run records shipped (scrubbed of local paths), sha256 only. scripts/provenance.py checks every entry.", + "base_commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "files": [ + { + "file": "inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py", + "blob": "15782ba625e438a3c707718fa51796ec1937018f", + "sha256": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b", + "stored": "verbatim", + "used_for": "the native verifier model (frame climb, final cap): profile()" + }, + { + "file": "inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py", + "blob": "0e5fde920d29106232776eb56347297c0d40fa72", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "stored": "verbatim", + "used_for": "helpers of gk_word.py (basis, perp, apply_op)" + }, + { + "file": "inputs/repo/research/gauge44-slots/independent/audit_local.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/independent/audit_local.py", + "blob": "4744d8783c25bf7bf5076886169077ca3808309a", + "sha256": "03afcfc9da428b3f6edac81c1fee7f277ab81b64998efae78380b63498dec6cd", + "stored": "verbatim", + "used_for": "the #1018 verifier AL: rule anchors and the frame replay used by the prices" + }, + { + "file": "inputs/repo/research/gauge44-slots/independent/price_profile.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/independent/price_profile.py", + "blob": "0e36ebd4687374e3ca14f233c77fafbdc1e5cfcd", + "sha256": "d2f548ad6b99f64a8ca5fbaf822a89560bb99359957ce3420b497f6a46fc0acf", + "stored": "verbatim", + "used_for": "the package price chain (two exact engines, outer 47, PR589 bit)" + }, + { + "file": "inputs/repo/research/gauge44-slots/data/UPSTREAM-PINS.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/data/UPSTREAM-PINS.json", + "blob": "68486b84e3ae599d776b9613adc901fd8874718d", + "sha256": "ccc37ab7fbf78947fe02c7f57ea672d2e4eae8454cb1158ed964c75bf423869b", + "stored": "verbatim", + "used_for": "pins read by price_profile.py" + }, + { + "file": "inputs/repo/research/gauge44-slots/data/PLAN.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/data/PLAN.json", + "blob": "0465492a1f0a3c489a4cab13af9c78a0048a927a", + "sha256": "1dec4ca3af6d45d82286005cae4c5e56e7253adefb117d797da55c55c891af08", + "stored": "verbatim", + "used_for": "the frozen #1018 invoice (idle profile)" + }, + { + "file": "inputs/repo/research/gauge44-slots/inputs/PR589-EXPECTED.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/inputs/PR589-EXPECTED.json", + "blob": "e293ddc557742637f9f679f083a1a282d87b1b13", + "sha256": "b9f0e5ca038abe837b0007c8fe006f366a6f02009244ac57705a8a200e2301f4", + "stored": "verbatim", + "used_for": "bit supplier input of price_profile.py" + }, + { + "file": "inputs/repo/research/gauge44-slots/construction/notri/PRIO6.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/construction/notri/PRIO6.json", + "blob": "069a7bf5a5f4db53068480acd57cb9e2e62eac2f", + "sha256": "de0412511b0dd1af13e9717bc791126ac0e91c569b5391fd6c70268083045d15", + "stored": "verbatim", + "used_for": "XPARAM of the generator" + }, + { + "file": "inputs/repo/research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json", + "blob": "e3bb24cc49812a90a82e8e77ee8588f3d00d81e4", + "sha256": "b22e6ecf76104de66844bd617c4ca80f5546ba0966a50e5e9aa0ffea4976cb30", + "stored": "verbatim", + "used_for": "K-triangle schedule of the generator" + }, + { + "file": "inputs/repo/research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json", + "blob": "cd23561e0be5bd060e6e0b94643e550374ecd7d8", + "sha256": "7347f814850a838bd617bc7a55c307cec2b72becde2f12ea3e2e1af344b43563", + "stored": "verbatim", + "used_for": "coded cells of the generator" + }, + { + "file": "inputs/repo/research/gauge44-slots/construction/COMPLETION-PRIORITY.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/construction/COMPLETION-PRIORITY.json", + "blob": "e0df30aeefc4063ccf203347889e18a621ff6b2a", + "sha256": "0274ffca1725e7460aaf7b672bc1248aa6dfdec11e5f0fec91af18b829f8ba47", + "stored": "verbatim", + "used_for": "generator input (hamming directory)" + }, + { + "file": "inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/gauge44-slots/construction/slots/SLOT-PINS-k8.json", + "blob": "2702c368f4de0b671577aee9a0e2df41c1b27658", + "sha256": "55dd229684febecb80638eff9c6b3986623e8539c6c956753b350209c3e0efe2", + "stored": "verbatim", + "used_for": "publishes the hash of the #1018 word" + }, + { + "file": "inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/moment.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/complex-k492-owner-repair/vendor/multicold/engines/moment.py", + "blob": "7d697cb45203fe72d97037403d6da41f71f3b7fd", + "sha256": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "stored": "verbatim", + "used_for": "price engine" + }, + { + "file": "inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py", + "blob": "14a90fa0e788217856f070382c9e61bd7c603c61", + "sha256": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "stored": "verbatim", + "used_for": "price engine" + }, + { + "file": "inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/outer.py", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/complex-k492-owner-repair/vendor/multicold/engines/outer.py", + "blob": "43007488ad2c43187c77cc6798beff8b1cd76ad2", + "sha256": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c", + "stored": "verbatim", + "used_for": "price engine" + }, + { + "file": "inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz", + "blob": "e98ce5d879e99427347acd725efc3b0c96fe5c13", + "sha256": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9", + "stored": "verbatim", + "used_for": "generator input (hamming directory)" + }, + { + "file": "inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PROTOTYPE.json", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/static44-selective/vendor/pr531/inputs/hamming/PROTOTYPE.json", + "blob": "9efe30ee107b9c67f15f1c726e1a1cb5cef03929", + "sha256": "327d2a868043e846381aa58a33053c24425e8cad522ff401b10ec8af1d649a3f", + "stored": "verbatim", + "used_for": "generator input (hamming directory)" + }, + { + "file": "inputs/spec/03-motifs.tex", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "upstream/build/sections/03-motifs.tex", + "blob": "cdb0ba527aa8df5d57c151183fd3893c1a7e21ab", + "sha256": "ed76761194988a01af77ead0ea6469cb5dcd29690ab985a0b5a4006b0f2b69bb", + "stored": "verbatim", + "used_for": "spec: common frame (:157), complex motif interface (:568-668)" + }, + { + "file": "inputs/spec/05-layers.tex", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "upstream/build/sections/05-layers.tex", + "blob": "5ce8b3c83c455f221bb84858a97230b0285644aa", + "sha256": "20cfc8d12099d4e4ed9e3e7eeb6162edd9b6e0e076f24693364cd24377252594", + "stored": "verbatim", + "used_for": "spec: recursive contract (:141-154)" + }, + { + "file": "inputs/spec/04-swap.tex", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "upstream/build/sections/04-swap.tex", + "blob": "951e792b1768e6509561380b8bbfb1d1ccb64c08", + "sha256": "412b170ccaab38dba96e95e3cbfae09f4876a9818f8d278776a746b0f8044906", + "stored": "verbatim", + "used_for": "spec: finite shear contract (:117-121)" + }, + { + "file": "inputs/repo/research/format-limits-corrected/README.md", + "pr": null, + "commit": "ed9ad578cb42d560115dc1e167341bd6c2a21ece", + "source_path": "research/format-limits-corrected/README.md", + "blob": "95c7ae59f24eeebba4baae992e70d11ff5d68459", + "sha256": "1bcd80c1cd61fddae9f3a7f00fc9d1c796410408251e576600e94c19b16b1e5e", + "stored": "verbatim", + "used_for": "rule census (rows 1, 3, 6), Lemma R (C.3), C.6" + } + ], + "derived": [ + { + "file": "inputs/words/w1018.json.gz", + "sha256": "49596aa4ed4fd36cd4582fd0e8ddeb09fd80370a7d8aea1ede52a135b536d289", + "content_sha256": "c2b294300760e1fd6eeab8c22c4d13e4633dca40e52cac8da0d68163a76e3ca8", + "published_in": "inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json", + "published_key": "word_sha256", + "rebuilt_from": "the #1018 construction (chain steps hyb, frames, slots); not a file of the repository", + "used_for": "the #1018 word c2b29430: ports, op sequences, price checks" + } + ], + "evidence": [ + { + "file": "evidence/B240-NOTES.md", + "sha256": "bea4258cee47cd49ee1f6ffa0b63a44d1f2db28b71fabfd58915180e327e5849" + }, + { + "file": "evidence/B244-NOTES.md", + "sha256": "232ec089bb3d19f3e1cd530fbf4eab44f6d22f959ef233635b50dbd79fe40ef9" + }, + { + "file": "evidence/B245-NOTES.md", + "sha256": "a5834abcea599d10ec8a74aa8a9775103b1f84efb6422d4f3a38fea2e9d9d19e" + }, + { + "file": "evidence/B247-NOTES.md", + "sha256": "7ce53c08ead1f4612a0e366709cafdffb1b9dd4ef57b8162932e248f8b003305" + }, + { + "file": "evidence/B248-NOTES.md", + "sha256": "9681674575c92a52225d881eefdb9244dff27c5d48a185d606896d2f8f0908b4" + }, + { + "file": "evidence/B251-NOTES.md", + "sha256": "480754ef1ef44c96e1786a982f732cda8a7ae5de8a394bb42d8b10b0e9198098" + }, + { + "file": "evidence/B252-NOTES.md", + "sha256": "ae6c500e272f78f037188296eca4cc367df7a9d723f93bca2270b45d1746d701" + }, + { + "file": "evidence/B253-NOTES.md", + "sha256": "d7db1385d23c5de3c5f4e406a5475e3bd987d7db7859773440b5d14cfde7f1c1" + }, + { + "file": "evidence/B254-NOTES.md", + "sha256": "34757bb3f71fdcb6893878cb5f647962d4cd5f893ac82ea86dd929d0b82c795b" + }, + { + "file": "evidence/B255-NOTES.md", + "sha256": "4f269ec0ff1ed543d3d2f9e05c29dff84ffc6ad61cd6d447acd716b799126628" + }, + { + "file": "evidence/B256-NOTES.md", + "sha256": "cfd5ba9b4c3313aa574e04636648fdcf944aba340bb5981161b79a2aa305c64b" + }, + { + "file": "evidence/B257-NOTES.md", + "sha256": "3fa646e0264ef6413e5d6b6cd6a5a9c4a723d88800e3726a3800c31d52e9df8a" + }, + { + "file": "evidence/B258-NOTES.md", + "sha256": "324248e9d7185bc4769117bc7c889fa37384326ea4874d8c64460f35f3990fe8" + }, + { + "file": "evidence/B258-b252_caps.txt", + "sha256": "2b56c00e3cf80e902a99274407927878cf783c9a947ac77306df37b2b4ed780b" + }, + { + "file": "evidence/B259-NOTES.md", + "sha256": "0086ba025662c95661ab1301a2b970d8835802188f71a7affa755ac859dd27b0" + }, + { + "file": "evidence/B260-NOTES.md", + "sha256": "e7132aac6efff256d54a20e2455ead7607f2bd32781f102bacfad6baebd0fb2c" + }, + { + "file": "evidence/KPR5-endcap.md", + "sha256": "409848a1bef6ffa0250ad12adad7573126d3d5da2a5d34f3a2d7b8ac18539ccf" + } + ] +} diff --git a/research/end-cap-obstruction/cards/B240/price.py b/research/end-cap-obstruction/cards/B240/price.py new file mode 100644 index 0000000000..7bad86b60c --- /dev/null +++ b/research/end-cap-obstruction/cards/B240/price.py @@ -0,0 +1,17 @@ +"""price.py: exact kappa for a k8-word local profile under #1018's composition (72*local + frozen #1018 idle), +via the package's own independent/price_profile.py (two exact engines + outer47 + PR589 bit). Same method as B232 price1018.py.""" +import json,subprocess,sys,tempfile +from pathlib import Path +ROOT=Path(__import__('os').environ['EO_ROOT']+'/inputs/repo');PKG=ROOT/'research/gauge44-slots' +plan=json.loads((PKG/'data/PLAN.json').read_text());paid=plan['provider_registry']['gauge44']['actual_paid_profile'] +IDLE={int(r):n-72*paid.get(r,0) for r,n in plan['profile'].items()} +def kappa(local): + H=dict(IDLE) + for r,n in local.items():H[int(r)]=H.get(int(r),0)+72*n + H={str(r):n for r,n in sorted(H.items()) if n} + d=Path(tempfile.mkdtemp());(d/'p.json').write_text(json.dumps({'profile':H})) + r=subprocess.run([sys.executable,'-B',str(PKG/'independent/price_profile.py'),'--main',str(ROOT),'--profile',str(d/'p.json'),'--output',str(d/'o.json')],capture_output=True,text=True,cwd=ROOT) + if r.returncode:raise RuntimeError(r.stdout[-400:]+r.stderr[-800:]) + return json.loads((d/'o.json').read_text())['prices']['native']['outer_with_bit']['kappa_decimal'] +if __name__=='__main__': + print(kappa(json.loads(sys.argv[1]))) diff --git a/research/end-cap-obstruction/cards/B240/prof.py b/research/end-cap-obstruction/cards/B240/prof.py new file mode 100644 index 0000000000..d2052c0e65 --- /dev/null +++ b/research/end-cap-obstruction/cards/B240/prof.py @@ -0,0 +1,49 @@ +"""prof.py WORD.json.gz -> local paid profile + width inventory (frame-only replica of audit_local.py:114-146; no scalar check).""" +import gzip,json,sys +from collections import Counter +def basis(vs): + piv={} + for a in vs: + while a: + bit=a.bit_length()-1 + if bit in piv:a^=piv[bit] + else:piv[bit]=a;break + for k in sorted(piv): + for j in piv: + if j>k and piv[j]>>k&1:piv[j]^=piv[k] + return tuple(piv[k] for k in sorted(piv,reverse=True)) +def regs(e):return e[1:3] if e[0]=='add' else e[1:2] +def profile(w,trace=None): + v,h,R=w['report']['v'],w['report']['h'],w['report']['R'];n=2*v+R + full=basis([1<=len(L):continue + j=idx[0];nxt=L[j+1];o=[x for x in rs if x!=q][0] + d1=L[j][2]-L[j][1];d2=nxt[2]-nxt[1] + # who forces the next climb: end cap of partner? + capped=len(end[o])H48',{48:mass*72/48}),('mass->H16',{16:mass*72/16})): + ex={r:int(round(n)) for r,n in ex.items()} + k=S.kapG(S.kg(l,ex));print(tag,ex,None if k is None else (k,100*(k-k0)/k0)) diff --git a/research/end-cap-obstruction/cards/B248/climbs.py b/research/end-cap-obstruction/cards/B248/climbs.py new file mode 100644 index 0000000000..2e33d049b5 --- /dev/null +++ b/research/end-cap-obstruction/cards/B248/climbs.py @@ -0,0 +1,42 @@ +import sys,gzip,json +from collections import Counter,defaultdict +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/inputs/repo/research/gauge44-slots/independent') +import audit_local as AL +basis=AL.basis;contained=AL.contained;registers=AL.registers +def load(p=None): + p=p or __import__('os').environ['EO_ROOT']+'/inputs/words/w1018.json.gz' + return json.loads(gzip.decompress(open(p,'rb').read())) +def climbs(w): + v,h,R=w['report']['v'],w['report']['h'],w['report']['R'];n=2*v+R + early=w.get('early_cleanup',[]);earlyids={i for i,U in early} + tail=[w['cleanup'][i][:-1]+[U] for i,U in early] + full=basis([1<>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 perp(F,port):return all((x&port).bit_count()%2==0 for x in F) +print('pairs',len(pairs),'selected',sum(p['selected'] for p in pairs)) +# FULLT +sel_one=0;sel_both=0;sel_none=0 +for pr in pairs: + if not pr['selected']:continue + k=[(key[1],key[2]) in FULLT for key in pr['keys']] + if all(k):sel_both+=1 + elif any(k):sel_one+=1 + else:sel_none+=1 +print('selected pairs: both FULLT',sel_both,'one FULLT',sel_one,'none',sel_none,'|FULLT|',len(FULLT)) +cnt=Counter();dims=Counter() +for pid,pr in enumerate(pairs): + if pr['selected']:continue + t,u=pr['targets'];k1,k2=pr['keys'] + fr=[] + for key in (k1,k2): + (a,al,fa),(b,be,fb)=HALF[key];fr+= [fa,fb] + ok_t=all(perp(f,P[t]) for f in fr);ok_u=all(perp(f,P[u]) for f in fr) + ok_both=ok_t and ok_u + J=basis(sum(fr,())) + cnt[(ok_t,ok_u)]+=1;dims[(len(J),tuple(len(f) for f in fr))]+=1 +print('nonselected raw-half frames inside hyper(Pt),hyper(Pu):',dict(cnt));print(dims) +print('--- value gate: m10*m01+m00*m11==0 (target-basis T solves), nonselected vs selected') +c=Counter() +for pr in pairs: + m=pr['matrix'];ok=(m[1][0]*m[0][1]+m[0][0]*m[1][1]==0);zero=any(x==0 for r in m for x in r) + c[(pr['selected'],ok,zero)]+=1 +print(dict(c)) +print(Counter(abs(x) for pr in pairs for r in pr['matrix'] for x in r)) +print('--- coded-frame gate: curY after selected loads vs partner hyperplane') +curY=I['curY'];c=Counter();dd=Counter() +for pid,pr in enumerate(pairs): + if pr['selected']:continue + t,u=pr['targets'] + a=perp(curY[t],P[u]);b=perp(curY[u],P[t]) + c[(a,b)]+=1;dd[(len(curY[t]),len(curY[u]))]+=1 +print(dict(c),dict(dd)) +# per-target: how many partners u (across the 2 nonselected pairs) +print('--- ordering feasibility: loads of another pair X\' (halves of both keys, J dim 6) inside partner hyperplane') +bytarget={} +for pid,pr in enumerate(pairs): + for t in pr['targets']:bytarget.setdefault(t,[]).append(pid) +assert all(len(x)==3 for x in bytarget.values()) +def Jf(pr): + fr=[] + for key in pr['keys']: + (a,al,fa),(b,be,fb)=HALF[key] if key in HALF else (None,None) + fr+=[fa,fb] + return basis(sum(fr,())) +# HALF only has nonselected keys; selected keys loads: use curY info instead +res=Counter() +for pid,pr in enumerate(pairs): + if pr['selected']:continue + t,u=pr['targets'] + for me,partner in ((t,u),(u,t)): + for xp in bytarget[me]: + if xp==pid:continue + X=pairs[xp] + if X['selected']: + ok='sel:'+str(perp(curY[me],P[partner])) + else: + ok='non:'+str(perp(Jf(X),P[partner])) + res[ok]+=1 +print(dict(res)) +print('--- single-half granularity') +res=Counter() +for pid,pr in enumerate(pairs): + if pr['selected']:continue + t,u=pr['targets'] + for me,partner in ((t,u),(u,t)): + for xp in bytarget[me]: + if xp==pid or pairs[xp]['selected']:continue + for key in pairs[xp]['keys']: + for (a,al,fa) in HALF[key]: + res[perp(fa,P[partner])]+=1 +print(dict(res)) diff --git a/research/end-cap-obstruction/cards/B248/gen/cgx_inst.py b/research/end-cap-obstruction/cards/B248/gen/cgx_inst.py new file mode 100644 index 0000000000..914edd8d15 --- /dev/null +++ b/research/end-cap-obstruction/cards/B248/gen/cgx_inst.py @@ -0,0 +1,495 @@ +# LeaverSAT: no-helper mutable-leaver all-K cells (coded triangles) on the no-triangle word. Generated by +# LeaverSAT/mkpkg.py from construction/notri/cgx.py with the leaver edits (lv.leaver_source); Apache-2.0. +import json as _lj, os as _lo, sys as _ls +from fractions import Fraction as _lF +CODED_CELLS=[(c['bindings'],[[t,s,_lF(q)] for t,s,q in c['scaled']]) for c in _lj.load(open(_lo.path.join(_lo.path.dirname(_lo.path.abspath(_ls.argv[3])),'CODED-CELLS.json')))] +# Round20 early-coordinate-center / own-Y variant, prepared for icekylinx +# with OpenAI Codex assistance. Apache-2.0. Scalar elementary-operation +# helpers below are retained from the attributed PR514 construct_partial.py. +# Adapted by OpenAI Codex for isolated structural research. +# Modified from PR425 by icekylinx with Codex assistance. +"""Full discovery word for Hamming packets with borrowed X and Y registers. + +This changes the scalar architecture. It is not accepted by the old restricted +gx interface: source bases may change until full-frame cleanup, and targets use +an explicitly inverted output basis. No supplier admission is asserted. +""" +import copy,gzip,json,math,time +import itertools as it +from collections import Counter,defaultdict +from fractions import Fraction as Q +from pathlib import Path + +import sys +INPUT=Path(sys.argv[1]);OUT=Path(sys.argv[2]);OUT.mkdir(parents=True,exist_ok=False);D=json.loads((INPUT/'PROTOTYPE.json').read_text()) +P=D['binary_ports'];R=D['root_lines'];v=120;h=9 +modules=json.load(gzip.open(INPUT/'PACKET-PROGRAMS.json.gz')) +# AtomScout: leaver-read K-triangles (schedule from atom1.py / rog.py CP-SAT) +TRI=json.loads(Path(sys.argv[3]).read_text()) +FULLT={(tuple(tr['p']),tr['e']) for tr in TRI['triangles']} +TRI_COORDS={t+8 for tr in TRI['triangles'] for t,_,_ in tr['reads']} +import os as _o +COPYL=json.loads(open(_o.environ['XPARAM']).read()).get('copyl',[]) if _o.environ.get('XPARAM') else [] +NH=504-3*len(FULLT)+len(COPYL) + +def basis(vectors): + b={} + for x in vectors: + for p in sorted(b,reverse=True): + if x>>p&1:x^=b[p] + if x: + p=x.bit_length()-1 + for q in b: + if b[q]>>p&1:b[q]^=x + b[p]=x + return tuple(b[p] for p in sorted(b,reverse=True)) +def inside(a,b):return basis(a+b)==b +def hyper(p):return basis([x for x in range(1,512) if (x&p).bit_count()%2==0]) +FULL=basis([1<=v,r)) + for col,s in enumerate(ids): + k=next(i for i in range(col,len(regs)) if rows[regs[i]].get(s,Q(0))) + swap(regs[k],regs[col],F) + scale(regs[col],1/rows[regs[col]][s],F) + for i in range(len(regs)): + if i!=col and rows[regs[i]].get(s,Q(0)):add(regs[i],regs[col],-rows[regs[i]][s],F) + assert all(rows[regs[i]]=={s:Q(1)} for i,s in enumerate(ids)) + M=[[Q(R[s][i]) for s in ids] for i in c] + def qr_rank(rs): + bs={} + for r in rs: + r=r.copy() + for i,b in sorted(bs.items()): + if r[i]:q=r[i];r=[x-q*y for x,y in zip(r,b)] + i=next((i for i,x in enumerate(r) if x),None) + if i is not None:q=r[i];bs[i]=[x/q for x in r] + return len(bs) + assert qr_rank(M)==4 + for rr0 in PRIO.get(",".join(map(str,c)),[])+PRIORITY[",".join(map(str,c))]["rows"]: + rr=list(map(Q,rr0)) + if qr_rank(M+[rr])>len(M):M.append(rr) + if len(M)==8:break + for i in range(8): + if len(M)==8:break + rr=[Q(i==j) for j in range(8)] + if qr_rank(M+[rr])>len(M):M.append(rr) + if len(M)==8:break + assert len(M)==8 + linear(regs,M,F) + for i,r in zip(c,regs): + assert rows[r]=={s:Q(R[s][i]) for s in ids} + block_totals[c,i]=r + +# All centers are complete while Y is still at zero. This is the crucial +# difference from an illegal early-own-Y prefix using the old center order. +centers=[] +for i in range(8): + regs=[block_totals[c,i] for c in sorted(blocks) if i in c] + F=hyper(P[frame[i]]);a=regs[0] + for b in regs[1:]:add(a,b,1,F) + centers.append(a) +centers += [frame[i] for i in range(8)] +center_frames=[cur[r] for r in centers] +assert list(map(len,center_frames))==[8]*8+[1]*8 +assert all(cur[v+t]==() for t in range(v)) + +phase=B +for t,(r,coef,F) in sorted(own_rows.items()): + if t in TRI_COORDS:continue + assert cur[r]==F + add(v+t,r,coef,F) +# requests are needed for TRI coefficients +requests=defaultdict(list) +for pid,pair in enumerate(pairs): + if not pair['selected']:continue + (t,u),(key1,key2),mat=pair['targets'],pair['keys'],pair['matrix'] + requests[key1].append((t,-Q(mat[0][0],2))) + requests[key2].append((u,-Q(mat[0][1],2))) +reqcoef={t:(key,coef) for key,reqs in requests.items() for t,coef in reqs} +def face_info(c,p,eps): + z=blocks[c];keys=[(pp,ee) for pp in it.combinations(c,2) for ee in (-1,1)] + r_local,alpha=z['outputs'][keys.index((p,eps))] + j=[j for j in range(40,len(z['events'])) if z['events'][j][0]==r_local];assert len(j)==1 + return j[0],Q(alpha) +tri_join_counts=Counter() +coded_shadow_slot={} +coded_target_edges=[];TRILOG=[] +lcopy={} +for s8 in COPYL: + r=s8+8;c=len(cur);cur.append(());rows.append({});shadow.append(None);add(c,r,1,cur[r]);lcopy[r]=c +BF={c:basis([P[x] for x in z['receipt']['source_lines']]) for c,z in blocks.items()} +HYB={(tuple(map(int,h[0])),tuple(map(int,h[1])),int(h[2])) for h in XP.get('hyb',[])} +HYBLOG=[] +def triread(t,blk,r,q): + F=basis(cur[v+t]+cur[r]);assert inside(F,hyper(P[t])),('TRI frame',t,blk,r,cur[v+t],cur[r],hyper(P[t]),[x for x in TRILOG if x[2]==r],HYBLOG) + tri_join_counts[len(F)]+=1;add(v+t,r,q,F);TRILOG.append([t,list(blk),r,str(q),list(F),list(cur[r])]) +for tr in TRI['triangles']: + if tr.get('coded'): + bindings={} + for name,binding in CODED_CELLS[tr['cell']][0].items(): + bindings[name]=maps[tuple(binding[1])][binding[2]] if binding[0]=='source' else v+binding[1] + for tn,sn,q in CODED_CELLS[tr['cell']][1]: + target,source=bindings[tn],bindings[sn] + F=basis(cur[target]+cur[source]) + for register in (target,source): + if v<=register<2*v:assert inside(F,hyper(P[register-v])),('coded frame',register,F) + add(target,source,q,F) + if sn.startswith('y'):coded_target_edges.append((target,source,Q(q))) + continue + p,eps=tuple(tr['p']),tr['e'] + hb={blk for _,blk,_ in map(lambda x:(x[0],tuple(x[1]),x[2]),tr['reads']) if (blk,p,eps) in HYB} + own=[];rest=[] + for t8,blk,loc in tr['reads']: + t=t8+8;blk=tuple(blk);r=maps[blk][loc];r0=r;r=lcopy.get(r,r) + key,coef=reqcoef[t];assert key[1]==p and key[2]==eps,(key,p,eps) + if blk==key[0]: + rr,c0,F0=own_rows[t];assert rr==r0;own.append((t,blk,r,c0)) + else: + j,alpha=face_info(blk,p,eps);ev=blocks[blk]['events'][j];assert loc in ev[:2] + rest.append((t,blk,loc,r,coef*alpha)) + if not hb: + # original interleaved order + for t8,blk,loc in tr['reads']: + t=t8+8;blk=tuple(blk);r=maps[blk][loc];key,coef=reqcoef[t] + if blk==key[0]:q=own_rows[t][1] + else:j,alpha=face_info(blk,p,eps);q=coef*alpha + triread(t,blk,r,q) + continue + items=[] # (kind, t, reg, q, blk) + for t,blk,r,q in own:items.append(('r',t,r,q,blk,blk in hb)) + for blk in sorted(hb):items.append(('e',None,None,None,blk,True)) + done=set() + for t,blk,loc,r,q in rest: + if blk in hb: + j,_=face_info(blk,p,eps);ev=blocks[blk]['events'][j] + ws=[x for x in rest if x[0]==t and x[1]==blk];assert len(ws)==2 and ws[0][4]==ws[1][4] and {ws[0][2],ws[1][2]}==set(ev[:2]) + if (t,blk) in done:continue + done.add((t,blk));items.append(('m',t,maps[blk][ev[0]],q,blk,True)) + else:items.append(('r',t,r,q,blk,False)) + # Original read order with the two half reads collapsed into one M read at the first half's slot; the face event goes + # just before the first M read of its block; own reads of the M register are hoisted ahead of that event. + def evinfo(blk): + j,_=face_info(blk,p,eps);ev=blocks[blk]['events'][j];assert ev[2]==ev[3]==1,ev + mpb=maps[blk];return mpb[ev[0]],mpb[ev[1]],tuple(blocks[blk]['event_frames'][j]) + items=[] + seen=set() + for t8,blk,loc in tr['reads']: + t=t8+8;blk=tuple(blk);r=maps[blk][loc];key,coef=reqcoef[t] + if blk==key[0]:items.append(('r',t,r,own_rows[t][1],blk,blk in hb)) + else: + j,alpha=face_info(blk,p,eps);q=coef*alpha + if blk in hb: + if (t,blk) not in seen:seen.add((t,blk));continue + items.append(('m',t,evinfo(blk)[0],q,blk,True)) + else:items.append(('r',t,r,q,blk,False)) + for blk in sorted(hb): + k0=min(i for i,x in enumerate(items) if x[0]=='m' and x[4]==blk) + items.insert(k0,('e',None,None,None,blk,True)) + n=len(items) + def step(it,st): + k,t,r,q,blk,h=it;g=lambda x:st.get(x,cur[x]) + if k=='e': + a_,b_,EF=evinfo(blk);FF=basis(list(EF)+list(g(a_))+list(g(b_))) + return {a_:FF,b_:FF} if inside(FF,BF[blk]) else None + F=basis(list(g(v+t))+list(g(r))) + if not inside(F,hyper(P[t])):return None + if h and k=='r' and r==evinfo(blk)[1] and not inside(F,BF[blk]):return None + return {v+t:F,r:F} + def allowed(i,used): + k,t,r,q,blk,h=items[i] + evi=[j for j,x in enumerate(items) if x[0]=='e' and x[4]==blk] if h else [] + if k=='e':return all(j in used for j,x in enumerate(items) if x[0]=='r' and x[4]==blk and x[5] and x[2]==evinfo(blk)[0]) + if k=='m':return evi[0] in used + if k=='r' and h and r==evinfo(blk)[0]:return evi[0] not in used + return True + budget=[int(os.environ.get('HYBBUDGET','300000'))];memo=set() + def dfs(st,used,order): + if len(order)==n:return order + budget[0]-=1 + if budget[0]<0:return None + sig=(used,tuple(sorted(st.items()))) + if sig in memo:return None + memo.add(sig) + for i in range(n): + if i in used or not allowed(i,used):continue + d=step(items[i],st) + if d is None:continue + ns=dict(st);ns.update(d);res=dfs(ns,used|{i},order+[i]) + if res:return res + return None + import sys as _s;_s.setrecursionlimit(20000) + order=dfs({},frozenset(),[]) + assert order,('no feasible hybrid order',p,eps,sorted(hb),budget) + for i in order: + k,t,r,q,blk,h=items[i] + if k=='e': + a_,b_,EF=evinfo(blk);FF=basis(list(EF)+list(cur[a_])+list(cur[b_]));add(a_,b_,1,FF);HYBLOG.append([list(blk),list(p),eps,list(FF)]) + else:triread(t,blk,r,q) + +packets={} +for c,z in sorted(blocks.items()): + mp=maps[c] + keys=[(p,eps) for p in it.combinations(c,2) for eps in (-1,1)] + skipev={face_info(c,p,eps)[0] for p,eps in keys if (p,eps) in FULLT} + for j,(e,F) in enumerate(list(zip(z['events'],z['event_frames']))[40:]): + if j not in early[c] and 40+j not in skipev: + t,s,a,b=e;add(mp[t],mp[s],Q(a,b),tuple(F)) + for key,(r,alpha) in zip(keys,z['outputs']): + if tuple(key) in FULLT:skip();continue + a=mp[r];b=alloc();add(b,a,1,cur[a]) + consumers=sorted(d for d in blocks if d!=c and set(key[0])<=set(d)) + assert len(consumers)==2 + for target,r in zip(consumers,(a,b)):packets[c,key[0],key[1],target]=(r,Q(alpha)) + +# Both tetrahedra use the same partition. A selected key has exactly two +# selected Y loads and no ordinary M consumer. Supply its two raw halves in +# opposite orders and never form that M. Other keys retain the old M path. +second=[];first_join_counts=Counter() +for key,reqs in sorted(requests.items()): + assert len(reqs)==2 + c,p,eps=key + if (p,eps) in FULLT:continue + ds=sorted(d for d in blocks if d!=c and set(p)<=set(d));a,b=ds + for j,(target,coef) in enumerate(sorted(reqs)): + first_source,second_source=(a,b) if j==0 else (b,a) + r,alpha=packets[first_source,p,eps,second_source] + F=basis(cur[v+target]+cur[r]);assert inside(F,hyper(P[target])) + first_join_counts[len(F)]+=1;add(v+target,r,coef*alpha,F) + r,alpha=packets[second_source,p,eps,c] + second.append((target,r,coef*alpha)) + +Ms={};HALF={} +for c in sorted(blocks): + for p in it.combinations(c,2): + ds=sorted(d for d in blocks if d!=c and set(p)<=set(d)) + for eps in (-1,1): + if (c,p,eps) in requests:continue + (a,alpha),(b,beta)=[packets[d,p,eps,c] for d in ds] + HALF[c,p,eps]=((a,alpha,cur[a]),(b,beta,cur[b])) + F=basis(cur[a]+cur[b]);add(a,b,beta/alpha,F) + Ms[c,p,eps]=(a,alpha) + +consumers=defaultdict(list) +for pid,pair in enumerate(pairs): + for key in pair['keys']:consumers[key].append(pid) +slots={} +for key,uses in sorted(consumers.items()): + assert len(uses)==2 + if key in requests: + assert all(pairs[i]['selected'] for i in uses) + continue + assert all(not pairs[i]['selected'] for i in uses) + a,alpha=Ms[key] + for j,pid in enumerate(uses): + if j==0:r=a + else:r=alloc();add(r,a,1,cur[a]) + slots[pid,key]=(r,alpha) +assert len(cur)-240==NH,len(cur)-240 + +selected_join_counts=Counter() +for target,r,coef in second: + F=basis(cur[v+target]+cur[r]);assert inside(F,hyper(P[target])) + selected_join_counts[len(F)]+=1;add(v+target,r,coef,F) +output_basis=[] +for pair in pairs: + if not pair['selected']:continue + (t,u),mat=pair['targets'],pair['matrix'] + F=basis(cur[v+t]+cur[v+u]);assert inside(F,hyper(P[t])) and inside(F,hyper(P[u])) + add(v+t,v+u,1,F);add(v+u,v+t,-Q(1,2),F) + z=-Q(2*mat[1][0],mat[0][0]);scale(v+u,z,F);output_basis.append((t,u,z)) + +import pickle +INFO=dict(pairs=pairs,HALF=HALF,P=P,v=v,curY={t:cur[v+t] for t in range(v)},FULLT=FULLT) +pickle.dump(INFO,open(os.environ.get('INFOOUT','info.pkl'),'wb')) +for pid,pair in enumerate(pairs): + if pair['selected']:continue + (t,u),(key1,key2),mat=pair['targets'],pair['keys'],pair['matrix'] + (a,alpha),(b,beta)=slots[pid,key1],slots[pid,key2] + F=basis(cur[a]+cur[b]);aa,ab=Q(mat[0][0])*alpha,Q(mat[0][1])*beta + ba,bb=Q(mat[1][0])*alpha,Q(mat[1][1])*beta + add(a,b,ab/aa,F);q=ba/(bb-ba*ab/aa);add(b,a,q,F) + add(v+t,a,-aa/2,hyper(P[t]));add(v+u,b,-(bb-ba*ab/aa)/2,hyper(P[u])) + +for t in range(v): + expected={s:-Q(G[t][s],2) for s in range(v) if s!=t and G[t][s] and s not in frame.values()} if t not in frame.values() else {} + assert rows[v+t]==expected,('side identity',t) + +scatter=[[Q(r[i],4) if t not in frame.values() else Q(0) for i in range(8)]+[Q(t==frame[i]) for i in range(8)] for t,r in enumerate(R)] +precondition=[] +for t,u,z in output_basis: + a,b=scatter[t].copy(),scatter[u].copy() + scatter[t]=[x/2-y/z for x,y in zip(a,b)] + scatter[u]=[x/2+y/z for x,y in zip(a,b)] + precondition.extend([['scale',v+u,(1/z).numerator,(1/z).denominator,[]], + ['add',v+u,v+t,1,2,[]],['add',v+t,v+u,-1,1,[]]]) +for target,source,q in reversed(coded_target_edges): + scatter[target-v]=[a-q*b for a,b in zip(scatter[target-v],scatter[source-v])] + precondition.append(['add',target,source,-q.numerator,q.denominator,[]]) +for r in range(len(cur)):climb(r,hyper(P[r-v]) if v<=r<2*v else FULL) +H[8]+=8;H[1]+=8 +assert sum(r*z for r,z in H.items())==9*NH+240*8+72,sum(r*z for r,z in H.items()) + +def apply(e,matrix): + if e[0]=='add': + _,t,s,a,b,*_=e;q=Q(a,b) + for j,x in list(matrix[s].items()): + z=matrix[t].get(j,Q(0))+q*x + if z:matrix[t][j]=z + else:matrix[t].pop(j,None) + else: + _,t,a,b,*_=e;q=Q(a,b);matrix[t]={j:q*x for j,x in matrix[t].items()} +def inverse(e): + e=copy.deepcopy(e) + if e[0]=='add':e[3]*=-1 + else:e[2],e[3]=e[3],e[2] + e[-1]=list(FULL);return e +cut=[['add',v+t,centers[i],q.numerator,q.denominator,None] for t,row in enumerate(scatter) for i,q in enumerate(row) if q] +cleanup=[inverse(e) for e in reversed(A+B) if not v<=e[1]<2*v] +matrix=[{r:Q(1)} if r H48 +27 +t('2 helpers gone, mass->idle rank48 (27 H48)',{1:-12,3:-2},{48:27}) +t('2 helpers gone, mass->idle as H16 (81 H16)',{1:-12,3:-2},{16:81}) +t('2 helpers gone, mass-> as 1296 H1 (idle small)',{1:-12,3:-2},{1:1296}) +t('2 helpers (1,1,1,1,5) gone -> H48',{1:-8,5:-2},{48:27}) +t('mass-only: 1 H1 mass->H48 equivalent (-48 H1 +1 H48)',{},{1:-48,48:1}) +t('#1005-like cell -30H1+6H2+6H3 per local x8 (neutral)',{1:-240,2:48,3:48},{}) diff --git a/research/end-cap-obstruction/cards/B249/cand.py b/research/end-cap-obstruction/cards/B249/cand.py new file mode 100644 index 0000000000..9ddcee343d --- /dev/null +++ b/research/end-cap-obstruction/cards/B249/cand.py @@ -0,0 +1,32 @@ +import sys,collections,json +from sim import * +def newprog_for(hs): + """hs: list of helpers removed jointly (must be independent: each tracked separately on the ORIGINAL prog; only valid singly).""" + h=hs[0];st,r=track(h) + assert st=='ok',st + out,nr,nw=r;outd=dict(out) + new=[] + for idx,(tag,e) in enumerate(prog): + if e[0]=='add' and h in e[1:3]: + if e[2]==h: + x=e[1] + for rr,c in outd[idx]: + ne=['add',x,rr,c.numerator,c.denominator,e[5]] + new.append((tag,ne)) + continue + new.append((tag,e)) + return new +if __name__=='__main__': + res=[] + for h in range(224,704): + if h in centers:continue + st,r=track(h) + if st!='ok':continue + ok,why,paid,mass=simulate(newprog_for([h]),removed={h}) + res.append((h,ok,why,mass,dict(paid) if paid else None)) + n_ok=[r for r in res if r[1]] + print(len(res),'candidates;',len(n_ok),'feasible') + for r in n_ok:print(r) + c=collections.Counter(r[2].split(' reg')[0].split(' ')[0]+' '+(r[2].split()[1][0] if len(r[2].split())>1 else '') for r in res if not r[1]) + print(c) + for r in res[:10]:print(r[:3]) diff --git a/research/end-cap-obstruction/cards/B249/census.py b/research/end-cap-obstruction/cards/B249/census.py new file mode 100644 index 0000000000..24a7b9e075 --- /dev/null +++ b/research/end-cap-obstruction/cards/B249/census.py @@ -0,0 +1,117 @@ +import gzip,json,sys,collections +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B240') +from prof import basis +w=json.load(gzip.open(sys.argv[1] if len(sys.argv)>1 else __import__('os').environ['EO_ROOT']+'/inputs/words/w1018.json.gz')) +v,h,R=w['report']['v'],w['report']['h'],w['report']['R'];n=2*v+R +FULLB=basis([1<>(y.bit_length()-1)&1:x^=y + if x:ok=False;break + _n[k]=ok + return _n[k] +tail=[w['cleanup'][i][:-1]+[U] for i,U in w['early_cleanup']] +ev=[] +for sec in ('A','B'): + for e in w[sec]:ev.append((sec,e)) +for e in tail:ev.append(('T',e)) +END=len(ev)-1 +start=[(p,) for p in w['ports']]+[()]*(v+R) +start=[B(s) for s in start] +for q,U in w.get('start_extra',{}).items():start[int(q)]=B(U) +fin=[FULLB]*n +for q,U in w.get('helper_final',{}).items():fin[int(q)]=B(U) +for q in range(v,2*v):fin[q]=B([x for x in range(1,1< [(i,frame,isread)] +reads=collections.defaultdict(list) +for i,(s,e) in enumerate(ev): + f=B(e[-1]) + ops[e[1]].append((i,f)) + if e[0]=='add':ops[e[2]].append((i,f));reads[e[2]].append((i,f)) +# leavers +LV={} +for r in range(v): + if reads[r]: + t,g=max(reads[r],key=lambda x:x[0]);LV[r]=(t,g) +print('leavers',len(LV),'of',v,'gdim hist',sorted(collections.Counter(len(g) for t,g in LV.values()).items())) +# does any leaver have a later write? climbs left +print('leaver sources with no read',v-len(LV)) +# helpers +cat={} +H={} +for hh in range(2*v,n): + O=ops[hh] + H[hh]=O +def layer(hh): + c0=len(start[hh])==0 + return ('cold0' if c0 else 'enter%d'%len(start[hh]))+('/endFULL' if fin[hh]==FULLB else '/endU') +def grp(hh): + return 'a' if hh<2*v+224 else 'b' if hh<2*v+224+144 else 'c' +print('helper index ranges by start/end:') +rng=collections.defaultdict(list) +for hh in H:rng[layer(hh)].append(hh) +for k,l in sorted(rng.items()):print(' ',k,len(l),min(l),max(l)) +res=collections.defaultdict(lambda:collections.Counter()) +best={} +for hh,O in H.items(): + L=layer(hh);res[L]['n']+=1 + if not O:res[L]['noops']+=1;continue + res[L]['frame0ops']+=any(len(f)==0 for i,f in O) + bw=bp=False;bc=0;bcf=0 + for z,(tL,g) in LV.items(): + # timed + k=len(O) + while k>0 and O[k-1][0]>tL and nested(g,O[k-1][1]):k-=1 + kf=len(O) + while kf>0 and nested(g,O[kf-1][1]):kf-=1 + for kk,fl in ((k,0),(kf,1)): + cov=(len(O)-kk)/len(O) + if fl==0: + bc=max(bc,cov) + if kk==0:bw=True + elif cov>=0.8:bp=True + else: + bcf=max(bcf,cov) + if kk==0:res[L]['whole_fo']+=0 + if kf==0:res[L]['_wf']+=1 + res[L]['whole']+=bw;res[L]['p80']+=(bp and not bw);res[L]['anyoverlap']+=bc>0 + res[L]['bestcov_max_x1000']=max(res[L]['bestcov_max_x1000'],int(bc*1000)) + res[L]['bestcov_frameonly_max_x1000']=max(res[L]['bestcov_frameonly_max_x1000'],int(bcf*1000)) + res[L]['whole_frameonly_helpers']+=any( + all(nested(g,f) for i,f in O) for z,(tL,g) in LV.items()) + res[L]['p80_frameonly_helpers']+=any( + sum(1 for i,f in O if nested(g,f))/len(O)>=0.8 for z,(tL,g) in LV.items()) +tot=collections.Counter() +for L,c in sorted(res.items()): + c.pop('_wf',None);print(L,dict(c)) + for k in('n','whole','p80'):tot[k]+=c[k] +print('TOTAL',dict(tot)) +# B236 live co-framing: any source reg r (live, frame at op time) nested in op frame for ALL ops of helper +def frame_at(r,i): + f=start[r] + for (j,ff) in ops[r]: + if j0] + if not O2:continue + L=layer(hh);bb=0;ba=False + for r in range(v): + c=sum(1 for i,f in O2 if nested(frame_at(r,i),f))/len(O2) + bb=max(bb,c) + if c==1:ba=True + co[L][0]+=1;co[L][1]+=ba;co[L][2]+=bb +for L,(a,b,c) in sorted(co.items()):print('cof',L,'n',a,'helpers with a live source whole-life co-framed',b,'mean best frac %.2f'%(c/a)) diff --git a/research/end-cap-obstruction/cards/B249/closure.py b/research/end-cap-obstruction/cards/B249/closure.py new file mode 100644 index 0000000000..f2c5e8b11e --- /dev/null +++ b/research/end-cap-obstruction/cards/B249/closure.py @@ -0,0 +1,62 @@ +import sys,collections +from sim import * +import scan +def track_p(P,h): + H={};out={} + for idx,(tag,e) in enumerate(P): + if e[0]=='scale': + if e[1]==h: + q=F(e[2],e[3]);H={k:q*c for k,c in H.items()} + elif e[1] in H: + q=F(e[2],e[3]);H[e[1]]=H[e[1]]/q + continue + t,s=e[1],e[2];q=F(e[3],e[4]) + if t==h: + H[s]=H.get(s,F(0))+q + if H[s]==0:del H[s] + continue + if s==h: + if t in H:return None + out[idx]=[(r,q*c) for r,c in H.items()];continue + if t in H: + c=H.pop(t);H[s]=H.get(s,F(0))-c*q + if H[s]==0:del H[s] + H[t]=c + return out if not H else None +def remove(P,h): + out=track_p(P,h) + if out is None:return None,None + new=[];srcs=set() + for idx,(tag,e) in enumerate(P): + if e[0]=='add' and h in e[1:3]: + if e[2]==h: + for rr,c in out[idx]: + new.append((tag,['add',e[1],rr,c.numerator,c.denominator,e[5]]));srcs.add(rr) + continue + new.append((tag,e)) + return new,srcs +def closure(h,maxn=16): + P=prog;rem=[];todo=[h] + while todo: + x=todo.pop() + if x in rem:continue + if x in centers or x<224:return None,'nonremovable src %d'%x + P2,srcs=remove(P,x) + if P2 is None:return None,'bail %d'%x + P=P2;rem.append(x) + for s in srcs: + if s>=224 and s not in rem:todo.append(s) + if len(rem)>maxn:return None,'too big' + return (P,rem),'ok' +if __name__=='__main__': + stat=collections.Counter();best=[] + for h in range(224,704): + if h in centers:continue + r,why=closure(h) + if r is None:stat[why.split()[0]]+=1;continue + P,rem=r + ok,why2,paid,mass=simulate(P,removed=set(rem)) + stat['feasible' if ok else 'infeasible']+=1 + if ok:best.append((h,rem,mass,dict(paid))) + print(stat) + for b in best:print(b) diff --git a/research/end-cap-obstruction/cards/B249/feas.py b/research/end-cap-obstruction/cards/B249/feas.py new file mode 100644 index 0000000000..4c189b0987 --- /dev/null +++ b/research/end-cap-obstruction/cards/B249/feas.py @@ -0,0 +1,71 @@ +import sys,collections,pickle +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B240') +from prof import basis +from scan import * +FULLB=basis([1<>(y.bit_length()-1)&1:x^=y + if x:return False + return True +start=[B((p,)) for p in w['ports']]+[()]*(v+480) +for q,U in w.get('start_extra',{}).items():start[int(q)]=B(U) +end=[FULLB]*n +for q,U in w.get('helper_final',{}).items():end[int(q)]=B(U) +for q in range(v,2*v):end[q]=B([x for x in range(1,1<<9) if (x&w['ports'][q-v]).bit_count()%2==0]) +FR=lambda e:B(e[-1]) if e[-1] is not None else None +# per-register op timeline of frames (only ops with frames, i.e. A,B,tail,cut?) ; full-frame others +tl=collections.defaultdict(list) # reg -> [(idx,frame)] +for idx,(tag,e) in enumerate(prog): + if e[0]=='scale':continue + f=FR(e) if tag[0] not in 'LPC' else FULLB if tag[0]=='L' else B(()) + if tag[0]=='cut':f=None + for r in e[1:3]:tl[r].append((idx,f)) +import bisect +def cur_at(r,idx): + L=tl[r];i=bisect.bisect_left(L,(idx,)) # first with index>=idx + # last op before idx with frame not None + j=i-1 + while j>=0 and L[j][1] is None:j-=1 + return L[j][1] if j>=0 else start[r] +def next_at(r,idx): + L=tl[r];i=bisect.bisect_right(L,(idx,B(()))) # entries > idx + i=bisect.bisect_left(L,(idx+1,)) + while i=2*v} + for e in w['precondition']:apply(e,dirt) + comp=[['add',y,k,-a.numerator,a.denominator,[]] for y in range(v,2*v) for k,a in sorted(dirt[y].items())] + early=w.get('early_cleanup',[]);eid={i for i,U in early} + tail=[(('E',i),w['cleanup'][i][:-1]+[U]) for i,U in early] + prog=[(('P',i),e) for i,e in enumerate(w['precondition'])]+[(('C',i),e) for i,e in enumerate(comp)] + for sec in ('A','cut','B'): + prog+= [((sec,i),e) for i,e in enumerate(w[sec])] + prog+=tail+[(('L',i),e) for i,e in enumerate(w['cleanup']) if i not in eid] + return prog,comp +if __name__=='__main__': + w=load();prog,comp=build(w) + print(len(prog),len(comp)) + import collections + print(collections.Counter(e[0] for _,e in prog)) + print('comp helpers',len({e[2] for e in comp}),'centers',w['centers']) + print([ (t,e) for t,e in prog if e[0]=='scale' and t[0]!='P'][:5]) diff --git a/research/end-cap-obstruction/cards/B249/scan.py b/research/end-cap-obstruction/cards/B249/scan.py new file mode 100644 index 0000000000..177fc90fd8 --- /dev/null +++ b/research/end-cap-obstruction/cards/B249/scan.py @@ -0,0 +1,45 @@ +import sys,collections +from fractions import Fraction as F +from prog import * +w=load();prog,comp=build(w);v=112;n=704 +compH={e[2] for e in comp} +centers=set(w['centers']) +def track(h): + """returns (status, newprog_spec) ; status 'ok' or bail reason""" + H={};g=F(1);out=[];nread=0;nwrite=0 + for idx,(tag,e) in enumerate(prog): + if e[0]=='scale': + if e[1]==h: + q=F(e[2],e[3]);g*=q;H={k:q*c for k,c in H.items()} + elif e[1] in H: + # r scaled: h-h0 = H[r]*r_old ; r_old = r_new/q + q=F(e[2],e[3]);H[e[1]]=H[e[1]]/q + continue + t,s=e[1],e[2];q=F(e[3],e[4]) + if t==h: + nwrite+=1 + H[s]=H.get(s,F(0))+q + if H[s]==0:del H[s] + continue + if s==h: + nread+=1 + if t in H:return 'bail:read-by-source@%s'%(tag,),None + out.append((idx,[(r,q*c) for r,c in H.items()])) + continue + if t in H: + # t += q s ; t_old = t_new - q s + c=H.pop(t) + H[s]=H.get(s,F(0))-c*q + if H[s]==0:del H[s] + H[t]=c + if H:return 'bail:final H nonzero',None + return 'ok',(out,nread,nwrite) +if __name__=='__main__': + res=collections.Counter();ok=[] + for h in range(224,704): + if h in centers:res['center']+=1;continue + st,r=track(h) + res[st.split('@')[0]]+=1 + if st=='ok':ok.append((h,r[1],r[2],h in compH)) + print(res) + print(len(ok),ok[:40]) diff --git a/research/end-cap-obstruction/cards/B249/sim.py b/research/end-cap-obstruction/cards/B249/sim.py new file mode 100644 index 0000000000..a12a3b08e0 --- /dev/null +++ b/research/end-cap-obstruction/cards/B249/sim.py @@ -0,0 +1,56 @@ +import sys,collections,time +from feas import * +lev_empty=B(()) +CF=[B(f) for f in w['center_frames']] +cache_j={} +def jn(a,b): + k=(a,b) + if k not in cache_j:cache_j[k]=B(list(a)+list(b)) + return cache_j[k] +def simulate(newprog,removed=()): + """newprog: list of (tag,e). returns (ok,reason,paid Counter,mass_total). lazy frames: F=join(E,cur..).""" + cur=list(start);paid=collections.Counter();changed=collections.Counter() + def climb(q,U,where): + c=cur[q] + if c==U:return True + if not nested(c,U):return False + if not nested(U,end[q]):return False + d=len(U)-len(c) + paid[d]+=1;cur[q]=U;return True + sec=None + for tag,e in newprog: + t0=tag[0] + if t0 in 'PC':continue + if t0=='L': + for q in e[1:3] if e[0]=='add' else e[1:2]: + if end[q]!=FULLB:return False,'L-low-end %s'%(tag,),None,None + continue + if t0=='cut':continue + if t0=='B' and sec!='B': + sec='B' + for t in range(v): + if cur[v+t]!=():return False,'target level y%d'%t,None,None + for q,U in zip(w['centers'],CF): + if cur[q]!=U:return False,'center frame %d'%q,None,None + # center path paid (as audit) + for q,U in zip(w['centers'],CF): + served={() for e2 in w['cut'] if e2[2]==q} + for T in sorted(served,key=lambda x:-len(x)): + if T!=U:paid[len(U)-len(T)]+=1 + U=T + regs=e[1:3] if e[0]=='add' else e[1:2] + E=B(e[-1]) + F=E + for q in regs: + if not nested(cur[q],F):F=jn(F,cur[q]) + for q in regs: + if not climb(q,F,tag):return False,'op %s reg %d F dim %d end dim %d cur %d'%(tag,q,len(F),len(end[q]),len(cur[q])),None,None + for q in range(n): + if q in removed:continue + if not climb(q,end[q],'end'):return False,'final',None,None + mass=sum(d*c for d,c in paid.items()) + return True,'ok',paid,mass +if __name__=='__main__': + t=time.time() + r=simulate(prog) + print(r,time.time()-t) diff --git a/research/end-cap-obstruction/cards/B251/cls2.py b/research/end-cap-obstruction/cards/B251/cls2.py new file mode 100644 index 0000000000..60025166e7 --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/cls2.py @@ -0,0 +1,27 @@ +import sys,pickle,collections +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from feas import * +inc=pickle.load(open('inc.pkl','rb'));sel,ub=pickle.load(open('mis_h.pkl','rb')) +def members(b): + s={0} + for x in b:s|={y^x for y in s} + m=0 + for y in s:m|=1<=224)) diff --git a/research/end-cap-obstruction/cards/B251/ev.py b/research/end-cap-obstruction/cards/B251/ev.py new file mode 100644 index 0000000000..1b5c2ecb4a --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/ev.py @@ -0,0 +1,23 @@ +import sys,collections,pickle +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from feas import * +Fx=set(range(224))|set(w['centers']) +# events: add ops in A,B,E sections (frames defined) whose TARGET is a fixed register: carrier = e[2] +def build_events(): + ops=[(i,tag,e) for i,(tag,e) in enumerate(prog) if e[0]=='add' and tag[0] in 'ABE'] + # target-chain: cap via backward pass over target ops only; L via forward pass + Ls={};caps={} + cur={} + for i,tag,e in ops: + x=e[1] + if x in Fx: + c=cur.get(x,start[x]);L=join(B(e[-1]),c);Ls[i]=L;cur[x]=L + capq={} + for i,tag,e in reversed(ops): + x=e[1] + if x in Fx: + c=capq.get(x,end[x]); + # cap = intersection(c, ...) ; ops frame subset of c. intersection of subspaces: store as member bitmask? use membership + capq[x]=c;caps[i]=c + # monotone: earlier ops must be inside this op's frame, so next cap for earlier = cap(o) itself bounded by F_o <= c ; we use c (upper) only + return ops,Ls,caps diff --git a/research/end-cap-obstruction/cards/B251/fin.py b/research/end-cap-obstruction/cards/B251/fin.py new file mode 100644 index 0000000000..315849a3fe --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/fin.py @@ -0,0 +1,21 @@ +import sys,pickle,collections +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from feas import * +inc=pickle.load(open('inc.pkl','rb'));host=pickle.load(open('host.pkl','rb'));Yev=pickle.load(open('yevp.pkl','rb')) +def lay(h): + return ('cold0' if len(start[h])==0 else 'enter%d'%len(start[h]))+('/endFULL' if end[h]==FULLB else '/endU') +H=[h for h in range(224,704) if h not in set(w['centers'])] +act=collections.Counter(lay(h) for h in H) +carr_real=collections.defaultdict(set);carr_gauge=collections.defaultdict(set) +for i in inc: + for c in i['car']: + if c>=224:carr_real[lay(c)].add(c) +for idx,tag,e,k,hh in Yev: + if k==() and e[2]>=224:carr_gauge[lay(e[2])].add(e[2]) +forced=collections.Counter() +for i,x in enumerate(inc): + if x['nh']==0 and len(host[i])==1:forced[next(iter(host[i]))]+=1 +print('class | actual | delivery-carriers(real value) | gauge-only carriers | no Y-read at all | forced-incarnations') +for L in sorted(act): + d=carr_real[L];g=carr_gauge[L]-d + print(L,act[L],len(d),len(g),act[L]-len(d|carr_gauge[L]),forced[L]) diff --git a/research/end-cap-obstruction/cards/B251/graph.py b/research/end-cap-obstruction/cards/B251/graph.py new file mode 100644 index 0000000000..bfe0c79b08 --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/graph.py @@ -0,0 +1,29 @@ +import sys,pickle,collections +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from ev import * +ops,Ls,caps=build_events() +Y=[(i,tag,e) for i,tag,e in ops if i in Ls and e[1] in range(112,224)] +print('Y events',len(Y),collections.Counter(tag[0] for i,tag,e in Y)) +# members bitmask of subspaces +def members(b): + s={0} + for x in b:s|={y^x for y in s} + m=0 + for y in s:m|=1< L_i not subset cap_j (given L_j subset cap_j; join subset iff both) +adj=[set() for _ in range(N)] +ne=0 +for a in range(N): + for b in range(a+1,N): + if Lm[a] & ~Cm[b]: + adj[a].add(b);adj[b].add(a);ne+=1 +print('edges',ne,'of',N*(N-1)//2) +pickle.dump((Y,adj),open('graph.pkl','wb')) diff --git a/research/end-cap-obstruction/cards/B251/inc.py b/research/end-cap-obstruction/cards/B251/inc.py new file mode 100644 index 0000000000..9f98b8d7a3 --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/inc.py @@ -0,0 +1,35 @@ +import sys,pickle,collections +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from ev import * +res=pickle.load(open('resp.pkl','rb'));Yev=pickle.load(open('yevp.pkl','rb')) +Y,adj=pickle.load(open('graph.pkl','rb')) +Ls=build_events()[1] +def members(b): + s={0} + for x in b:s|={y^x for y in s} + m=0 + for y in s:m|=1<2 else 2 +tl=float(sys.argv[3]) if len(sys.argv)>3 else 100 +idx=[i for i,x in enumerate(inc) if which=='all' or x['nh']==0] +def compat(a,b): + if inc[a]['last']=224 else 'Y' if c>=112 else 'src') for i in sel for c in inc[i]['car'])) diff --git a/research/end-cap-obstruction/cards/B251/proj.py b/research/end-cap-obstruction/cards/B251/proj.py new file mode 100644 index 0000000000..108d19d5ea --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/proj.py @@ -0,0 +1,57 @@ +import sys,pickle,collections,time +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from ev import * +P=(1<<61)-1 +KEEP=set(range(224))|set(w['centers']) +rows=[{k:1} for k in range(n)] +def norm(r): + r={k:x for k,x in r.items() if k in KEEP} + if not r:return () + k0=min(r);inv=pow(r[k0],P-2,P) + return tuple(sorted((k,x*inv%P) for k,x in r.items())) +key=[norm(r) for r in rows] +holders=collections.defaultdict(set) +for q in range(n):holders[key[q]].add(q) +Yev=[] +def setrow(q,r): + holders[key[q]].discard(q) + rows[q]=r;key[q]=norm(r);holders[key[q]].add(q) +for idx,(tag,e) in enumerate(prog): + if e[0]=='scale': + q=e[1];f=e[2]*pow(e[3],P-2,P)%P + setrow(q,{k:x*f%P for k,x in rows[q].items()});continue + t,s=e[1],e[2];num=e[3]*pow(e[4],P-2,P)%P + if tag[0]=='B' and 112<=t<224: + Yev.append((idx,tag,e,key[s],frozenset(r for r in holders[key[s]] if r<224 or r in KEEP))) + r=dict(rows[t]) + for k,x in rows[s].items(): + a=(r.get(k,0)+num*x)%P + if a:r[k]=a + else:r.pop(k,None) + setrow(t,r) +pickle.dump(Yev,open('yevp.pkl','wb')) +Y,adj=pickle.load(open('graph.pkl','rb')) +byk=collections.defaultdict(list) +for a,(idx,tag,e,k,h) in enumerate(Yev):byk[k].append(a) +print('proj classes',len(byk),'zero-class events',len(byk.get((),[]))) +print(collections.Counter((len(v),len({Yev[a][2][2] for a in v})) for v in byk.values())) +def dsat(nodes): + col={};sat={u:set() for u in nodes} + for _ in nodes: + v=max((u for u in nodes if u not in col),key=lambda u:(len(sat[u]),len(adj[u]))) + c=0 + while c in sat[v]:c+=1 + col[v]=c + for u in adj[v]: + if u in sat:sat[u].add(c) + return col +res=[] +for k,ev in byk.items(): + col=dsat(ev);chi=max(col.values())+1 + nh=set() + for a in ev:nh|=set(Yev[a][4]) + carriers={Yev[a][2][2] for a in ev} + res.append((k,ev,col,chi,nh,carriers)) +print('chi hist',collections.Counter(r[3] for r in res if r[0]!=())) +print('sum chi',sum(r[3] for r in res if r[0]!=()),'sum carriers used',sum(len(r[5]) for r in res if r[0]!=())) +pickle.dump([(r[0],r[1],r[2],r[3],r[4],r[5]) for r in res],open('resp.pkl','wb')) diff --git a/research/end-cap-obstruction/cards/B251/vals.py b/research/end-cap-obstruction/cards/B251/vals.py new file mode 100644 index 0000000000..7146533f60 --- /dev/null +++ b/research/end-cap-obstruction/cards/B251/vals.py @@ -0,0 +1,32 @@ +import sys,pickle,collections,time +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B251') +from ev import * +P=(1<<61)-1 +rows=[{k:1} for k in range(n)] +def norm(r): + if not r:return () + k0=min(r);inv=pow(r[k0],P-2,P) + return tuple(sorted((k,x*inv%P) for k,x in r.items())) +key=[norm(r) for r in rows] +holders=collections.defaultdict(set) +for q in range(n):holders[key[q]].add(q) +Yev=[] # (op idx, tag, e, carrier key, holders snapshot(set copy)) +t0=time.time() +def setrow(q,r): + holders[key[q]].discard(q) + rows[q]=r;key[q]=norm(r);holders[key[q]].add(q) +for idx,(tag,e) in enumerate(prog): + if e[0]=='scale': + q=e[1];f=e[2]*pow(e[3],P-2,P)%P + r={k:x*f%P for k,x in rows[q].items()};setrow(q,r);continue + t,s=e[1],e[2];num=e[3]*pow(e[4],P-2,P)%P + if tag[0]=='B' and 112<=t<224: + Yev.append((idx,tag,e,key[s],frozenset(holders[key[s]]))) + r=dict(rows[t]) + for k,x in rows[s].items(): + a=(r.get(k,0)+num*x)%P + if a:r[k]=a + else:r.pop(k,None) + setrow(t,r) +print(len(Yev),time.time()-t0) +pickle.dump(Yev,open('yev.pkl','wb')) diff --git a/research/end-cap-obstruction/cards/B252/cgx_y.py b/research/end-cap-obstruction/cards/B252/cgx_y.py new file mode 100644 index 0000000000..0bca3d6047 --- /dev/null +++ b/research/end-cap-obstruction/cards/B252/cgx_y.py @@ -0,0 +1,671 @@ +# LeaverSAT: no-helper mutable-leaver all-K cells (coded triangles) on the no-triangle word. Generated by +# LeaverSAT/mkpkg.py from construction/notri/cgx.py with the leaver edits (lv.leaver_source); Apache-2.0. +import json as _lj, os as _lo, sys as _ls +from fractions import Fraction as _lF +CODED_CELLS=[(c['bindings'],[[t,s,_lF(q)] for t,s,q in c['scaled']]) for c in _lj.load(open(_lo.path.join(_lo.path.dirname(_lo.path.abspath(_ls.argv[3])),'CODED-CELLS.json')))] +# Round20 early-coordinate-center / own-Y variant, prepared for icekylinx +# with OpenAI Codex assistance. Apache-2.0. Scalar elementary-operation +# helpers below are retained from the attributed PR514 construct_partial.py. +# Adapted by OpenAI Codex for isolated structural research. +# Modified from PR425 by icekylinx with Codex assistance. +"""Full discovery word for Hamming packets with borrowed X and Y registers. + +This changes the scalar architecture. It is not accepted by the old restricted +gx interface: source bases may change until full-frame cleanup, and targets use +an explicitly inverted output basis. No supplier admission is asserted. +""" +import copy,gzip,json,math,time +import itertools as it +from collections import Counter,defaultdict +from fractions import Fraction as Q +from pathlib import Path + +import sys +INPUT=Path(sys.argv[1]);OUT=Path(sys.argv[2]);OUT.mkdir(parents=True,exist_ok=False);D=json.loads((INPUT/'PROTOTYPE.json').read_text()) +P=D['binary_ports'];R=D['root_lines'];v=120;h=9 +modules=json.load(gzip.open(INPUT/'PACKET-PROGRAMS.json.gz')) +# AtomScout: leaver-read K-triangles (schedule from atom1.py / rog.py CP-SAT) +TRI=json.loads(Path(sys.argv[3]).read_text()) +FULLT={(tuple(tr['p']),tr['e']) for tr in TRI['triangles']} +TRI_COORDS={t+8 for tr in TRI['triangles'] for t,_,_ in tr['reads']} +import os as _o +COPYL=json.loads(open(_o.environ['XPARAM']).read()).get('copyl',[]) if _o.environ.get('XPARAM') else [] +NH=504-3*len(FULLT)+len(COPYL) + +def basis(vectors): + b={} + for x in vectors: + for p in sorted(b,reverse=True): + if x>>p&1:x^=b[p] + if x: + p=x.bit_length()-1 + for q in b: + if b[q]>>p&1:b[q]^=x + b[p]=x + return tuple(b[p] for p in sorted(b,reverse=True)) +def inside(a,b):return basis(a+b)==b +def hyper(p):return basis([x for x in range(1,512) if (x&p).bit_count()%2==0]) +FULL=basis([1<=v,r)) + for col,s in enumerate(ids): + k=next(i for i in range(col,len(regs)) if rows[regs[i]].get(s,Q(0))) + swap(regs[k],regs[col],F) + scale(regs[col],1/rows[regs[col]][s],F) + for i in range(len(regs)): + if i!=col and rows[regs[i]].get(s,Q(0)):add(regs[i],regs[col],-rows[regs[i]][s],F) + assert all(rows[regs[i]]=={s:Q(1)} for i,s in enumerate(ids)) + M=[[Q(R[s][i]) for s in ids] for i in c] + def qr_rank(rs): + bs={} + for r in rs: + r=r.copy() + for i,b in sorted(bs.items()): + if r[i]:q=r[i];r=[x-q*y for x,y in zip(r,b)] + i=next((i for i,x in enumerate(r) if x),None) + if i is not None:q=r[i];bs[i]=[x/q for x in r] + return len(bs) + assert qr_rank(M)==4 + for rr0 in PRIO.get(",".join(map(str,c)),[])+PRIORITY[",".join(map(str,c))]["rows"]: + rr=list(map(Q,rr0)) + if qr_rank(M+[rr])>len(M):M.append(rr) + if len(M)==8:break + for i in range(8): + if len(M)==8:break + rr=[Q(i==j) for j in range(8)] + if qr_rank(M+[rr])>len(M):M.append(rr) + if len(M)==8:break + assert len(M)==8 + linear(regs,M,F) + for i,r in zip(c,regs): + assert rows[r]=={s:Q(R[s][i]) for s in ids} + block_totals[c,i]=r + +# All centers are complete while Y is still at zero. This is the crucial +# difference from an illegal early-own-Y prefix using the old center order. +centers=[] +for i in range(8): + regs=[block_totals[c,i] for c in sorted(blocks) if i in c] + F=hyper(P[frame[i]]);a=regs[0] + for b in regs[1:]:add(a,b,1,F) + centers.append(a) +centers += [frame[i] for i in range(8)] +center_frames=[cur[r] for r in centers] +assert list(map(len,center_frames))==[8]*8+[1]*8 +assert all(cur[v+t]==() for t in range(v)) + +phase=B +# candidate cold-first packets: selected key at both consumers, deterministic enumeration +_ORD=sorted(blocks,key=lambda c:(0 if c in ((0,1,2,3),(4,5,6,7)) and _oo.environ.get('STAG')=='1' else 1,c));_RK={c:i for i,c in enumerate(_ORD)} +_req=defaultdict(list) +for _pr in pairs: + if _pr['selected']: + _req[_pr['keys'][0]].append(_pr['targets'][0]);_req[_pr['keys'][1]].append(_pr['targets'][1]) +for _c0 in sorted(blocks): + for _p in it.combinations(_c0,2): + for _e in (-1,1): + if (_p,_e) in FULLT:continue + _cons=sorted(d for d in blocks if d!=_c0 and set(_p)<=set(d)) + if all((d,_p,_e) in _req for d in _cons): + if all(_RK[d]>_RK[_c0] for d in _cons):CFL.append((_c0,_p,_e,tuple(_cons))) +_NSS=len(CFL) +for _c0 in sorted(blocks): + for _p in it.combinations(_c0,2): + for _e in (-1,1): + if (_p,_e) in FULLT:continue + _cons=sorted(d for d in blocks if d!=_c0 and set(_p)<=set(d)) + _S=[d for d in _cons if (d,_p,_e) in _req] + if _S and len(_S)_RK[_c0] for d in _S):CFL.append((_c0,_p,_e,tuple(_S))) +print('CFL SS',_NSS,'total',len(CFL)) +CF=[CFL[i] for i in sorted(CFSEL)] +ROL=[] +for _c0 in sorted(blocks): + for _p in it.combinations(_c0,2): + for _e in (-1,1): + if (_p,_e) in FULLT:continue + _cons=sorted(d for d in blocks if d!=_c0 and set(_p)<=set(d)) + def _ro(d2): + if (d2,_p,_e) in _req:return True + snd=sorted(x for x in blocks if x!=d2 and set(_p)<=set(x)) + return _c0!=snd[0] + if all(_ro(d2) for d2 in _cons):ROL.append((_c0,_p,_e,tuple(_cons),tuple(('S' if (d2,_p,_e) in _req else 'M') for d2 in _cons))) +_rv=_oo.environ.get('RO',''); +if _rv=='all':ROSEL=set(range(len(ROL))) +elif _rv=='nocf':ROSEL={i for i,x in enumerate(ROL) if x[:3] not in {y[:3] for y in CFL}} +elif _rv:ROSEL=set(map(int,_rv.split(','))) +else:ROSEL=set() +ROP={ROL[i][:3] for i in ROSEL} +WRP=set();WREDGE=[] +_wrc=_oo.environ.get('WRC','') +if _wrc: + _wr_idx=_oo.environ.get('WR','all') + _n=0 + for _c0 in sorted(blocks): + for _p in it.combinations(_c0,2): + for _e in (-1,1): + if (_p,_e) in FULLT:continue + _cons=sorted(d for d in blocks if d!=_c0 and set(_p)<=set(d)) + _rl=[] + for d2 in _cons: + if (d2,_p,_e) in _req:_rl.append('S') + else: + snd=sorted(x for x in blocks if x!=d2 and set(_p)<=set(x));_rl.append('W' if _c0==snd[0] else 'r') + _rs=''.join(_rl) + if _rs in _wrc.split(',') or _rs[::-1] in _wrc.split(','): + if _wr_idx=='all' or _n in set(map(int,_wr_idx.split(','))): + WRP.add((_c0,_p,_e)) + iw=_rl.index('W');io=1-iw + WREDGE.append(((_cons[io],_p,_e),(_cons[iw],_p,_e),_rs,_cons[io])) + _n+=1 + print('WRP',len(WRP),'of',_n,'classes',_wrc) +print('ROL',len(ROL),'ROSEL',len(ROSEL));_oo.environ.get('SHOWROL') and print('ROLLIST',[(i,x[0],x[1],x[2],x[4],x[:3] in {y[:3] for y in CFL}) for i,x in enumerate(ROL)]) + +if _oo.environ.get('ROLES'): + import collections as _cc + cnt=_cc.Counter();edges=[];ALLK=[] + for _c0 in sorted(blocks): + for _p in it.combinations(_c0,2): + for _e in (-1,1): + if (_p,_e) in FULLT:continue + _cons=sorted(d for d in blocks if d!=_c0 and set(_p)<=set(d)) + rl=[] + for d2 in _cons: + if (d2,_p,_e) in _req:rl.append('S') + else: + snd=sorted(x for x in blocks if x!=d2 and set(_p)<=set(x));rl.append('W' if _c0==snd[0] else 'r') + cnt[''.join(rl)]+=1;ALLK.append((_c0,_p,_e,tuple(_cons),''.join(rl))) + print('ROLES',dict(cnt),len(ALLK)) + print('ALLK',ALLK) +CFP={(c0,p,e) for c0,p,e,d in CF} +CFD=defaultdict(list) +for c0,p,e,ds in CF: + for d in ds:CFD[d].append((c0,p,e)) +_deferred_blocks={d for d in CFD} +_tblk={} +for _c,_z in blocks.items(): + for _s in _z['receipt']['source_lines']:_tblk[_s]=_c +for t,(r,coef,F) in sorted(own_rows.items()): + if t in TRI_COORDS:continue + if _tblk.get(t) in _deferred_blocks or t in DEFT:DEFER[t]=(r,coef,F);continue + assert cur[r]==F + add(v+t,r,coef,F) +# requests are needed for TRI coefficients +requests=defaultdict(list) +for pid,pair in enumerate(pairs): + if not pair['selected']:continue + (t,u),(key1,key2),mat=pair['targets'],pair['keys'],pair['matrix'] + requests[key1].append((t,-Q(mat[0][0],2))) + requests[key2].append((u,-Q(mat[0][1],2))) +reqcoef={t:(key,coef) for key,reqs in requests.items() for t,coef in reqs} +def face_info(c,p,eps): + z=blocks[c];keys=[(pp,ee) for pp in it.combinations(c,2) for ee in (-1,1)] + r_local,alpha=z['outputs'][keys.index((p,eps))] + j=[j for j in range(40,len(z['events'])) if z['events'][j][0]==r_local];assert len(j)==1 + return j[0],Q(alpha) +tri_join_counts=Counter() +coded_shadow_slot={} +coded_target_edges=[];TRILOG=[] +lcopy={} +for s8 in COPYL: + r=s8+8;c=len(cur);cur.append(());rows.append({});shadow.append(None);add(c,r,1,cur[r]);lcopy[r]=c +BF={c:basis([P[x] for x in z['receipt']['source_lines']]) for c,z in blocks.items()} +HYB={(tuple(map(int,h[0])),tuple(map(int,h[1])),int(h[2])) for h in XP.get('hyb',[])} +HYBLOG=[] +def triread(t,blk,r,q): + F=basis(cur[v+t]+cur[r]);assert inside(F,hyper(P[t])),('TRI frame',t,blk,r,cur[v+t],cur[r],hyper(P[t]),[x for x in TRILOG if x[2]==r],HYBLOG) + tri_join_counts[len(F)]+=1;add(v+t,r,q,F);TRILOG.append([t,list(blk),r,str(q),list(F),list(cur[r])]) +for tr in TRI['triangles']: + if tr.get('coded'): + bindings={} + for name,binding in CODED_CELLS[tr['cell']][0].items(): + bindings[name]=maps[tuple(binding[1])][binding[2]] if binding[0]=='source' else v+binding[1] + for tn,sn,q in CODED_CELLS[tr['cell']][1]: + target,source=bindings[tn],bindings[sn] + F=basis(cur[target]+cur[source]) + for register in (target,source): + if v<=register<2*v:assert inside(F,hyper(P[register-v])),('coded frame',register,F) + add(target,source,q,F) + if sn.startswith('y'):coded_target_edges.append((target,source,Q(q))) + continue + p,eps=tuple(tr['p']),tr['e'] + hb={blk for _,blk,_ in map(lambda x:(x[0],tuple(x[1]),x[2]),tr['reads']) if (blk,p,eps) in HYB} + own=[];rest=[] + for t8,blk,loc in tr['reads']: + t=t8+8;blk=tuple(blk);r=maps[blk][loc];r0=r;r=lcopy.get(r,r) + key,coef=reqcoef[t];assert key[1]==p and key[2]==eps,(key,p,eps) + if blk==key[0]: + rr,c0,F0=own_rows[t];assert rr==r0;own.append((t,blk,r,c0)) + else: + j,alpha=face_info(blk,p,eps);ev=blocks[blk]['events'][j];assert loc in ev[:2] + rest.append((t,blk,loc,r,coef*alpha)) + if not hb: + # original interleaved order + for t8,blk,loc in tr['reads']: + t=t8+8;blk=tuple(blk);r=maps[blk][loc];key,coef=reqcoef[t] + if blk==key[0]:q=own_rows[t][1] + else:j,alpha=face_info(blk,p,eps);q=coef*alpha + triread(t,blk,r,q) + continue + items=[] # (kind, t, reg, q, blk) + for t,blk,r,q in own:items.append(('r',t,r,q,blk,blk in hb)) + for blk in sorted(hb):items.append(('e',None,None,None,blk,True)) + done=set() + for t,blk,loc,r,q in rest: + if blk in hb: + j,_=face_info(blk,p,eps);ev=blocks[blk]['events'][j] + ws=[x for x in rest if x[0]==t and x[1]==blk];assert len(ws)==2 and ws[0][4]==ws[1][4] and {ws[0][2],ws[1][2]}==set(ev[:2]) + if (t,blk) in done:continue + done.add((t,blk));items.append(('m',t,maps[blk][ev[0]],q,blk,True)) + else:items.append(('r',t,r,q,blk,False)) + # Original read order with the two half reads collapsed into one M read at the first half's slot; the face event goes + # just before the first M read of its block; own reads of the M register are hoisted ahead of that event. + def evinfo(blk): + j,_=face_info(blk,p,eps);ev=blocks[blk]['events'][j];assert ev[2]==ev[3]==1,ev + mpb=maps[blk];return mpb[ev[0]],mpb[ev[1]],tuple(blocks[blk]['event_frames'][j]) + items=[] + seen=set() + for t8,blk,loc in tr['reads']: + t=t8+8;blk=tuple(blk);r=maps[blk][loc];key,coef=reqcoef[t] + if blk==key[0]:items.append(('r',t,r,own_rows[t][1],blk,blk in hb)) + else: + j,alpha=face_info(blk,p,eps);q=coef*alpha + if blk in hb: + if (t,blk) not in seen:seen.add((t,blk));continue + items.append(('m',t,evinfo(blk)[0],q,blk,True)) + else:items.append(('r',t,r,q,blk,False)) + for blk in sorted(hb): + k0=min(i for i,x in enumerate(items) if x[0]=='m' and x[4]==blk) + items.insert(k0,('e',None,None,None,blk,True)) + n=len(items) + def step(it,st): + k,t,r,q,blk,h=it;g=lambda x:st.get(x,cur[x]) + if k=='e': + a_,b_,EF=evinfo(blk);FF=basis(list(EF)+list(g(a_))+list(g(b_))) + return {a_:FF,b_:FF} if inside(FF,BF[blk]) else None + F=basis(list(g(v+t))+list(g(r))) + if not inside(F,hyper(P[t])):return None + if h and k=='r' and r==evinfo(blk)[1] and not inside(F,BF[blk]):return None + return {v+t:F,r:F} + def allowed(i,used): + k,t,r,q,blk,h=items[i] + evi=[j for j,x in enumerate(items) if x[0]=='e' and x[4]==blk] if h else [] + if k=='e':return all(j in used for j,x in enumerate(items) if x[0]=='r' and x[4]==blk and x[5] and x[2]==evinfo(blk)[0]) + if k=='m':return evi[0] in used + if k=='r' and h and r==evinfo(blk)[0]:return evi[0] not in used + return True + budget=[int(os.environ.get('HYBBUDGET','300000'))];memo=set() + def dfs(st,used,order): + if len(order)==n:return order + budget[0]-=1 + if budget[0]<0:return None + sig=(used,tuple(sorted(st.items()))) + if sig in memo:return None + memo.add(sig) + for i in range(n): + if i in used or not allowed(i,used):continue + d=step(items[i],st) + if d is None:continue + ns=dict(st);ns.update(d);res=dfs(ns,used|{i},order+[i]) + if res:return res + return None + import sys as _s;_s.setrecursionlimit(20000) + order=dfs({},frozenset(),[]) + assert order,('no feasible hybrid order',p,eps,sorted(hb),budget) + for i in order: + k,t,r,q,blk,h=items[i] + if k=='e': + a_,b_,EF=evinfo(blk);FF=basis(list(EF)+list(cur[a_])+list(cur[b_]));add(a_,b_,1,FF);HYBLOG.append([list(blk),list(p),eps,list(FF)]) + else:triread(t,blk,r,q) + +packets={};CFREG={};WIDEN=[] +for c in _ORD: + z=blocks[c] + mp=maps[c] + keys=[(p,eps) for p in it.combinations(c,2) for eps in (-1,1)] + skipev={face_info(c,p,eps)[0] for p,eps in keys if (p,eps) in FULLT} + for (c0,p0,e0) in CFD.get(c,[]): + reg,alpha0=CFREG[(c0,p0,e0)] + for tt,cf in requests[(c,p0,e0)]: + print('COLDDBG',tt,'y',len(cur[v+tt]),'P',len(cur[reg]),'inTRI',tt in TRI_COORDS) + add(v+tt,reg,cf*alpha0,basis(list(cur[v+tt])+list(cur[reg])));CFDONE.add((tt,reg)) + for t in sorted(DEFER): + if _tblk[t]==c and not POST: + r_,coef_,F_=DEFER[t];F2=basis(list(cur[v+t])+list(cur[r_]));assert inside(F2,hyper(P[t])),('cf ownrow cap',t) + add(v+t,r_,coef_,F2) + for j,(e,F) in enumerate(list(zip(z['events'],z['event_frames']))[40:]): + if j not in early[c] and 40+j not in skipev: + t,s,a,b=e + FF=basis(list(F)+list(cur[mp[t]])+list(cur[mp[s]])) if LAZY else tuple(F) + if FF!=basis(list(F)):WIDEN.append((c,j,len(F),len(FF))) + add(mp[t],mp[s],Q(a,b),FF) + for t in sorted(DEFER): + if _tblk[t]==c and POST: + r_,coef_,F_=DEFER[t];F2=basis(list(cur[v+t])+list(cur[r_])) + if not inside(F2,hyper(P[t])):print('POSTFAIL',t,c,len(cur[v+t]),len(cur[r_]),len(F2));raise SystemExit(3) + if len(F2)!=len(cur[r_]):print('POSTLIFT',t,len(cur[r_]),len(F2)) + add(v+t,r_,coef_,F2) + for key,(r,alpha) in zip(keys,z['outputs']): + if tuple(key) in FULLT:skip();continue + if ((c,)+tuple(key) in ROP or (c,)+tuple(key) in WRP) and (c,)+tuple(key) not in CFP: + a=mp[r];b=a;skip() + elif (c,)+tuple(key) in CFP: + a=mp[r];b=a;skip();CFREG[(c,)+tuple(key)]=(a,Q(alpha)) + else:a=mp[r];b=alloc();add(b,a,1,cur[a]) + consumers=sorted(d for d in blocks if d!=c and set(key[0])<=set(d)) + assert len(consumers)==2 + for target,r in zip(consumers,(a,b)):packets[c,key[0],key[1],target]=(r,Q(alpha)) + +# Both tetrahedra use the same partition. A selected key has exactly two +# selected Y loads and no ordinary M consumer. Supply its two raw halves in +# opposite orders and never form that M. Other keys retain the old M path. +second=[];first_join_counts=Counter() +for key,reqs in sorted(requests.items()): + assert len(reqs)==2 + c,p,eps=key + if (p,eps) in FULLT:continue + ds=sorted(d for d in blocks if d!=c and set(p)<=set(d));a,b=ds + for j,(target,coef) in enumerate(sorted(reqs)): + first_source,second_source=(a,b) if j==0 else (b,a) + r,alpha=packets[first_source,p,eps,second_source] + if target in (45,44,20,21):print('FIRSTDBG',target,len(cur[v+target]),r,len(cur[r])) + if (target,r) not in CFDONE: + F=basis(cur[v+target]+cur[r]);assert inside(F,hyper(P[target])),('first',target) + first_join_counts[len(F)]+=1;add(v+target,r,coef*alpha,F) + r,alpha=packets[second_source,p,eps,c] + second.append((target,r,coef*alpha)) + +Ms={};RAWF={} +_mg=[(c,p,eps) for c in sorted(blocks) for p in it.combinations(c,2) for eps in (-1,1) if (c,p,eps) not in requests and (p,eps) not in FULLT] +_pred=defaultdict(set) +for (m1,m2,_rs,_) in WREDGE: + if _rs.count('S')==0 and m1 in _mg and m2 in _mg:_pred[m2].add(m1) +_done=set();_ordm=[] +while len(_ordm)=2*V else ()) +first={} +for part in 'AB': + for i,e in enumerate(w[part]): + F=G.basis(e[-1]);rr=[e[1]]+([e[2]] if e[0]=='add' else []) + for r in rr: + nf=G.basis(list(cur[r])+list(F)) + if r in range(V,2*V) and r not in first and G.basis(list(nf)+list(G.perp(P[r-V])))!=G.perp(P[r-V]): first[r]=(part,i,e[:3]) + cur[r]=nf +bad=[r for r in range(V,2*V) if G.basis(list(cur[r])+list(G.perp(P[r-V])))!=G.perp(P[r-V])] +print('final cap violators',bad) +for r in bad: print(r,first.get(r)) diff --git a/research/end-cap-obstruction/cards/B253/prof.py b/research/end-cap-obstruction/cards/B253/prof.py new file mode 100644 index 0000000000..35ca7ab72e --- /dev/null +++ b/research/end-cap-obstruction/cards/B253/prof.py @@ -0,0 +1,8 @@ +import gzip,json,sys +GK=__import__('os').environ['EO_ROOT']+'/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk' +sys.path.insert(0,GK) +import gk_word as G,gk_common as C +G.V=C.V=112 +w=json.loads(gzip.decompress(open(sys.argv[1],'rb').read())) +try: print(dict(sorted(G.profile(w).items()))) +except AssertionError as e: print('FAIL',e) diff --git a/research/end-cap-obstruction/cards/B253/trace.py b/research/end-cap-obstruction/cards/B253/trace.py new file mode 100644 index 0000000000..d675fc2331 --- /dev/null +++ b/research/end-cap-obstruction/cards/B253/trace.py @@ -0,0 +1,21 @@ +import gzip,json,sys,os +GK=__import__('os').environ['EO_ROOT']+'/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk' +sys.path.insert(0,GK) +import gk_word as G,gk_common as C +G.V=C.V=112 +w=json.loads(gzip.decompress(open(sys.argv[1],'rb').read())) +watch=[int(x) for x in sys.argv[2].split(',')] +V=112;R=w['report']['R'];n=2*V+R;P=w['ports'] +cur={} +for r in range(n): cur[r]=(P[r],) if r=2*V else ()) +tgt=G.perp(P[watch[0]-V]) if V<=watch[0]<2*V else None +print('target',tgt) +for part in 'AB': + for i,e in enumerate(w[part]): + F=G.basis(e[-1]) + rr=[e[1]]+([e[2]] if e[0]=='add' else []) + if any(r in watch for r in rr): + print(part,i,e[:-1],'dim',len(F),'cur',[len(cur[r]) for r in rr], 'inperp' , [G.basis(list(F)+list(tgt))==tgt for _ in [0]] if tgt else '') + for r in rr: + if tuple(cur[r])!=tuple(F) and G.basis(list(cur[r])+list(F))==F: cur[r]=F + elif tuple(cur[r])!=tuple(F): print(' VIOL',part,i,r) diff --git a/research/end-cap-obstruction/cards/B254/joint.py b/research/end-cap-obstruction/cards/B254/joint.py new file mode 100644 index 0000000000..2a172b7a17 --- /dev/null +++ b/research/end-cap-obstruction/cards/B254/joint.py @@ -0,0 +1,11 @@ +import pickle +from sim import * +import closure as C +S=pickle.load(open('S161.pkl','rb'));ok=pickle.load(open('ok161.pkl','rb')) +for name,hs in (('all65',ok),('Brelay53',[h for h in ok if len(end[h])>0 and (h in S) and len(prog)>0 and h not in (408,412,424,428,546,547,548,549,558,560,568,570)]),): + P=prog;rem=[] + for h in hs: + P2,_=C.remove(P,h) + if P2 is None:print('bail',h);continue + P=P2;rem.append(h) + print(name,len(rem),simulate(P,removed=set(rem))[:2]) diff --git a/research/end-cap-obstruction/cards/B254/ops.py b/research/end-cap-obstruction/cards/B254/ops.py new file mode 100644 index 0000000000..8f580715bb --- /dev/null +++ b/research/end-cap-obstruction/cards/B254/ops.py @@ -0,0 +1,9 @@ +import sys +from feas import * +for h in map(int,sys.argv[1:]): + print('== h',h,'start',len(start[h]),'end',len(end[h]),'inComp',h in compH) + for idx,(tag,e) in enumerate(prog): + if e[0]=='scale': + if e[1]==h:print(' ',tag,'scale',e[2:4]) + elif h in e[1:3]: + print(' ',tag,('h+= %s*r%d'%(e[3:5],e[2]) if e[1]==h else 'r%d+= %s*h'%(e[1],e[3:5])),'frame dim',len(B(e[-1])) if tag[0] not in 'PCL' else '-') diff --git a/research/end-cap-obstruction/cards/B254/rm161.py b/research/end-cap-obstruction/cards/B254/rm161.py new file mode 100644 index 0000000000..5dbbadf69d --- /dev/null +++ b/research/end-cap-obstruction/cards/B254/rm161.py @@ -0,0 +1,14 @@ +import pickle,collections +from feas import * +S=pickle.load(open('S161.pkl','rb')) +def lay(h): + return ('cold0' if len(start[h])==0 else 'enter%d'%len(start[h]))+('/endFULL' if end[h]==FULLB else '/endU') +res=collections.Counter();ok=[] +for h in S: + st,r=track(h) + k=st.split('@')[0] + res[(lay(h),k,h in compH)]+=1 + if st=='ok':ok.append(h) +for k,n in sorted(res.items()):print(n,k) +print('algebra-ok',len(ok),ok) +pickle.dump(ok,open('ok161.pkl','wb')) diff --git a/research/end-cap-obstruction/cards/B254/roles2.py b/research/end-cap-obstruction/cards/B254/roles2.py new file mode 100644 index 0000000000..6f61cb39b0 --- /dev/null +++ b/research/end-cap-obstruction/cards/B254/roles2.py @@ -0,0 +1,25 @@ +import pickle,collections +from feas import * +S=pickle.load(open('S161.pkl','rb'));ok=set(pickle.load(open('ok161.pkl','rb'))) +def lay(h): + return ('cold0' if len(start[h])==0 else 'enter%d'%len(start[h]))+('/endFULL' if end[h]==FULLB else '/endU') +c=collections.Counter();ex={} +for h in S: + bw=br=C=asc=ar=aw=0;nB=0 + for idx,(tag,e) in enumerate(prog): + if e[0]=='scale': + if e[1]==h and tag[0]=='A':asc=1 + continue + if h in e[1:3]: + t=tag[0] + if t=='C':C=1 + if t=='B': + nB+=1 + if e[1]==h:bw=1 + else:br=1 + if t=='A' and e[1]==h:aw=1 + # A-phase "real" (non-gauge) activity: A write by h counts + role=('Cglue' if C else 'Brelay' if (bw and br) else 'other')+('+Arot' if asc else '')+('+Awr' if aw else '') + k=(lay(h),role,'algOK' if h in ok else 'rotlock') + c[k]+=1;ex.setdefault(k,h) +for k,n in sorted(c.items()):print(n,k,'ex',ex[k]) diff --git a/research/end-cap-obstruction/cards/B254/set161.py b/research/end-cap-obstruction/cards/B254/set161.py new file mode 100644 index 0000000000..1c0504cc17 --- /dev/null +++ b/research/end-cap-obstruction/cards/B254/set161.py @@ -0,0 +1,13 @@ +import sys,collections,pickle +from feas import * +inc=pickle.load(open('inc.pkl','rb'));Yev=pickle.load(open('yevp.pkl','rb')) +H=[h for h in range(224,704) if h not in set(w['centers'])] +used=set() +for i in inc: + for c in i['car']: + if c>=224:used.add(c) +for idx,tag,e,k,hh in Yev: + if e[2]>=224:used.add(e[2]) +S=[h for h in H if h not in used] +print(len(S)) +pickle.dump(S,open('S161.pkl','wb')) diff --git a/research/end-cap-obstruction/cards/B254/sim161.py b/research/end-cap-obstruction/cards/B254/sim161.py new file mode 100644 index 0000000000..a0c545552b --- /dev/null +++ b/research/end-cap-obstruction/cards/B254/sim161.py @@ -0,0 +1,25 @@ +import pickle,collections +from cand import * +import closure as C +S=pickle.load(open('S161.pkl','rb'));ok=pickle.load(open('ok161.pkl','rb')) +def lay(h): + return ('cold0' if len(start[h])==0 else 'enter%d'%len(start[h]))+('/endFULL' if end[h]==FULLB else '/endU') +base=simulate(prog) +print('baseline',base[0],base[3]) +cnt=collections.Counter();feas=[] +for h in ok: + ok1,why,paid,m=simulate(newprog_for([h]),removed={h}) + key=(lay(h),'FEAS' if ok1 else why.split(' reg')[0].split(' ')[0][0]+' '+why.split()[0] ) + cnt[(lay(h),ok1)]+=1 + if ok1:feas.append((h,m)) + else: print(h,lay(h),why) +print(cnt);print('feasible single',feas) +# closures +cc=collections.Counter() +for h in S: + r,why=C.closure(h) + if r is None:cc[why.split()[0]]+=1;continue + P,rem=r;ok1,why2,paid,m=simulate(P,removed=set(rem)) + cc['feas' if ok1 else 'infeas']+=1 + if ok1:print('closure feasible',h,rem,m) +print(cc) diff --git a/research/end-cap-obstruction/cards/B256/cluster.py b/research/end-cap-obstruction/cards/B256/cluster.py new file mode 100644 index 0000000000..95f71ddfcc --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/cluster.py @@ -0,0 +1,27 @@ +from plan import * +import random +w=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz');M=Model(w);P=M.P;NA=len(w['A']) +g0=NA+239 +regs=(124,125,148,149,231,283,281,299,297,591) +cur0={r:M.frame_at(r,g0) for r in regs} +print({r:len(f) for r,f in cur0.items()}) +ops={'r1':(125,231),'r2':(124,231),'r3':(124,283),'r4':(125,281),'a3':(591,283),'a1':(591,281), + 's1':(149,231),'s2':(148,231),'s3':(148,299),'s4':(149,297),'b9':(591,299),'b7':(591,297)} +def run(perm,extra=None): + cur=dict(cur0) + for n in perm: + t,s=ops[n];F=G.basis(list(cur[t])+list(cur[s]));cur[t]=cur[s]=F + return cur +def score(cur): + c=[inperp(cur[124],12,P),inperp(cur[125],13,P),inperp(cur[148],36,P),inperp(cur[149],37,P),inperp(cur[591],58,P)] + return sum(c),c +names=list(ops);random.seed(1);best=0;sols=[] +for it in range(20000): + perm=names[:];random.shuffle(perm) + s,c=score(run(perm)) + if s==5: sols.append(perm) +print(len(sols)); print(sols[:3]) +# identify extra constraint: 591 also in perp(63) +ok63=[p for p in sols if inperp(run(p)[591],63,P)] +print('also perp63',len(ok63)) +import json;json.dump(sols[:200],open('cluster_sols.json','w')) diff --git a/research/end-cap-obstruction/cards/B256/cluster2.py b/research/end-cap-obstruction/cards/B256/cluster2.py new file mode 100644 index 0000000000..f72dd6a318 --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/cluster2.py @@ -0,0 +1,32 @@ +from plan import * +import random,json,sys +w=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz');M=Model(w);P=M.P;NA=len(w['A']) +g0=NA+239 +regs=(124,125,148,149,231,283,281,299,297,591,471,483) +cur0={r:M.frame_at(r,g0) for r in regs} +ops={'r1':(125,231),'r2':(124,231),'r3':(124,283),'r4':(125,281),'a3':(591,283),'a1':(591,281), + 's1':(149,231),'s2':(148,231),'s3':(148,299),'s4':(149,297),'b9':(591,299),'b7':(591,297), + 'W1':(283,281),'W2':(299,297),'e1':(471,283),'e2':(483,299),'q1':(125,299),'q2':(149,283),'W3':(283,299),'z1':(124,483),'z2':(148,471)} +# precedence (a before b) +pre=[('r3','W1'),('a3','W1'),('W1','e1'),('W1','q2'),('e1','W3'),('q2','W3'),('s3','W2'),('b9','W2'),('W2','e2'),('W2','q1'),('W2','W3'),('e2','z1'),('e1','z2'),('W1','W3'),('q1','W3'),('e2','W3')] +# a(591,*) after W? absorption of 283 before W1, 299 before W2 — covered. 297,281 never written. +def run(perm): + cur=dict(cur0) + for n in perm: + t,s=ops[n];F=G.basis(list(cur[t])+list(cur[s]));cur[t]=cur[s]=F + return cur +def score(cur): + return [inperp(cur[124],12,P),inperp(cur[125],13,P),inperp(cur[148],36,P),inperp(cur[149],37,P),inperp(cur[591],58,P),inperp(cur[591],63,P)] +names=list(ops) +def rand_topo(rng): + rem=set(names);out=[] + while rem: + ok=[n for n in rem if not any(b==n and a in rem for a,b in pre)] + n=rng.choice(sorted(ok));out.append(n);rem.remove(n) + return out +rng=random.Random(int(sys.argv[1]) if len(sys.argv)>1 else 1);sols=[];best=0 +for it in range(int(sys.argv[2]) if len(sys.argv)>2 else 5000): + p=rand_topo(rng);c=score(run(p));s=sum(c) + if s>best: best=s;print(best,c,p) + if s==6: sols.append(p) +print('solutions',len(sols));json.dump(sols[:100],open('cluster2_sols.json','w')) diff --git a/research/end-cap-obstruction/cards/B256/dfs.py b/research/end-cap-obstruction/cards/B256/dfs.py new file mode 100644 index 0000000000..0e61642a89 --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/dfs.py @@ -0,0 +1,38 @@ +import sys +sys.argv=[sys.argv[0]] +exec(open('cluster2.py').read().split("names=list(ops)")[0]) +import time,os +TL=float(os.environ.get("TL","100")) +import os +VA=os.environ.get('VA','pre');VB=os.environ.get('VB','pre') +if VA=='post': + for k in ('a3','a1'): del ops[k] + ops['a2']=(591,283); pre.append(('W1','a2')); pre.append(('a2','W3')) +if VB=='post': + for k in ('b9','b7'): del ops[k] + ops['b2']=(591,299); pre.append(('W2','b2')); pre.append(('b2','W3')) +pre[:]=[(a,b) for a,b in pre if a in ops and b in ops] +names=list(ops) +chk=[(124,12),(125,13),(148,36),(149,37),(591,58),(591,63)] +DROP=os.environ.get('DROP') +if DROP: chk=[c for c in chk if c[0]!=int(DROP)] +sys.setrecursionlimit(10000) +seen=set();t0=time.time();found=[];deepest=[0,None] +def ok(cur): return all(inperp(cur[r],t,P) for r,t in chk) +def dfs(rem,cur,path): + if time.time()-t0>TL: return True + if not rem: found.append(list(path));return True + key=(rem,tuple(cur[r] for r in regs)) + key=hash(key) + if key in seen: return False + seen.add(key) + if len(path)>deepest[0]: deepest[0]=len(path);deepest[1]=list(path) + for n in sorted(rem): + if any(b==n and a in rem for a,b in pre): continue + t,s=ops[n];F=G.basis(list(cur[t])+list(cur[s])) + c2=dict(cur);c2[t]=c2[s]=F + if not ok(c2): continue + if dfs(rem-{n},c2,path+[n]): return True + return False +dfs(frozenset(names),dict(cur0),[]) +print('found',found[:1],'deepest',deepest,'seen',len(seen),'time',time.time()-t0) diff --git a/research/end-cap-obstruction/cards/B256/e1.py b/research/end-cap-obstruction/cards/B256/e1.py new file mode 100644 index 0000000000..a9a8b7a88c --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/e1.py @@ -0,0 +1,22 @@ +from vr import * +import sys +W0=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz') +def leafops(dst,row,skip=()): + ops=[] + for j,c in sorted(row.items()): + if j==dst or j in skip: continue + ops.append(['add',dst,j,c.numerator,c.denominator,[]]) + return ops +def e1(pos): + w=copy.deepcopy(W0) + rows=rows_at(w,'B',585) + row=rows[283] # value of 283 read at B585 + ops=leafops(591,row) + assert w['B'][585][:3]==['add',591,283] + del w['B'][585] + w['A'][pos:pos]=ops + return w +if __name__=='__main__': + for pos in (0,473): + w=e1(pos); r,nw=relax(w) + print(pos,'value same',same_value(W0,r),'widened',nw,'caps',caps(r)[0],prof(r)) diff --git a/research/end-cap-obstruction/cards/B256/e2.py b/research/end-cap-obstruction/cards/B256/e2.py new file mode 100644 index 0000000000..02d99cb46c --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/e2.py @@ -0,0 +1,12 @@ +from vr import * +W0=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz') +def fix591(w,posB=245,terms=(283,281,299,297)): + w=copy.deepcopy(w) + assert w['B'][585][:3]==['add',591,283] + del w['B'][585] + for k,u in enumerate(terms): w['B'].insert(posB+k,['add',591,u,1,1,[]]) + return w +if __name__=='__main__': + for pos in (240,245,150,0): + w=fix591(W0,pos); print(pos,'valsame',same_value(W0,w)); r,nw=relax(w) + print(' widened',nw,'caps',caps(r)[0],prof(r)) diff --git a/research/end-cap-obstruction/cards/B256/e6.py b/research/end-cap-obstruction/cards/B256/e6.py new file mode 100644 index 0000000000..d48485dfb8 --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/e6.py @@ -0,0 +1,25 @@ +from vr import * +import itertools,sys +W0=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz') +def build(Q,hoist,terms,dst=591,delidx=585): + """Q: B index where hoisted reads+absorption go; hoist: list of B indices to hoist (original indices); terms: regs absorbed into dst in order""" + w=copy.deepcopy(W0); B=w['B'] + assert B[delidx][:3]==['add',dst,283] + moved=[B[i][:-1]+[None] for i in hoist] + dead=set(hoist)|{delidx} + newB=[] + for i,e in enumerate(B): + if i==Q: newB+= [copy.deepcopy(m) for m in moved]; newB+=[['add',dst,u,1,1,None] for u in terms] + if i in dead: continue + newB.append(e) + w['B']=newB + return w +def evaluate(w,seeds=(591,),verbose=True): + ok=same_value(W0,w) + r,ch,cone=lazy(w,list(seeds)); b,fr=caps(r) + return ok,ch,b,fr,prof(r),r +if __name__=='__main__': + for Q in (0,100,200,239): + w=build(Q,[245,246,271,272],(283,281,299,297)) + ok,ch,b,fr,pr,r=evaluate(w) + print(Q,'value',ok,'changed',ch,'caps',b,pr if not isinstance(pr,dict) else 'PROFILE OK') diff --git a/research/end-cap-obstruction/cards/B256/e7.py b/research/end-cap-obstruction/cards/B256/e7.py new file mode 100644 index 0000000000..df97e551fd --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/e7.py @@ -0,0 +1,26 @@ +from vr import * +import json,sys +W0=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz') +NAMES={'r1':239,'r2':240,'r3':245,'r4':246,'s1':265,'s2':266,'s3':271,'s4':272} +ABS={'a3':283,'a1':281,'b9':299,'b7':297} +def build(perm,Q=239): + w=copy.deepcopy(W0);B=w['B'] + assert B[585][:3]==['add',591,283] + dead={585}|set(NAMES.values()) + blk=[] + for n in perm: + if n in NAMES: blk.append(B[NAMES[n]][:-1]+[None]) + else: blk.append(['add',591,ABS[n],1,1,None]) + newB=[] + for i,e in enumerate(B): + if i==Q: newB+=blk + if i in dead: continue + newB.append(e) + w['B']=newB;return w +if __name__=='__main__': + sols=json.load(open('cluster_sols.json')) + seen=0 + for perm in sols[:int(sys.argv[1])]: + w=build(perm); + r,ch,cone=lazy(w,[591]);b,fr=caps(r);pr=prof(r) + print(perm, 'changed',ch,'caps',b,'OK' if isinstance(pr,dict) else pr[:60]);sys.stdout.flush() diff --git a/research/end-cap-obstruction/cards/B256/leaves.py b/research/end-cap-obstruction/cards/B256/leaves.py new file mode 100644 index 0000000000..05b7f283c2 --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/leaves.py @@ -0,0 +1,26 @@ +from lib import * +import sys +w=load(sys.argv[1] if len(sys.argv)>1 else __import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz');P=w['ports'] +n=2*V+w['report']['R'] +seq=[('A',i,e) for i,e in enumerate(w['A'])]+[('C',i,e) for i,e in enumerate(w['cut'])]+[('B',i,e) for i,e in enumerate(w['B'])] +rows=[{r:Q(1)} for r in range(n)] +# first write / first-drag time per reg wrt target +viol={170:('B',945,591,58),171:('B',929,283,59),174:('B',930,379,62),175:('B',946,598,63)} +firstw={} +for k,(p,i,e) in enumerate(seq): + if p=='C': + G.apply_op(e,rows);firstw.setdefault(e[1],k);continue + t=e[1] + if (p,i)==viol.get(t,(0,0))[:2] if False else False: pass + for y,(pp,ii,s,tg) in viol.items(): + if (p,i)==(pp,ii): + print('y',y,'src',s,'support',len(rows[s]),'leaves:',sorted(rows[s].items())[:0]) + sup=rows[s] + bad=[] + for j in sup: + fw=firstw.get(j,None) + bad.append((j,'unwritten' if fw is None else 'written@%d'%fw)) + from collections import Counter + print(Counter(b[1][:5] for b in bad)); print([b for b in bad if b[1]!='unwritten'][:20]); + print('regkinds',Counter('x' if j<112 else 'y' if j<224 else 'h' for j in sup)) + G.apply_op(e,rows); firstw.setdefault(e[1],k) diff --git a/research/end-cap-obstruction/cards/B256/lib.py b/research/end-cap-obstruction/cards/B256/lib.py new file mode 100644 index 0000000000..03f0897806 --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/lib.py @@ -0,0 +1,18 @@ +import gzip,json,sys,copy +from fractions import Fraction as Q +GK=__import__('os').environ['EO_ROOT']+'/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk' +sys.path.insert(0,GK) +import gk_word as G,gk_common as C +G.V=C.V=112 +V=112 +def load(p): return json.loads(gzip.decompress(open(p,'rb').read())) +def save(w,p): open(p,'wb').write(G.dump(w)) +_pc={} +def inperp(F,t,P): + if P[t] not in _pc: _pc[P[t]]=G.perp(P[t]) + pp=_pc[P[t]]; return G.basis(list(F)+list(pp))==pp +def rows_final(w,order=None): + n=2*V+w['report']['R']; rows=[{r:Q(1)} for r in range(n)] + seq=(order if order is not None else w['A']+w['cut']+w['B']) + for e in seq: G.apply_op(e,rows) + return rows diff --git a/research/end-cap-obstruction/cards/B256/pair.py b/research/end-cap-obstruction/cards/B256/pair.py new file mode 100644 index 0000000000..c48ac7e6bf --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/pair.py @@ -0,0 +1,23 @@ +from plan import * +import itertools +w=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz');M=Model(w);P=M.P;NA=len(w['A']) +g0=NA+239 +cur0={r:M.frame_at(r,g0) for r in (124,125,231,283,281,591)} +print({r:len(f) for r,f in cur0.items()}, {r:[t for t in (12,13,58) if inperp(f,t,P)] for r,f in cur0.items()}) +ops={'r1':(125,231),'r2':(124,231),'r3':(124,283),'r4':(125,281),'a3':(591,283),'a1':(591,281),'W':(283,281)} +# value dependency: W (283+=281) must follow r3,a3 (they read v1) ; r4,a1 read 281 only (never written) any time +before={('r3','W'),('a3','W')} +names=list(ops);good=[] +for perm in itertools.permutations(names): + pos={n:i for i,n in enumerate(perm)} + if any(pos[a]>pos[b] for a,b in before): continue + cur=dict(cur0) + for n in perm: + t,s=ops[n];F=G.basis(list(cur[t])+list(cur[s]));cur[t]=cur[s]=F + ok12=inperp(cur[124],12,P);ok13=inperp(cur[125],13,P);ok58=inperp(cur[591],58,P) + # reads of 231 other users want 231 ⊆ perp36/37: check + ok231=inperp(cur[231],36,P) and inperp(cur[231],37,P) + good.append((ok12,ok13,ok58,ok231,perm)) +import collections +print(collections.Counter(g[:4] for g in good)) +print([g for g in good if all(g[:3])][:5]) diff --git a/research/end-cap-obstruction/cards/B256/plan.py b/research/end-cap-obstruction/cards/B256/plan.py new file mode 100644 index 0000000000..7634d5cd32 --- /dev/null +++ b/research/end-cap-obstruction/cards/B256/plan.py @@ -0,0 +1,55 @@ +from vr import * +import sys +def seqof(w): return [('A',i,e) for i,e in enumerate(w['A'])]+[('B',i,e) for i,e in enumerate(w['B'])] # cut skipped for frames (cut ops have None frames); value ops handled separately +class Model: + def __init__(self,w): + self.w=w;self.P=w['ports'];R=w['report']['R'];n=2*V+R + self.seq=seqof(w) # global index g over A then B + self.n=n + self.writes={} # reg-> list of g (writes: dst of add/scale) + for g,(p,i,e) in enumerate(self.seq): + self.writes.setdefault(e[1],[]).append(g) + # cur frame after each op per register: record drag time wrt perp sets lazily + cur={r:((self.P[r],) if r=2*V else ())) for r in range(n)} + self.hist={r:[(-1,cur[r])] for r in range(n)} + for g,(p,i,e) in enumerate(self.seq): + F=G.basis(e[-1]) + for r in [e[1]]+([e[2]] if e[0]=='add' else []): + nf=G.basis(list(cur[r])+list(F)) + if nf!=cur[r]: self.hist[r].append((g,nf)) + cur[r]=nf + def tdrag(self,u,ts): + """first global idx at which u's frame is not inside perp(P_t) for all t in ts (None=never) ; -1 means from start""" + for g,F in self.hist[u]: + if not all(inperp(F,t,self.P) for t in ts): return g + return None + def frame_at(self,u,g): + F=() + for gg,FF in self.hist[u]: + if gg=2*V else ()) + nw=0 + for part in 'AB': + for e in w[part]: + rr=[e[1]]+([e[2]] if e[0]=='add' else []) + F=G.basis(list(e[-1])+[x for r in rr for x in cur[r]]) + if tuple(F)!=tuple(G.basis(e[-1])): nw+=1 + e[-1]=list(F) + for r in rr: cur[r]=F + return w,nw +def rowsfinal(w): return rows_final(w) +def same_value(w1,w2): + r1=rows_final(w1);r2=rows_final(w2) + return r1==r2 +def rows_at(w,part,idx): + """rows just before op (part,idx)""" + n=2*V+w['report']['R'];rows=[{r:Q(1)} for r in range(n)] + for e in w['A']: + if part=='A' and e is w['A'][idx]: return rows + G.apply_op(e,rows) + for e in w['cut']: G.apply_op(e,rows) + for i,e in enumerate(w['B']): + if part=='B' and i==idx: return rows + G.apply_op(e,rows) + return rows +def caps(w): + P=w['ports'];R=w['report']['R'];n=2*V+R + cur={r:((P[r],) if r=2*V else ())) for r in range(n)} + first={} + for part in 'AB': + for i,e in enumerate(w[part]): + F=G.basis(e[-1]);rr=[e[1]]+([e[2]] if e[0]=='add' else []) + for r in rr: + nf=G.basis(list(cur[r])+list(F)) + if V<=r<2*V and r not in first and not inperp(nf,r-V,P): first[r]=(part,i,e[:3]) + cur[r]=nf + bad=[r for r in range(V,2*V) if not inperp(cur[r],r-V,P)] + return bad,first +def prof(w): + try: return dict(sorted(G.profile(w).items())) + except AssertionError as ex: return 'FAIL '+str(ex)[:150] + +def lazy(w, seeds, startg=0, maxcone=None): + """re-derive lazy-join frames for ops touching the cone (cone grows through shared ops), widening elsewhere. + returns word, #ops changed, cone""" + w=copy.deepcopy(w); R=w['report']['R']; n=2*V+R; P=w['ports'] + cone=set(seeds) + cur={r:((P[r],) if r=2*V else ())) for r in range(n)} + ch=0 + for part in 'AB': + for e in w[part]: + rr=[e[1]]+([e[2]] if e[0]=='add' else []) + need=G.basis([x for r in rr for x in cur[r]]) + if e[-1] is None or any(r in cone for r in rr): + F=need; + cone.update(rr) + else: + F=G.basis(list(e[-1])+list(need)) + if e[-1] is None or tuple(F)!=tuple(G.basis(e[-1])): ch+=1 + e[-1]=list(F) + for r in rr: cur[r]=F + return w,ch,cone diff --git a/research/end-cap-obstruction/cards/B257/cls.py b/research/end-cap-obstruction/cards/B257/cls.py new file mode 100644 index 0000000000..1cde5f1581 --- /dev/null +++ b/research/end-cap-obstruction/cards/B257/cls.py @@ -0,0 +1,21 @@ +from slide import * +import re +c=collections.Counter();why_np=collections.Counter() +for h in range(224,704): + if h in centers or track(h)[0]!='ok':continue + items=build(h) + if items is None:continue + bad=[it for it in items if it[6]>it[7]] + if bad: + it=bad[0];ridx,x,a,widx,s,cc,lo,hi=it + xr=lastread(x,ridx)>widx; sw=nextw(s,widx)1 else 'W' + cls=collections.Counter();passers=[];feas=[] + for h in range(224,704): + if h in centers:continue + st,_=track(h) + if st!='ok':continue + np_,why=hoisted_prog([h],mode) + if np_ is None:cls[why.split('@')[0]]+=1;continue + passers.append(h) + ok,r,paid,mass_=simulate(np_,removed={h}) + if ok:feas.append((h,mass_)) + else:cls['frame:'+r.split()[0]+' '+r.split()[1]]+=1 + print(mode,'alg-ok 172; window-ok',len(passers),'frame-ok',len(feas));print(cls);print(feas) diff --git a/research/end-cap-obstruction/cards/B257/slide.py b/research/end-cap-obstruction/cards/B257/slide.py new file mode 100644 index 0000000000..e1a23f6a67 --- /dev/null +++ b/research/end-cap-obstruction/cards/B257/slide.py @@ -0,0 +1,68 @@ +import sys,collections,itertools +from hoist import * +# per (reg) write positions +wr=collections.defaultdict(list);rd_=collections.defaultdict(list) +for i,(tag,e) in enumerate(prog): + if e[0]=='add':wr[e[1]].append(i);rd_[e[2]].append(i) + else:wr[e[1]].append(i) +import bisect +def nextw(s,i): + L=wr[s];k=bisect.bisect_right(L,i);return L[k] if k0 else -1 +def build(h): + st,rd=contribs(h) + if st!='ok':return None + items=[] # (ridx,x,a,widx,s,c,lo,hi,f) + for ridx,x,a,ent in rd: + for widx,s,c in ent: + if prog[widx][0][0] in 'PC':return None + lo=max(widx,lastread(x,ridx)+0) # place after last read of x (insert after op lo) + hi=min(ridx-1,nextw(s,widx)-1) # insert after op hi at latest; s unwritten through hi + # s-write at widx itself is h-write op not s. nextw(s,widx) first write to s after widx + items.append([ridx,x,a,widx,s,c,lo,hi]) + return items +def mk(h,items,taus,mode='Z'): + ins=collections.defaultdict(list);drop={i for i,(tag,e) in enumerate(prog) if e[0]=='add' and h in e[1:3]} + for it,t in zip(items,taus): + ridx,x,a,widx,s,c,lo,hi=it + f=Fr(1) + for i in range(widx+1,t+1): + tg,e=prog[i] + if e[0]=='scale' and e[1]==x:f*=Fr(e[2],e[3]) + # x scales between t and ridx: new op placed after t, before those scales -> need a*c/f' where f'=scales in (t,ridx) + f=Fr(1) + for i in range(t+1,ridx): + tg,e=prog[i] + if e[0]=='scale' and e[1]==x:f*=Fr(e[2],e[3]) + co=a*c/f + E=[] if mode=='Z' else prog[ridx][1][5] + ins[t].append((prog[t][0],['add',x,s,co.numerator,co.denominator,E])) + new=[] + for idx,(tag,e) in enumerate(prog): + if idx not in drop:new.append((tag,e)) + for te in ins.get(idx,[]):new.append(te) + return new +if __name__=='__main__': + stat=collections.Counter();feas=[];nopos=0 + for h in range(224,704): + if h in centers or track(h)[0]!='ok':continue + items=build(h) + if items is None:stat['PC']+=1;continue + if any(it[6]>it[7] for it in items):stat['no-position']+=1;continue + # candidate taus per item: all positions lo..hi (limit sample) + cands=[] + for it in items: + cs=list(range(it[6],it[7]+1)) + if len(cs)>40:cs=cs[:20]+cs[-20:] + cands.append(cs) + nprod=1 + for c in cands:nprod*=len(c) + stat['window-ok']+=1 + best=None + combos=itertools.product(*cands) if nprod<=400 else [tuple(c[0] for c in cands),tuple(c[-1] for c in cands)] + for taus in combos: + ok,why,paid,m=simulate(mk(h,items,taus),removed={h}) + if ok:best=(taus,m);break + if best:feas.append((h,best)) + print(stat,'frame-ok',len(feas),feas) diff --git a/research/end-cap-obstruction/cards/B258/endcap.py b/research/end-cap-obstruction/cards/B258/endcap.py new file mode 100644 index 0000000000..1c6c7609ff --- /dev/null +++ b/research/end-cap-obstruction/cards/B258/endcap.py @@ -0,0 +1,24 @@ +# B258: per violating y, final frame geometry vs perp(P_t). usage: endcap.py WORD.json.gz [...] +import gzip,json,sys +GK=__import__('os').environ['EO_ROOT']+'/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk' +sys.path.insert(0,GK) +import gk_word as G,gk_common as C +V=G.V=C.V=112 +def sp(B): return G.span(B) +for path in sys.argv[1:]: + w=json.loads(gzip.decompress(open(path,'rb').read())) + R=w['report']['R'];n=2*V+R;P=w['ports'] + cur={r:((P[r],) if r=2*V else ())) for r in range(n)} + for part in 'AB': + for e in w[part]: + F=e[-1] + for r in [e[1]]+([e[2]] if e[0]=='add' else []): cur[r]=G.basis(list(cur[r])+list(F)) + bad=[];d9=0;comp=0;ex=0 + for t in range(V): + r=V+t;u=P[t];Pp=G.perp(u);c=cur[r] + if G.basis(list(c)+list(Pp))!=Pp: + S=sp(c);inter=len(G.basis([x for x in S if x in sp(Pp)])) if S else 0 + full=len(c)==9; uin=u in S + d9+=full; comp+=(not uin); ex+=len(c)-inter + bad.append((r,len(c),inter,uin)) + print(path.split('/')[-2],'R',R,'viol',len(bad),'dim9',d9,'complement-hyperplane-possible(u not in frame)',comp,'sum(dim-dim∩perp)',ex, bad[:6]) diff --git a/research/end-cap-obstruction/cards/B258/kap_free.py b/research/end-cap-obstruction/cards/B258/kap_free.py new file mode 100644 index 0000000000..314963bd6b --- /dev/null +++ b/research/end-cap-obstruction/cards/B258/kap_free.py @@ -0,0 +1,27 @@ +# B258: exact kappa of a global profile WITHOUT the 2560 deficit pin (deficit-honest: added rank lowers D). Uses the package's +# own price_profile.py (two exact engines + outer47 + PR589 bit), monkeypatching only the deficit assertion. NOT a package edit. +import importlib.util,json,sys,tempfile,io,contextlib +from pathlib import Path +sys.path.insert(0,__import__('os').environ['EO_ROOT']+'/cards/B248') +with contextlib.redirect_stdout(io.StringIO()): + import pricep as PP +ROOT=PP.ROOT;PKG=PP.PKG +spec=importlib.util.spec_from_file_location('pp',PKG/'independent/price_profile.py');pp=importlib.util.module_from_spec(spec);spec.loader.exec_module(pp) +orig=pp.moment_checks +def mc(M,B,H,m,W,lower,deficit,bad): + return orig(M,B,H,m,W,lower,m*W-sum(r*n for r,n in H.items()),bad) +pp.moment_checks=mc +def kappa(loc): + H=dict(PP.idle) + for r,n in loc.items():H[int(r)]=H.get(int(r),0)+72*n + d=Path(tempfile.mkdtemp());(d/'p.json').write_text(json.dumps({'profile':{str(r):n for r,n in sorted(H.items()) if n}})) + sys.argv=['x','--main',str(ROOT),'--profile',str(d/'p.json'),'--output',str(d/'o.json')] + import os;cwd=os.getcwd();os.chdir(ROOT) + with contextlib.redirect_stdout(io.StringIO()): pp.main() + os.chdir(cwd) + return float(json.loads((d/'o.json').read_text())['prices']['native']['outer_with_bit']['kappa_decimal']) +if __name__=='__main__': + base={1:2412,2:418,3:432,4:142,5:82,8:8} + k0=kappa(base);print('base',k0,'(pinned price1018 base should match)') + for k in (1,2,4,16,32,48,64,96,128): + l=dict(base);l[1]+=k;kk=kappa(l);print(f'+{k:3d} rank-1 local units: kappa {kk:.9e} {100*(kk-k0)/k0:+.3f}% per unit {100*(kk-k0)/k0/k:+.4f}%',flush=True) diff --git a/research/end-cap-obstruction/cards/B259/an1.py b/research/end-cap-obstruction/cards/B259/an1.py new file mode 100644 index 0000000000..cf3e4271a8 --- /dev/null +++ b/research/end-cap-obstruction/cards/B259/an1.py @@ -0,0 +1,35 @@ +import gzip,json,sys,itertools,collections +GK=__import__('os').environ['EO_ROOT']+'/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk' +sys.path.insert(0,GK) +import gk_word as G,gk_common as C +V=G.V=C.V=112 +sp=G.span +def load(p): return json.loads(gzip.decompress(open(p,'rb').read())) +def frames(w): + R=w['report']['R'];n=2*V+R;P=w['ports'] + cur={r:((P[r],) if r=2*V else ())) for r in range(n)} + readers=collections.defaultdict(set) + for part in 'AB': + for e in w[part]: + F=e[-1] + if e[0]=='add': readers[e[1]].add(e[2]) + for r in [e[1]]+([e[2]] if e[0]=='add' else []): cur[r]=G.basis(list(cur[r])+list(F)) + return cur,readers +def dimint(spaces_perp_vecs): # dim of intersection of u^perp over vectors + b=[] + for v in spaces_perp_vecs: + for x in b: v=min(v,v^x) + if v: b.append(v) + return 9-len(b) +def perpset(vs): return G.perp_of(vs) if hasattr(G,'perp_of') else None +if __name__=='__main__': + w=load(sys.argv[1]);P=w['ports'];cur,rd=frames(w) + bad=[] + for t in range(V): + r=V+t;Pp=G.perp(P[t]) + if G.basis(list(cur[r])+list(Pp))!=Pp: bad.append(t) + print('violator targets',bad,'blocks',sorted({t//8 for t in bad})) + # group by 4 + I=dimint([P[t] for t in bad]);print('dim ∩ over all violators',I) + for g in range(0,len(bad),4): + grp=bad[g:g+4];print(grp,'blocks',[t//8 for t in grp],'dim∩',dimint([P[t] for t in grp])) diff --git a/research/end-cap-obstruction/cards/B259/an2.py b/research/end-cap-obstruction/cards/B259/an2.py new file mode 100644 index 0000000000..ab58d2c037 --- /dev/null +++ b/research/end-cap-obstruction/cards/B259/an2.py @@ -0,0 +1,17 @@ +from an1 import * +import random +w=load(__import__('os').environ['EO_ROOT']+'/work/o_cf0/FULL-WORD.json.gz');P=w['ports'];cur,rd=frames(w) +bad=[58,59,62,63] +Iv=[P[t] for t in bad] +Ispace=G.basis([x for x in sp(G.perp(Iv[0]))]) if False else None +# I = intersection of perps: vectors x with x.u=0 for all u +def dot(a,b): return bin(a&b).count('1')&1 +Iset=[x for x in range(512) if all(dot(x,u)==0 for u in Iv)] +print('|I|',len(Iset),'dim',len(Iset).bit_length()-1) +Is=set(Iset) +for t in bad: + y=V+t;print('y',y,'final dim',len(cur[y]),'readers',sorted(rd[y])) + for s in sorted(rd[y]): + S=sp(cur[s]) if cur[s] else {0} + inter=len([x for x in S if x in Is]) + print(' src',s,'final frame dim',len(cur[s]),'|S∩I|',inter,'dim excess over I',len(cur[s])-(inter.bit_length()-1)) diff --git a/research/end-cap-obstruction/cards/B259/an3.py b/research/end-cap-obstruction/cards/B259/an3.py new file mode 100644 index 0000000000..de23968cdd --- /dev/null +++ b/research/end-cap-obstruction/cards/B259/an3.py @@ -0,0 +1,23 @@ +from an1 import * +def dot(a,b): return bin(a&b).count('1')&1 +w=load(__import__('os').environ['EO_ROOT']+'/work/o_base/FULL-WORD.json.gz');P=w['ports'];cur,rd=frames(w) +# readers by register: y targets that add from s directly +ry=collections.defaultdict(set) +for y in range(V,2*V): + for s in rd[y]: ry[s].add(y-V) +res=collections.Counter();rows=[] +for s,T in ry.items(): + blks={t//8 for t in T} + if len(blks)<2: continue + I={x for x in range(512) if all(dot(x,P[t])==0 for t in T)} + F=sp(cur[s]) if cur[s] else {0} + inter=len([x for x in F if x in I]).bit_length()-1 + dF=len(cur[s]);dI=len(I).bit_length()-1 + rows.append((s,len(T),len(blks),dF,dI,dF-inter)) + res[(len(blks),dF-inter)]+=1 +print('regs read directly by y of >=2 blocks:',len(rows)) +print('(nblocks, excess of final frame over ∩perp):count',sorted(res.items())) +print('dim ∩ distribution',collections.Counter(r[4] for r in rows)) +print('final dim dist',collections.Counter(r[3] for r in rows)) +print(rows[:10]) +print('s=283',[r for r in rows if r[0]==283]) diff --git a/research/end-cap-obstruction/cards/B259/an4.py b/research/end-cap-obstruction/cards/B259/an4.py new file mode 100644 index 0000000000..cf5c48e88f --- /dev/null +++ b/research/end-cap-obstruction/cards/B259/an4.py @@ -0,0 +1,28 @@ +from an1 import * +def dot(a,b): return bin(a&b).count('1')&1 +w=load(__import__('os').environ['EO_ROOT']+'/work/o_base/FULL-WORD.json.gz');P=w['ports'];cur,rd=frames(w) +ry=collections.defaultdict(set) +for y in range(V,2*V): + for s in rd[y]: ry[s].add(y-V) +ops=collections.defaultdict(list) +for part in 'AB': + for e in w[part]: + F=G.basis(e[-1]) + for r in [e[1]]+([e[2]] if e[0]=='add' else []): ops[r].append(F) +tot=[];cnt=collections.Counter() +for s,T in ry.items(): + if len({t//8 for t in T})<2: continue + I={x for x in range(512) if all(dot(x,P[t])==0 for t in T)} + ex=0;nb=0 + for F in ops[s]: + S=sp(F) if F else {0} + i=(len([x for x in S if x in I])).bit_length()-1 + if icf0:',[(r,len(cb[r]),len(cc[r])) for r in diff]) +ry=collections.defaultdict(set) +for y in range(V,2*V): + for s in rc[y]: ry[s].add(y-V) +ops=collections.defaultdict(list) +for e in wc['A']+wc['B']: + F=G.basis(e[-1]) + for r in [e[1]]+([e[2]] if e[0]=='add' else []): ops[r].append(F) +for s in diff: + T=ry.get(s,set()) + if not T: print(s,'no direct y reader');continue + I={x for x in range(512) if all(dot(x,P[t])==0 for t in T)} + ex=0 + for F in ops[s]: + S=sp(F) if F else {0} + i=len([x for x in S if x in I]).bit_length()-1 + ex+=len(F)-i + print(s,'T',sorted(T),'blocks',sorted({t//8 for t in T}),'dimI',len(I).bit_length()-1,'final',len(cc[s]),'op-excess',ex) diff --git a/research/end-cap-obstruction/cards/B260/anc.py b/research/end-cap-obstruction/cards/B260/anc.py new file mode 100644 index 0000000000..4e5e15b2bc --- /dev/null +++ b/research/end-cap-obstruction/cards/B260/anc.py @@ -0,0 +1,48 @@ +import sys,collections +sys.path.insert(0,'../B256') +from lib import * +w=load(__import__('os').environ['EO_ROOT']+'/inputs/words/w1018.json.gz');P=w['ports'] +def basis(vs): + b=[] + for v in vs: + for x in b: v=min(v,v^x) + if v: b.append(v) + return b +def span_in_perp(vs,T): # all vs orthogonal to all ports of T + return all(bin(v&P[t]).count('1')%2==0 for v in vs for t in T) +n=2*V+w['report']['R'] +# ancestor-source port set (as F2 span basis) per register, through A/B ADD dag (cut ignored like caps.py); frames as caps.py too +anc=[basis([P[r]]) if r=2*V and not rows[t] and rows[s]: copies.append((k,t,s)) + if V<=t<2*V: events.append((k,t-V,s,list(anc[s]),list(cur[s]))) + anc[t]=basis(anc[t]+anc[s]) + F=basis(cur[t]+cur[s]+list(G.basis(e[-1]))) + cur[t]=list(F); cur[s]=list(F) + else: + F=basis(cur[e[1]]+list(G.basis(e[-1]))); cur[e[1]]=F + G.apply_op(e,rows) +rd=collections.defaultdict(list) +for k,t,s,a,f in events: rd[s].append((k,t,a,f)) +res=collections.Counter(); ex=[] +for k,h,s in copies: + Th={t for kk,t,a,f in rd[h] if kk>k}; Ts={t for kk,t,a,f in rd[s] if kk>k} + if not Th or not Ts: res['one side unread']+=1; continue + T=sorted(Th|Ts); d=len(basis([P[t] for t in T])) + # ancestor floor at merged reads: s's ancestors at each of h's reads (s would be read instead of h) + lastk=max(kk for kk,t,a,f in rd[h]) + a_s=[a for kk,t,a,f in rd[s] if kk>k] + ancok=span_in_perp(anc_at(lastk) if False else [], T) + res[(len(T),d)]+=1 + ex.append((k,h,s,sorted(Th),sorted(Ts),d)) +print('copies',len(copies),'merge-union reader groups (|T|,span dim):',sorted(res.items(),key=str)) +for x in ex[:8]: print(x) +import pickle; pickle.dump((events,copies),open('ev.pkl','wb')) diff --git a/research/end-cap-obstruction/cards/B260/cp.py b/research/end-cap-obstruction/cards/B260/cp.py new file mode 100644 index 0000000000..35500e2a39 --- /dev/null +++ b/research/end-cap-obstruction/cards/B260/cp.py @@ -0,0 +1,32 @@ +import sys,collections +sys.path.insert(0,'../B256') +from lib import * +w=load(__import__('os').environ['EO_ROOT']+'/inputs/words/w1018.json.gz');P=w['ports'] +def rank(vs): + b=[] + for v in vs: + for x in b: v=min(v,v^x) + if v: b.append(v) + return len(b) +n=2*V+w['report']['R'] +rows=[{r:Q(1)} if r<2*V else {} for r in range(n)] # data coords only +seq=[('A',i,e) for i,e in enumerate(w['A'])]+[('cut',i,e) for i,e in enumerate(w['cut'])]+[('B',i,e) for i,e in enumerate(w['B'])] +copies=[]; readers=collections.defaultdict(set); readinfo=collections.defaultdict(list) +for sec,i,e in seq: + if e[0]=='add': + t,s=e[1],e[2] + if t>=2*V and not rows[t] and rows[s]: copies.append((sec,i,t,s)) + if V<=t<2*V and sec!='cut': readers[s].add(t-V); readinfo[s].append((sec,i,t-V,dict(rows[s]))) + G.apply_op(e,rows) +print('copy events (helper written from zero):',len(copies), collections.Counter((c[0],'x' if c[3]=2 targets, at each read, is x-support of content within common-orth of all its target readers? +def dot(a,b): return bin(a&b).count('1')&1 +bad=collections.Counter() +for s,T in readers.items(): + if len(T)<2: continue + T=sorted(T) + for sec,i,t,row in readinfo[s]: + xs=[k for k,v in row.items() if kq[2]] +print('zero-sum 4-sets (span dim3 with 4 ports):',len(quads)) +blk=lambda i:i//8 +print('block spans:',[rank(P[8*b:8*b+8]) for b in range(14)]) +c=collections.Counter(tuple(sorted(collections.Counter(blk(i) for i in q).values())) for q in quads) +print('quad block patterns:',c) +# orthogonality graph +O=[[dot(P[i],P[j]) for j in range(V)] for i in range(V)] +deg0=[sum(1 for j in range(V) if j!=i and O[i][j]==0) for i in range(V)] +print('orth degree (excluding self):',collections.Counter(deg0)) +# within block orthogonality +for b in range(2): + print('block',b,[[O[i][j] for j in range(8*b,8*b+8)] for i in range(8*b,8*b+8)]) +# common-orth source counts for groups +def corth(T): return [s for s in range(V) if all(O[s][t]==0 for t in T)] +pc=collections.Counter(len(corth(p)) for p in itertools.combinations(range(V),2)) +print('pairs: #ports in perp(u_a)∩perp(u_b):',sorted(pc.items())) +qc=collections.Counter(len(corth(q)) for q in quads) +print('quads: #ports in common perp (dim6):',sorted(qc.items())) +tc=collections.Counter(len(corth(q)) for q in itertools.combinations(range(V),3)) +print('triples: #ports in common perp:',sorted(tc.items())) +# within/cross block pairs +pcb=collections.Counter((blk(a)==blk(b),O[a][b]) for a,b in itertools.combinations(range(V),2)) +print('pairs (sameblock, dot):',pcb) diff --git a/research/end-cap-obstruction/cards/B260/groups.py b/research/end-cap-obstruction/cards/B260/groups.py new file mode 100644 index 0000000000..e94fa0c745 --- /dev/null +++ b/research/end-cap-obstruction/cards/B260/groups.py @@ -0,0 +1,41 @@ +import gzip,json,itertools,collections +w=json.loads(gzip.decompress(open(__import__('os').environ['EO_ROOT']+'/inputs/words/w1018.json.gz','rb').read())) +P=w['ports'];R=w['root_lines'];V=112 +dot=lambda a,b:bin(a&b).count('1')&1 +ip=lambda a,b:sum(x*y for x,y in zip(a,b)) +SG=[[(ip(R[t],R[s])//2) for s in range(V)] for t in range(V)] # ±1 or 0 off-diag +def rank(vs): + b=[] + for v in vs: + for x in b: v=min(v,v^x) + if v: b.append(v) + return len(b) +S=set(P); idx={p:i for i,p in enumerate(P)} +def common(T): return [s for s in range(V) if s not in T and all(SG[t][s]!=0 for t in T)] +def r1classes(T): + cs=collections.Counter() + for s in common(T): + col=tuple(SG[t][s] for t in T) + if col[0]<0: col=tuple(-c for c in col) + cs[col]+=1 + return cs +blk=lambda i:i//8 +def report(name,groups): + st=collections.Counter() + for T in groups: + cs=r1classes(T); st[(len(common(T)),max(cs.values()) if cs else 0,len(cs))]+=1 + print(name,len(groups),'(|S_T|,max rank1 class,#classes):',sorted(st.items())) +pairs=list(itertools.combinations(range(V),2)) +report('pairs dot0 same-block',[p for p in pairs if blk(p[0])==blk(p[1]) and dot(P[p[0]],P[p[1]])==0]) +report('pairs dot1 same-block',[p for p in pairs if blk(p[0])==blk(p[1]) and dot(P[p[0]],P[p[1]])==1]) +report('pairs dot0 cross',[p for p in pairs if blk(p[0])!=blk(p[1]) and dot(P[p[0]],P[p[1]])==0]) +report('pairs dot1 cross',[p for p in pairs if blk(p[0])!=blk(p[1]) and dot(P[p[0]],P[p[1]])==1]) +quads=[] +for a,b,c in itertools.combinations(range(V),3): + d=P[a]^P[b]^P[c] + if d in S and idx[d]>c: quads.append((a,b,c,idx[d])) +bp=lambda q:tuple(sorted(collections.Counter(blk(i) for i in q).values())) +for pat in [(4,),(2,2),(1,1,2),(1,1,1,1)]: + report('quads blocks%s'%(pat,),[q for q in quads if bp(q)==pat]) +# 8-port dim-4 groups +oct8=[] diff --git a/research/end-cap-obstruction/cards/B260/merge.py b/research/end-cap-obstruction/cards/B260/merge.py new file mode 100644 index 0000000000..5e6bd3cdf3 --- /dev/null +++ b/research/end-cap-obstruction/cards/B260/merge.py @@ -0,0 +1,43 @@ +import sys,collections,pickle +sys.path.insert(0,'../B256') +from lib import * +w=load(__import__('os').environ['EO_ROOT']+'/inputs/words/w1018.json.gz');P=w['ports'] +def basis(vs): + b=[] + for v in vs: + for x in b: v=min(v,v^x) + if v: b.append(v) + return b +orth=lambda v,T: all(bin(v&P[t]).count('1')%2==0 for t in T) +n=2*V+w['report']['R'] +anc=[basis([P[r]]) if r=2*V and not rows[t] and rows[s]: + copies.append((k,t,s)); snap[k]=(list(anc[s]),dict(rows[s])) + if V<=t<2*V: reads[s].append((k,t-V,list(anc[s]))) + anc[t]=basis(anc[t]+anc[s]) + G.apply_op(e,rows) +st=collections.Counter(); keep=[] +for k,h,s in copies: + Th={t for kk,t,a in reads[h] if kk>k}; Ts={t for kk,t,a in reads[s] if kk>k} + if not Th or not Ts: continue + T=sorted(Th|Ts) + a_copy,row=snap[k] + # ancestor floor: s's ancestors at copy time already inside common perp of T? + anc_ok=all(orth(v,T) for v in a_copy) + # s's ancestors at the time of its own later reads (drag after copy) + a_late=basis([v for kk,t,a in reads[s] if kk>k for v in a]) + late_ok=all(orth(v,T) for v in a_late) + xs=[c for c,v in row.items() if ck for kk in writes[h]) + hreads=[kk for kk,e in enumerate(seq) if e[0]=='add' and e[2]==h and kk>k] + last=max(hreads) + version=any(k targets reading s directly +tread=collections.defaultdict(list) +for part in 'AB': + for i,e in enumerate(w[part]): + if e[0]=='add' and V<=e[1]<2*V: + readers[e[2]].add(e[1]-V); tread[e[1]-V].append((part,i,e[2])) +kind=lambda s:'x' if s=2*V and v!=0] + supx[len(xs)]+=1; supy[len(ys)]+=1 + nb[len(set(s//8 for s in xs))]+=1 + if t<3: print(t, 'x',[(s,str(r[s]),dot(P[s],P[t])) for s in xs][:20],'y',ys[:10],'h',len(hs)) +print('x-support sizes',supx,'y-support',supy,'blocks touched',nb) diff --git a/research/end-cap-obstruction/checks/anchors.py b/research/end-cap-obstruction/checks/anchors.py new file mode 100644 index 0000000000..5d57657ab9 --- /dev/null +++ b/research/end-cap-obstruction/checks/anchors.py @@ -0,0 +1,38 @@ +"""Anchors of the rules the theorem uses: every quoted file:line is read from the vendored copy and must contain the quoted text. +Prints one PASS/FAIL line per anchor; exits 1 on any FAIL. usage: anchors.py (EO_ROOT = the work tree)""" +import os, re, sys +R = os.environ['EO_ROOT'] + '/inputs/repo/' +GK = 'research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py' +AL = 'research/gauge44-slots/independent/audit_local.py' +MO = '../spec/03-motifs.tex' +LA = '../spec/05-layers.tex' +SW = '../spec/04-swap.tex' +FL = 'research/format-limits-corrected/README.md' +A = [ + ('R3 gk_word.py:102', GK, 102, 102, r"assert basis\(list\(o\) \+ list\(F\)\) == F, \('frame violation'"), + ('R1 gk_word.py:116 (both ADD operands climb)', GK, 116, 116, r"for r in \[e\[1\]\] \+ \(\[e\[2\]\] if e\[0\] == 'add' else \[\]\): climb\(r, e\[-1\]\)"), + ('E gk_word.py:117 (final climb to perp of the target port)', GK, 117, 117, r"climb\(r, FULL if \(r < V or r >= 2 \* V\) else perp\(P\[r - V\]\)\)"), + ('E audit_local.py:115 (target end = perp of its port)', AL, 115, 115, r"end=\[full\]\*v\+\[basis\(\[x for x in range\(1,1<= tl: print('FAIL %s time limit reached (%.0fs): not exhaustive' % (label, secs)); sys.exit(1) +print('PASS %s 0 orders, exhaustive: %d states, deepest prefix %d ops' % (label, seen, deep)) diff --git a/research/end-cap-obstruction/checks/expect.py b/research/end-cap-obstruction/checks/expect.py new file mode 100644 index 0000000000..5b0b3118c7 --- /dev/null +++ b/research/end-cap-obstruction/checks/expect.py @@ -0,0 +1,31 @@ +"""Assertion helper of verify.sh. usage: expect.py LABEL LOG [--has REGEX]... [--count REGEX N]... [--absent REGEX]... +Prints one 'PASS LABEL detail' or 'FAIL LABEL reason' line. Also FAILS if LOG.rc exists and is not 0 (the run itself failed).""" +import re, sys, os +label, log = sys.argv[1], sys.argv[2] +args = sys.argv[3:] +txt = open(log, encoding='utf-8', errors='replace').read() if os.path.isfile(log) else None +bad = [] +if txt is None: + bad.append('missing log ' + os.path.basename(log)) +else: + rc = log[:-4] + '.rc' if log.endswith('.log') else None + if rc and os.path.isfile(rc) and open(rc).read().strip() != '0': + bad.append('run exited %s' % open(rc).read().strip()) + i = 0 + while i < len(args): + a = args[i] + if a == '--has': + if not re.search(args[i + 1], txt, re.M): bad.append('missing: ' + args[i + 1]) + i += 2 + elif a == '--absent': + if re.search(args[i + 1], txt, re.M): bad.append('unexpected: ' + args[i + 1]) + i += 2 + elif a == '--count': + n = len(re.findall(args[i + 1], txt, re.M)) + if n != int(args[i + 2]): bad.append('count of %r is %d, want %s' % (args[i + 1], n, args[i + 2])) + i += 3 + else: + bad.append('bad option ' + a); i += 1 +if bad: + print('FAIL %s %s' % (label, '; '.join(bad))); sys.exit(1) +print('PASS %s' % label) diff --git a/research/end-cap-obstruction/checks/generated.json b/research/end-cap-obstruction/checks/generated.json new file mode 100644 index 0000000000..63bcf0be47 --- /dev/null +++ b/research/end-cap-obstruction/checks/generated.json @@ -0,0 +1,10 @@ +{ + "base": "85c0e64718a9ceafe094e7152ea27ec9d7f804e514b5efaab085a94b7ef1841f", + "cf0": "2db62aac9cb9d55e8505d8257b64b4089c14f6ceac71020d7b7e2926cc724424", + "all16": "8aef730ee2a1c9abe4bec1e0c966100e63a36326169357572d18305ec7adc5b1", + "rr": "c5c5027faafd8e23c29f4dce966628e3d30c041bfd2ab29ca85068547e416dda", + "wr": "ef40652492929ecd98b47ba62064429aebaf01fff944ea01197b2b75225fa042", + "rrss": "c5484cebdf64189ef5c84599863932b93ba32c102f68f511492fa8e00b90de97", + "rrwr": "aa8ccf91c96e7b805628dbc3f458260ec879dee58fcd0d1e0e14d3278d5dd23e", + "all80": "5e013ca67ad5d6be5fecd6927620ae82d25c3b782ef9614b57a725d4f1bb82ba" +} diff --git a/research/end-cap-obstruction/checks/portdims.py b/research/end-cap-obstruction/checks/portdims.py new file mode 100644 index 0000000000..d062d82d86 --- /dev/null +++ b/research/end-cap-obstruction/checks/portdims.py @@ -0,0 +1,26 @@ +"""dim of the common perp of the ports of a reader set, over the 112 ports of the k8 word: cross-block pairs, triples and quads. +For ports in F_2^9, dim(cap perp(u_i)) = 9 - rank(u_i). Quads are counted with numpy over all (14 choose 4) * 8^4 index choices.""" +import gzip, itertools, json, os +import numpy as np +w = json.loads(gzip.decompress(open(os.environ['EO_ROOT'] + '/inputs/words/w1018.json.gz', 'rb').read())) +P = w['ports']; blk = [P[8 * b:8 * b + 8] for b in range(14)] +def rank(vs): + b = [] + for v in vs: + for x in b: v = min(v, v ^ x) + if v: b.append(v) + return len(b) +assert len(set(P)) == 112 and all(bin(p).count('1') % 2 == 1 for p in P) +print('ports 112 distinct odd-weight, 14 blocks of 8, block ranks', sorted({rank(b) for b in blk})) +pairs = {9 - rank([a, b]) for i, j in itertools.combinations(range(14), 2) for a in blk[i] for b in blk[j]} +npairs = sum(1 for i, j in itertools.combinations(range(14), 2) for a in blk[i] for b in blk[j]) +print('cross-block pairs', npairs, 'dim of common perp', sorted(pairs)) +tr = [9 - rank([a, b, c]) for i, j, k in itertools.combinations(range(14), 3) for a in blk[i] for b in blk[j] for c in blk[k]] +print('cross-block triples', len(tr), 'dim of common perp', sorted(set(tr))) +n6 = n5 = other = 0 +A = [np.array(b, dtype=np.int64) for b in blk] +for i, j, k, l in itertools.combinations(range(14), 4): + a, b, c, d = (A[i][:, None, None, None], A[j][None, :, None, None], A[k][None, None, :, None], A[l][None, None, None, :]) + zero = ((a ^ b ^ c ^ d) == 0) | ((a ^ b ^ c) == 0) | ((a ^ b ^ d) == 0) | ((a ^ c ^ d) == 0) | ((b ^ c ^ d) == 0) + z = int(zero.sum()); n6 += z; n5 += 8 ** 4 - z +print('cross-block quads', n5 + n6, 'dim 5:', n5, 'dim 6 (zero-sum, rank 3):', n6) diff --git a/research/end-cap-obstruction/checks/units.py b/research/end-cap-obstruction/checks/units.py new file mode 100644 index 0000000000..43782ed52e --- /dev/null +++ b/research/end-cap-obstruction/checks/units.py @@ -0,0 +1,24 @@ +"""Exact kappa of the k8 / #1018 invoice with k extra rank-1 local units per call (72 calls), deficit-honest (cards/B258/kap_free.py, +which calls the package's own price_profile.py and replaces only the 2560 deficit pin). Prints the base, the exact change for each k, +and the first k in 33..48 at which the certificate stops existing.""" +import os, sys +sys.path.insert(0, os.environ['EO_ROOT'] + '/cards/B258') +import kap_free as K +base = {1: 2412, 2: 418, 3: 432, 4: 142, 5: 82, 8: 8} +k0 = K.kappa(base) +print('base kappa %.15e' % k0) +for k in (1, 2, 4, 16, 32): + l = dict(base); l[1] += k; kk = K.kappa(l) + print('+%d rank-1 local units: kappa %.9e %+.3f%% per unit %+.4f%%' % (k, kk, 100 * (kk - k0) / k0, 100 * (kk - k0) / k0 / k)) +first = None +for k in range(33, 49): + l = dict(base); l[1] += k + try: K.kappa(l) + except (AssertionError, RuntimeError) as ex: first = k; why = type(ex).__name__; break +print('first k with no certificate:', first, '(exact certificate refused by price_profile.py: %s)' % why) +# break-even of the best pre-cap credit against one unit per violating y (arithmetic on the numbers above and on the recorded band) +band = 3.5152 # percent: bit-cap ceiling of the 112 S4 copies gone (cards/B248/ceil.py: +3.5152%), the largest credit any copy deletion can have +l1 = dict(base); l1[1] += 1 +unit = 100 * (k0 - K.kappa(l1)) / k0 +print('break-even: best credit %.2f%% / 80 copies = %.4f%% per copy; one unit costs %.3f%% per violating y -> a deletion pays only if it breaks <= %.4f caps per copy' + % (band, band / 80, unit, (band / 80) / unit)) diff --git a/research/end-cap-obstruction/checks/wordpins.py b/research/end-cap-obstruction/checks/wordpins.py new file mode 100644 index 0000000000..5f3143ab9d --- /dev/null +++ b/research/end-cap-obstruction/checks/wordpins.py @@ -0,0 +1,12 @@ +"""The gauge-forward words regenerated by verify.sh must equal the words recorded in checks/generated.json (sha256 of the decompressed +FULL-WORD.json.gz). usage: wordpins.py EO_ROOT WORKDIR""" +import gzip, hashlib, json, os, sys +root, wk = sys.argv[1], sys.argv[2] +pins = json.load(open(os.path.join(root, 'checks/generated.json'))) +bad = 0 +for name, want in sorted(pins.items()): + got = hashlib.sha256(gzip.decompress(open('%s/o_%s/FULL-WORD.json.gz' % (wk, name), 'rb').read())).hexdigest() + ok = got == want + bad += not ok + print(('PASS' if ok else 'FAIL') + ' G0.generated-word-%s sha256 %s' % (name, got[:16])) +sys.exit(1 if bad else 0) diff --git a/research/end-cap-obstruction/evidence/B240-NOTES.md b/research/end-cap-obstruction/evidence/B240-NOTES.md new file mode 100644 index 0000000000..a16822bdd5 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B240-NOTES.md @@ -0,0 +1,49 @@ +# B240 ASYMMETRY VERDICT (k8 word #1018 c2b29430; ship bar #1031 1.672167430672016e-3; no ship candidate) +VALID: YES. No verifier, SPEC or pin requires the 14 factory blocks to be uniform. The shipped word is already block-asymmetric (7 slots on 7 blocks, leaver cells only in K-blocks, fat/lean gates). Uniformity is required only ACROSS providers (calls), and that is a package-code convention. +COST: 0 to enable. Built word drop_439 (#1018 with slot X=439 removed, so one block differs): real audit_local PASS (fused + package, 704 cols), exact κ 1.671625560579741e-3, Δκ = -3.9722639029e-8 vs #1018. That is the value of one per-block rewrite, not a toll for asymmetry. +WINDOWS (ranked by exact priced bound; none legal ONLY because blocks differ, since every per-block move was already legal): + 1. Tail-gate split merges, all 78 mergeable early-cleanup splits: <= +1.3149e-5 (+0.787%). This is an upper bound, not a construction. All 116 gates are already lazy (minimal frame = span of operand frames), and gopt2 is an exact global frame optimum, so this window needs SCALAR changes. + 2. Fat/lean alignment, 20 gates (7,7->8 and 6,6->8): <= +2.685e-6 (+0.161%); the 8 (7,7->8) gates alone: +8.75e-7. The card target lives here, see "Mechanism". + 3. More per-block triangle-hybrid slots: +3.97e-8 each (exact, linear). #987's search on k8 found 7; 14 more would be <= 5.6e-7 (0.03%). + 4. Heterogeneous owner packing / per-call providers: κ is linear in provider mixing (B230: 1.5e-11 below linear), so the only gain is idle packing; #1018 -> #1031 T16 gave +5.0e-7. Needs same R/ports (see VALID). + 5. Per-block punctures: any dropped delivery must be re-delivered (all-column endpoint), and register mass is fixed by start/end frames (+1 mass ~ -2.8%). Bound 0 legal found; B235's census is invalid (see Warning). + 6. #1037 asymmetric fitting: min rank is exactly 9d = 9 per block, so asymmetric port labelling cannot reduce h=9. Window 0 (proven per profile; global 25/27 still open). + 7. #1023 width-7 bit residuals: "+17-23%" is bit-side c headroom (bit_lower), not κ. Complex binds (κ 1.6722e-3 vs bit cap 1.7304e-3), so the window is 0 until complex gains exceed +3.5%. + 8. #1032/#1033 factory coefficient work: floors already attained by PR924, and coefficient work is not in the paid profile. Window 0. + +## VALID: every rule that touches uniformity (worktree wt = pr1031; research/gauge44-slots/ unless noted) +- Local audit (independent/audit_local.py) has no block concept. Its rules are: v,h=(112,9) :79; port set and ordered centre frames = parent :63,:69; no non-target reads a target :88; all-column forward+dual endpoint :106-112; monotone frames, both operands at e[-1] :121-122,:137-138; target levels and centre frames at B :129-131; cleanup only on FULL ends :143; profile/inventory = report :144-146; cones :150-153. +- Native locals (pr635 complex-571-cold14-st2/code/hpe_audit_and_transport.py) also have no block concept: h,v :111; cleanup = literal reversed inverse of A+B :141, unless the word carries refactored_cleanup :130-139 (it does), in which case any exact factorisation passes; ports = routing set :182. +- Global (cross-provider = per-call) uniformity. This is CONVENTION, not SPEC: + - all providers share v,h,R,ports: code/audit_allcold.py:70; bind_providers_portable.py:29,:62; emit_allcold.py:43; assemble.py:65,:78 + - centre frames = parent: audit_allcold.py:76-78 + - 4 spot helpers have width 8/9: witness.py:16,:28-30; bind:32; assemble.py:84 + - per-provider widths may differ, owners follow them: emit_allcold.py:47,:59 + - dispatch = SPEC.dispatch: bind:24, witness.py:12 + - freeze_spec.py:26 hard-codes provider_counts {'gauge44':72}, so multi-provider needs a package-code edit +- Hash pins (CHAIN-PINS, SLOT-PINS, data/SPEC.json via discovery -> freeze_spec) are per-package expected values, regenerated for any new word. +- SPEC proper (the math) is exactness, monotone frames, ends, centres, cones, owner distinctness and pricing. None of it mentions blocks. +- Shipped precedent: slot recipes use source holders from other blocks as cleanup partners (X=444 hold 34/98; X=439 hold 10/74; RECIPE-SLOTS-k8.json variants), and leaver cells exist only in K-blocks. So leaver-coupled cross-block cleanup partners are ALREADY legal and shipped. + +## COST (exact, real) +- Rebuilt from B232's jx word: hyb c836d892 -> frames db2c7cfb (#1005, work/w1005.json.gz) -> slots c2b29430 (#1018, work/w1018.json.gz), all shas match. +- Slot words: dropslot.py X builds #1018 minus one slot. All 7 give profile {1:2412,2:418,3:430,4:146,5:80,8:8} (mass-neutral). +- drop_439 (98937b47) and w1018: audit_local PASS on both the fused engine and the package's own audit. Negative control (one B coefficient flipped) is REJECTED. +- Prices: price.py (package price_profile, 72*local + frozen #1018 idle) reproduces 1.67166528321877e-3 exactly; drop_439 gives 1.671625560579741e-3. + +## Mechanism of the card target (fat gate with a leaver partner): PROVEN-NO, scoped to fixed targets and ports +- The 7 slot tail gates ARE fat (7,7->8) gates with a leaver partner. Example: holder 74 (source) restores E=584 at frame 8, after 584 reads into target 122 at F7a ⊆ perp(p122) (B1170) and 74 reads into target 126 at F7b ⊆ perp(p126) (B1171). +- Any restore order forces the frame up to F7a+F7b (8). A frame-7 gate needs F7a = F7b = perp(p122)∩perp(p126), i.e. re-chosen target ladders. gopt2 (exact global frame optimum) rejects that. +- Exact moves on slot 439: + - restore moved into B (675 positions): profile unchanged + - E-read moved earlier: illegal (end cap) +- No register can stand in for the gate partner: the full state is invertible, so there are no exact full-row twins (stats/info). +- A relay leaver only moves the split onto itself, because per-register mass is fixed by start/end. The relay is free only if its frame chain already passes F_S then U (B234 telescoping test). +- mv.py: single long-range commuting moves, with the moved op and all tail gates at lazy (minimal) frames and the rest legalised. Exact price. + - slot 439: all 15 ops in every commuting range (~8k moves) plus the tail restore moved into B. 0 improving moves. + - job 00_B240_mv covered slot 444 (0 improving moves) and was then killed externally at 13:20 (exit 143). The other 28 pairs remain untested. To resume, edit mvjob.sh and rerun it. + +## Warning for reviewers +B234 and B235 analysed research/gauge44-leaver8/evidence/local/*. That is #645's HISTORICAL word (R=492, profile {1:2514,...}; README "evidence/ except evidence/layers is #645"), NOT the k8 word (R=480). Their leaver/helper censuses must be rerun on work/w1018.json.gz (or work/w1005.json.gz). +B232 can take these words: they match the c2b29430 and db2c7cfb pins. +Files: prof.py (frame-only profile), price.py, dropslot.py, fat.py/fat2.py (window bounds), lazy.py, dumpg.py, mv.py, audits.sh, work/. diff --git a/research/end-cap-obstruction/evidence/B244-NOTES.md b/research/end-cap-obstruction/evidence/B244-NOTES.md new file mode 100644 index 0000000000..0530310e93 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B244-NOTES.md @@ -0,0 +1,15 @@ +# B244 VERDICT: NO GAIN. Realised Δκ = 0 (bound +1.3149e-5, +0.787%); 0 of 78 splits merged. No word built, no ship candidate. +Ship bar now #1065 κ 1.672644568760139e-3 (card said #1031); nothing near it. + +## Blocking class (structural, all 78): PARTNER END CAP +classify.py (splits.json): every one of the 78 mergeable splits is a T->E split (the register's tail-gate climb followed by its own end climb; d1,d2 = (1,5)x32, (1,1)x22, (2,1)x16, (3,1)x8). In every case the gate partner is a low-end helper (helper_final, end 8 or less) while the split register ends full (9). Merging = running the gate at the register's end frame, which would raise the capped partner beyond its end (frame must stay inside end). lift.py: lifting any single gate (to full / its end / later joins) is legal for only 2 of 116 gates, both profile-neutral (Δκ 0). +Hence "frames alone give 0" is explained, not just asserted: the cap, not laziness, blocks it. + +## Scalar rewrites tried (exact algebra, frame-profile priced by price.py, 0.5 s/eval) +- Commutator relay E_tr(x)E_rs(c/x)E_tr(-x)E_rs(-c/x), both orders, ALL 700 relay registers r, per-op frame choice (ops not touching the capped partner may be lifted to full): relay2.py, first 3 splits (stopped by the SYN-23 stop rule; ~16.8k evals, 3 distinct profiles, all WORSE: -1.1e-7, -1.8e-7, -2.0e-7). A relay raises all three registers to span(t,r,s), never less than the plain gate; the partner restore of the relay register needs the capped register again while the relay is above the cap. +- Order permutations of the tail (all commuting single moves) and adjacent-pair reassociation with a Steinberg corrector gate: 0 distinct profiles (all identical to base) - search.py order/assoc. +- Information argument (not a rigorous proof): once the capped partner's content is copied into a register that later reaches frame 9, only ops among frame-9 registers can remove it, an invertible transform that cannot zero it; so no relay chain can avoid touching the capped register at <= its cap on the way back. +- Not done: SYN-23 extras (coded y+=y target edges at frame 0 / free target-basis choice, cgx_leaver.py:244-249,:433-435) - these change the B-side target ladders (a different word, not a tail rewrite); per the stop rule they are the likely remaining route ("needs a different target ladder" / lowering the partner caps, which is +1 mass per capped helper ~ -2.8%, not mass-neutral). The wider per-split CP-SAT search was not built since a relay/reorder/reassociation sweep is exhaustive for the 4-op commutator class and found nothing; general programs were not enumerated. +- Bug note: search.py relay mode crashes on 'scale' ops in the tail (18 of 116); relay2.py only touches add gates. + +Files: ev.py (tail profile evaluator, reproduces 1.67166528321877e-3 exactly), classify.py, lift.py, relay2.py, search.py, splits.json, res_*.json. Audits (value replay, audit_local, exact κ) not run: no candidate word. diff --git a/research/end-cap-obstruction/evidence/B245-NOTES.md b/research/end-cap-obstruction/evidence/B245-NOTES.md new file mode 100644 index 0000000000..5c2c2fd89a --- /dev/null +++ b/research/end-cap-obstruction/evidence/B245-NOTES.md @@ -0,0 +1,17 @@ +# B245 VERDICT: BLOCKED at the chain (port stage), not a value/price result. No word built, no SHIP CANDIDATE, nothing pushed. +Gauge-forward is GO with GLAZY (B247 lead reproduced): STAG=1 GLAZY=1 CF=0..15 -> NH 480->464, NVIOL 0, scalar asserts pass, MASS (6184,6168), 32 widened events (3->5). Without GLAZY the card's 5 moves fail (below). +Blocker class: B232 chain stage `port_stage_x.py` (port0: RAW504 -> split-centres), which transfers the 504-chain stage frames by gate-order/scalar-op alignment. Any moved op (cold P read, deferred own row, widened event) breaks it. +## What was run +- G6 reproduced (CF=0, STAG=1, no GLAZY): fails at reg 299 (frame violation, dim 8 vs hyper(P_t)). Trace: 299/315 are own-row/packet regs read by TWO reader y's (own + partner: y140,y165 / y164,y141). A warm read of the deferred own row after the cold P read puts Fp into 299/315; the later merge M=299+315 and slot op needs them inside hyper(P[t']) where Fp is not. +- Move (a) warm-last: WARM=t for each single reader, and 10 subsets (cgx_cf2.py env WARM): 15/15 fail (299 frame violation or 'second' cap). Argument: each of the 4 readers touches 299 or 315, so avoiding Fp needs P warm at ALL 4 readers = the G4 wall. Moves (b)-(e) were not enumerated (sweep.sh written, not run; superseded by the GLAZY lead, which removes the failure by widening the partner ops). +- Lead: cgx_x.py (B247) copied to cards/B245/ and installed as cgx_leaver.py in my private copy cards/B245/chain/wt (pins demoted to PINWARN; B232 files untouched). chain.sh = B232 chain steps lv, lvc, slots on that copy (notri-base and pr635 linked read-only). +- Control (STAG=0, CF empty): lv gauge-forward, port0..3, cold44 all PASS (toolchain sound). +- CF=0..15 with STAG=1: port0 FAIL ('frame violation', reg 448, (96,) vs (302,174,120)). +- CF=0 only, STAG=1: port0 FAIL (reg 455). CF=0 only, STAG=0 (no block reorder, 8 candidates legal): port0 FAIL. So not just the stagger. +- Repair attempt (B245REPAIR=1 in my port_stage_x.py: lazily widen each ported gate frame to contain the current register frames): 2 gates widened, then profile fails the final cap: y reg 170 (target 58) pushed to the full 9-dim frame, outside perp(P_58). The stage frames (cold44/layers) were laid for the baseline op order. +## Not obtained +No value replay, no audit_local, no exact kappa for any variant (no word exists). B247's +1.3% (H16) .. +2.0% (H48) / -0.35% (H1) remains an unaudited gauge-forward estimate. +## What would unblock (new card, tooling) +Port the cold-hold ops natively in the 504 chain: generate the shadow stages (I4/O4) with the same CF/STAG/GLAZY edits so that alignment is exact and the stage frames are computed for the new order, or write a port variant that re-derives stage frames for moved gates (identity: widened y reg must stay inside perp(P)). Start with one copy (CF=0, STAG=0) as the test; cost estimate for one copy is small (+0.05..0.14% per B247), 16 copies need the full chain. +Files: cards/B245/{cgx_cf2.py (WARM/WATCH debug), cgx_x.py, chain.sh, chain/wt (patched copy), sweep.sh, out/}. Jobs: 00_B245_chain* (logs in the job logs). +Ship bar update (reviewer): now #1087 kappa 1.672654541898561e-3. No candidate word exists (port0 blocks), so price1018/verify1018 were not run; the credit assumption question (price1018 uses frozen #1018 IDLE = PLAN.profile - 72*paid, valid only while width_inventory is unchanged) is untested. diff --git a/research/end-cap-obstruction/evidence/B247-NOTES.md b/research/end-cap-obstruction/evidence/B247-NOTES.md new file mode 100644 index 0000000000..369142bf8c --- /dev/null +++ b/research/end-cap-obstruction/evidence/B247-NOTES.md @@ -0,0 +1,18 @@ +# B247 COLD-SLOT LEDGER - VERDICT: NO-GO for the card's target (coded pairs / S4 cold M reads): 0/112 targets can host a 2nd T pair, at ANY schedule. No word built, no SHIP CANDIDATE, nothing pushed. +SIDE FINDING for B245 (not my lane, flagged): at gauge-forward, all 16 S3 sel x4 copies delete (NH 480->464) with STAG=1 + lazy widening of ALL explicit-frame ops (GLAZY=1, gates cgx_x.py): scalar identity assert passes, 0 y-cap violations. Rough price on w1018 terms +1.3% (H16 mass credit) .. +2.0% (H48), -0.35% (H1 credit). NOT chained/audited; the G6 "partner pollution" failure disappears once partner ops widen (WIDEN list: 32 events, 3->5, 4 per consumer block). +## Q(A) exchange rate "own row warm" (cold-slot rate) +- One cold-first packet read in a block (CF=0, STAG=1, GLAZY=1): own rows of that block's 8 targets are deferred behind it; only ONE explicit event per consumer block widens (3 -> 5), not one per target. Profile vs base: H1 -6, H2 -9, H3 +3, H4 +1, H5 +1, H6 -1, H7 +1 (helper deleted, NH 479). Mapped price on w1018 (H6/H7 -> H1, mass to idle): +0.05% (H1), +0.12% (H16), +0.14% (H48). +- Isolated widen cost: a lone 3->5 event = -0.02..-0.04% (H16/H48 credit), ~0 at H1 credit. Per held block (4 events, all 8 targets) about -0.025% at H48 = well below the card's 3 x 0.07% bar. So the PRICE of a cold hold is cheap (~0.006% per event). It is not the blocker. +- Plain deferral (own row after the block's late events, POST=1) is frame-illegal: r_ at dim 3 is not inside hyper(P_t) (POSTFAIL 16 and 72). The only legal deferral is behind another cold read, which then widens r_. +## Q(B) capacity of coded pairs in cold-held targets (exact, cgx_x.py PROBE at the slots stage, all 112 non-selected pairs) +- Cold coded T edge for the pair ALONE: 112/112 OK (join of the two M slot frames, dim 5, lies in hyper(P_t) and hyper(P_u)). So a cold target hosts ONE coded pair. +- Warm (after selected loads): 0/112 (matches B248). +- SECOND pair on the same target, T edge join must contain whatever pair 1 left in y_t: pair-1 slot frame in partner hyperplane 0/224; both keys 0/224; selected loads 0/224; RAW halves (dim 3/4) 0/448. Independent of schedule and cold hold, because frames only grow. Max 1 T pair per target = the 56 selected pairs (B248 matching bound re-confirmed from a second angle). Hosting 2+ coded pairs: 0 targets. +- Single-M cold read (G7 form) needs the reader's cold slot AND a coded basis; the coded basis is the T edge, so it falls to the same 1-pair bound. S4 copies removable by the coded route: 0 of 112. +## Ledger (cold slots, 112 supply = one per target) +- Supply 112 (frame () first read of each y). Today: 112 spent on own-row reads (dim 2). +- Demand: S3 16 copies (need cold reads of P at consumers: 32 consumer blocks x targets; per CF: 4 targets); S4 112 (coded pairs: 0 feasible, 2nd T pair 0/224); MIXSEL 32 (B246). +- The exchange rate is cheap (lazy widening), so cold slots are NOT scarce for S3: the S3 family is limited by widening, not by supply. For S4 the wall is the one-T-pair-per-target matching, not slots. +## Closure +Cold-slot family for S4/coded pairs CLOSED (rate irrelevant: capacity 0). S3 branch (B245) alive: see side finding; needs chain.sh carry + audit_local + price1018. +Files: cgx_x.py (cf2 + DEFT/POST/GLAZY/PROBE), run.sh, pr.py/step0.py (pricing helper, uses B248/pricep.py), o logs in a scratch directory. diff --git a/research/end-cap-obstruction/evidence/B248-NOTES.md b/research/end-cap-obstruction/evidence/B248-NOTES.md new file mode 100644 index 0000000000..b6fe13e4ab --- /dev/null +++ b/research/end-cap-obstruction/evidence/B248-NOTES.md @@ -0,0 +1,16 @@ +# B248 NOTES - VERDICT: NO-GO at the Step 1 gate. 0 of 112 non-selected pairs feasible (value gate 112/112 passes, frame gate 0/112). No word built; no SHIP CANDIDATE. Nothing pushed. +Base: w1018 (c2b29430, κ 1.67166528321877e-3). Gate run on the 1-second generator rerun (gen/cgx_inst.py = cgx_leaver.py + pickle dump; gen/run.sh; gen/ana1.py) and spot-confirmed on w1018 (group y137/138/140/143, below). +## Step 0 (SYN-23C) mass identity +- Σr·H_r = 9·NH + 240·8 + 72 is per-helper-linear: a helper starts at dim 0 and ends FULL (dim 9), so it pays 9; NH = 504 − 3|FULLT| + |COPYL|. Locally, deleting a helper deletes its width (S4: 4-9). +- But globally the mass is pinned: price_profile.py requires m·W − Σ r·n = 2560 (m=73, W=7168). Pricing a "−helper" local profile with the frozen idle raises "rank deficit". Freed mass must reappear in the plan's idle (rank 48/16 climbs), so the objective is climb SHAPE (many H1 -> few big idle climbs), not mass. Client check: mass moved to idle as rank 48 (or 16) both price the same, bit-capped at 1.7304e-3. +- Exact pricing (pricep.py, step0.py, ceil.py; mass→idle H48): 2 width-9 helpers gone +0.30% (≈ +0.15%/helper); all 112 S4 helpers (704 mass: 384 H1, 64 H2, 32 H3, 24 H4) gone: κ=1.7304e-3 = +3.52% (bit cap, paper ceiling only). "Climbs reassigned" (no mass change): 0 by construction. Caveat: a helper-reduced word needs a re-planned owner map (width inventory changes), so exact κ is not obtainable with the frozen #1018 plan. +## Step 1 gate (exact, bitvector frames + rationals) +- 168 pairs = 56 selected + 112 non-selected; every target is in exactly 3 pairs (1 selected, 2 non-selected), partners = the other 3 targets of its tetrad. +- (i) value gate: the 2x2 pair matrix is ±1 and satisfies m10·m01 + m00·m11 = 0 for ALL 112 non-selected pairs (same identity the selected output_basis uses, z = −2·m10/m00). PASS 112/112. +- (ii) half-frame gate: the four raw-half frames (dim 3-4, join dim 6) are inside hyper(P_t)∩hyper(P_u) for 112/112. PASS (vacuous: M-mix already needs it). +- (iii) coded-frame gate (:247, join of y_t,y_u at the time of the T edge inside both hyperplanes): FAIL 112/112 in the generator order (y frames are dim 7 after the selected loads; 0/112 inside the partner hyperplane). Spot-check on w1018: y137,138,140,143 at B1248-1253: selected pairs (137,138),(140,143) PASS; all 4 non-selected pairs FAIL both ways. +- Reordering does not rescue it: a T edge acts on everything already loaded into y_t,y_u, so each target can host a T pair only while it holds nothing but that pair's own loads. For a second pair on a target, EVERY other load fails to lie in the partner hyperplane: other pair's both-key loads 0/448 (224 selected-pair, 224 non-selected), and single half frames 0/896. So at most ONE T pair per target = a perfect matching = the 56 selected pairs already used. Re-choosing SELECT cannot raise the count above 56 (each target in 3 pairs). +- Why the S4 copy is forced (pinning bound): a source read into y at its top frame is pinned to hyper(P_y); the 112 distinct ports give distinct hyperplanes, and the 224 non-selected y reads happen at dim ≥7 (y not cold). So ≥224 distinct pinned sources are needed = 112 M registers + 112 S4 copies, tight. #1005's trick worked only because its 6 y were COLD (frame 0) when the raw dim-2 halves were read. +## SYN-23B (half-K): selected pairs with exactly ONE FULLT key = 0 (24 both, 32 none, |FULLT|=8). Nothing to convert; extending K cells is the existing #781/#1005 line, not new. +## Blocking class: y frames already dim 7 before any non-selected load + one-T-per-target (matching) + register pinning at hyper(P_y). Not a value problem. Escape would need a different loading ORDER of whole targets (non-selected pairs while y cold) which contradicts the matching bound, or more K cells. Step 2 (leaversynth cell, splice, audit_local, κ) not run: no feasible pair to splice. +## Files: gen/ana1.py (gate), gen/info.pkl, climbs.py (per-register climbs of w1018), pricep.py/step0.py/ceil.py (pricing), look1.py/look2.py/rows.py (word inspection). diff --git a/research/end-cap-obstruction/evidence/B251-NOTES.md b/research/end-cap-obstruction/evidence/B251-NOTES.md new file mode 100644 index 0000000000..d8984d48da --- /dev/null +++ b/research/end-cap-obstruction/evidence/B251-NOTES.md @@ -0,0 +1,25 @@ +# B251 NOTES: DECOUPLER bound on k8 word #1018. VERDICT: frame conflicts ALONE force only 111 of 480 helpers (model-UB 113); NO class is shown closed. ship=false, no word built, nothing pushed. +Honest reading: the frame-conflict structure is real but weak. It pins ONE helper per Y target (111 ~ 112 targets), not the 480. The remaining gap (369) is not excluded by frames-of-delivery; B249's per-helper cascade (0/172 remat-removable feasible, 308 algebraically locked) is a 1-removal result, NOT a global bound. +## Statement proved (computed, exact on word1018; tools in this dir, all <3 s, CP-SAT 1 worker 60 s) +Scope: fixed targets/ports/Y end caps (hyperplane parity, dim 8); op frames E of the word taken as intrinsic (SYN-23); Y/src register identity fixed; section-B deliveries (926 Y+=carrier events, ev.py); value content = carrier row projected to non-helper+centre columns (proj.py; dropping helper dirt columns, 280 pure-gauge reads excluded = sound); a carrier keeps its value from first to last read of that incarnation (no rewrite inside); target-history lower frame L = join(E, earlier target frames); only the op's TARGET chain caps (carrier identity is replaceable, caps do not propagate through carriers). +Theorem (inc.py, mis.py): two read-incarnations a= max set of pairwise-incompatible incarnations among the 350 value-incarnations with no non-helper holder = 111 (CP-SAT OPTIMAL, bound 111). Greedy chain cover of the same set = 113, so the model is tight (111..113). Incl. non-helper holders: 124 registers (OPTIMAL) for all 592 incarnations. +Sub-results: (i) per projected value class the frame-conflict chromatic number is 1 for 548 classes, 2 for 22: frames force at most 22 value duplications (these are the S4-copy pins; B248's 112 S4 copies come from the 22 + singletons per target). (ii) conflict graph over 926 Y events has omega = chi = 112 = #Y targets, because carriers of different targets' dim>=7 reads cannot be shared (L_i not in hyper(P_j)), but same-target events chain. +## Per-class table (B235R classes; 480 helpers incl. 3 centres inside cold0/endFULL=240) +| class | actual | carries a real Y delivery | never read by Y in B | frame-FORCED (single-class-only incarnations) | bound | gap | gap x0.15% (paper) | +| cold0/endFULL | 237 | 164 | 73 | 0 | 111 total shared across classes (clique is hostable by cold0/endFULL, enter1, enter4/5) | 237 | - | +| cold0/endU | 48 | 0 | 48 | 0 | 0 | 48 | 7.2% | +| enter1/endFULL | 106 | 66 | 40 | 0 | 0 forced | 106 | - | +| enter1/endU | 30 | 30 | 0 | 0 | 0 | 30 | - | +| enter4/endFULL | 32 | 32 | 0 | 0 | 0 | 32 | - | +| enter5/endFULL | 24 | 24 | 0 | 0 | 0 | 24 | - | +| TOTAL | 477 (+3 centres) | 316 | 161 | 0 | 111 | 366-369 | 55% paper ceiling (not achievable; B248 bit-cap 3.52% for all 112 S4) | +Class-wise forcing is zero because every clique member is hostable by plain cold0/endFULL helpers (hostability = start in pre, post in end). Only the TOTAL bound (111) is meaningful; the 0.15%/helper value of the gap is a paper figure (B248: freed mass needs a re-planned owner map). +## Where the gap lives +- 161 helpers (73+48+40) are never read by a Y in B: A-phase scaffolding/rotations; delivery frame conflicts say nothing about them (bound 0, gap = all). +- 316 carriers serve 350+ helper-only incarnations; the model would let ~3 incarnations share a register (111-113 registers) but sharing needs a rewrite of the register between reads (ops not priced here, rotations/H+=H in B: 736 ops) and climbs frames monotonically: that is the real cost B249 saw, outside this relaxation. +- Frames-forced part sits in section B, high-frame (dim 7/8) Y reads, one pinned helper per target (111 of 112), plus 22 duplicated values. +## Not proved / caveats +No-rewrite and L=join(E,target history) assumptions (an alternative program could shorten E); 54 colour classes had pairwise-only compat but chain semantic (pre/post) was used in the final bound; section A and cleanup have no caps (all FULL) so they contribute 0; gauge (dirt) reads excluded. The bound is a LB on helpers, not on climb shape/mass: paid-climb LB not computed. +## Consequence +An op-multiset change at fixed targets/ports cannot go below ~111 helpers via frames, so frames do NOT close the remaining ~369; closing them needs the value/algebra side (rotation lock 305, remat cascade B249). Next test (not run): ILP over incarnation merging priced with the real rewrite-op frames (B249 sim) to see if >111 is forced. +Files: ev.py graph.py vals.py proj.py inc.py mis.py cls2.py fin.py (+ copied prog/feas/sim/scan/census). diff --git a/research/end-cap-obstruction/evidence/B252-NOTES.md b/research/end-cap-obstruction/evidence/B252-NOTES.md new file mode 100644 index 0000000000..706ec26d5f --- /dev/null +++ b/research/end-cap-obstruction/evidence/B252-NOTES.md @@ -0,0 +1,18 @@ +# B252 NOTES - VERDICT: with the true final y cap perp(P_t) (B253 caps.py) NO class is deletable. 0 of every class. Nothing to chain. +Before the caps check, the pre-cap gauge-forward gates (explicit frames + hyper(P_t) y reads, scalar identity) said more, but ALL of it is invalid (every word fails caps.py; base passes []). +## Pre-cap counts (gauge-forward, GLAZY=1, tool cgx_y.py = cgx_x + RO/WRC; S3 copies = 144 of 480; S1 = 224 block-local helpers, no copy ops; S4 = 112 slots) +Roles of the 144 S3 copies by consumer (W = consumer merge writes it, r = merge reads only, S = selected y load): SS16 rr32 Wr32 WW32 WS8 SW8 rS8 Sr8. +- rr 32 (G4's "64 value-redundant" = rr32+SS16+rS/Sr16): passes alone and together (NH 448), any stagger, GLAZY needed (no-GLAZY: frame violation). Caps: 0/32 singles OK (4 y fail each). +- SS 16 (B245 set, STAG hubs first, GLAZY, CF=0..15): NH 464, 32 widened explicit events (3->5). Caps: all y160..175 fail (B253). +- Wr 32 (one consumer reads only, other writes: delete copy, order merge of the reader before the writer; acyclic, no stagger needed): passes pre-cap, NH 448. Caps: 6/6 singles tried fail (4 y each), all-32 fails. +- Combos pre-cap: rr+Wr NH 416; rr+Wr+SS NH 400. Caps fail (y120.. etc). +- Blockers: WW32 (both consumers write: value needs the copy). WS/SW 16: assert 'second' (y cap at selected second load, needs second loads before merge). rS/Sr 16: 'second' alone; cold-first needs sender before S consumer but mutual 0246<->0257 style 2-cycles, so block-order impossible (needs event-level order, not done). +- S4 slots 112: not tested by run: each slot is written by the pair mixer (add(a,b),add(b,a)), so sharing breaks value; coded route 0/112 (B247). Count 0. +- S1: not copies (224 working registers); none. +## GLAZY enabling cost alone +No deletion: 0 widened events, 0 mass (profile identical to base, NH 480, mass 6312). Cost appears only with a deletion: SS16 = 32 events + mass +16 vs formula; rr32 = 0 explicit events but climbs (profile H6/H7 shifts, mass +48 vs formula). +## Price bands (pre-cap, w1018 convention of B247 mapping H6/H7->r H1, reproduces gall +1.34/+2.02/-0.35) -- MOOT given caps +gall SS16: H1 -0.35, H16 +1.34, H48 +2.02. rr32: -2.31/+0.78/+2.05. rr+SS48: -2.64/+2.14/+3.52. rr+Wr64: -4.15/+2.64/+3.52. rr+Wr+SS80: -4.47/+3.52/+3.52 (H48 cap is the same as 64; credit saturates). +## Flags (pre-cap only; run via q.sh/run.sh tag, env) +SS16: STAG=1 GLAZY=1 CF=0..15. rr32: GLAZY=1 RO=10,11,12,13,16-19,26-29,34-37,40-55 (idx in ROL). Wr32: GLAZY=1 WRC=Wr WR=all. All: STAG=1 GLAZY=1 CF=0..15 RO= WRC=Wr. +Fix needed for any of these: the final y cap perp(P_t) (y ends at 9 after the widened climb); a gate must include caps.py before counting. Not tried: re-planning y ladders / hosting the widened register elsewhere. diff --git a/research/end-cap-obstruction/evidence/B253-NOTES.md b/research/end-cap-obstruction/evidence/B253-NOTES.md new file mode 100644 index 0000000000..5aeb471aa0 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B253-NOTES.md @@ -0,0 +1,12 @@ +# B253 VERDICT: NO-GO. The STAG+GLAZY S3-copy deletion violates the y final cap perp(P_t) in the RAW gauge-forward word itself. y170 is a REAL construction violation, not a port-stage artefact. No chain word, no kappa, no SHIP CANDIDATE. +Method: copied B245 chain/wt to B253/chain/wt; gf.sh = patched gauge-forward only (env B245CF STAG GLAZY); prof.py = native gk_word.profile on any FULL-WORD; caps.py = non-asserting list of y regs ending outside perp(P_t); trace.py = per-register frame history. +- Baseline raw (STAG=0 GLAZY=0 CF none): profile OK, caps.py -> []. port0 on it passes. +- CF=0 raw (any STAG, GLAZY=1; NH 479, cgx says NVIOL 0): G.profile FAILS 'frame violation' reg 170 (cur full 9 vs perp(P_58)) BEFORE any port stage. caps.py: 4 y regs end outside perp(P_t): 170,171,174,175. +- All 16 copies (NH 464): profile fails at y160; ALL 16 y regs 160..175 violate (caps.py). +- Sweep (job 00_B253_sweep), each single copy CF=0..15, STAG=0/1: every one has exactly 4 violating y regs (STAG=0 only CF 0-7 are legal moves). No copy is clean. +- cgx_leaver's NVIOL checks hyper(P_t)/explicit-frame ops, NOT the final perp(P) cap that gk_word.profile enforces. So the B247 "0 y-cap violations" is a gap in the check. +- Mechanism (y170 = target 58, CF=0): deleting the copy makes the shared packet register 283 serve its readers directly. 'add 124 -= 283/2' moves from B12 (283 dim 2) to B245 (dim 4); 283 then grows 5->7->8 (reads by 299, 379). Helper 591 += 283 enters at dim 7 (base: 592 at dim 5), 'add 170 -= 591/2' needs F >= cur170 + cur591 = dim 9 > perp(P_58) (dim 8). Same at 'add 171 -= 283/2' (B929) and via 379 (y174), 598 (y175). Frames only grow, and the deleted copy was exactly what absorbed that growth. +- Lazy widening is the minimal legal frame, so this is forced by the order, not by over-widening; the B245REPAIR failure (reg 170) is this same violation, merely surfaced at port0's profile call. +Not run: ports 1-3, cold44, audit_local, exact kappa (no legal word). idle/owner assumption: moot (width_inventory untouched since no word); frozen #1018 IDLE would need re-plan if widths ever change. +Revival would need a redesign so the packet registers' late readers (y58,59,62,63 etc. per CF) see a frame inside perp(P_t), e.g. keep a copy for those readers only; the price then loses most of the +1.3..2.0% credit (4 of 16 y-groups per copy). +Files: gf.sh port.sh prof.py caps.py trace.py dif.py sweep.sh; out/g_cf0, out/g_all16, out/g_base (raw words), out/p0_cf0r/PRE.json.gz (repaired, shows y170 history). diff --git a/research/end-cap-obstruction/evidence/B254-NOTES.md b/research/end-cap-obstruction/evidence/B254-NOTES.md new file mode 100644 index 0000000000..0185d998c5 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B254-NOTES.md @@ -0,0 +1,17 @@ +# B254 NOTES: the 161 never-read-by-Y-in-B helpers on k8 word #1018. VERDICT: NONE REMOVABLE. 96/161 rotation-locked (exact algebra), 65/161 algebraically removable but 0/65 frame-feasible (single, joint-65, joint-53). No splice, no kappa built; ship=false, nothing pushed. +Tools (this dir, single process <10 s): set161.py (the 161 = non-centre helpers with no Y-target event in B/gauge; matches B251 73+48+40), roles2.py, rm161.py (B249 scan.track algebra), sim161.py (B249 lazy-frame climb sim, singles + closures), joint.py, ops.py (exact op listing). Baseline sim mass 5586 reproduced. +## Role table (161 = 4 families, exact) +| family | n | class | what it is | removable? | +| F1 C-glue + A-rotation | 49 | cold0/endFULL | A-phase gauge rotations (scale + h<->x rotation ops in A), read by precondition-compensation C ops (Y += h/4 style dirt cancel, ~32 Y rows each, e.g. h225), cleaned in L | NO: rotation-locked (read-by-source) | +| F2 C-glue, no rotation | 24 | cold0/endFULL | same C compensation role without A scale: 12 alg-OK (h408: A copy chain r92->h, B574/B986 feeds helper 572/376, E98 undo, L cleanup), 12 rotation-locked | 12 alg-OK but frame-infeasible (B574: F dim 3 not inside parity end of target helper chain; 4 of them B574/657/595/615), 12 locked | +| F3 A-scaffold rotations | 35 | cold0/endU | A-only gauge rotations/block totals (h273: ~40 A ops, dims 0-4, scales), E early-cleanup write-back; no real B value | NO: rotation-locked (35/35) | +| F4 B-relay copies | 53 | 13 cold0/endU + 40 enter1/endFULL | NOT A-phase: a copy h+=s at B frame 3, read by ONE helper x at frame 6 (x is a real Y carrier, so h is a 2nd-tier decoupler invisible to B251's Y-delivery view), undone in E/L; A reads only frame-0/1 gauge (e.g. h500: B768 h+=r310, B976 r262+=h, E102 undo; h474: A1239 gauge, B727 h+=r279, B982 r456+=h, L undo chain) | alg-OK (53/53, no rotation) but frame-infeasible 53/53 | +(sum 49+24+35+53=161; 1 cold0/endU Brelay+Awr rotation-locked is counted in F3.) +## Q2 result (exact, B249 sim) +- Algebra: 65 pass (12 F2, 13+40 F4); 96 locked (49 F1, 12 F2, 35 F3). +- Remat of each of the 65 (reader reads source directly): 0 feasible. F4: first violation at B1432-1728, a Y target (regs 112-219) raised to F dim 9 > end 8 (the reader x now carries s's later dim-7/8 frame into a Y partner; identical mechanism to B249: copy = frame decoupler). F2 four cases: F dim 3 not inside parity end of a Y-chain reg (B574/595/615/657). +- Closures (recursive remat, cap 16) over all 161: 158 bail, 3 closed sets all infeasible. Joint removal of all 65 / all 53 F4: infeasible at first op (B574 / B1432). So no family can be carried by an existing source/target/centre register at a frame it already passes through: those registers have climbed to a different frame by read time (needs reorder of the register's own climb = SYN-23 reshuffle, or Y frame 9 = SYN-23A). +- Consistent with B251: frames force ~111 helpers; these 161 are NOT dead weight: 53 are Y-adjacent relays, 108 are rotation/compensation scaffolding with algebraic locks. +## Q3: nothing to splice (no feasible candidate), so no value replay, audit_local or kappa; ship bar 1.672654541898561e-3 untouched. +## Blocker / next +The only non-excluded route left for F4 (53, nominal ~-8 mass each) is escape (1)/(3) of B249: reorder s's climb after x's read, or a join-frame relay; both change op order. Not tried (time box). F1/F3 need a different gauge construction (rotation lock), not removal. diff --git a/research/end-cap-obstruction/evidence/B255-NOTES.md b/research/end-cap-obstruction/evidence/B255-NOTES.md new file mode 100644 index 0000000000..a59645fecc --- /dev/null +++ b/research/end-cap-obstruction/evidence/B255-NOTES.md @@ -0,0 +1,17 @@ +# B255 VERDICT: NO-GO / nothing to build. Cross-block value sharing/unification census = 0 at end of A (w1018) and at gauge-forward; the only legal-by-value sharing candidates (16 S3 sel x4 packets) are the B253-killed set (y final cap perp(P_t)). No word, no kappa, no SHIP CANDIDATE, nothing pushed, no heavy job. +Tools (this dir, single process, seconds): cen1..cen6.py (exact row census), cgx_x.py (B247 copy + NOORD/ORDP/DUMP env hooks), run.sh, prog.py/feas.py (B249 copies). +## Census, w1018 (B249 prog; register value = row over DATA coords <224, helper coords projected out since helper inputs are 0) +- Raw rows over all coords: all 704 rows linearly independent (invertible word), so "equal" only makes sense on data coords. +- End of A (P+C+A): 256 helpers hold zero data; 56 equal pairs (src/helper, x0+x3 style), ALL one-block; every nonzero row is supported in ONE block except 8 centres (support 56 over 7 blocks). Cross-block equal / scalar-multiple / any small rational combination: 0 (disjoint block supports are linearly independent; only the 8 centres bridge blocks). +- Ever-equal pairs during A+B (transient, time-resolved): 802 = A 546 (476 equal + 70 proportional; 1-block; scaffold/rotation, B254 rotation-locked) + B 256 (144 one-block relay, 112 two-block rows = S3/S4 packet/slot copy with its source). Equal at one instant only; both sides written later (G1: 0 value-redundant on w1018). +## Census, gauge-forward end-of-encode (cgx dump, 464 regs) +- 82 proportional classes (50 pairs, 32 triples; 38 equal, rest scalar multiples), ALL single-block (x/y/h own-row copies and gauge scaffold). Support: 99 x + 229 h single-block, 8+8 two-block, 8 centres + 3 h over 7 blocks, 56 y single, 48 y over 3 blocks. Cross-block: 0. +- Packets: each packet (block c, pair p, eps) is read by exactly 2 consumer blocks (B121 degree-2 bound), so cross-block sharing already exists at degree 2; the copy exists only as frame decoupler. Copy families: S3 (168 keys - FULLT; 148 fresh helpers) + S4 slot copies 112 = 268 (B172). +## Legal sharing +- Value-legal (read-only packet at both consumers): 16 candidates ONLY, even with NOORD=1 (no ordering rule): hubs (0123),(4567), keys x pairs x +-. Any block order cannot add more (G3/G4 geometry; non-selected keys' packets are mutated by the M add). +- Frame-legal with STAG+GLAZY: cgx NVIOL 0 for all 16 (reproduced, NH 464), but B253 (caps.py/gk_word.profile) shows the y final cap violated: single copies 4 y regs each, all 16 -> y160..175. => legal sharing count = 0/16. Per-copy fix (keep a copy for the 4 late y groups) removes most of the credit. +- S4 (112): reader-climbed M breaks mixer caps (B247/G7 0/112); a read-only share needs undo of the pair-1 mix (extra ops, not modelled). Unification of src/helper equal pairs (A, 56+) = B249/B254 remat/rotation locks (0 feasible). +## What differs from earlier kills +- B121 (no 4-set shares rank-1 content over >=4 blocks): still true and is why there is no census mass; what is new is only degree-2 sharing with a cold-slot read, which B121 never forbade (it was the packet copy, not the content). Result is the same wall one level down. +- B187 (cross-part redirects illegal, donor at dim 6 vs copy dim 3): here the donor is the packet itself at its producer frame; stagger/cold slots fix the READ legality (cold target) but not the producer register's later growth into other readers' frames (mechanism of B253). +- B190 (dirt invisible to port oracles): same trap realised: cgx NVIOL is blind to the final perp(P_t) cap; use B253/caps.py + prof.py. Heavy slots untouched. diff --git a/research/end-cap-obstruction/evidence/B256-NOTES.md b/research/end-cap-obstruction/evidence/B256-NOTES.md new file mode 100644 index 0000000000..1e117e932f --- /dev/null +++ b/research/end-cap-obstruction/evidence/B256-NOTES.md @@ -0,0 +1,17 @@ +# B256 VERDICT: NO-GO (provisional). Gate fails: caps.py never reaches [] for CF=0 (NH 479). No word, no chain, no audit, no kappa, no SHIP CANDIDATE. Nothing pushed. +Gate = G.profile + caps.py (B253) on a rebuilt FULL-WORD; every candidate below was value-checked (exact rationals, final rows of all 703 regs identical to B253 g_cf0) before caps. +## What works (reality gate, CF=0 only, tools lib.py vr.py plan.py e*.py) +- (i) Version reconstruction is value-exact and has NO frame floor per operand: plan.expand walks 591's snapshot read (B585) back to 283v1+281+299+297, every term with a window inside perp(P58) (all end at dim 2, before the B245/B246/B271/B272 drags). Same for y171/174/175 reads (5-7 terms each). B252's S3 set g_all16: 16 violators, 8-21 terms each, no single-read floor. +- Pair alone is fine: absorbing {283,281} into 591 with y124(t12)/y125(t13) reading 231/283/281 has 128 legal orders (pair.py). +- (ii) Hoisting the non-capped readers (B245,246,271,272 to before the absorption) is value-legal; with moved/new ops lazy and the 591 chain re-lazied, y170 and y175 become clean. Remaining violators: 124-127,148-151 (the hoisted readers' partners) plus 171,174. Strict card rule (keep every other explicit frame) cannot pass at all: B943-945 keep F8/F9. +## Why NO-GO: the TRUE FLOOR (named operands) +1. Cross-pair join. 591 must hold all four terms, so its frame is F283+F281+F299+F297, and every term is dragged to it at absorption. Individually each F is in perp(P58) but F281 not in perp(P12), F283 not in perp(P13), F299 not in perp(P37), F297 not in perp(P36). The readers y124,y125,y148,y149 (and later 299v2 by y125 B411, 283v2 by y149 B418, 483 by y124, 471 by y148) need frames inside those perps. Exhaustive DFS over ALL legal orders of the 20-21 cluster ops (registers 124,125,148,149,231,283,281,299,297,471,483,591; precedence from value deps; sim = exact frame joins from the real word at B239): 0 orders for all 4 absorption variants (pre/post W1, pre/post W2); log jobs 00_B256_dfs*. Same model WITHOUT the 591 cap has solutions, so the conflict is exactly "591 collects both pairs inside perp(P58)/perp(P63)". Dropping any single y check does not rescue it. +2. y171/y174 have no private accumulator: reads 171 -= 283/2, 174 += 379 sit after the Hadamard pair (168,171) and (173,174) (B759-764: (a,b)->(a+b,a-b)). Adding the version terms early to y171 needs the compensation 168 += d/2, 171 -= d/2; every term (283,281,299,297,379) has frame NOT in perp(P56) and NOT in perp(P61), so partners y168/y173 break. Routing through 591 would import e_591 dirt (needs a new cut/compensation op = model change). +Operand floor (card wording): 281/283 vs 299/297 cross-pair, and y168/y173 partners for 171/174. +## Table (CF=0 single deletion; B252 SS16/rr32/Wr32 raw words not regenerated here, only g_all16 expansion above) +deletable after caps: 0 of 1 (CF=0). ops added if pursued: 4 per 591 snapshot (net +3), +about 40 re-lazied frames; widened events not counted (no passing profile). Blocker class: frame algebra (cross-term join), not tooling. +## Kill protocol (provisional) +Assumptions: single accumulator per capped helper; frames lazy-minimal; value map exact; CF=0 is representative (B253 sweep: all 16 copies show the same 4-violator pattern). +Escape routes: (E1) split accumulation: two accumulators (pair A, pair B) so terms only join inside their pair, y170 reads both. Needs +1 helper per group (width_inventory change -> owner re-plan; B253 estimates it eats most of the +1.3..2.0% credit). (E2) keep a copy only for the pair whose readers conflict (299/297), delete the other: halves the gain. (E3) new cut/compensation op to let 171/174 read 591 (dirt term), model change. +Rescue check: re-run dfs.py with a second accumulator register added to the sim (ops b* target 598b); if feasible, price needs +1 helper per group. +Files: lib.py vr.py (relax/lazy/caps/prof/value), plan.py (expand, windows), pair.py, cluster.py, cluster2.py, dfs.py (VA/VB/DROP env), e1-e7.py, leaves.py. diff --git a/research/end-cap-obstruction/evidence/B257-NOTES.md b/research/end-cap-obstruction/evidence/B257-NOTES.md new file mode 100644 index 0000000000..b507f0de5f --- /dev/null +++ b/research/end-cap-obstruction/evidence/B257-NOTES.md @@ -0,0 +1,15 @@ +# B257 NOTES: SNAPSHOT HOIST on w1018. VERDICT: NO-GO (provisional). 0 of 172 frame-feasible under hoist or slide; ship=false, no splice, no kappa (nothing to price). Bar #1087 untouched. +Tools (this dir, single process, 7-40 s): hoist.py (each x+=a*h becomes x+=a*c*s at each h-write time, window test, B249 lazy-frame sim), slide.py (same but any position tau in [last read of x, first write of s] ), cls.py, det.py. Baseline sim mass 5586 reproduced (B249 sim.py). +## Counts (B249 172 alg-OK, w1018) +- Window ok (no read of x between copy write and x read; x scale rescaled): 64/172. Fails: 108 = x is read in the window (non-commuting). +- Frame ok: 0/64 (E = write frame, reader frame, or empty/lazy: identical). 62 die at a B-section Y op (F dim 9 > end 8, or F not in parity end), 2 at "target level" (y2, y42: a hoisted op into a Y/target register before B). +- Value replay of hoisted programs (h500, h474, h472 sampled): 0 rows differ, so the algebra is exact; only frames kill it. +- Slide generalization (any tau, s unwritten since copy write, x unread after tau): 86 candidates fail position for BOTH reasons (x read AND s written in the window); 0 positions left on 86. So the "sink" half (move s's other writers/readers) is what is missing. +- First violation class (172 -> 0): Y target forced to dim 9 > end 8 in section B, 169/172 placements; 3 at target level. Same class as B249/B254. +## Mechanism (why hoist does not escape) +Joining x (frame dim 3, its own) with s (dim 3, different subspace) at the copy time already puts both at F=join (>3). From then on s carries x's frame: h474, x=456 s=279: baseline s=7 at B1432, after hoist s=8, Y139 += 279 needs F 9. The SPEC rule climbs the READ operand too, so reading s from x at ANY time after s has a lower frame than x's is a drag of s. Hoisting changes when, not whether. Only a time where x's frame is nested in s's (or vice versa) is free; none exists among the 64 (lazy sim with E=[] is the minimal frame). +## Kill protocol (provisional) +Assumptions: single-helper removal, ops order otherwise fixed, sim = B249 lazy-frame model, s unmodified for tau slides; joint set and CP-SAT not run since singles = 0 (<7 GO bar). +Escape routes: (1) hoist+sink joint: reorder s's writers so s is unwritten and x unread (86 'both'); changes op order for ~dozens of ops, fixed-multiset searches B11/B103/B108 do not transfer but frames were not the only wall; (2) slide with compensation (s written in window: x += a(s_tau - corrections), adds ops, loses mass); (3) copy at the Y-partner frame (join-frame relay, B249 route 3). +Rescue check: first violation is s-drag into Y at B1432-1728, identical across 62/64; no instance is within one frame of feasible. +No audit_local, caps.py, price1018 run (no candidate). diff --git a/research/end-cap-obstruction/evidence/B258-NOTES.md b/research/end-cap-obstruction/evidence/B258-NOTES.md new file mode 100644 index 0000000000..fa24098e2d --- /dev/null +++ b/research/end-cap-obstruction/evidence/B258-NOTES.md @@ -0,0 +1,48 @@ +# B258 VERDICT: SPEC / FORCED. By the letter it is MIXED, but both convention slivers are inert on every window, so nothing is unlocked. KPR5 material is in evidence/KPR5-endcap.md. +"y_t ends ⊆ perp(P_t)" is three rules stacked. Only the first is the swap contract. None of them is the ≥ 1 unit charge, which is the price of breaking the cap, not a rule. +1. SPEC: the sink label of Y_t is a complement hyperplane of the source label ⟨u_t⟩. + - Complex route operator C_{U_sink(Y)} C_{U_src(X)}^{-1} must equal C^{⊗m} up to free per-role Z/phase wrappers: upstream/build/sections/03-motifs.tex:625-668 (Prop complex-motif-interface) and 05-layers.tex:141-154. + - Bit analogue: 04-swap.tex:117-121 (eq finite-shear-contract), 03-motifs.tex:492-497, terminal table :235-243. + - Legal sinks are exactly w^⊥ with w·u = 1, at zero rank. A non-complement costs rank n-2 (format-limits-corrected C.3 gate 0). +2. CONVENTION, but pinned: the choice w_t = u_t, which is the literal perp(P_t). + - Census row 6, class C (research/format-limits-corrected/README.md B.2; re-checked on origin/main ba82555c, unchanged). + - Lemma R (C.3) forces w_t = u_t whenever the drop-free taint of t spans u_t^⊥ (112/112 targets on #531/#569/#571). +3. CONVENTION, but priced: the last gate frame of y must lie inside the sink, i.e. no descent edge (nesting, census row 3, "C (priced, not forbidden)"). + - A non-nested final edge G→S costs d = dim G + dim S − 2 dim(G∩S). + - Reader descents are registered dead: R39-H, R40-C, J24-C1 (≈ −5.5%/call). +Verifier enforcement, for targets only. Helpers get arbitrary ends via helper_final (#593/#599): +- gk_word.py:117 does the final climb of r ∈ [V, 2V) to perp(P[r−V]); the assert at :102 raises 'frame violation'. +- gk_word.py:116 climbs BOTH ADD operands. This is the read drag: census row 1, SPEC, 03-motifs.tex:157. +- gauge44-slots/independent/audit_local.py:115 sets end = perp(p) per port; :122 checks 'frame not monotone'; :142 does the final climb; :116 helper_final is helpers only. +- freeze_spec.py and invoice_allcold.py carry no separate target-cap rule. +"≥ 1 unit/target" is the minimum price of violating (1)+(3), and it is rank-intrinsic (B29/B35). A FULL sink forces M_in(X_t) = 0: X loses its port dimension, +1 rank. A descent FULL→perp costs d = 1. Either way it is +1 rank per call on the target. + +## Decisive fact: every violator ends FULL +Measured on all 84 B252/B253 gauge-forward words (endcap.py; b252_caps.txt): +- every violating y ends at dim 9 = FULL, with u_t ∈ frame (u_t inside the final frame) in 100% of cases; +- so 0 violators fit ANY complement hyperplane, and relaxing sliver (2) unlocks nothing, independently of Lemma R; +- each violator is exactly 1 dimension out (dim − dim(frame ∩ perp) = 1). +The only remaining relaxations are "FULL end + unit" or "descent", and each costs 1 rank unit/call. +Violator counts: single S3 copy 4; SS16 16; rr32 48; Wr32 48; rr+SS48 64; rr+Wr64 48; rr+Wr+SS80 64. + +## Prices +Exact unit price: kap_free.py runs the package's own price_profile.py (two exact engines + outer47 + PR589 bit). The only change is that the 2560 deficit pin is replaced by the honest deficit; nothing else in the package is edited. Base κ = 1.67166528321877e-3, which reproduces the package. +- +1 rank-1 local unit ×72 calls: κ 1.624537144e-3, −2.819%. +4: −11.275%. +16: −45.061%. +32: −90.02%. ≥ about 36: certify fails (no saving left). +Window bands = B252 pre-cap band + exact charge, first-order: + +| window | pre-cap band, reproduced exactly by relax_price.py (H1 / H16 / H48) | ≥ 1 unit per violator | ≥ 2 units per violator | +|---|---|---|---| +| single S3 copy (4 y) | −0.01 / +0.05 / +0.07% | ≈ −11.2% | ≈ −21.5% | +| SS16 (16 y) | −0.35 / +1.34 / +2.02% | ≈ −43% | κ ≈ 0 | +| rr32, Wr32, rr+Wr64 (48 y) | ≤ +3.52% | κ → 0 (no saving) | κ → 0 | +| rr+SS48, all 80 (64 y) | ≤ +3.52% | κ → 0 (no saving) | κ → 0 | + +- The ≥ 2 units column applies when the 8→9 climb, which the band convention sends to idle, is also charged honestly. +- WARNING: B252's band convention lets idle absorb added TARGET rank. That is how relax_price.py printed only −0.3% for the 80. It is wrong for data registers (B15 item 5: data-carrying registers cannot be hosted). Use the deficit-honest unit. +Break-even: the best pre-cap credit is +3.52%/80 = 0.044% per deleted copy, and the charge is 2.82% per violating y, so a deletion pays only if it breaks ≤ 0.016 y caps per copy. +- B255 (16 hub packets) and B244 partner caps are the same mechanism and price, so the same kill applies. +- S4 (0/112) is blocked by VALUE (the pair mixer), not by the cap. The relaxation does not touch it. + +No legality case is written (part c): there is no convention whose relaxation is free. The CONVENTION bar fails at step 2: there is no soundness argument for an uncharged FULL end, by B29/B35, and the exact price above confirms what that unit costs (−2.819% per unit per call). +Escapes that remain (all SPEC-legal, none touching the cap): version reconstruction (B256); drag reordering (B256/B257); snapshot hoist (B257); a decoder/motif redesign that changes the u_t's (Lemma R scope). +Files: endcap.py, relax_price.py, kap_free.py, b252_caps.txt (cards/B258/). Nothing was pushed, no SPEC or HEADROOM files were touched, and no heavy jobs were run. diff --git a/research/end-cap-obstruction/evidence/B258-b252_caps.txt b/research/end-cap-obstruction/evidence/B258-b252_caps.txt new file mode 100644 index 0000000000..4fb4d4f344 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B258-b252_caps.txt @@ -0,0 +1,84 @@ +o_b2 R 480 viol 0 dim9 0 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 0 [] +o_base R 480 viol 0 dim9 0 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 0 [] +o_g0 R 480 viol 0 dim9 0 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 0 [] +o_g1 R 480 viol 0 dim9 0 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 0 [] +o_gall R 464 viol 16 dim9 16 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 16 [(160, 9, 8, True), (161, 9, 8, True), (1 +o_lst R 480 viol 0 dim9 0 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 0 [] +o_mm0 R 448 viol 48 dim9 48 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 48 [(112, 9, 8, True), (113, 9, 8, True), (11 +o_mm1 R 448 viol 48 dim9 48 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 48 [(112, 9, 8, True), (113, 9, 8, True), (11 +o_mmcf R 432 viol 64 dim9 64 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 64 [(112, 9, 8, True), (113, 9, 8, True), (1 +o_rl R 480 viol 0 dim9 0 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 0 [] +o_s0_10 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(122, 9, 8, True), (123, 9, 8, True), (126 +o_s0_11 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(120, 9, 8, True), (121, 9, 8, True), (124 +o_s0_12 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(145, 9, 8, True), (147, 9, 8, True), (149 +o_s0_13 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(144, 9, 8, True), (146, 9, 8, True), (148 +o_s0_16 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(146, 9, 8, True), (147, 9, 8, True), (150 +o_s0_17 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(144, 9, 8, True), (145, 9, 8, True), (148 +o_s0_18 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(121, 9, 8, True), (123, 9, 8, True), (125 +o_s0_19 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(120, 9, 8, True), (122, 9, 8, True), (124 +o_s0_26 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(114, 9, 8, True), (115, 9, 8, True), (118 +o_s0_27 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (113, 9, 8, True), (116 +o_s0_28 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(153, 9, 8, True), (155, 9, 8, True), (157 +o_s0_29 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (154, 9, 8, True), (156 +o_s0_34 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(154, 9, 8, True), (155, 9, 8, True), (158 +o_s0_35 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (153, 9, 8, True), (156 +o_s0_36 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(113, 9, 8, True), (115, 9, 8, True), (117 +o_s0_37 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (114, 9, 8, True), (116 +o_s0_40 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(114, 9, 8, True), (115, 9, 8, True), (116 +o_s0_41 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (113, 9, 8, True), (118 +o_s0_42 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(154, 9, 8, True), (155, 9, 8, True), (156 +o_s0_43 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (153, 9, 8, True), (158 +o_s0_44 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(186, 9, 8, True), (187, 9, 8, True), (188 +o_s0_45 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(184, 9, 8, True), (185, 9, 8, True), (190 +o_s0_46 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(210, 9, 8, True), (211, 9, 8, True), (212 +o_s0_47 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(208, 9, 8, True), (209, 9, 8, True), (214 +o_s0_48 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(153, 9, 8, True), (155, 9, 8, True), (156 +o_s0_49 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (154, 9, 8, True), (157 +o_s0_50 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(113, 9, 8, True), (115, 9, 8, True), (116 +o_s0_51 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (114, 9, 8, True), (117 +o_s0_52 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(185, 9, 8, True), (187, 9, 8, True), (188 +o_s0_53 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(184, 9, 8, True), (186, 9, 8, True), (189 +o_s0_54 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(209, 9, 8, True), (211, 9, 8, True), (212 +o_s0_55 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(208, 9, 8, True), (210, 9, 8, True), (213 +o_s1_10 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(122, 9, 8, True), (123, 9, 8, True), (126 +o_s1_11 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(120, 9, 8, True), (121, 9, 8, True), (124 +o_s1_12 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(145, 9, 8, True), (147, 9, 8, True), (149 +o_s1_13 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(144, 9, 8, True), (146, 9, 8, True), (148 +o_s1_16 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(146, 9, 8, True), (147, 9, 8, True), (150 +o_s1_17 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(144, 9, 8, True), (145, 9, 8, True), (148 +o_s1_18 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(121, 9, 8, True), (123, 9, 8, True), (125 +o_s1_19 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(120, 9, 8, True), (122, 9, 8, True), (124 +o_s1_26 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(114, 9, 8, True), (115, 9, 8, True), (118 +o_s1_27 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (113, 9, 8, True), (116 +o_s1_28 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(153, 9, 8, True), (155, 9, 8, True), (157 +o_s1_29 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (154, 9, 8, True), (156 +o_s1_34 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(154, 9, 8, True), (155, 9, 8, True), (158 +o_s1_35 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (153, 9, 8, True), (156 +o_s1_36 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(113, 9, 8, True), (115, 9, 8, True), (117 +o_s1_37 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (114, 9, 8, True), (116 +o_s1_40 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(114, 9, 8, True), (115, 9, 8, True), (116 +o_s1_41 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (113, 9, 8, True), (118 +o_s1_42 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(154, 9, 8, True), (155, 9, 8, True), (156 +o_s1_43 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (153, 9, 8, True), (158 +o_s1_44 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(186, 9, 8, True), (187, 9, 8, True), (188 +o_s1_45 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(184, 9, 8, True), (185, 9, 8, True), (190 +o_s1_46 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(210, 9, 8, True), (211, 9, 8, True), (212 +o_s1_47 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(208, 9, 8, True), (209, 9, 8, True), (214 +o_s1_48 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(153, 9, 8, True), (155, 9, 8, True), (156 +o_s1_49 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(152, 9, 8, True), (154, 9, 8, True), (157 +o_s1_50 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(113, 9, 8, True), (115, 9, 8, True), (116 +o_s1_51 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(112, 9, 8, True), (114, 9, 8, True), (117 +o_s1_52 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(185, 9, 8, True), (187, 9, 8, True), (188 +o_s1_53 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(184, 9, 8, True), (186, 9, 8, True), (189 +o_s1_54 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(209, 9, 8, True), (211, 9, 8, True), (212 +o_s1_55 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(208, 9, 8, True), (210, 9, 8, True), (213 +o_w0 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(138, 9, 8, True), (139, 9, 8, True), (142, 9 +o_w11 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(128, 9, 8, True), (130, 9, 8, True), (133, +o_w17 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(136, 9, 8, True), (138, 9, 8, True), (141, +o_w23 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(120, 9, 8, True), (122, 9, 8, True), (125, +o_w31 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(176, 9, 8, True), (178, 9, 8, True), (181, +o_w5 R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 4 [(136, 9, 8, True), (138, 9, 8, True), (140, 9 +o_wr R 448 viol 48 dim9 48 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 48 [(120, 9, 8, True), (121, 9, 8, True), (122 +o_wr0 R 448 viol 48 dim9 48 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 48 [(120, 9, 8, True), (121, 9, 8, True), (12 +o_wrmm R 416 viol 48 dim9 48 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 48 [(120, 9, 8, True), (121, 9, 8, True), (1 +o_wrmmcf R 400 viol 64 dim9 64 complement-hyperplane-possible(u not in frame) 0 sum(dim-dim∩perp) 64 [(120, 9, 8, True), (121, 9, 8, True), diff --git a/research/end-cap-obstruction/evidence/B259-NOTES.md b/research/end-cap-obstruction/evidence/B259-NOTES.md new file mode 100644 index 0000000000..118556e003 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B259-NOTES.md @@ -0,0 +1,21 @@ +# B259 VERDICT: LOCAL-PRICE NO-GO. Dimension room exists on paper (dim ∩u⊥ = 7 pair / 6 triple / 5 quad), but a second encoding must re-frame ~100 mass for one copy deletion (credit ≈ 0.08-0.13%); puncture pairs one coord-pair of a reader triple at most. Nothing built, nothing pushed, no heavy jobs. (Local-price: op-excess is a first-order proxy, not an exact kappa.) +Tools here: an1..an6.py (single process, seconds), on B232/word1018 ports + B253/out/{g_base,g_cf0,g_all16} words. +## (1) dim(∩ u_t^⊥), 112 ports, 14 blocks of 8 (t//8; each block's ports span rank 4) +- Ports are distinct, odd weight. Cross-block pairs (5824): dim 7 always. Triples across 3 blocks (186368): dim 6 always. Quads across 4 blocks (4.1M): dim 5 (4,080,384) or 6 (19,712). +- Union of whole blocks: 2 blocks rank 6 (dim 3), 3 blocks rank 7, 4 blocks rank 8 (924) or 7 (77). So the algebra leaves room; the cap is the frame, not the dimension count. +- Real reader sets (base word, regs read directly by y of >= 2 blocks): 136 regs, 104 with dim I=7, 32 with dim 6. Their FINAL frame exceeds ∩perp by 1 (80), 2 (56): 0/136 fit already. +## (2) Second encoding price (needs every op frame on the shared reg inside I_T and the cascade) +- Op-excess = sum over ops on s of dim F - dim(F∩I_T). Over the 136 multi-block regs: min 1 (32 regs), median 3, max 13; 0 regs with 0 excess. Excess-1 regs are only the 2-block, dim-7 ones. +- The actual deletion (g_cf0, CF=0): packet 283 (readers y12,y37,y59, blocks 1,4,7, dim I=6) op-excess 22; neighbours 1:14, 315:14, 379:16, 171:8, 174:8, 591:4, 598:3, 299:5, others 1-2. Sum ≈ 105 mass for ONE copy (4 y violators). All-16 case: 230-290 mass per 4-y group. +- Rate: helper w9 = +0.15% (0.017%/mass); 1 unit x72 calls = -2.82% (0.039%/72-call mass). So 105 mass ≈ 1.8-4%. Credit per deleted copy = 1.3-2.0%/16 = 0.08-0.13% (B258 break-even 0.044%/copy at all-80). Ratio ≈ 15-50x against us. +- Cheapest legal "second encoding" is the existing one: keep a copy for the late readers (cost ≈ the helper, net ≈ 0). No encoding cheaper than the copy found; the copy is already the minimal-rank second encoding. +## (3) Puncture (merge two of the 9 source lines) +- Merging coords i,j makes ports differing by e_i+e_j coincide: cross-block weight-2 pairs 776 (32 classes, <=28 pairs each; 4 in-block 100). Such a pair gets dim I=8 (= single cap). +- But reader sets are triples (e.g. 12/37/59: pair weights 4,4,2; 59/68/109: 2,4,4; 0/41/62: 4,4,6): one merge fixes at most one pair, triple stays dim 7 vs final frame 9. Also changes h 9->8 (new family; ports collide, Lemma R / distinctness untested). Not priced beyond that: LOCAL. +## Priced bound +Second-encoding sharing for a hub copy costs ≳ 1.8% vs credit ≤ 0.13%/copy; even excess-1 two-block regs (32/136) cost 0.02-0.04% each but are already shared and are not copy candidates (B255: 16 legal-by-value, all killed by B253). +## Escapes (>=3) +1. Reader-set aware decoder: choose u_t so a hub's readers are collinear/low-rank (pairs weight 2 only 776/5824; needs 3-4 reader sets on weight-2 chains) - changes u_t, outside Lemma R scope. +2. Reorder so shared regs' large-frame ops (dim 7-9, late B ops 927-930) move after all reads (B256/B257 drag reordering). +3. Version reconstruction instead of a register (B256), no ∩ constraint on a fresh frame. +4. Puncture/h=8 family redesign with asymmetric pairing (C.6 says none at window<=9). diff --git a/research/end-cap-obstruction/evidence/B260-NOTES.md b/research/end-cap-obstruction/evidence/B260-NOTES.md new file mode 100644 index 0000000000..7375a64d29 --- /dev/null +++ b/research/end-cap-obstruction/evidence/B260-NOTES.md @@ -0,0 +1,33 @@ +# B260 VERDICT: NO-GO at the design gate. The savings bound is 0 helpers, i.e. ≈ 0% (< +0.5%), at the fixed multiset and also under port-aligned rebuild. No word was built, so there is no κ and no SHIP CANDIDATE. Nothing was pushed, no heavy job was run, and SPEC/HEADROOM were not touched. +Why: today's shared registers are ALREADY port-aligned at the minimum span. Every copy's content is already inside its union group's common perp. What forces the copy is the ORIGINAL register's other uses (drag + versions), and regrouping by target port leaves those uses unchanged. +## (1) Geometry (exact; geo.py, groups.py; ports = w1018 'ports'; u·u = 1 for 112/112; cap verified) +- Dim-2 groups are exactly the PAIRS (cap ⇒ a dim-2 subspace holds ≤ 2 ports): 6216. Common perp dim 7, holding 20-26 ports. 3 ports always span dim 3, so the card's "3 ports in 2 dims" never happens. +- Dim-3 groups: all 227,920 triples (common perp dim 6) plus the ZERO-SUM QUADS, the maximum group size in dim 3 (arc of PG(2,2)): 24,276. + - By block pattern: 196 in one block (14 per block = the affine planes of the block's AG(3,2)), 4,368 split 2+2 over two blocks, 19,712 over 4 different blocks. Patterns 3+1 and 2+1+1: 0. +- Each source block is an affine 3-flat: 8 ports, span dim 4, the maximum cap in a dim-4 space. In-block orthogonality is bipartite (two halves of 4; dot 1 within a half, 0 across). +- Delivery: M = I − G/2 is nonzero off the diagonal exactly where u_s·u_t = 0 (5824/5824, 52 per target). So a group T can share content only from S_T = {s : u_s ⊥ all of T}. + - Pairs: |S_T| 20-26. Max rank-1 (shareable) sub-sum: 24 or 25 for orthogonal pairs, 10-12 for non-orthogonal pairs. + - In-block quads: 168 have one 8-source rank-1 class spanning dim 5; 28 have none. + - Cross-block quads: ≤ 10 sources. +## (2) Today's sharing is already minimum-span (rd.py; direct target reads in A/B) +Every register read by ≥ 2 targets has reader-port span = the minimum possible for its size: +- 54 h + 25 x + 24 y read by pairs (dim 2); +- 16 h + 16 x read by triples across 3 blocks (dim 3); +- 56 h read by in-block zero-sum quads (dim 3, 4 per block). +No "spread-out" group exists to tighten. +Copies (merge.py, pure.py): 248 helper-from-register events (a helper initialised as q·s, then both h and s are read by targets). Union reader group T: 200 pairs, 33 triples, 15 quads (dim 4, never zero-sum). +- At the copy instant, s's ancestor-port span AND its value x-support lie inside ∩_T u^⊥ in 248/248 cases. The copy IS already the port-aligned shared intermediate. +- After the copy, s fails the ancestor floor for T in 213/248, through VERSIONS (s written before h's last read, 218) and DRAG (s read by non-targets, 229). 35/248 pass the ancestor floor, a necessary test only, and they are covered by B172 (268/268 necessary in any order). +## Savings bound and regrouping cost +- Deleting a copy needs s's out-of-cap uses served by another register (a version) or moved after the capped reads (B256/B257, killed or open there). Port regrouping does neither, so it removes 0 copies. +- Rebuilding a port-aligned factory register from S_T sources costs 1 helper + |supp| ADDs. It replaces a copy that costs 1 helper + 1 ADD: net helpers 0, ops +(|supp|−1), so the saving is ≤ 0 × B248 rate (0.0725-0.15%/w9 helper). +- Sharing NEW sub-sums across groups is capped by reader order. In a group, every non-last reader must read while its frame is ⊆ ∩ perp of the later readers. After a non-last read of an in-block-quad 8-sum (span dim 5), a target's later co-readers must lie in a dim-4 space (≤ 8 ports). This is the B248 one-pair-per-target matching, generalised, and the word already uses it (56 quad helpers). +- Bound ≤ 0 helpers, far below the +0.5% gate. Ceiling context: all copies gone = bit cap +3.52% (B248), not reachable this way. +## Kill protocol (provisional) +Assumptions: fixed target ports (D8 roots, skeleton); direct-read frames per caps.py; the copy census is the ancestor/value necessary test (frames ⊇ ancestor span). +Escapes: +- (E1) change the packet's out-of-cap consumers so s itself is read only in-cap (internal factory redesign = multiset change); +- (E2) joint delete+reorder (B257); +- (E3) a decoder/skeleton that changes the u_t (Lemma R scope). +Rescue check: rd.py on any new skeleton word. If any multi-reader register has span > minimum, or any copy's content at the copy instant lies outside ∩_T u^⊥, re-open. +Files (cards/B260): geo.py, groups.py, rd.py, val.py, cp.py, anc.py, merge.py (merge.pkl), pure.py. All are single-process, run in seconds. diff --git a/research/end-cap-obstruction/evidence/KPR5-endcap.md b/research/end-cap-obstruction/evidence/KPR5-endcap.md new file mode 100644 index 0000000000..542608b298 --- /dev/null +++ b/research/end-cap-obstruction/evidence/KPR5-endcap.md @@ -0,0 +1,44 @@ +# KPR5 material: the END-CAP OBSTRUCTION (B258, Oct 13). Read drag plus versions plus the perp(P_t) cap forces copies. + +## Setting (k8/#1018-type complex local; frames are binary subspaces of F_2^9; V targets y_t with ports u_t, u_t·u_t = 1) +- (R1, SPEC) Common frame: an ADD t += q·s at frame F climbs BOTH t and s to ⊇ F (03-motifs.tex:157; gk_word.py:116; audit_local.py:137-138). +- (R2, SPEC) Sink interface: Y_t's sink label S_t is a complement hyperplane of ⟨u_t⟩, i.e. S_t = w_t^⊥ with w_t·u_t = 1. + Sources: 03-motifs.tex:625-668 and 05-layers.tex:141-154; bit form 04-swap.tex:117-121; format-limits-corrected C.3. + Lemma R pins w_t = u_t when the drop-free taint of t spans u_t^⊥. +- (R3, C priced) Nesting: a register's frame is monotone. A non-nested edge G→S costs d(G,S) = dim G + dim S − 2 dim(G∩S) rank per call. + It is enforced as a hard rule for targets by gk_word.py:102/:117 and audit_local.py:122/:142. + +## Lemma (read drag) +Let D_s(τ) be the join of all op frames on register s strictly before time τ. By R1 and R3, frame(s) at τ ⊇ D_s(τ). This holds whether s was written or only READ, because reads climb s too. +If y_t reads s directly at τ, then frame(y_t) at the end ⊇ D_s(τ). + +## Theorem (end-cap obstruction) +Suppose y_t reads s directly at τ and D_s(τ) ⊄ w^⊥ for every admissible w (under Lemma R: D_s(τ) ⊄ u_t^⊥, i.e. one op on s before τ used a frame with a direction off u_t's cap). +Then a word that keeps s's value at τ for this chain must pay one of: +- (a) a VERSION of s: a register that holds s's value at τ with frame ⊆ u_t^⊥. + - Either a copy taken before the first offending op (needs no write to s in between), + - or a reconstruction from the operands of the writes that occurred after that copy (forward substitution, extra ADDs); +- (b) a REORDER that moves every offending op on s after τ. This is legal only for ops that commute with the read: other reads of s, not writes; +- (c) ≥ 1 rank unit per call on target t: FULL sink with M_in(X_t) = 0, or a descent FULL→S_t, d = 1 (B29/B35, rank-intrinsic); +- (d) a descent on s itself, d ≥ 1 per call (R3; reader descents ≈ 2r/call, registered dead R39-H/J24-C1). +Proof sketch: by the Lemma, frame(y_t) ⊇ D_s(τ) ⊄ S_t, so the final edge to S_t is non-nested. By R2, no complement sink fixes it, so (c) or (d) is paid unless the read is redirected to another register (a) or the order is changed (b). QED. +Corollary (versions): if s is WRITTEN after the offending op and before τ, then (a) needs a version, not a snapshot. A copy taken before the drag carries the wrong value, so either the copy must also receive the later writes (it becomes a second register, i.e. the existing S3 copy) or the value must be reconstructed. + +## Price on the k8/#1018 invoice (exact, deficit-honest; cards/B258/kap_free.py) +- (c): −2.819% κ per unit per call, linear (+16 units −45.06%; ≥ about 36 units: no saving). +- (a) copy: a helper ≈ +0.04 to 0.14% to delete, so a copy is 20 to 70 times cheaper than (c). +- Hence copies are economically forced whenever the obstruction fires. That is the ≈ 268 S3/S4 copy population. +- Measured scope: B252/B253, 84 words. Every deletion fires on 4 targets per S3 copy. Every violator ends FULL with u_t inside the frame, so no complement-sink freedom applies even without Lemma R. + +## Scope (what the theorem does NOT exclude) +- Fixed op order and a fixed multiset are assumed in the measured instances. (b), joint deletion+reorder, has never been run (B256/B257 are running it). +- The theorem does not exclude (a) by reconstruction: it adds ADDs and frame mass but no register (B256). +- It does not exclude a decoder whose pairing is asymmetric, so that Lemma R no longer pins w_t (C.6: none exists at E8 window ≤ 9). +- It does not exclude non-projection rational labels (the B37 hole), where sinks need not be idempotent complements. +- Helpers are out of scope: they have arbitrary ends via helper_final (#593/#599), and the obstruction applies only to registers that feed targets. + +## Escapes, ranked (from SYN-24) +1. Version reconstruction (B256). +2. Cap-ascending drag ordering with joint deletion (B256/B257). +3. Snapshot hoist on the final word (B257). +4. Motif/decoder redesign changing the u_t's (outside the current family). diff --git a/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py new file mode 100644 index 0000000000..14a90fa0e7 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/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/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/moment.py b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/engines/moment.py new file mode 100644 index 0000000000..7d697cb452 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/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/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py new file mode 100644 index 0000000000..0e5fde920d --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_common.py @@ -0,0 +1,94 @@ +"""Shared helpers for the complex shared-donor-kernel / entrance-gauge word. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. + +A "gk word" is PR #433's FULL-WORD.json.gz with optional extension keys (absent in #433's word, so every default is +#433's behaviour): + start_extra {register: entrance frame (list of F2^9 vectors)} helpers that start at a nonzero frame (width 9 - dim) + target_levels {target: frame} frame a target reaches through nonzero-frame compensation +Entrance gauges are ordinary gates at the head of A (target += c * helper at the entrance frame); kernel updates are +ordinary gates at the head of A (donor += q * pivot at the entrance frame). +""" +import math +from collections import Counter + +V, K, T, L, M = 120, 4, 8, 9, 73 +DATA = 2 * K * V * T # 7680 +FULL = tuple(1 << i for i in range(8, -1, -1)) + + +def basis(vs): + b = {} + for x in vs: + for p in sorted(b, reverse=True): + if x >> p & 1: x ^= b[p] + if x: + p = x.bit_length() - 1 + for q in b: + if b[q] >> p & 1: b[q] ^= x + b[p] = x + return tuple(b[p] for p in sorted(b, reverse=True)) + + +def widths_of(word): + """residual width of every helper: 9 - dim(entrance frame); 9 when the word has no extension""" + R = word['report']['R'] if 'R' not in word else word['R'] + w = [L] * R + for r, E in word.get('start_extra', {}).items(): + assert 2 * V <= int(r) < 2 * V + R + w[int(r) - 2 * V] = L - len(basis(E)) + return w + + +def split_pad(p): + """a pad of rank p is paid as nested commuting children of rank <= 51 (so that 73^2 > 2*child^2); rank 1 stays 1""" + if p == 0: return [] + n = -(-p // 51); return [p // n + (1 if i < p % n else 0) for i in range(n)] + + +def tile(items): + """Bank tiling of unhosted residuals. items: list of (rep, helper, width); a bank has M = 73 cells. + * width-9 residuals (no wrapper acts on them): first fit in the given order, packed from offset 0, eight per bank, pad rank 1 + (PR #433/#442's tiling and routes [2, slot]); + * ENTERING residuals (width w < 9, paid wrappers, e = 9 - w spectators): banks of their own in which every entering helper is the ONLY + owner of its bank family in its invocation (the one-helper rule of PR #458 extended to banks): bank j holds the j-th entering + helper of each replica, residuals packed from offset 0 in replica order (at most one helper per replica, hence per invocation). + The spectators of an entering helper are the first e cells of the bank beyond every residual cell of the bank (the pad, which no call + uses for a residual, is paid as before: rank 73 - sum of widths; the spectators are borrowed inside it and not deducted). + Returns (assign, banks, pads): assign[(rep, helper)] = (bank, offset, width, pure, spectators) with pure = the bank holds only width-9 + residuals and spectators = () for width 9; pads = Counter of pad ranks (split into children of rank <= 51).""" + assign = {}; pads = Counter(); fill = [] + for z, (rep, h, w) in enumerate(items): # width 9: first fit, as PR #433 (all widths 9 reproduces it exactly) + if w != L: continue + for b, f in enumerate(fill): + if f + w <= M: break + else: + b = len(fill); fill.append(0) + assign[(rep, h)] = (b, fill[b], w, True, ()); fill[b] += w + nwide = len(fill); byrep = {} + for rep, h, w in items: + if w < L: byrep.setdefault(rep, []).append((h, w)) + cells = [0] * max((len(v) for v in byrep.values()), default=0); emax = [0] * len(cells); place = {} + for rep in sorted(byrep): # the j-th entering helper of every replica goes to entering bank j + for j, (h, w) in enumerate(byrep[rep]): + place[(rep, h)] = (nwide + j, cells[j], w); cells[j] += w; emax[j] = max(emax[j], L - w) + for j in range(len(cells)): assert cells[j] + emax[j] <= M, ('entering bank without room for its spectators', j) + for (rep, h), (b, off, w) in place.items(): + assign[(rep, h)] = (b, off, w, False, tuple(range(cells[b - nwide], cells[b - nwide] + L - w))) + fill += cells + for f in fill: + for part in split_pad(M - f): pads[part] += 1 + return assign, len(fill), pads + + +def route(off, w, pure, sp=()): + """owner route of a banked helper residual: PR #433's [2, slot] for width 9 (pure width-9 bank); an entering helper (w < 9) is + [2, offset, width, [spectator cells]] with e = 9 - w spectators""" + if w == L: assert pure and not sp; return [2, off // L] + assert not pure and len(sp) == L - w; return [2, off, w, list(sp)] + + +def unhosted_stock(widths): + """live stock and padding histogram of the unhosted (parent) template, per stage x nine""" + R = len(widths) + _, nb, pads = tile([(rep, h, widths[h]) for rep in range(T) for h in range(R)]) + return DATA + L * nb, Counter({r: z * L for r, z in pads.items()}) diff --git a/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/static44/gk/gk_word.py new file mode 100644 index 0000000000..15782ba625 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-local/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/end-cap-obstruction/inputs/repo/research/format-limits-corrected/README.md b/research/end-cap-obstruction/inputs/repo/research/format-limits-corrected/README.md new file mode 100644 index 0000000000..95c7ae59f2 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/format-limits-corrected/README.md @@ -0,0 +1,805 @@ +# Format limits (no κ claim): a certified ceiling, a spec census, structural lemmas and helper bounds + +This package states results about the limits of the current construction format (B_K compressed windows, star +copies, whole-residual hosting) and checks the ones that can be checked. **It makes no κ claim and ships no word.** +Each result comes with its scope and assumptions. Each is marked: + +- **checked**: `verify.sh` recomputes it from the files listed below (exact or certified arithmetic unless stated); +- **argued**: a proof or proof sketch in this README; +- **recorded**: an input taken from a run or a PR that `verify.sh` does not repeat (the file and its source are named). + +```sh +python3 -m pip install -r research/format-limits/requirements.txt +bash research/format-limits/verify.sh /fresh/output/dir # from a checkout or `git archive` of the whole repository +``` + +Python ≥ 3.11 with numpy, scipy, sympy, python-sat and ortools (`requirements.txt` pins a tested set). Step 0 +checks the package against `MANIFEST.sha256`, the vendored inputs against the git blob ids of their PR commits +(`SOURCES.json`) and the files of main it reads (`DEPENDS.json`). Steps A–E print one `PASS`/`FAIL` line per claim. +About 2 minutes on 12 cores (six checks at a time). + +**Tested environments** (fresh `git archive`, every claim PASS): + +| Python | numpy | scipy | sympy | python-sat | ortools | how installed | +|---|---|---|---|---|---|---| +| 3.11.17 | 2.4.6 | 1.17.1 | 1.14.0 | 1.9.dev15 | 9.15.6755 | fresh venv from `requirements.txt` | +| 3.14.7 | 2.4.6 | 1.17.1 | 1.14.0 | 1.9.dev15 | 9.15.6755 | fresh venv from `requirements.txt` | +| 3.14.7 | 2.5.4 | 1.18.1 | 1.14.0 | 1.9.dev15 | 9.15.6755 | fresh venv, latest releases | +| 3.14.7 | 2.3.5 | 1.17.0 | 1.14.0 | 1.9.dev15 | 9.15.6755 | development venv | + +Values that come from floating-point solvers (the hosting LP, the coupled-cover MILP) are compared with explicit +tolerances; the certified roots are rational intervals. + +## Results at a glance + +| id | result | status | +|---|---|---| +| A | **Format ceiling, rev. 2.** Under the accounting axioms of §A.1, every supplier in the format has saving a ≤ X(s, h/k, x) (root of the slot-domination bound). On the realised units, X* = 6.0005·10⁻³ (bit, 111 lines, decoder constant 63) and 5.1863·10⁻³ (complex, 112 ports, copy cost 64), both at s = 5, so **κ ≤ 5.1595·10⁻³** (complex binds). | theorem argued; every number checked (`a1`–`a5`) | +| A.4 | The axioms hold on the frontier words #555 (bit) and #568 (complex): published values reproduced from their profiles, deficit identity with equality, B_K idle windows literal, slot domination at nine values of q. | checked (`a3`); (Bat)/(Hst) for #568 argued from its README | +| A.5 | At s = 9 the frontier sits 2.66× (bit) / 2.50× (complex) under the ceiling; 87% / 93% of the log-gap is helper cost, 19% / 25% data-run fragmentation, and hosting recovers 7% / 18%. | checked (`a4`); #568 uses a recorded idle remainder | +| A.6 | The rev. 1 scope x = 3/5 (κ ≤ 4.5151·10⁻³) is superseded: the punctured units have x = 63/111 and 64/112. | checked (`a1`) | +| B | 25 format rules classified as spec / proved / convention, with file:line evidence in the upstream paper and the hub's checkers, and the corrections the census found. | anchors checked (`b`); classification argued | +| C.1 | Frame sandwich: a register's frame lies between the span of what it carries and the orthogonal of what it will serve; the three complex frame walls are its faces; leaving it is exact and costs d(f, g). | argued; toy checked (`c1`) | +| C.2 | Lemma N: the per-target rank-1 port factor is a gauge of the endpoint frames, always paid; any detour off the geodesic interval costs exactly 2. | proof argued; toys checked (`c2`) | +| C.3 | Lemma R: complement sinks w_t^⊥ (w·u = 1) are legal at zero rank and port cost, and forced to w_t = u_t on every target of the four complex words checked (#531; #569 width-7 and four-cold; #571 combined). | checked (`c3_gate0`, `c3_taint`) | +| C.4 | Lemma Q: a degenerate-label unit is dominated by its quotient (copy cost and window), so degenerate spans give no new (w, x) points. | proof argued; toys and families checked (`c4`) | +| C.5 | Lemma λ: a phase-frame butterfly needs λ = ±i (and 2 invertible) in its payload ring; b < c is the price of √−1, and the outer already uses shift twiddles. | argued; instances checked (`c5`), anchors (`b`) | +| C.6 | At the E8 decoder pattern with window ≤ 9 the label pairing B = W·Uᵀ is unique (= B0); every W ≠ U is a gauge. Window 8 is impossible. | checked (`c6`, SAT without proof logs) | +| C.7 | A rank-r descent costs 2r data mass in every call (−5.63% c on #555, −5.65% b on #568 per rank-1 descent); within that price class a schedule with a paid descent is dominated. | toy and prices checked (`c7`); dominance argued | +| C.8 | Splitting one helper residual across two hosting streams meets a trace obstruction under every invertible storage change; uncharged, it is worth at most +0.67% b on the current complex frontier. | argued | +| D | Design-free helper floors in the drop-free monotone-chain model: bit ≥ 212 (sink-only targets) / 138 (strict) vs 439 shipped; complex ≥ 107 / 0 vs 496. Coupling the levels adds 0. The "224 carriers" complex floor is a design choice, and carriers are register-neutral in the calibrated ledger. | checked (`d1`–`d3`), given the argued crossing lemma | +| E | Complex helper price by class and width on #569 (0.039–0.140% b per helper at k = 1; the hosting offset depends on width only), and the moment-cost census by class on #555 and #569. | k = 1 prices, control and census checked (`e1`, `e2`); k > 1 rows recorded | +| F | Cost structure: a change paid in every local word must buy about 2.8% of the supplier value per rank unit; open problems: per-word enablers, a non-star decoder, the schedule/ρ freedom, new skeletons. | conclusion from checked prices | + +Earlier statements this package relies on: Theorems A–C of #446 (DreamingOfClouds, open; content-frame invariant, +stage-window additivity, pairing-rank copy floor). They are cited as premises and are not re-proved here. #446 states +Theorem B for rank-1 labels (every number in this package is at k = 1), and its Theorem C value 72 for the bit E8 +unit is computed there and not replayed here. + +## A. Format ceiling, rev. 2 + +### A.1 Scope S2 (accounting axioms) + +A word is a B_K compressed-window block for one supplier (bit or complex), replicated T times, with s = 2K + 1 +stages, v ports of label rank k and stage window h, copy rank cst per stage, and any helper network (any R, widths, +local programs), any banking or hosting rule and any halving depth. Writing z_r for the number of paid children of rank +r and g_q(r) = r((m/r)^q − 1): + +- **(P) pressure identity.** The supplier saving a is the root q of Σ_r z_r g_q(r) = D. (The hub pricers add a + nonnegative fallback term, which only lowers their root.) +- **(Dfc) deficit.** D = T[(s − 1)vk − s·cst], with cst ≥ cst_min(U), the star floor of the unit U (the pairing-rank + floor of #446 Theorem C holds for any copy tree; the star form β_j ≥ k·w_in is the scope assumption). +- **(Win) window.** Every data register climbs a ≥ h − k per stage and m = k + s·a (#446 Theorem B gives + m ≥ k + s(h − k); #386's compressed windows attain it). X is non-increasing in a, so a = h − k is the extreme case. +- **(Sch) B_K schedule.** Stage j activates one bank pair (2 data registers per port per replica); pair 0 is active at + stages 0, 1, 2 and pair p ≥ 1 at 2p + 1, 2p + 2. Idle frame changes per copy (2v copies): pair 0 has [(2K − 2)a]; + pair p ∈ 1..K − 1 has [2pa, a, (2K − 2p − 2)a] (a bridge read splits the pre-stretch). +- **(Bat) batching.** A paid child executes part of one frame change Δ and has rank ≤ rank Δ (Δ is a register's + frame change, or, as in #448, one idle change across the copies of one idle child). Local children have rank ≤ a + (data registers) and ≤ h (helpers, copies). +- **(Hst) hosting is accounting.** A hosted helper child is a local child (rank ≤ h) that executes coordinates of an + idle frame change; the rest of that change is paid in children of rank ≤ its rank; an unhosted helper lives on a bank + wire. + +### A.2 Theorem and proof sketch + +Per port (v and T cancel), the **forced slots** are: the active climbs (mass 2sa, cap a), the copy drops (mass s·x, +x = cst/v, cap h) and each idle frame change of rank r of the schedule (mass 2r, cap max(r, h)). Let +F_s(q) = Σ_slots mass · ((m/cap)^q − 1) and D_s = (s − 1)k − s·x. + +**Theorem.** For every word in S2 on a unit U, a ≤ X(s, h/k, x_U) := the root q of F_s(q) = D_s, with +x_U = cst_min(U)/v(U). Since e^y − 1 ≥ y, also X ≤ D_s/Cost_s with Cost_s = Σ_slots mass · ln(m/cap). + +*Proof sketch.* (1) Monotonicity: each g_q(r) increases in q for r < m, so a(z, D) ≤ a(z', D') whenever f_z ≥ f_z' +pointwise and D ≤ D'. (2) Slot domination: by (P) the paid mass executes every coordinate of every forced slot; by +(Win), (Sch), (Bat) and (Hst) every child touching a slot has rank ≤ its cap; φ_q(r) = (m/r)^q − 1 decreases in r, so +splitting each child's mass over the slots it touches gives f_N(q) ≥ F_s(q; cst_N); children touching no slot +contribute ≥ 0. (3) Helpers never shift D or m (call this Lemma H): Theorem B bounds m with target frames only; a bank wire is restored +scratch, so its saving is ≤ 0; a data register saves ≤ k whoever executes its coordinates; copies cost ≥ cst_min for +any tree. X is non-increasing in a (d/da of each slot term is ≥ 0 by Bernoulli's inequality). The cap max(r, h) on +idle slots absorbs the one place where hosting lowers paid cost (a width-h helper child on a single-stage idle slot); +it costs 1% against the literal R = 0 profile. (4) F_s increases and D_s decreases in cst, so cst_N may be replaced by +cst_min. Apply (1). + +**General k (argued; no number here uses it).** Scaling every rank by k (a = k(w − 1), h = kw, m = k(1 + s(w − 1)), +every slot mass and D multiplied by k at fixed x/k) leaves each ratio m/cap unchanged, so X depends only on +(s, w = h/k, x/k). Every number in this package is at k = 1. + +**κ.** The outer assembly seeds s0 = min(c, (1 − β)b) − 10⁻²⁴ and bootstraps x ↦ (1 − s0)s0 + s0·x from below; the map +is increasing with fixed point s0, so κ ≤ X/(1 + X) with X = min(X_bit*, X_cx*), each side at its own best s. + +### A.3 Numbers (certified; `a1_ceiling_roots.py`, `a2_ceiling_sup.py`) + +| unit | x | s = 3 | **s = 5** | s = 7 | s = 9 | s = 11 | s = 13 | +|---|---|---|---|---|---|---|---| +| bit, 111 live lines, decoder constant 63 (#545, #555), h = 8 | 0.5676 | 5.9474e-3 | **6.0005e-3** | 5.2095e-3 | 4.6072e-3 | 4.1490e-3 | 3.7879e-3 | +| complex, 112 ports, copy cost 64 (#523 → #569), h = 9 | 0.5714 | 5.0474e-3 | **5.1863e-3** | 4.5130e-3 | 3.9946e-3 | 3.5989e-3 | 3.2865e-3 | + +Roots are rational-interval brackets of width < 10⁻¹⁵; the upper end is the certified value. + +- **κ ≤ 5.1594939·10⁻³ < 5.1595·10⁻³**; the complex side binds. The bit-only corollary is c/(1 + c) ≤ 5.964704·10⁻³. +- **The supremum over s is at s = 5** on both units. For odd s = 7..401, the certified D_s/Cost_s stays below X(5); + the largest values are 5.2311·10⁻³ (bit) and 4.5292·10⁻³ (complex), both at s = 7. For s ≥ 403 a tail bound applies: + Cost_s/v ≥ 2Σ_{p 2Ka), and + Σ_{p=1}^{K−1} p ln(K/p) ≥ K²/4 − K/e − K/2. Then X ≤ D_s/Cost_s < (1 − x)s/(4a(K²/4 − K/e − K/2)), which is + decreasing in K and equals 6.27·10⁻⁴ (bit) / 5.44·10⁻⁴ (complex) at s = 403. + - *Proof of the inequality (erratum to rev. 1, which invoked "trapezoid error for a concave function", the wrong + direction).* f(p) = p ln(K/p) is concave, so by Hermite–Hadamard f(p) ≥ ∫_{p−1/2}^{p+1/2} f. Summing gives + Σ_{p=1}^{K−1} f(p) ≥ ∫_{1/2}^{K−1/2} f = K²/4 − ∫_0^{1/2} f − ∫_{K−1/2}^K f. Both removed pieces are small: + the first is (1/8)(ln K + ln 2 + 1/2), and the second is ≤ (K/2)·ln(K/(K − 1/2)) ≤ K/(4K − 2) ≤ 1/3. Their sum is + ≤ K/e + K/2 for every K ≥ 2. The script also checks the inequality numerically for K = 2..5000. +- **Frontier against the ceiling at s = 9.** X(9)/c = 2.658 for #555 (c = 1.733053·10⁻³), and X(9)/b = 2.499 for + #568 (b = 1.598685·10⁻³). +- **Copy charge.** One copy-rank unit per stage (bit cst 63 → 62) raises X by +3.90% (s = 5), +2.82% (s = 9) and + +2.65% (s = 11). + +### A.4 The axioms on the frontier words (`a3_axioms.py`, checked) + +| check | words | result | +|---|---|---| +| (P): certified root of the published global profile at the word's (m, D) vs its published value | #510 R480 s9, #543 R420 s9/s11, #545 p111 s11, #555 p111 s9/s11, #568 | root ≥ published; relative difference 1.2–1.7·10⁻⁹ on the bit pipelines (consistent with their nonnegative 10⁻¹⁶ fallback term), 5·10⁻¹⁸ on #568 | +| (Dfc): m·W − rank mass = T[(s − 1)v − s·cst] with integral W | same seven profiles | equality (e.g. #555: 64·28416 − 1,808,352 = 10,272; #568: 73·7168 − 520,704 = 2,560) | +| (Win): m = k + s(h − k); largest child = literal idle remainder (2K − 2)a | same | m = 64/78/73; largest child 42/56/48 on #543, #545, #555, #568 (#510's largest child is 8) | +| (Sch): active + copies + idle slot mass = rank mass | #555, #568 | 447,552 + 18,144 + 1,342,656 = 1,808,352; 129,024 + 4,608 + 387,072 = 520,704 | +| (Sch): idle windows per replica = idle_slots(K = 4, a = 8) on both banks | #568 PLAN, 8 replicas | {8: 6, 16: 4, 32: 4, 48: 4} on every replica | +| (Hst): helpers hosted whole, no banks | #555 | bank assignments 0; hosted residuals 126,432 = 439·288 | +| Lemma 2 on a grid: min of f_N(q)/F_s(q; cst_N) over nine values of q in [10⁻⁵, 1] | all seven | 2.29–2.66 (≥ 1) | + +**(Bat) at child level.** #555's helper runs have rank ≤ 5 ≤ h (checked by the replay in `a4_gap.py`). #568's helper +children have rank ≤ 6 ≤ h (its implied helper histogram in `a4_gap.py`). #568's README (commit 71c99ac, +research/complex-multicold/README.md:22) reports one whole owner for all 36,288 helpers, no auxiliary banks and 27,679 +cross-replica roles; a cross-replica role hosts helper children of one idle change at rank ≤ h, so it falls inside +(Bat)/(Hst) (argued). No structural axiom is violated by #555 or #568. + +### A.5 Gap decomposition at s = 9 (`a4_gap.py`, checked) + +| step | #555 bit | #568 complex | +|---|---|---| +| A: theorem skeleton (R-free; idle slots at cap max(r, h)) | 4.6072e-3 | 3.9946e-3 | +| B: literal R = 0 (each idle slot one child of its own rank) | 4.5661e-3 | 3.9631e-3 | +| C: B with the real data-register runs and copy children | 3.7868e-3 | 3.1544e-3 | +| D: C plus every helper run paid unhosted (the only step with more rank mass) | 1.6183e-3 | 1.3517e-3 | +| E: the real word (helpers hosted whole, idle remainders paid) | 1.7331e-3 | 1.5987e-3 | + +Shares of ln(A/E) (0.978 / 0.916): + +| component | #555 | #568 | +|---|---|---| +| helpers | 87% | 93% | +| data fragmentation | 19% | 25% | +| literal vs cap | 1% | 1% | +| hosting | −7% | −18% | + +Steps A, B, C and E have the same rank mass, m·W − D (1,808,352 and 520,704). + +Inputs: + +- **#555.** Data, helper and copy runs are replayed from the published word. The replay matches #555's local + histogram, and the helper mass is 8R. The idle remainder is the published profile minus 288 × the local profile; + 75.3% of the skeleton idle mass is hosted. +- **#568.** The data-register runs per call come from #569's four-cold provider word (the same x/y ladders). The paid + idle remainder {1: 93, 2: 93, 3: 2118, 7: 1, 48: 1713} is **recorded** from our replay of #568's hosting + (`data/ceiling/gap568-inputs.json`). Its 4,018 children match the "4,018 positive idle remainders" of #568's README + (checked), and the implied helper histogram is nonnegative (checked). + +The headroom under S2 is therefore almost entirely helper cost. Even with zero helper cost and real data +fragmentation, the words would sit 2.19× (bit) / 1.97× (complex) above today. + +### A.6 The superseded numeric scope of (Dfc) + +Rev. 1 of this ceiling fixed cst_min = 72 and x = 3/5 (the full 120-line E8 unit) on both sides. That gave X_bit* = +5.1598·10⁻³, X_cx* = 4.5356·10⁻³ and κ ≤ 4.5151·10⁻³ (checked, `A1.rev1-superseded`). + +The punctured units that the frontier now uses have smaller x: + +- bit: #545/#555 keep 111 live lines with decoder constant 63; +- complex: the #523 lineage has 112 ports with copy cost 64. + +So x = 63/111 = 0.5676 and 64/112 = 0.5714. With x_U taken from the realised units the ceiling is §A.3's +κ ≤ 5.1595·10⁻³. The structural axioms are unchanged. + +Status of cst_min per unit: + +| unit | cst_min | status | +|---|---|---| +| bit 120/72 | 72 | proved given #446 Theorem C: the F2 decoder of the E8 pattern needs 9 totals (its F2 minrank is 9; c = 8 is UNSAT, checked in `c6`), and each star total costs β = 8, the Gram rank of an 8-line in-cap clique (premise, not replayed) | +| bit 111/63 | 63 | the star floor among punctures of p ≤ 25 lines: Δcst ≤ min(p, 9), from an exact matroid-greedy search over the 9-dimensional code that this package does not reproduce (**argued**, not checked here). For 26 ≤ p ≤ 52 only the total D gain s·Δcst − (s − 1)p ≤ 9 is bounded, which does not pin x. | +| complex 112/64 | 64 | 8 × 8, the star floor at w_in = 8, attained (**argued**) | + +A unit with smaller x would move X by about +2.8% per copy-rank unit at s = 9 (§A.3). For scale, two units with +smaller x that no word realises are checked as well (`A1.outside-scope`): bit x = 54/102 gives X* = 8.2457·10⁻³ and +complex x = 56/104 gives X* = 6.8000·10⁻³, both at s = 3. They lie outside the realised-unit scope of the theorem. + +### A.7 What each scope rule is worth (`a5_scope_multipliers.py`, checked) + +Multiplier of the ceiling if one rule is dropped. Each cell is best-s multiplier / s = 9 multiplier. + +| rule dropped | bit 111/63 | complex 112/64 | +|---|---|---| +| star scope (copy charge x → 0) | ×6.77 / ×2.79 | ×6.91 / ×2.83 | +| B_K idle frame changes free | ×1.67 / ×2.14 | ×1.68 / ×2.15 | +| all idle changes of a copy in one child | ×1.19 / ×1.55 | ×1.20 / ×1.55 | +| bridges off the idle stretches (no split) | ×1.15 / ×1.18 | ×1.15 / ×1.18 | +| data local climbs batched to h (cross-register) | ×1.12 / ×1.03 | ×1.08 / ×1.02 | +| idle free and local batching together | ×1.79 / ×2.28 | ×1.79 / ×2.27 | +| family window one smaller at the same x | ×1.16 / ×1.16 | ×1.14 / ×1.14 | + +Hosting cannot raise the ceiling (step (3) of the proof in §A.2). Full relaxation of (Bat), with arbitrary batching up to rank m, +would give no bound, because rank-m children cost 0. + +**Not covered:** + +- non-B_K schedules (a different number of active pairs per stage changes (Sch) and (Dfc)); +- non-star decoders (totals with β_j < k·w_in), and units with smaller x than the realised ones (see A.6); +- labels outside the cross-field unit; +- any change to (P), such as children of rank larger than their frame change, or a new outer assembly. + +## B. Spec versus convention census + +`b_census_anchors.py` checks every file:line anchor of the rule table (B.2), 73 in all, and the four corrections +marked "checked" in B.3. Line numbers are as of the base commit 7dfa22b. Each anchor's quoted text must lie within two +lines of the cited line, except in docs/research/ (the hub's ledgers and reviews, which main rewrites often), where it +is matched by text anywhere in the file. The line ranges cited in the prose of B.1 and B.3 were read by hand at +7dfa22b and are not machine-checked. Paths are relative to the repository root, and `U/` is +`upstream/build/sections/`. The classification is argued: + +- **S**: mandated by the upstream paper or interfaces; +- **P**: proved necessary given the cited S/C rules; +- **C**: a convention of the paper's instance or of the hub's checkers and templates, changeable if the replacement is + proved. + +### B.1 What upstream imposes + +- **Bit contract** (the only bit-side interface), U/04-swap.tex:105-123. A finite circuit of W wires whose pointwise + bit gates induce a *permutation* ρ. There is one rational m×m matrix per terminal and per gate, common to every wire + at that gate. The cost is s = Σ rank_Q(M_head − M_tail), with M_out(ρ(w)) − M_in(w) = I_m on every role and s < Wm. + The recurrence is F_k ≤ (s/W)F_{k−1} + O(1) (:197-211). No subspaces, nesting, banks, pairs or nondegeneracy appear. +- **Complex interface**: + - frames C_U = H^m diag(i^{q_U}) H^m, with q_U(x) = wt(P_U x) mod 4 for nondegenerate binary U (U/03-motifs.tex:528-561); + - an edge is a product of one kernel (aI + bX_v)^{±1} per vector of an orthonormal basis of the residual of + comparable labels (:568-583); + - endpoint C^{⊗m} on every role after free per-role corrections (:579-582, :641-668; U/05-layers.tex:127-154); + - the implementation P_M conjugation needs only invertible M (U/05-layers.tex:86-103). +- **Common-frame identity** for any invertible D_v: U/03-motifs.tex:154-186. +- **The paper's instance**: + - nondegenerate nested labels (U/03-motifs.tex:199-208, 351-364); + - terminal labels X_a: U_a → F, Y_a: 0 → U_a^⊥ (:235-243); + - the signed exchange of X_a and Y_a (:89-100); + - arbitrary, restored scratch (:34-46). +- **Outer.** Two suppliers are composed through 08-assembly.tex (:16-48, κ at :849-866, :995-1000). The transforms + are Nussbaumer synthetic transforms whose roots are signed shifts (U/00-introduction.tex:44-56, U/06-transforms.tex). +- **The maintainer's interface list**, docs/research/community-pr531-review.md:116-125: + - all-size compilation; + - common-label and mutable-basis realization; + - normalized residual wrappers as uniformly priced operations; + - whole-call correlated-helper hosting; + - compressed windows and restored rows; + - grids, tape, precision; + - the analytic transfer. + + The same review of #531's integration says the fixed-word ceiling and family-optimality discussions it carries + were "not independently certified" (:130-134). + +### B.2 Rule table + +Multipliers are from §A.7 (best s / s = 9, bit unit unless stated). + +| # | rule | class | anchors (file:line) | evidence and history | ceiling multiplier if relaxed | +|---|---|---|---|---|---| +| 1 | Common frame at every gate | S | U/03-motifs.tex:157; U/04-swap.tex:111; legality_h.cpp:11; audit_local.py:64; LemmaG/Stream.lean:106 | never changed; an ADD across frames needs an adapter edge priced d(f, g) | 1.00 | +| 2 | Frames are nondegenerate subspaces | spec: any invertible D_v (S); nondegenerate subspaces: the paper's instance (C) | U/03-motifs.tex:154, :203; U/04-swap.tex:110; gram_frames.py:46; notes/general-clifford-frames.tex:21 | #130's general frame lemma covers arbitrary (also degenerate) binary subspaces, d = dim U + dim V − 2 dim(U ∩ V); main has its TeX note and Python checks, its Lean proof is in an external repository (a conditional interface); degenerate labels are dominated by their quotient (C.4) | none by itself (only through x) | +| 3 | Nesting: climbs along a register's life; drops only as copies or centre steps | C (priced, not forbidden) | U/03-motifs.tex:352 (the paper has decreasing edges); U/05-layers.tex:83; legality_h.cpp:11; audit_local.py:45, :128; LemmaG/Stream.lean:111 | #425's full → 0 centre copies; a non-nested step is exact and costs d(f, g) (C.1, C.7) | 1.00 (two nested edges) | +| 4 | Exact restoration of helpers and dirty registers | S (same endpoint operator on every role; scratch arbitrary); "ρ fixes scratch" is C | U/03-motifs.tex:46, :98, :581; U/05-layers.tex:150; columns_k.cpp:57; audit_local.py:101 | no PR permutes scratch | 1.00 | +| 5 | ρ = signed exchange of X_a and Y_a, pairwise | C (any permutation ρ is legal) | U/04-swap.tex:107; U/03-motifs.tex:99, :628; bit_global.py:55; columns_k.cpp:56 | never varied | not quantified | +| 6 | Terminal labels X_a: U_a → F, Y_a: 0 → U_a^⊥; targets inside u_t^⊥ | C (the paper's choice; the ⊥ relations then follow from #446 Thm A) | U/03-motifs.tex:235, :240; U/05-layers.tex:128, :146 | complement sinks are legal at zero cost but forced on every current decoder (C.3) | 1.00 on current decoders | +| 7 | Rank-1 labels (k = 1) | C | U/03-motifs.tex:233 | X depends only on (s, h/k, x/k) (§A.2) | through (w, x) | +| 8 | Star copies (cst = Σβ_j, β_j ≥ k·w_in) | scope assumption of the ceiling; the pairing-rank floor itself is proved for any copy tree (#446 Thm C) | legality_h.cpp:1; columns_k.cpp:39 | every PR's totals are star | ×6.77 / ×2.79 (complex ×6.91 / ×2.83); +2.8% per copy-rank unit at s = 9 | +| 9 | E8 cross-field unit (h = 8 bit, 9 complex) | C (family) | U/03-motifs.tex:221, :225 ("the scalar domain need not equal the label field") | — | window one smaller: ×1.16 (complex ×1.14) | +| 10 | Window m = k + s(h − k) | P (#446 Thm B) | — | attained by #386 | 1.00 in model | +| 11 | Deficit D = T[(s − 1)vk − s·cst] | P given rows 8 and 12; spec form D = mW − s | U/04-swap.tex:122; U/03-motifs.tex:360 | equality on seven profiles (§A.4) | through rows 8, 12 | +| 12 | B_K schedule (one dependency chain, alternating locals, bridges, idle children) | P given row 13 | bit_global.py:49; columns_k.cpp:46; Work__Bridge__Net.lean:56 | no other schedule on record | idle free ×1.67 / ×2.14; one idle child ×1.19 / ×1.55; no split ×1.15 / ×1.18 | +| 13 | One (X, Y) bank pair per invocation (LOCAL = 2V + R) | C | bit_global.py:12; columns_k.cpp:31; Work__Bridge__Net.lean:55 (one I : Inv for all stages) | no local on two pairs on record | feeds row 12 | +| 14 | (Bat): a paid child executes one frame change | axiom of the ceiling: one register across a local/bridge is the equal-frame rule; cross-register batching is open | docs/research/pr-ledger.md:403, :405 (#448 and #451 unreviewed) | #451's trace obstruction to #448's split residuals (C.8) | local batching ×1.12 / ×1.03; with idle free ×1.79 / ×2.28 | +| 15 | Whole-residual hosting | accepted conditional interface | community-pr531-review.md:122; idle-axis-hosting/PROOF.md:43 | #442 accepted; split residuals disputed (C.8) | 1.00 (Lemma H, §A.2) | +| 16 | One owner per stream (#458) | P inside #442's stream model | LemmaA/Realize.lean:95 (`one_owner_needed`) | relaxed to disjoint footprints | 1.00 | +| 17 | Source registers never destinations | C (#370's checker assertion) | e8-bit-carrier-skeleton/README.md:67-68 | sufficient, not necessary (#425); relaxed by #433, #493 | already taken | +| 18 | Payload bounds (2^104 bit, 2^192 complex prefix, 2^80 prime witnesses) | C, never binding | columns_h.cpp:25; columns_k.cpp:34; finite_check.py:98; audit_local.py:103; gram_frames.py:17 | — | 1.00 | +| 19 | F2 payload coefficients | C | columns_h.cpp:27 | — | 1.00 | +| 20 | Replication T | C | bit_global.py:11; finite_check.py:86 | #505 asynchronous replicas | 1.00 (T cancels) | +| 21 | 47-inequality outer assembly | structure S, constants C | outer.py:27; U/08-assembly.tex:37; assembly-domain-audit.md:21 | the 1/32 domain cap is conservative and not binding | 1.00 | +| 22 | κ is the composition of the two suppliers | S | U/08-assembly.tex:37; outer.py:29, :30 | — | — | +| 23 | Two suppliers: complex butterfly layer, bit address shear | S | U/00-introduction.tex:48, :56, :118; U/06-transforms.tex:12 | shift twiddles are already in the outer (C.5) | — | +| 24 | Pressure identity (a rank-r child priced as a fraction of a call) | inherited conditional ("normalized residual wrappers as uniformly priced operations") on the paper's rank-1 recurrence | U/04-swap.tex:197; community-pr531-review.md:122 | — | defines the ceiling | +| 25 | Bridges X → X and Y → Y only | P (X wires contain q, Y wires do not) | columns_k.cpp:43 | — | — | + +Abbreviations: + +- `legality_h.cpp`, `columns_h.cpp`, `columns_k.cpp` and `gram_frames.py` are in + research/e8-bit-carrier-skeleton/code/bit/checkers/; +- `audit_local.py` is research/direct-delivery504-global/code/audit_local.py; +- `bit_global.py` is research/e8-early-reset-kernel/bit_global.py; +- `Work__Bridge__Net.lean` is in research/five-stage-gen4-banks/inputs/complex/sources/; +- `finite_check.py` is research/five-stage-gen4-banks/finite_check.py; +- `outer.py` is research/e8-bit-carrier-skeleton/code/pricing/outer.py; +- `LemmaG/`, `LemmaA/` are under research/e8-lemma-g-lean/ and research/e8-lemma-a-lean/; +- `community-pr531-review.md` and `assembly-domain-audit.md` are under docs/research/. + +### B.3 Corrections, as the census found them + +1. **The bit interface is the shear contract alone** (U/04-swap.tex:105-123). Subspace labels, nesting, Gram + orthogonality, bank pairs and the pair exchange are construction-layer choices of the paper's instance + (:199-243, 351-364), not interface requirements. +2. **Nesting is priced, not forbidden.** + - The paper itself has decreasing edges (U/03-motifs.tex:352-353). + - The paper counts kernels on decreasing edges (U/05-layers.tex:83). + - #130's frame lemma prices non-comparable labels by d(f, g). + - The checkers enforce nesting as a pricing rule. +3. **The bit legality checker** keeps its MOVE (nested and exactly priced), ADD (common frame) and COPY-lifecycle rules + on legality_h.cpp:11; line 10 holds the containment helper and the owner/helper selection (checked). +4. **The invariant `Inv`/`GInv`** used by the complex five-stage bridge is imported (`import Work.Bridge.Inv`) and + defined nowhere in main (checked). "One X bank and one Y bank per invariant" therefore rests on its use in + `Bridge2` and in bit_global.py / columns_k.cpp, not on a definition in the repository. +5. **#370's assertion "x registers are never destinations"** is a sufficient, not a necessary, condition (#425's + scalar-interface lemma; #493's README) (checked). +6. **The outer already uses shift twiddles** (Nussbaumer synthetic transforms; U/00-introduction.tex:44-50); the + complex supplier is the H_0 butterfly layer (:114-121). A ring change does not remove it (C.5). +7. **Complement sinks** (sink = any complement of the source label, w·u = 1) are not covered by the earlier phase-frame + null result: the sink stays a plain label with a new projection. They are legal (C.3, gate 0), and Lemma R closes + them on every current decoder. +8. **The only untested spec freedom with a ceiling term ≥ ×1.15** is the schedule/ρ family (rows 5, 12, 13). The + large multipliers (×6.8 copy charge, ×1.16 window) are scope and family terms, not rules. + +Caveats of the census itself: + +- "Sink = any complement of the source label" (row 6) was the census's own reading of U/05-layers.tex:145-148; it is now + settled by C.3. +- "A plain swap of two scratch roles cannot gain" (row 4: shared gate frames give ≥ 2m on the swapped pair) is the + census's own argument and is not re-derived here. +- #448 and #451 are unreviewed in the hub's ledger, so the "conceded" status of split-residual hosting rests on the + contributors' own record. + +## C. Structural lemmas + +### C.1 Frame sandwich and the complex frame walls (argued; toy `c1_sandwich_toy.py` checked) + +**Lemma (sandwich).** Let R be a register at time t, and consider paths that carry no priced drop. Then + + span{frame(r, t′) : r's content reached R drop-free by t} ⊆ frame(R, t) ⊆ (span{L_q : target q that R's content reaches drop-free after t})^⊥. + +*Proof sketch.* The lower side is #446 Theorem A, applied with any register as origin. For the upper side, a target q +ends at L_q^⊥ because its terminal label absorbs the port gate (T_{u^⊥} = F·C_u^{−1} up to monomials). Chains are +monotone, and a copy taken at t sits at its parent's frame (common frame at the copy gate), so it inherits the +parent's future. Exactness uses neither side: both are accounting. + +**Consequences** on the complex unit (labels in F_2^9, 112 ports): + +- **(W1)** The common station of a term whose readers span u_a^⊥ is the point ⟨u_a⟩. A cut shared by all readers of a + term is therefore one point per term. +- **(W2)** A copy serving a face of four targets of rank-3 span has frame dimension ≤ 6. A group of eight copies whose + faces span rank 4 has a common frame of dimension ≤ 5. +- **(W3)** Run backwards on the cleanup, the lower side gives end(X) ≥ the join of the frames of every register that + X's restoration reads. + +**Leaving the sandwich is legal and priced.** The toy (n = 4) puts three readers whose labels span u_a^⊥ at a station +⟨w⟩ outside every u_i^⊥ and then takes a non-nested step to u_i^⊥: + +- both networks are exact on 64/64 basis columns; +- every child's Clifford rank equals d(A, B) = dim A + dim B − 2 dim(A ∩ B), including the non-nested rank-4 steps; +- the charge is 18 = 13 + 3·2 − 1 against the standard network's 13. + +Relaxing "targets avoid u_t" costs +2 data mass per relaxed target per call (C.7 prices this). + +### C.2 Lemma N: the port factor is a gauge, always paid (`c2_port_gauge.py`) + +**Setting.** C_v = ((1 + i)I + (1 − i)X_v)/2, so C_v² = X_v. The full transform is F = Π_{w ∈ orthonormal basis} C_w, +and T_{q^⊥} = F·C_q^{−1} (#514's repeated-axis identities). In the hub's controller a source family runs +⟨q⟩ → … → F and a target family runs 0 → … → q^⊥. Each data family saves exactly one unit (m − 1 instead of m), which +is the C_q gauge: (s − 1)vkT = 8·112·8 = 7168 on the complex side, of which copies take 4608 and D = 2560 remains. + +**Lemma N.** For a parent child Z = C^{⊗A}, + +- rank(C_q^{±1}Z) = rank Z − 1 if q ∈ span(A) with odd support; +- rank(C_q^{±1}Z) = rank Z + 1 if q ∉ span(A) and q ⊥ A. + +**Theorem N (proof).** With d(f, g) = dim f + dim g − 2 dim(f ∩ g), any path f0 → G → f1 costs at least d(f0, f1), +with excess + +- **target** (0 → q^⊥): d(0, G) + d(G, q^⊥) − d(0, q^⊥) = 2(dim G − dim(G ∩ q^⊥)) ∈ {0, 2}, which is 0 iff G ⊆ q^⊥; +- **source** (⟨q⟩ → L): 2(1 − dim(⟨q⟩ ∩ G)) ∈ {0, 2}, which is 0 iff q ∈ G. + +(dim G − dim(G ∩ q^⊥) ≤ 1 because q^⊥ is a hyperplane.) + +The route T_{fY}·T_{fX}^{−1} equals F modulo monomials *only if* dim fX + dim fY = n and fX ∩ fY = 0. The source's +saving and the target's saving are therefore tied: un-labelling one side alone leaves a rank-1 mismatch on the pair. + +**Consequence.** "y avoids u_t" is the geodesic condition of the endpoint frames, not an artifact of where the +factor is paid. Moving the rank-1 factor to the parent costs at least d(0, L) − d(0, q^⊥) = 1 per family. Leaving +the interval costs exactly 2. + +**Checks (exact Clifford).** + +- The F2 rank of B = Σqqᵀ equals the tableau child rank on 240 random C-products (n = 4..7). +- Detour excess is 0 on the geodesic set and exactly 2 otherwise: + + | n | geodesic | off-geodesic | + |---|---|---| + | 3 | 20 | 44 | + | 4 | 128 | 408 | + | 5 | 1072 | 4912 | + | 6 | 3740 | 24510 | + + The source and target families give the same counts. +- The rigid pairs at n = 3, 4 are a subset of the complementary pairs. The converse fails: complementary pairs need + not be rigid. +- The gauge descent rank − 1 holds in 9/9 controls. + +**Not reproduced here.** A run on the 112 retained ports of the #523 controller found rank(C_q Z) = rank Z + 1 on +2016/2016 idle children and 2016/2016 stage climbs (no parent object absorbs the gauge). It needs the controller's +generated data-phase files, which this package does not ship, so it is reported, not checked. + +### C.3 Lemma R: complement sinks are legal but pinned + +**Legal (gate 0, `c3_complement_gate0.py`, checked).** For an odd w with w·u = 1, the route T_{w^⊥}·T_{⟨u⟩}^{−1} has +Clifford rank n: + +- for every complement w at n = 3..6, and on 40 seeded samples at n = 9; +- it equals C^{⊗n} after monomial wrappers of the same class as the standard sink, on the tableau and on every basis + column (n ≤ 6); +- non-complements (w·u = 0) give rank n − 2. + +The port price is unchanged: Y: 0 → w^⊥ and X: ⟨u⟩ → F both cost n − 1. The geodesic interval is G ⊆ w^⊥, with +excess exactly 2 outside it. A corrector that the standard sink forbids is exact and correctly priced. So the sink +stays a plain label with a new projection, and the port gate stays a gauge (C_w instead of C_u). + +**Lemma R.** If the sources whose content reaches target t drop-free span u_t^⊥, the only admissible complement sink +of t is w_t = u_t. + +*Proof.* By #446 Theorem A the sink V_t = w_t^⊥ contains u_t^⊥, and V_t is a hyperplane. + +**Pinned (`c3_complement_taint.py`, checked).** The checks run on four complex words: main's #531 word, the width-7 +and four-cold provider words of #569, and the combined-eight-local word of #571. The closure starts every helper at frame 0, the most permissive choice, +so the result holds for every frame assignment of the same scalar word; the words' own entrance frames are not +needed (on the three vendored words the closure with them gives the same result). + +- The most permissive lower closure (helpers enter at 0; every centre may drop to 0 at the cut) has dimension 8 on + 112/112 targets, so w_t = u_t is forced on 112/112. +- The pure drop-free source taint of every target is exactly its Gram-orthogonal neighbourhood: 52 sources, span + u_t^⊥. Phase A contributes nothing to any target. +- Any w ≠ u_t breaks at least 20 of t's 52 lossless corrections (112/112 targets). + +A positive control removes the 4 correction gates of one target. The closure then reports dimension 7 and 2 +admissible sinks, so the instrument sees freedom when it exists. + +On these four words the obstruction is the decoder's lossless pattern, not the endpoint rule. A decoder whose pairing is not symmetric +would be needed, and C.6 shows the E8 pattern admits none at window ≤ 9. + +### C.4 Lemma Q: a degenerate unit is dominated by its quotient (`c4_quotient.py`) + +**Setting.** The ports span W (dim d), with radical rad = W ∩ W^⊥ (dim ρ) and Gram rank r = d − ρ. Write +π: W → W/rad. + +**Lemma Q.** + +- A copy of total j read at a common cut g (g lies in every target sink, so WLOG g ⊆ rad) costs + d(f_j, g) ≥ dim π(f_j). +- Summed over j, this is the quotient unit's reads-at-0 cost, which is ≥ Σ_j rank G[S_j, R_j] (#446 Theorem C at + Gram level). +- Every stage window contains W and is nondegenerate, so h ≥ r + 2ρ. + +Since X is non-increasing in a and in cst (§A.2), X_deg(s) ≤ X(s, r/k, x_quot) ≤ X(s, r/k, x_ThmC) for every s. +Star scope is Gram-level (an in-cap clique inside S_j has a nonsingular diagonal Gram block in every realisation), so +degenerate spans are not outside the ceiling's scope and add no (w, x) points. + +**Checks (exact ranks).** + +- **The paired-cube p = 3 toy:** d 4, ρ 2; copy cost 18 (reads at 0), 16 (optimum over all flags of rad), 12 + (quotient = Theorem C bound); window 6 vs quotient 2. +- **Paired cubes p = 3..12:** only the complex p = 3 cube is degenerate. +- **E8 + an extra vector (bit):** 81 → 72 = quotient 72, window 10 vs 8. +- **E8 + weight-2 isotropic decorations (complex), ρ = 1, 2, 3:** 80 / 88 / 96 → 72 = quotient, windows 11 / 13 / 15 + vs 9. +- **Random radicals:** 0 violations of "cut cost ≥ quotient cost" on 737 seeded instances. +- **Certified X:** each realisation sits below its quotient. + + | unit | quotient | realisation(s) | + |---|---|---| + | bit | 5.1598e-3 | 4.0462e-3 | + | complex (ρ = 1 / 2 / 3) | 4.5356e-3 | 3.6522e-3 / 3.0570e-3 / 2.6286e-3 | + +**Out of scope.** Repeated-label (vector-linear) decoders are a Gram-level class that Lemma Q does not close. + +### C.5 Lemma λ: a phase-frame butterfly needs √−1 (argued; instances checked by `c5_lambda.py`) + +**Lemma λ.** Let K be a directional kernel defined by its direction alone. If P_N(K ⊗ I)P_N^{−1} = K ⊗ I for the +e₁-fixing N, then K = aI + bX. If moreover H_0 = [[1, 1], [1, −1]] satisfies u·H_0 = D₁(aI + bX)D₂ with D₁, D₂ +invertible diagonal and u a unit, then (b/a)² = −1, i.e. the Walsh eigenvalue ratio λ = (a − b)/(a + b) = ±i. + +*Proof.* The first part is a 2 × 2 symbolic computation (T5). For the second, write D₁ = diag(d, d′) and +D₂ = diag(e, e′). Entrywise, d·a·e = u, d·b·e′ = u, d′·b·e = u and d′·a·e′ = −u. Multiplying the first and last +equations gives dd′ee′·a² = −u², and multiplying the middle two gives dd′ee′·b² = u². Hence a² = −b², so a and b are +units and (b/a)² = −1. With b = ±i·a, λ = (1 ∓ i)/(1 ± i) = ∓i. Writing λ needs a + b = a(1 ± i) invertible, and +(1 + i)(1 − i) = 2, so the ring must also make 2 invertible (H_0 itself has determinant −2). ∎ + +**Consequences.** + +- A payload ring in which −1 is not a square (Z[1/2]; Z/M with a prime factor ≡ 3 mod 4) or in which 2 is not + invertible (F2; even M) carries no phase-frame butterfly supplier. +- In a ring with √−1, such as the Fermat ring Z/(2^N + 1) where i = 2^{N/2} is a shift, the ring hosts the identical + C-network with the same paid Fourier-rank histogram and the same b. +- The odd-weight residuals that the phase calculus needs (U/03-motifs.tex:600) force an odd-form unit. For E8 this + means F2 rank 9 and h = 9, which is the structural part of b < c. +- Bit networks have signed-permutation endpoints per role for any payload alphabet. Each two-point butterfly level at + most doubles row support, so a length-8 transform needs ≥ 3 butterfly levels, with the same Fourier-rank mass as the + complex DFT₈. +- The outer already uses shift twiddles (B.3, item 6). + +**Checks (exact, sympy / modular).** + +- **T1–T3:** the product of three H_0 factors and three monomial twiddles equals the bit-reversed DFT₈. Over Z/17 it is + the length-8 NTT with root 2. Row support 8 needs 3 levels. +- **T4:** brute force over Z/M for the 16 odd moduli M ∈ {3, 5, 7, 9, 11, 13, 15, 17, 21, 25, 29, 33, 37, 41, 45, 65}: + solutions exist iff −1 is a square mod M, and λ² = −1 in every solution. +- **T5:** the commutation forces K = aI + bX. +- **T6:** C² = X and H_0 = b·S·C·S in Z/17 with i = 4. +- **T7:** there is no real solution. +- **T8:** weight-2-mod-4 residuals act as translations. + +### C.6 Asymmetric pairing uniqueness at the E8 pattern (`c6_asym.py`) + +**Setting.** A unit is (N over Q, B = W·Uᵀ over F2): + +- window = rank B (the pairing version of Lemma Q); +- a correction N_TS is lossless iff B_TS = 0 (#446 Theorem A, directed); +- β_j = rank B[R_j, A_j] (Theorem C); +- exactness is N∘B = diag. + +The gauge (U, W) ↦ (UP, WP^{−T}) fixes B, so "W ≠ U" means nothing by itself. A symmetric unit-diagonal F2 matrix of +rank r is congruent to I_r. + +**Result (SAT).** At the E8-linear decoder pattern (B_TS = 0 where G_TS ≠ 0, B_TT = 1), gauge-fixed on 8 +pairwise non-orthogonal lines (where the pattern forces B[K, K] = I, so U_K = W_K = [I_8 | 0]): + +- P112 at c = 9: "B ≠ Bᵀ" and "B ≠ B0 = (J + G) mod 2" are UNSAT with U and W both free; with U fixed to the E8 + labels and W free, "B ≠ Bᵀ" is UNSAT too (the "B ≠ B0" question was not run with U fixed); +- P120 at c = 9: the same two questions are UNSAT; +- c = 8: UNSAT, symmetric and non-symmetric (P120), and non-symmetric on P112; +- calibration: c = 9 without the extra constraint is SAT, with B = B0. + +So at window ≤ 9 the pairing is unique and every W ≠ U is a gauge. The UNSAT answers come from CaDiCaL (through +python-sat) without proof logs; the SAT calibration runs show that each encoding is satisfiable where it should be. + +**Off the E8 pattern.** An exact asymmetric P112 unit exists at copy cost 65 (+1) and window 9: N′∘B = diag on all +112 × 112 entries. Two of its targets take sinks w ≠ u and need 28 corrections instead of 52. In this verified unit one extra copy-rank +unit (65 instead of 64) frees exactly two sinks; no lower bound on the price of a freed sink is claimed. A directed +3-cycle toy (B non-symmetric, rank 2, +exact on 343 inputs) shows that the asymmetric class is larger in general. + +### C.7 Per-call descent pricing (`c7_descent_toy.py`, `c7_descent_price.py`) + +**Statement.** A descent of rank r followed by its re-climb costs exactly 2r rank units in the local word. It +therefore costs 2r units of data mass in every call, which is 2r copy-rank units by the deficit identity. There is no +fixed cost to share between uses. + +**Checks.** + +- **Exact toy (n = 5).** One reader reads three cheap terms at point stations ⟨u_a⟩, ⟨u_b⟩, ⟨u_c⟩, and each term's + readers span u_j^⊥. + - Four networks (standard, clones, direct descents, descents through 0) are exact on 224/224 basis columns. + - Every child, including the rank-2 non-comparable ones, has Clifford rank d(A, B). + - Each rank-1 descent costs +2, whether direct or through 0, and a reader at k point stations pays 2(k − 1). +- **Prices on the published profiles** (certified root, hosting held fixed): one rank-1 descent per local word costs + **−5.630% c on #555** (288 stage-replicas) and **−5.646% b on #568** (72 calls); two cost −11.26% / −11.29%. + +**Dominance within the price class (argued).** In the known designs (the complex factory, face and M-copy ledger and +the bit pair-term and star units; this list is a census of those designs, not a theorem), each use of a descent buys at +most one of the following: + +- one target removed from one last-read antichain (≤ |T_t| ≤ 7 private copies); +- two monotone arms for a copy register; +- two fixed pair-split conflicts; +- one supplied retired row. + +That is at most about 7 helpers' work. One rank-1 descent costs −5.65% b on #568, about 40 width-9 complex helpers +at 0.14% b each (§E.1). So within the class where every non-comparable step is one child of rank d(f, g) +paid in every call, a schedule with ≥ 1 paid descent is dominated by the best schedule without one. + +This is price-class dominance, not an impossibility. It does not cover a descent paid once per word. + +### C.8 Split residuals across hosting streams (argued) + +Split a helper residual of width w = a + b over two streams. #451 (chafreaky) shows that the identity +trace(D_{a+b} + I) − trace(D_a + D_b) = q^{2m−a−b}(q^a − 1)(q^b − 1) ≠ 0 is invariant under every invertible linear +change of storage; there is a complex analogue. So no relabelling makes an uncharged split exact. An exact split +needs one of: + +- a cross-term repair (≥ min(a, b) doubly paid coordinates); +- one helper per piece; +- a new hub primitive that prices split routing. + +The "one further route factor per helper selector" of #448 (higherbeing) is the last kind. + +Even uncharged, the gain is small on the current complex frontier. #569 hosts all residual supply and pays the idle +remainder {3: 1200, 7: 48, 48: 1808} (90,720 coordinates; checked in `e2`). #588 uses the same hosting regime, but +its remainder differs and is not reproduced here. φ(r) = r((m/r)^q − 1) is concave, so with free +splitting the best case puts the whole remainder in rank-48 children: 1890·φ(48) = 60.98 against 78.06 today, a +saving of 17.08 D-units. That is **at most +0.67% b**, and it ignores windows and timing. + +Status: argued (concavity bound on #569's reproduced hosting profile; the profile itself is checked in `e2`). + +## D. Design-free helper bounds (`d1_cover_numbers.py`, `d2_coupled_count.py`, `d3_carrier_ledger.py`) + +**Model.** Registers are monotone frame chains: + +- helpers 0 → F; +- sources ⟨u_s⟩ → F; +- targets 0 → u_t^⊥. + +Gates act at a common frame. The only drops are the decoder copies: 9 totals at p^⊥ (bit), 8 rank-8 centres +(complex). The demand is the drop-free source → terminal map. + +**Crossing lemma (argued; #446 Thm A plus the sandwich).** Fix a level d. Every drop-free path s → q crosses level d +exactly once, inside one register's climb a → b, so N = Σ_e α_e β_eᵀ over the level-d crossing events, with +supp β_e ⊆ S(a_e) and supp α_e ⊆ Q(b_e^⊥). Each register crosses each level at most once. Only the extreme levels +bind: at the middle levels the rectangle areas are below the free data crossings. + +**Cover numbers (exact).** + +| side | per-source cover | per-terminal cover | evidence | +|---|---|---|---| +| complex P112 (F2^9) | 2 | 2 | two proper hyperplane sections cover every source's 52 readers (112/112; max section 32; 26 with port-spanned frames only, still 2 sections) | +| bit #555 (Q^8, E7 = the 63 lines ⊥ a source) | 3 | 3 | exhaustive census of the 8821 hyperplane flats of E7: two cover at most 52 of 63 (≥ 11 left), three D6 flats (30 lines each) cover all; on the terminal side at least 6 live sources stay uncovered by any two flats (all 120 terminals) | + +**Floors.** + +| side | sink-only targets | strict (y → y mixing allowed) | shipped | +|---|---|---|---| +| bit | 2·111 − ⌊111/11⌋ = **212** | max(3·111 − 222, 3·120 − 222) = **138** | 439 | +| complex | 112 − ⌊112/20⌋ = **107** (108 with port-spanned frames) | 2·112 − 224 = **0** | 496 (+ 8 centres) | + +**Coupling adds 0 (checked).** The coupled cover model (hop areas through all levels, exact unit rectangle caps +32/32/32/36/32/32/32 for complex d = 2..8, exhaustive for d = 2..5 and by the symmetry d ↔ 10 − d above; end +patterns; bit flat sizes 1, 3, 6, 12, 20, 36, 63 per rank, enumerated in E7, with maximality in E8 from the +root-subsystem chain A1 ⊂ A2 ⊂ A3 ⊂ D4 ⊂ D5 ⊂ E6 ⊂ E7) has integer count optima 212 / 138 / 107 / 0 (HiGHS, zero gap), +identical to the single-cut bounds. The shipped words are feasible in it. With the shipped data ladders held fixed the +floors rise to 222 (bit) and 146 / 123 (complex). + +**Corrections.** + +- **The census of E7's hyperplane flats.** An earlier sampled census found 2258 flats; the exhaustive census has 8821 + (5040 / 2016 / 1008 / 666 / 63 / 28 of sizes 10 / 13 / 16 / 21 / 30 / 36). The sampled set is reproduced (seed 1) and + undercounts the small types; the cover number 3 is unchanged. +- **The "224 carriers = 2 per source" complex floor is a design choice.** #531 gives every source exactly 3 level-2 + crossings (X_s + 2 helpers) into port-spanned 2-dim frames whose section is 20 (3 × 20 = 60 ≥ 52), while two + sections already cover every source. The 224 is a property of the section type, not of the format. +- **Carriers are register-neutral in the calibrated ledger (checked).** The register ledger rebuilt from #531's real + tile objects (168 block-local planes, 168 keys, mate matching 2) reproduces 224 scratch + 168 face copies + 112 M + copies = 504, with B = N2 + K + R − 112 + waste. The carrier stage and the face stage together cost 2·N2 − 112 + + waste for any edge cover. The cover axis therefore only enters through wasted single-variant butterflies: + - rebuilding the same planes from cross-tetrad edges costs +168 (12 per block, exact); + - tetrad edges give waste 0 (CP-SAT over all three splits). + +**What the floors certify.** At most 48% (bit, sink-only, 212/439) / 22% (complex, 107/496 helpers without the 8 +centres) of the shipped helper count is design-free necessary. No single-cut or coupled cover argument closes the helper gap that §A.5 identifies as the whole headroom. + +## E. Complex helper prices and the moment-cost census (`e1_run_census.py`, `e2_helper_prices.py`) + +### E.1 Price per helper by class and width on #569 + +The b gain per deleted helper is measured as follows: + +- the helper is removed in all 72 calls; +- its width returns to the idle remainders; +- hosting is re-solved (the LP relaxation of the whole-owner model; integer CP-SAT spot checks at k = 1, not + reproduced here, agreed with it to < 0.002% b). + +The control reproduces #569's hosting (remainder {3: 1200, 7: 48, 48: 1808}, b = 1.602631811·10⁻³). + +| cell (count) | width | % b per helper, k = 1 (checked) | k = 8 / 14 / whole cell (recorded) | +|---|---|---|---| +| factory scratch (216) | 9 | 0.140 | 0.142 / 0.143 / 0.179 | +| face copy (64) | 9 | 0.134 | 0.140 / 0.141 / 0.151 | +| face-copy entrant (72) | 8 | 0.105 | 0.102 / 0.101 / 0.081 | +| face-copy provider (32) | 7 | 0.075 | 0.069 / 0.062 / 0.050 | +| M-copy entrant (56) | 8 | 0.111 | 0.111 / 0.109 / 0.098 | +| rank-4 pivot (48) | 5 | 0.039 | 0.039 / 0.036 / 0.032 | +| rank-5 pivot (8) | 4 | 0.042 | 0.041 / – / – | + +**Width law.** Price = local fee saved − hosting offset, where the offset is the increase of the hosting LP objective. +The offset depends on width only: cells of equal width have identical LP objective increases (checked). Its share of +the local fee at k = 1 (checked) is: + +| width | 9 | 8 | 7 | 5 | 4 | +|---|---|---|---|---|---| +| offset share, k = 1 | 6.3–6.6% | 17.0–17.9% | 31.5% | 57.4% | 45.4% | + +The share is not monotone in width (w4 sits between w7 and w5). At larger k the w7 share rises to 55% and the w5 share +to 65% (recorded in `data/prices/helper-price-table.json`). One conversion constant links all cells: fee saved minus offset is 25.64–25.66 moment units per 1% b. + +A count-based "0.11% per helper" is therefore about right for the width-8 entrants (0.105–0.111), overprices the +width-7 providers by about 1.5× (0.075) and the rank-4/5 pivots by 2.6–2.8× (0.039–0.042), and underprices the +width-9 scratch and face copies by about 25% (0.134–0.140). Summed k = 1 marginals give: + +| class | share of the marginal helper cost | % b | +|---|---|---| +| factory scratch | 53% | 30.2 | +| face copies | 32% | 18.5 | +| M copies | 15% | 8.4 | + +Full table, including the mixed-class runs: `data/prices/helper-price-table.json` (k > 1 rows recorded). + +### E.2 Moment-cost census by class (checked) + +The F-share of a class is its share of Σφ = D at the word's own root. The all-single-run ceiling is the supplier value +if each register of the class climbed in one child, with hosting proportional. + +**#555** (R = 439; 288 stage-replicas): + +| class | n | runs | mean run | stops/register | F-share | all-single-run ceiling | +|---|---|---|---|---|---|---| +| line-born carriers (0,1,2,…) | 205 | 1120 | 1.46 | 4.46 | 29.5% | +14.75% c | +| cell-born (0,2,…) | 153 | 686 | 1.78 | 3.48 | 21.2% | +9.60% | +| line → quad/D6 keepers and totals | 80 | 349 | 1.83 | 3.36 | 10.7% | +4.35% | +| quad-born | 1 | 4 | 2.00 | 3.00 | 0.1% | +0.05% | +| data x / data y | 111 / 111 | 539 / 213 | 1.44 / 3.65 | – | 14.1% / 10.4% | – | + +Copies take 0.7% and the idle remainder 13.4%. + +**#569** (R = 504; width-7 provider word for all 72 calls): + +| class | n | runs | mean run | stops/register | F-share | all-single-run ceiling | +|---|---|---|---|---|---|---| +| factory scratch | 216 | 1304 | 1.49 | 5.04 | 32.5% | +16.4% b | +| face copies | 168 | 696 | 1.98 | 3.14 | 21.9% | +9.1% | +| M copies | 112 | 504 | 1.43 | 3.50 | 12.4% | +4.9% | + +Data take 28.3%, centres 1.8% and the idle remainder 3.0%. The published global profile is reproduced exactly from +63 width-7 calls, 9 four-cold calls and the remainder. + +## F. What the results imply + +**Cost structure (result).** Under S2 the ceiling is set by the copy charge and the B_K idle structure (A.7); on the +real words the headroom is helper cost, 87–93% of the log-gap (A.5). A change inside the local word is paid in every +call: the local word runs 288 times (stage-replicas) in #555's bit pipeline and 72 times in #568's complex pipeline, +and by the deficit identity each rank unit added per local word lowers D by one per call. On the published profiles one +rank unit per local word costs 2.82% of c (#555) and 2.82% of b (#568): half the checked price of a rank-1 descent +(C.7), and the same size as one copy-rank unit per stage (+2.8% of X at s = 9, A.3). What such a change unlocks (a +shared station, a freed sink, a removed copy, a supplied row) is a gain fixed per word. + +**Break-even.** A change that costs Δ rank units in every local word pays only if its per-word gain exceeds about +2.8·Δ % of the supplier value. On the complex side that is about 20·Δ width-9 helpers (0.14% b each, E.1). The +per-call prices of C.1, C.2, C.6 and C.7 are all of this form: +2 per relaxed target per call, at least 1 per +un-gauged family per call, one copy-rank unit for the two sinks freed in the verified asymmetric unit, and 2r per +rank-r descent per call. + +**Open problems.** + +1. **Per-word enablers.** A mechanism charged once per word or per outer level instead of per call, such as a descent, + gauge change or station hoisted out of the local word. At 1/72 of its per-call price a rank-1 descent would cost + about 0.08% b, roughly half a width-9 helper. The current interface has no such primitive (B.2 rows 1, 3, 24). +2. **A non-star decoder.** The copy charge is the largest scope term (×6.8 at the best s, ×2.8 at s = 9; A.7). On the + E8 pattern the pairing is unique at window ≤ 9 (C.6), and on the four complex words checked the lossless pattern + pins every sink (C.3). Lowering x therefore needs a different unit or decoder; for scale, x = 54/102 (bit) and + 56/104 (complex) would give X* = 8.25·10⁻³ and 6.80·10⁻³ (A.6). +3. **The schedule/ρ freedom.** Any permutation ρ is spec-legal, and one bank pair per invocation is a convention (B.2 + rows 5, 12, 13). The B_K idle terms are worth ×1.15 to ×2.15 (A.7). +4. **New skeletons.** The design-free floors certify at most 48% (bit, 212/439) and 22% (complex, 107/496) of today's + helper counts (D). The other 52% and 78% of the helpers are not shown necessary by any argument here. + +## Files + +- `scripts/`: one check per claim group, plus shared code. + - Shared: `report.py` (PASS/FAIL, paths), `cert.py` (rational-interval ln/expm1, certified roots), `skel.py` + (skeleton slots, variants), `e8units.py` and `minrank_sat.py` (E8 geometry, SAT encodings), `d_geometry.py`, + `e_hosting.py` (the hosting LP and the moment root). + - Driver and step 0: `run_all.py`, `provenance.py`. +- `data/vendor/`: inputs copied from open PRs (`SOURCES.json` gives PR, author, commit, path, git blob id). +- `data/ceiling/`, `data/census/`, `data/toys/`, `data/prices/`: small inputs (#568's recorded idle remainder, the + census anchors, the p = 3 paired-cube instance, #569's call dispatch with its source blob id, the deleted-helper + specs and the recorded price table). +- `DEPENDS.json`: files of main read by the checks, by sha256. +- `MANIFEST.sha256`: every file of the package. + +## Credits + +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code; Apache-2.0. See `NOTICE.md` for the +PRs whose words, pipelines and results are used. diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/COMPLETION-PRIORITY.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/COMPLETION-PRIORITY.json new file mode 100644 index 0000000000..e0df30aeef --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/COMPLETION-PRIORITY.json @@ -0,0 +1,746 @@ +{ + "0,1,2,3": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ] + ], + "registers": [ + 64, + 67 + ] + }, + "0,1,4,5": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ] + ], + "registers": [ + 32, + 35 + ] + }, + "0,1,6,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ] + ], + "registers": [ + 24, + 27 + ] + }, + "0,2,4,6": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 16, + 18, + 19, + 297, + 301, + 303 + ] + }, + "0,2,5,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 40, + 42, + 43, + 313, + 317, + 319 + ] + }, + "0,3,4,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 72, + 74, + 75, + 329, + 333, + 335 + ] + }, + "0,3,5,6": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 112, + 114, + 115, + 345, + 349, + 351 + ] + }, + "1,2,4,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 8, + 10, + 11, + 361, + 365, + 367 + ] + }, + "1,2,5,6": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 48, + 50, + 51, + 377, + 381, + 383 + ] + }, + "1,3,4,6": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 80, + 82, + 83, + 393, + 397, + 399 + ] + }, + "1,3,5,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "0", + "-1/2", + "1/2", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "1", + "0", + "0", + "1" + ], + [ + "0", + "0", + "0", + "0", + "0", + "-1/2", + "1/2", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "-1/2", + "0", + "0", + "1/2" + ] + ], + "registers": [ + 104, + 106, + 107, + 409, + 413, + 415 + ] + }, + "2,3,4,5": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ] + ], + "registers": [ + 96, + 99 + ] + }, + "2,3,6,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ] + ], + "registers": [ + 88, + 91 + ] + }, + "4,5,6,7": { + "rows": [ + [ + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + [ + "-1/2", + "0", + "0", + "1/2", + "0", + "0", + "0", + "0" + ] + ], + "registers": [ + 56, + 59 + ] + } +} \ No newline at end of file diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json new file mode 100644 index 0000000000..cd23561e0b --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/CODED-CELLS-k8.json @@ -0,0 +1,2826 @@ +[ + { + "cell": "01+", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 1 + ], + "x1": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 0 + ], + "x2": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 1 + ], + "x3": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 0 + ], + "x4": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 1 + ], + "x5": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 0 + ], + "y0": [ + "target", + 65 + ], + "y1": [ + "target", + 64 + ], + "y2": [ + "target", + 33 + ], + "y3": [ + "target", + 32 + ], + "y4": [ + "target", + 25 + ], + "y5": [ + "target", + 24 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "-1/2" + ], + [ + "y0", + "x1", + "-1/2" + ], + [ + "y2", + "x5", + "-1/2" + ], + [ + "y3", + "x4", + "-1/2" + ], + [ + "y4", + "x3", + "-1/2" + ], + [ + "y5", + "x2", + "-1/2" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x2", + "x5", + "1" + ], + [ + "x4", + "x3", + "1" + ], + [ + "y1", + "x2", + "-1/2" + ], + [ + "y3", + "x0", + "-1/2" + ], + [ + "y5", + "x4", + "-1/2" + ], + [ + "y0", + "y5", + "1" + ], + [ + "y2", + "y3", + "1" + ], + [ + "y4", + "y1", + "1" + ], + [ + "y1", + "x4", + "-1/2" + ], + [ + "y0", + "x5", + "-1/2" + ], + [ + "y2", + "x3", + "-1/2" + ], + [ + "y3", + "x2", + "-1/2" + ], + [ + "y4", + "x1", + "-1/2" + ], + [ + "y5", + "x0", + "-1/2" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x2", + "x5", + 1 + ], + [ + "x4", + "x3", + 1 + ], + [ + "y1", + "x2", + 1 + ], + [ + "y3", + "x0", + 1 + ], + [ + "y5", + "x4", + 1 + ], + [ + "y0", + "y5", + 1 + ], + [ + "y2", + "y3", + 1 + ], + [ + "y4", + "y1", + 1 + ], + [ + "y1", + "x4", + 1 + ], + [ + "y0", + "x5", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y4", + "x1", + 1 + ], + [ + "y5", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "0", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "0", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "-1/2", + "0", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "0", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "0" + ] + ] + }, + { + "cell": "23+", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 23 + ], + "x1": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 3 + ], + "x2": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 1 + ], + "x3": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 0 + ], + "x4": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 1 + ], + "x5": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 0 + ], + "y0": [ + "target", + 71 + ], + "y1": [ + "target", + 67 + ], + "y2": [ + "target", + 97 + ], + "y3": [ + "target", + 96 + ], + "y4": [ + "target", + 89 + ], + "y5": [ + "target", + 88 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "1" + ], + [ + "y0", + "x1", + "1" + ], + [ + "y2", + "x5", + "-1/2" + ], + [ + "y3", + "x4", + "-1/2" + ], + [ + "y4", + "x3", + "-1/2" + ], + [ + "y5", + "x2", + "-1/2" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x2", + "x5", + "1" + ], + [ + "x4", + "x3", + "1" + ], + [ + "y1", + "x2", + "-1/2" + ], + [ + "y3", + "x0", + "1" + ], + [ + "y5", + "x4", + "-1/2" + ], + [ + "y0", + "y5", + "1" + ], + [ + "y2", + "y3", + "1" + ], + [ + "y4", + "y1", + "1" + ], + [ + "y1", + "x4", + "-1/2" + ], + [ + "y0", + "x5", + "-1/2" + ], + [ + "y2", + "x3", + "-1/2" + ], + [ + "y3", + "x2", + "-1/2" + ], + [ + "y4", + "x1", + "1" + ], + [ + "y5", + "x0", + "1" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x2", + "x5", + 1 + ], + [ + "x4", + "x3", + 1 + ], + [ + "y1", + "x2", + 1 + ], + [ + "y3", + "x0", + 1 + ], + [ + "y5", + "x4", + 1 + ], + [ + "y0", + "y5", + 1 + ], + [ + "y2", + "y3", + 1 + ], + [ + "y4", + "y1", + 1 + ], + [ + "y1", + "x4", + 1 + ], + [ + "y0", + "x5", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y4", + "x1", + 1 + ], + [ + "y5", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "1", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "1", + "0", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "0", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "-1/2", + "0", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "-1/2", + "-1/2", + "0", + "-1/2" + ], + [ + "1", + "1", + "-1/2", + "-1/2", + "-1/2", + "0" + ] + ] + }, + { + "cell": "45+", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 23 + ], + "x1": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 3 + ], + "x2": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 23 + ], + "x3": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 3 + ], + "x4": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 1 + ], + "x5": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 0 + ], + "y0": [ + "target", + 39 + ], + "y1": [ + "target", + 35 + ], + "y2": [ + "target", + 103 + ], + "y3": [ + "target", + 99 + ], + "y4": [ + "target", + 57 + ], + "y5": [ + "target", + 56 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "1" + ], + [ + "y0", + "x1", + "1" + ], + [ + "y2", + "x5", + "-1/2" + ], + [ + "y3", + "x4", + "-1/2" + ], + [ + "y4", + "x3", + "1" + ], + [ + "y5", + "x2", + "1" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x2", + "x5", + "-1/2" + ], + [ + "x4", + "x3", + "-2" + ], + [ + "y1", + "x2", + "1" + ], + [ + "y3", + "x0", + "1" + ], + [ + "y5", + "x4", + "-1/2" + ], + [ + "y0", + "y5", + "1" + ], + [ + "y2", + "y3", + "1" + ], + [ + "y4", + "y1", + "1" + ], + [ + "y1", + "x4", + "-1/2" + ], + [ + "y0", + "x5", + "-1/2" + ], + [ + "y2", + "x3", + "1" + ], + [ + "y3", + "x2", + "1" + ], + [ + "y4", + "x1", + "1" + ], + [ + "y5", + "x0", + "1" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x2", + "x5", + 1 + ], + [ + "x4", + "x3", + 1 + ], + [ + "y1", + "x2", + 1 + ], + [ + "y3", + "x0", + 1 + ], + [ + "y5", + "x4", + 1 + ], + [ + "y0", + "y5", + 1 + ], + [ + "y2", + "y3", + 1 + ], + [ + "y4", + "y1", + 1 + ], + [ + "y1", + "x4", + 1 + ], + [ + "y0", + "x5", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y4", + "x1", + 1 + ], + [ + "y5", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "1", + "1", + "1", + "-1/2", + "-1/2" + ], + [ + "1", + "0", + "1", + "1", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "0", + "1", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "1", + "0", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "1", + "1", + "0", + "-1/2" + ], + [ + "1", + "1", + "1", + "1", + "-1/2", + "0" + ] + ] + }, + { + "cell": "67+", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 23 + ], + "x1": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 3 + ], + "x2": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 23 + ], + "x3": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 3 + ], + "x4": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 23 + ], + "x5": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 3 + ], + "y0": [ + "target", + 31 + ], + "y1": [ + "target", + 27 + ], + "y2": [ + "target", + 95 + ], + "y3": [ + "target", + 91 + ], + "y4": [ + "target", + 63 + ], + "y5": [ + "target", + 59 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "1" + ], + [ + "y0", + "x1", + "1" + ], + [ + "y2", + "x5", + "1" + ], + [ + "y3", + "x4", + "1" + ], + [ + "y4", + "x3", + "1" + ], + [ + "y5", + "x2", + "1" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x2", + "x5", + "1" + ], + [ + "x4", + "x3", + "1" + ], + [ + "y1", + "x2", + "1" + ], + [ + "y3", + "x0", + "1" + ], + [ + "y5", + "x4", + "1" + ], + [ + "y0", + "y5", + "1" + ], + [ + "y2", + "y3", + "1" + ], + [ + "y4", + "y1", + "1" + ], + [ + "y1", + "x4", + "1" + ], + [ + "y0", + "x5", + "1" + ], + [ + "y2", + "x3", + "1" + ], + [ + "y3", + "x2", + "1" + ], + [ + "y4", + "x1", + "1" + ], + [ + "y5", + "x0", + "1" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x2", + "x5", + 1 + ], + [ + "x4", + "x3", + 1 + ], + [ + "y1", + "x2", + 1 + ], + [ + "y3", + "x0", + 1 + ], + [ + "y5", + "x4", + 1 + ], + [ + "y0", + "y5", + 1 + ], + [ + "y2", + "y3", + 1 + ], + [ + "y4", + "y1", + 1 + ], + [ + "y1", + "x4", + 1 + ], + [ + "y0", + "x5", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y4", + "x1", + 1 + ], + [ + "y5", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "1", + "1", + "1", + "1", + "1" + ], + [ + "1", + "0", + "1", + "1", + "1", + "1" + ], + [ + "1", + "1", + "0", + "1", + "1", + "1" + ], + [ + "1", + "1", + "1", + "0", + "1", + "1" + ], + [ + "1", + "1", + "1", + "1", + "0", + "1" + ], + [ + "1", + "1", + "1", + "1", + "1", + "0" + ] + ] + }, + { + "cell": "67-", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 2 + ], + "x1": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 21 + ], + "x2": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 2 + ], + "x3": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 21 + ], + "x4": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 2 + ], + "x5": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 21 + ], + "y0": [ + "target", + 26 + ], + "y1": [ + "target", + 30 + ], + "y2": [ + "target", + 90 + ], + "y3": [ + "target", + 94 + ], + "y4": [ + "target", + 58 + ], + "y5": [ + "target", + 62 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "1" + ], + [ + "y0", + "x1", + "1" + ], + [ + "y2", + "x5", + "1" + ], + [ + "y3", + "x4", + "1" + ], + [ + "y4", + "x3", + "1" + ], + [ + "y5", + "x2", + "1" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x2", + "x5", + "1" + ], + [ + "x4", + "x3", + "1" + ], + [ + "y1", + "x2", + "1" + ], + [ + "y3", + "x0", + "1" + ], + [ + "y5", + "x4", + "1" + ], + [ + "y0", + "y5", + "1" + ], + [ + "y2", + "y3", + "1" + ], + [ + "y4", + "y1", + "1" + ], + [ + "y1", + "x4", + "1" + ], + [ + "y0", + "x5", + "1" + ], + [ + "y2", + "x3", + "1" + ], + [ + "y3", + "x2", + "1" + ], + [ + "y4", + "x1", + "1" + ], + [ + "y5", + "x0", + "1" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x2", + "x5", + 1 + ], + [ + "x4", + "x3", + 1 + ], + [ + "y1", + "x2", + 1 + ], + [ + "y3", + "x0", + 1 + ], + [ + "y5", + "x4", + 1 + ], + [ + "y0", + "y5", + 1 + ], + [ + "y2", + "y3", + 1 + ], + [ + "y4", + "y1", + 1 + ], + [ + "y1", + "x4", + 1 + ], + [ + "y0", + "x5", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y4", + "x1", + 1 + ], + [ + "y5", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "1", + "1", + "1", + "1", + "1" + ], + [ + "1", + "0", + "1", + "1", + "1", + "1" + ], + [ + "1", + "1", + "0", + "1", + "1", + "1" + ], + [ + "1", + "1", + "1", + "0", + "1", + "1" + ], + [ + "1", + "1", + "1", + "1", + "0", + "1" + ], + [ + "1", + "1", + "1", + "1", + "1", + "0" + ] + ] + }, + { + "cell": "01-", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 19 + ], + "x1": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 17 + ], + "x2": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 19 + ], + "x3": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 17 + ], + "x4": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 19 + ], + "x5": [ + "source", + [ + 0, + 1, + 6, + 7 + ], + 17 + ], + "y0": [ + "target", + 69 + ], + "y1": [ + "target", + 68 + ], + "y2": [ + "target", + 37 + ], + "y3": [ + "target", + 36 + ], + "y4": [ + "target", + 29 + ], + "y5": [ + "target", + 28 + ] + }, + "scaled": [ + [ + "y0", + "x1", + "-1/2" + ], + [ + "y1", + "x0", + "-1/2" + ], + [ + "y3", + "x4", + "-1/2" + ], + [ + "y2", + "x5", + "-1/2" + ], + [ + "y5", + "x2", + "-1/2" + ], + [ + "y4", + "x3", + "-1/2" + ], + [ + "x1", + "x0", + "1" + ], + [ + "x3", + "x4", + "1" + ], + [ + "x5", + "x2", + "1" + ], + [ + "y0", + "x3", + "-1/2" + ], + [ + "y2", + "x1", + "-1/2" + ], + [ + "y4", + "x5", + "-1/2" + ], + [ + "y1", + "y4", + "1" + ], + [ + "y3", + "y2", + "1" + ], + [ + "y5", + "y0", + "1" + ], + [ + "y0", + "x5", + "-1/2" + ], + [ + "y1", + "x4", + "-1/2" + ], + [ + "y3", + "x2", + "-1/2" + ], + [ + "y2", + "x3", + "-1/2" + ], + [ + "y5", + "x0", + "-1/2" + ], + [ + "y4", + "x1", + "-1/2" + ] + ], + "unit": [ + [ + "y0", + "x1", + 1 + ], + [ + "y1", + "x0", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "x1", + "x0", + 1 + ], + [ + "x3", + "x4", + 1 + ], + [ + "x5", + "x2", + 1 + ], + [ + "y0", + "x3", + 1 + ], + [ + "y2", + "x1", + 1 + ], + [ + "y4", + "x5", + 1 + ], + [ + "y1", + "y4", + 1 + ], + [ + "y3", + "y2", + 1 + ], + [ + "y5", + "y0", + 1 + ], + [ + "y0", + "x5", + 1 + ], + [ + "y1", + "x4", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y5", + "x0", + 1 + ], + [ + "y4", + "x1", + 1 + ] + ], + "coefficients": [ + [ + "0", + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "0", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "0", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "-1/2", + "0", + "-1/2", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "0", + "-1/2" + ], + [ + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "-1/2", + "0" + ] + ] + }, + { + "cell": "23-", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 2 + ], + "x1": [ + "source", + [ + 0, + 1, + 2, + 3 + ], + 21 + ], + "x2": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 19 + ], + "x3": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 17 + ], + "x4": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 19 + ], + "x5": [ + "source", + [ + 2, + 3, + 6, + 7 + ], + 17 + ], + "y0": [ + "target", + 66 + ], + "y1": [ + "target", + 70 + ], + "y2": [ + "target", + 101 + ], + "y3": [ + "target", + 100 + ], + "y4": [ + "target", + 93 + ], + "y5": [ + "target", + 92 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "1" + ], + [ + "y0", + "x1", + "1" + ], + [ + "y3", + "x4", + "-1/2" + ], + [ + "y2", + "x5", + "-1/2" + ], + [ + "y5", + "x2", + "-1/2" + ], + [ + "y4", + "x3", + "-1/2" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x3", + "x4", + "1" + ], + [ + "x5", + "x2", + "1" + ], + [ + "y1", + "x3", + "-1/2" + ], + [ + "y2", + "x0", + "1" + ], + [ + "y4", + "x5", + "-1/2" + ], + [ + "y0", + "y4", + "1" + ], + [ + "y3", + "y2", + "1" + ], + [ + "y5", + "y1", + "1" + ], + [ + "y1", + "x5", + "-1/2" + ], + [ + "y0", + "x4", + "-1/2" + ], + [ + "y3", + "x2", + "-1/2" + ], + [ + "y2", + "x3", + "-1/2" + ], + [ + "y5", + "x1", + "1" + ], + [ + "y4", + "x0", + "1" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y3", + "x4", + 1 + ], + [ + "y2", + "x5", + 1 + ], + [ + "y5", + "x2", + 1 + ], + [ + "y4", + "x3", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x3", + "x4", + 1 + ], + [ + "x5", + "x2", + 1 + ], + [ + "y1", + "x3", + 1 + ], + [ + "y2", + "x0", + 1 + ], + [ + "y4", + "x5", + 1 + ], + [ + "y0", + "y4", + 1 + ], + [ + "y3", + "y2", + 1 + ], + [ + "y5", + "y1", + 1 + ], + [ + "y1", + "x5", + 1 + ], + [ + "y0", + "x4", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y5", + "x1", + 1 + ], + [ + "y4", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "1", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "1", + "0", + "-1/2", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "0", + "-1/2", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "-1/2", + "0", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "-1/2", + "-1/2", + "0", + "-1/2" + ], + [ + "1", + "1", + "-1/2", + "-1/2", + "-1/2", + "0" + ] + ] + }, + { + "cell": "45-", + "bindings": { + "x0": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 2 + ], + "x1": [ + "source", + [ + 0, + 1, + 4, + 5 + ], + 21 + ], + "x2": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 2 + ], + "x3": [ + "source", + [ + 2, + 3, + 4, + 5 + ], + 21 + ], + "x4": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 19 + ], + "x5": [ + "source", + [ + 4, + 5, + 6, + 7 + ], + 17 + ], + "y0": [ + "target", + 34 + ], + "y1": [ + "target", + 38 + ], + "y2": [ + "target", + 98 + ], + "y3": [ + "target", + 102 + ], + "y4": [ + "target", + 61 + ], + "y5": [ + "target", + 60 + ] + }, + "scaled": [ + [ + "y1", + "x0", + "1" + ], + [ + "y0", + "x1", + "1" + ], + [ + "y2", + "x4", + "-1/2" + ], + [ + "y3", + "x5", + "-1/2" + ], + [ + "y5", + "x3", + "1" + ], + [ + "y4", + "x2", + "1" + ], + [ + "x0", + "x1", + "1" + ], + [ + "x2", + "x4", + "-1/2" + ], + [ + "x5", + "x3", + "-2" + ], + [ + "y1", + "x2", + "1" + ], + [ + "y3", + "x0", + "1" + ], + [ + "y4", + "x5", + "-1/2" + ], + [ + "y0", + "y4", + "1" + ], + [ + "y2", + "y3", + "1" + ], + [ + "y5", + "y1", + "1" + ], + [ + "y1", + "x5", + "-1/2" + ], + [ + "y0", + "x4", + "-1/2" + ], + [ + "y2", + "x3", + "1" + ], + [ + "y3", + "x2", + "1" + ], + [ + "y5", + "x1", + "1" + ], + [ + "y4", + "x0", + "1" + ] + ], + "unit": [ + [ + "y1", + "x0", + 1 + ], + [ + "y0", + "x1", + 1 + ], + [ + "y2", + "x4", + 1 + ], + [ + "y3", + "x5", + 1 + ], + [ + "y5", + "x3", + 1 + ], + [ + "y4", + "x2", + 1 + ], + [ + "x0", + "x1", + 1 + ], + [ + "x2", + "x4", + 1 + ], + [ + "x5", + "x3", + 1 + ], + [ + "y1", + "x2", + 1 + ], + [ + "y3", + "x0", + 1 + ], + [ + "y4", + "x5", + 1 + ], + [ + "y0", + "y4", + 1 + ], + [ + "y2", + "y3", + 1 + ], + [ + "y5", + "y1", + 1 + ], + [ + "y1", + "x5", + 1 + ], + [ + "y0", + "x4", + 1 + ], + [ + "y2", + "x3", + 1 + ], + [ + "y3", + "x2", + 1 + ], + [ + "y5", + "x1", + 1 + ], + [ + "y4", + "x0", + 1 + ] + ], + "coefficients": [ + [ + "0", + "1", + "1", + "1", + "-1/2", + "-1/2" + ], + [ + "1", + "0", + "1", + "1", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "0", + "1", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "1", + "0", + "-1/2", + "-1/2" + ], + [ + "1", + "1", + "1", + "1", + "0", + "-1/2" + ], + [ + "1", + "1", + "1", + "1", + "-1/2", + "0" + ] + ] + } +] diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json new file mode 100644 index 0000000000..e3bb24cc49 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json @@ -0,0 +1,590 @@ +{ + "full_pairs": [ + [ + 0, + 1 + ], + [ + 2, + 3 + ], + [ + 4, + 5 + ], + [ + 6, + 7 + ] + ], + "triangles": [ + { + "p": [ + 0, + 1 + ], + "e": 1, + "reads": [ + [ + 57, + [ + 0, + 1, + 2, + 3 + ], + 0 + ], + [ + 56, + [ + 0, + 1, + 2, + 3 + ], + 1 + ], + [ + 25, + [ + 0, + 1, + 4, + 5 + ], + 0 + ], + [ + 24, + [ + 0, + 1, + 4, + 5 + ], + 1 + ], + [ + 17, + [ + 0, + 1, + 6, + 7 + ], + 0 + ], + [ + 16, + [ + 0, + 1, + 6, + 7 + ], + 1 + ] + ], + "coded": true, + "cell": 0 + }, + { + "p": [ + 2, + 3 + ], + "e": 1, + "reads": [ + [ + 63, + [ + 0, + 1, + 2, + 3 + ], + 3 + ], + [ + 59, + [ + 0, + 1, + 2, + 3 + ], + 23 + ], + [ + 89, + [ + 2, + 3, + 4, + 5 + ], + 0 + ], + [ + 88, + [ + 2, + 3, + 4, + 5 + ], + 1 + ], + [ + 81, + [ + 2, + 3, + 6, + 7 + ], + 0 + ], + [ + 80, + [ + 2, + 3, + 6, + 7 + ], + 1 + ] + ], + "coded": true, + "cell": 1 + }, + { + "p": [ + 4, + 5 + ], + "e": 1, + "reads": [ + [ + 31, + [ + 0, + 1, + 4, + 5 + ], + 3 + ], + [ + 27, + [ + 0, + 1, + 4, + 5 + ], + 23 + ], + [ + 95, + [ + 2, + 3, + 4, + 5 + ], + 3 + ], + [ + 91, + [ + 2, + 3, + 4, + 5 + ], + 23 + ], + [ + 49, + [ + 4, + 5, + 6, + 7 + ], + 0 + ], + [ + 48, + [ + 4, + 5, + 6, + 7 + ], + 1 + ] + ], + "coded": true, + "cell": 2 + }, + { + "p": [ + 6, + 7 + ], + "e": 1, + "reads": [ + [ + 23, + [ + 0, + 1, + 6, + 7 + ], + 3 + ], + [ + 19, + [ + 0, + 1, + 6, + 7 + ], + 23 + ], + [ + 87, + [ + 2, + 3, + 6, + 7 + ], + 3 + ], + [ + 83, + [ + 2, + 3, + 6, + 7 + ], + 23 + ], + [ + 55, + [ + 4, + 5, + 6, + 7 + ], + 3 + ], + [ + 51, + [ + 4, + 5, + 6, + 7 + ], + 23 + ] + ], + "coded": true, + "cell": 3 + }, + { + "p": [ + 6, + 7 + ], + "e": -1, + "reads": [ + [ + 18, + [ + 0, + 1, + 6, + 7 + ], + 21 + ], + [ + 22, + [ + 0, + 1, + 6, + 7 + ], + 2 + ], + [ + 82, + [ + 2, + 3, + 6, + 7 + ], + 21 + ], + [ + 86, + [ + 2, + 3, + 6, + 7 + ], + 2 + ], + [ + 50, + [ + 4, + 5, + 6, + 7 + ], + 21 + ], + [ + 54, + [ + 4, + 5, + 6, + 7 + ], + 2 + ] + ], + "coded": true, + "cell": 4 + }, + { + "p": [ + 0, + 1 + ], + "e": -1, + "reads": [ + [ + 61, + [ + 0, + 1, + 2, + 3 + ], + 17 + ], + [ + 60, + [ + 0, + 1, + 2, + 3 + ], + 19 + ], + [ + 29, + [ + 0, + 1, + 4, + 5 + ], + 17 + ], + [ + 28, + [ + 0, + 1, + 4, + 5 + ], + 19 + ], + [ + 21, + [ + 0, + 1, + 6, + 7 + ], + 17 + ], + [ + 20, + [ + 0, + 1, + 6, + 7 + ], + 19 + ] + ], + "coded": true, + "cell": 5 + }, + { + "p": [ + 2, + 3 + ], + "e": -1, + "reads": [ + [ + 58, + [ + 0, + 1, + 2, + 3 + ], + 21 + ], + [ + 62, + [ + 0, + 1, + 2, + 3 + ], + 2 + ], + [ + 93, + [ + 2, + 3, + 4, + 5 + ], + 17 + ], + [ + 92, + [ + 2, + 3, + 4, + 5 + ], + 19 + ], + [ + 85, + [ + 2, + 3, + 6, + 7 + ], + 17 + ], + [ + 84, + [ + 2, + 3, + 6, + 7 + ], + 19 + ] + ], + "coded": true, + "cell": 6 + }, + { + "p": [ + 4, + 5 + ], + "e": -1, + "reads": [ + [ + 26, + [ + 0, + 1, + 4, + 5 + ], + 21 + ], + [ + 30, + [ + 0, + 1, + 4, + 5 + ], + 2 + ], + [ + 90, + [ + 2, + 3, + 4, + 5 + ], + 21 + ], + [ + 94, + [ + 2, + 3, + 4, + 5 + ], + 2 + ], + [ + 53, + [ + 4, + 5, + 6, + 7 + ], + 17 + ], + [ + 52, + [ + 4, + 5, + 6, + 7 + ], + 19 + ] + ], + "coded": true, + "cell": 7 + } + ] +} diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/notri/PRIO6.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/notri/PRIO6.json new file mode 100644 index 0000000000..069a7bf5a5 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/notri/PRIO6.json @@ -0,0 +1 @@ +{"prio": {"0,1,2,3": [["1", "0", "0", "1", "0", "0", "0", "0"], ["0", "-1/2", "1/2", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "1"], ["0", "0", "0", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "-1/2", "0", "0", "1/2"]], "0,1,4,5": [["1", "0", "0", "1", "0", "0", "0", "0"], ["0", "-1/2", "1/2", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "1"], ["0", "0", "0", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "-1/2", "0", "0", "1/2"]], "0,1,6,7": [["1", "0", "0", "1", "0", "0", "0", "0"], ["0", "-1/2", "1/2", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "1"], ["0", "0", "0", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "-1/2", "0", "0", "1/2"]], "2,3,4,5": [["1", "0", "0", "1", "0", "0", "0", "0"], ["0", "-1/2", "1/2", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "1"], ["0", "0", "0", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "-1/2", "0", "0", "1/2"]], "2,3,6,7": [["1", "0", "0", "1", "0", "0", "0", "0"], ["0", "-1/2", "1/2", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "1"], ["0", "0", "0", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "-1/2", "0", "0", "1/2"]], "4,5,6,7": [["1", "0", "0", "1", "0", "0", "0", "0"], ["0", "-1/2", "1/2", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "0", "0", "0", "0"], ["0", "0", "0", "0", "1", "0", "0", "1"], ["0", "0", "0", "0", "0", "-1/2", "1/2", "0"], ["-1/2", "0", "0", "1/2", "-1/2", "0", "0", "1/2"]]}} \ No newline at end of file diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json new file mode 100644 index 0000000000..2702c368f4 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/construction/slots/SLOT-PINS-k8.json @@ -0,0 +1,47 @@ +{ + "base_sha256": "db2c7cfb3f8eee2b76c2e0154fc530520fb4d90cd9511a002cab527b16033b83", + "word_sha256": "c2b294300760e1fd6eeab8c22c4d13e4633dca40e52cac8da0d68163a76e3ca8", + "canonical_sha256": "4ddb29fb9bc6f27e0c0fbfcf19a2a93a3496ad900d0f6d89059d0305c9576c0c", + "program_sha256": { + "forward": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8", + "backward": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + "clifford_recipes_sha256": "d0768f2164d5f64a2fdbec422f1cfde4e400818792f1904ca541958377243731", + "slot_controls": [ + "C0_identity", + "donation_after", + "donation_after@236", + "donation_after@238", + "donation_after@434", + "donation_after@436", + "donation_after@439", + "donation_after@444", + "donation_after@446", + "drop_preread", + "drop_preread@236", + "drop_preread@238", + "drop_preread@434", + "drop_preread@436", + "drop_preread@439", + "drop_preread@444", + "drop_preread@446", + "drop_restore", + "drop_restore@236", + "drop_restore@238", + "drop_restore@434", + "drop_restore@436", + "drop_restore@439", + "drop_restore@444", + "drop_restore@446", + "recipe", + "restore_full", + "restore_full@236", + "restore_full@238", + "restore_full@434", + "restore_full@436", + "restore_full@439", + "restore_full@444", + "restore_full@446" + ], + "kappa_decimal": "0.00167166528321877" +} diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/PLAN.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/PLAN.json new file mode 100644 index 0000000000..0465492a1f --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/PLAN.json @@ -0,0 +1,40249 @@ +{ + "status": "FROZEN_EXPLICIT_GAUGE44_WHOLE_OWNER_NOMINATION", + "mode": "gauge44-all72", + "K": 4, + "T": 8, + "M": 73, + "L": 9, + "live": 7168, + "deficit": 2560, + "profile": { + "1": 174763, + "2": 30105, + "3": 31283, + "4": 10224, + "5": 5904, + "7": 54, + "8": 576, + "16": 23, + "48": 2419 + }, + "order": [ + [ + 0, + 0 + ], + [ + 0, + 1 + ], + [ + 1, + 0 + ], + [ + 0, + 2 + ], + [ + 1, + 1 + ], + [ + 2, + 0 + ], + [ + 0, + 3 + ], + [ + 1, + 2 + ], + [ + 2, + 1 + ], + [ + 3, + 0 + ], + [ + 0, + 4 + ], + [ + 1, + 3 + ], + [ + 2, + 2 + ], + [ + 3, + 1 + ], + [ + 4, + 0 + ], + [ + 0, + 5 + ], + [ + 1, + 4 + ], + [ + 2, + 3 + ], + [ + 3, + 2 + ], + [ + 4, + 1 + ], + [ + 5, + 0 + ], + [ + 0, + 6 + ], + [ + 1, + 5 + ], + [ + 2, + 4 + ], + [ + 3, + 3 + ], + [ + 4, + 2 + ], + [ + 5, + 1 + ], + [ + 0, + 7 + ], + [ + 6, + 0 + ], + [ + 1, + 6 + ], + [ + 2, + 5 + ], + [ + 3, + 4 + ], + [ + 4, + 3 + ], + [ + 5, + 2 + ], + [ + 6, + 1 + ], + [ + 1, + 7 + ], + [ + 7, + 0 + ], + [ + 2, + 6 + ], + [ + 3, + 5 + ], + [ + 4, + 4 + ], + [ + 5, + 3 + ], + [ + 6, + 2 + ], + [ + 7, + 1 + ], + [ + 2, + 7 + ], + [ + 8, + 0 + ], + [ + 3, + 6 + ], + [ + 4, + 5 + ], + [ + 5, + 4 + ], + [ + 6, + 3 + ], + [ + 7, + 2 + ], + [ + 8, + 1 + ], + [ + 3, + 7 + ], + [ + 4, + 6 + ], + [ + 5, + 5 + ], + [ + 6, + 4 + ], + [ + 7, + 3 + ], + [ + 8, + 2 + ], + [ + 4, + 7 + ], + [ + 5, + 6 + ], + [ + 6, + 5 + ], + [ + 7, + 4 + ], + [ + 8, + 3 + ], + [ + 5, + 7 + ], + [ + 6, + 6 + ], + [ + 7, + 5 + ], + [ + 8, + 4 + ], + [ + 6, + 7 + ], + [ + 7, + 6 + ], + [ + 8, + 5 + ], + [ + 7, + 7 + ], + [ + 8, + 6 + ], + [ + 8, + 7 + ] + ], + "windows": { + "0,0": [ + 16, + [ + 0, + 1, + 2 + ] + ], + "0,2": [ + 16, + [ + 0, + 1, + 2 + ] + ], + "0,1": [ + 8, + [ + 3, + 4, + 5 + ] + ], + "0,3": [ + 8, + [ + 3, + 4, + 5 + ] + ], + "0,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + ], + "0,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + ], + "0,5": [ + 8, + [ + 10, + 11, + 12, + 13, + 14 + ] + ], + "0,7": [ + 8, + [ + 10, + 11, + 12, + 13, + 14 + ] + ], + "0,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ] + ], + "0,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ] + ], + "0,9": [ + 8, + [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + ], + "0,11": [ + 8, + [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + ], + "0,12": [ + 48, + [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "0,13": [ + 48, + [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "0,14": [ + 32, + [ + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "0,15": [ + 32, + [ + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "0,16": [ + 16, + [ + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "0,17": [ + 16, + [ + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "1,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4 + ] + ], + "1,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4 + ] + ], + "1,1": [ + 8, + [ + 5, + 6, + 7, + 8 + ] + ], + "1,3": [ + 8, + [ + 5, + 6, + 7, + 8 + ] + ], + "1,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + ], + "1,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + ], + "1,5": [ + 8, + [ + 14, + 15, + 16, + 17, + 18, + 19 + ] + ], + "1,7": [ + 8, + [ + 14, + 15, + 16, + 17, + 18, + 19 + ] + ], + "1,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ] + ], + "1,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ] + ], + "1,9": [ + 8, + [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + ], + "1,11": [ + 8, + [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + ], + "1,12": [ + 48, + [ + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "1,13": [ + 48, + [ + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "1,14": [ + 32, + [ + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "1,15": [ + 32, + [ + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "1,16": [ + 16, + [ + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "1,17": [ + 16, + [ + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "2,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + ], + "2,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + ], + "2,1": [ + 8, + [ + 8, + 9, + 10, + 11, + 12 + ] + ], + "2,3": [ + 8, + [ + 8, + 9, + 10, + 11, + 12 + ] + ], + "2,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18 + ] + ], + "2,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18 + ] + ], + "2,5": [ + 8, + [ + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ] + ], + "2,7": [ + 8, + [ + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ] + ], + "2,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ] + ], + "2,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33 + ] + ], + "2,9": [ + 8, + [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41 + ] + ], + "2,11": [ + 8, + [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41 + ] + ], + "2,12": [ + 48, + [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "2,13": [ + 48, + [ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "2,14": [ + 32, + [ + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "2,15": [ + 32, + [ + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "2,16": [ + 16, + [ + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "2,17": [ + 16, + [ + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "3,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ] + ], + "3,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ] + ], + "3,1": [ + 8, + [ + 12, + 13, + 14, + 15, + 16, + 17 + ] + ], + "3,3": [ + 8, + [ + 12, + 13, + 14, + 15, + 16, + 17 + ] + ], + "3,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + ], + "3,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + ], + "3,5": [ + 8, + [ + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32 + ] + ], + "3,7": [ + 8, + [ + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32 + ] + ], + "3,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ] + ], + "3,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ] + ], + "3,9": [ + 8, + [ + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48 + ] + ], + "3,11": [ + 8, + [ + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48 + ] + ], + "3,12": [ + 48, + [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61 + ] + ], + "3,13": [ + 48, + [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61 + ] + ], + "3,14": [ + 32, + [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61 + ] + ], + "3,15": [ + 32, + [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61 + ] + ], + "3,16": [ + 16, + [ + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61 + ] + ], + "3,17": [ + 16, + [ + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61 + ] + ], + "4,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ] + ], + "4,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ] + ], + "4,1": [ + 8, + [ + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + ], + "4,3": [ + 8, + [ + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + ], + "4,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31 + ] + ], + "4,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31 + ] + ], + "4,5": [ + 8, + [ + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ] + ], + "4,7": [ + 8, + [ + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ] + ], + "4,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47 + ] + ], + "4,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47 + ] + ], + "4,9": [ + 8, + [ + 48, + 49, + 50, + 51, + 52, + 53, + 54 + ] + ], + "4,11": [ + 8, + [ + 48, + 49, + 50, + 51, + 52, + 53, + 54 + ] + ], + "4,12": [ + 48, + [ + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "4,13": [ + 48, + [ + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "4,14": [ + 32, + [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "4,15": [ + 32, + [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "4,16": [ + 16, + [ + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "4,17": [ + 16, + [ + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "5,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ] + ], + "5,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ] + ], + "5,1": [ + 8, + [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30 + ] + ], + "5,3": [ + 8, + [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30 + ] + ], + "5,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38 + ] + ], + "5,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38 + ] + ], + "5,5": [ + 8, + [ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46 + ] + ], + "5,7": [ + 8, + [ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46 + ] + ], + "5,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53 + ] + ], + "5,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53 + ] + ], + "5,9": [ + 8, + [ + 54, + 55, + 56, + 57, + 58, + 59 + ] + ], + "5,11": [ + 8, + [ + 54, + 55, + 56, + 57, + 58, + 59 + ] + ], + "5,12": [ + 48, + [ + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ] + ], + "5,13": [ + 48, + [ + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ] + ], + "5,14": [ + 32, + [ + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ] + ], + "5,15": [ + 32, + [ + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ] + ], + "5,16": [ + 16, + [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ] + ], + "5,17": [ + 16, + [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68 + ] + ], + "6,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29 + ] + ], + "6,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29 + ] + ], + "6,1": [ + 8, + [ + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ] + ], + "6,3": [ + 8, + [ + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ] + ], + "6,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45 + ] + ], + "6,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45 + ] + ], + "6,5": [ + 8, + [ + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ] + ], + "6,7": [ + 8, + [ + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ] + ], + "6,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + ], + "6,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58 + ] + ], + "6,9": [ + 8, + [ + 59, + 60, + 61, + 62, + 63 + ] + ], + "6,11": [ + 8, + [ + 59, + 60, + 61, + 62, + 63 + ] + ], + "6,12": [ + 48, + [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,13": [ + 48, + [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,14": [ + 32, + [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,15": [ + 32, + [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,16": [ + 16, + [ + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,17": [ + 16, + [ + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "7,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ] + ], + "7,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ] + ], + "7,1": [ + 8, + [ + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43 + ] + ], + "7,3": [ + 8, + [ + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43 + ] + ], + "7,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ] + ], + "7,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ] + ], + "7,5": [ + 8, + [ + 52, + 53, + 54, + 55, + 56, + 57 + ] + ], + "7,7": [ + 8, + [ + 52, + 53, + 54, + 55, + 56, + 57 + ] + ], + "7,8": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62 + ] + ], + "7,10": [ + 48, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62 + ] + ], + "7,9": [ + 8, + [ + 63, + 64, + 65, + 66 + ] + ], + "7,11": [ + 8, + [ + 63, + 64, + 65, + 66 + ] + ], + "7,12": [ + 48, + [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ] + ], + "7,13": [ + 48, + [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ] + ], + "7,14": [ + 32, + [ + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ] + ], + "7,15": [ + 32, + [ + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ] + ], + "7,16": [ + 16, + [ + 67, + 68, + 69, + 70, + 71 + ] + ], + "7,17": [ + 16, + [ + 67, + 68, + 69, + 70, + 71 + ] + ] + }, + "sides": { + "0": 0, + "2": 1, + "1": 0, + "3": 1, + "4": 0, + "6": 1, + "5": 0, + "7": 1, + "8": 0, + "10": 1, + "9": 0, + "11": 1, + "12": 0, + "13": 1, + "14": 0, + "15": 1, + "16": 0, + "17": 1 + }, + "pairs": { + "0": 1, + "2": 1, + "1": 1, + "3": 1, + "4": 2, + "6": 2, + "5": 2, + "7": 2, + "8": 3, + "10": 3, + "9": 3, + "11": 3, + "12": 0, + "13": 0, + "14": 1, + "15": 1, + "16": 2, + "17": 2 + }, + "solver_status": "g44pack_early_lns_of_deterministic-capacity-matching", + "gap": null, + "provider_calls": [ + { + "time": 0, + "stage": 0, + "replica": 0, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 1, + "stage": 0, + "replica": 1, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 2, + "stage": 1, + "replica": 0, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 3, + "stage": 0, + "replica": 2, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 4, + "stage": 1, + "replica": 1, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 5, + "stage": 2, + "replica": 0, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 6, + "stage": 0, + "replica": 3, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 7, + "stage": 1, + "replica": 2, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 8, + "stage": 2, + "replica": 1, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 9, + "stage": 3, + "replica": 0, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 10, + "stage": 0, + "replica": 4, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 11, + "stage": 1, + "replica": 3, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 12, + "stage": 2, + "replica": 2, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 13, + "stage": 3, + "replica": 1, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 14, + "stage": 4, + "replica": 0, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 15, + "stage": 0, + "replica": 5, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 16, + "stage": 1, + "replica": 4, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 17, + "stage": 2, + "replica": 3, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 18, + "stage": 3, + "replica": 2, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 19, + "stage": 4, + "replica": 1, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 20, + "stage": 5, + "replica": 0, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 21, + "stage": 0, + "replica": 6, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 22, + "stage": 1, + "replica": 5, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 23, + "stage": 2, + "replica": 4, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 24, + "stage": 3, + "replica": 3, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 25, + "stage": 4, + "replica": 2, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 26, + "stage": 5, + "replica": 1, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 27, + "stage": 0, + "replica": 7, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 28, + "stage": 6, + "replica": 0, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 29, + "stage": 1, + "replica": 6, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 30, + "stage": 2, + "replica": 5, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 31, + "stage": 3, + "replica": 4, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 32, + "stage": 4, + "replica": 3, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 33, + "stage": 5, + "replica": 2, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 34, + "stage": 6, + "replica": 1, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 35, + "stage": 1, + "replica": 7, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 36, + "stage": 7, + "replica": 0, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 37, + "stage": 2, + "replica": 6, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 38, + "stage": 3, + "replica": 5, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 39, + "stage": 4, + "replica": 4, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 40, + "stage": 5, + "replica": 3, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 41, + "stage": 6, + "replica": 2, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 42, + "stage": 7, + "replica": 1, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 43, + "stage": 2, + "replica": 7, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 44, + "stage": 8, + "replica": 0, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 45, + "stage": 3, + "replica": 6, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 46, + "stage": 4, + "replica": 5, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 47, + "stage": 5, + "replica": 4, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 48, + "stage": 6, + "replica": 3, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 49, + "stage": 7, + "replica": 2, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 50, + "stage": 8, + "replica": 1, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 51, + "stage": 3, + "replica": 7, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 52, + "stage": 4, + "replica": 6, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 53, + "stage": 5, + "replica": 5, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 54, + "stage": 6, + "replica": 4, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 55, + "stage": 7, + "replica": 3, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 56, + "stage": 8, + "replica": 2, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 57, + "stage": 4, + "replica": 7, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 58, + "stage": 5, + "replica": 6, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 59, + "stage": 6, + "replica": 5, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 60, + "stage": 7, + "replica": 4, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 61, + "stage": 8, + "replica": 3, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 62, + "stage": 5, + "replica": 7, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 63, + "stage": 6, + "replica": 6, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 64, + "stage": 7, + "replica": 5, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 65, + "stage": 8, + "replica": 4, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 66, + "stage": 6, + "replica": 7, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 67, + "stage": 7, + "replica": 6, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 68, + "stage": 8, + "replica": 5, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 69, + "stage": 7, + "replica": 7, + "provider": "gauge44", + "orientation": "backward", + "local_program_sha256": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + { + "time": 70, + "stage": 8, + "replica": 6, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + }, + { + "time": 71, + "stage": 8, + "replica": 7, + "provider": "gauge44", + "orientation": "forward", + "local_program_sha256": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8" + } + ], + "per_call_widths": [ + { + "stage": 0, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 0, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 1, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 2, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 0, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 1, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 3, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 2, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 4, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 3, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 5, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 4, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 6, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 5, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 7, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 6, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + }, + { + "stage": 8, + "replica": 7, + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ] + } + ], + "provider_registry": { + "gauge44": { + "directory": "providers/gauge44", + "artifact_sha256": { + "CANONICAL-WORD.json.gz": "16bc0ebb04b4be6c0ade74badc6a0c0cdba4215eda86e4ff9f13abf8ecebd219", + "LOCAL-PROGRAMS.json.gz": "241fde27d4e43f5a9cb6b128f9f76c5131a53d09f0371676163f914d0b0fef3a", + "LOCAL-CHECKS.json": "2b8b1891a736598010232bfb26abc31973b265a53a2009a3fcfd9138b5ecadb4", + "INDEPENDENT-LOCAL-REPLAY.json": "13dd18297162569532983db1a2ab67926b064330cd7edd3587e7b546b2dedf17", + "CLIFFORD-RECIPES.json": "d0768f2164d5f64a2fdbec422f1cfde4e400818792f1904ca541958377243731", + "CLIFFORD-REVIEW.json": "59e1f8d7215c79081f70b953f85fcbaac2a32a75b8b12448f667b17271405f9e", + "RESIDUAL-ADAPTERS.json": "383f40aadd00a4ac700dfd0d4c22d6c6c0be9a9863116e4d69c7acd23bafae0c" + }, + "ports": [ + 11, + 19, + 35, + 67, + 131, + 259, + 13, + 21, + 37, + 69, + 133, + 261, + 41, + 73, + 137, + 265, + 49, + 81, + 145, + 273, + 161, + 289, + 193, + 321, + 385, + 14, + 22, + 38, + 70, + 134, + 262, + 26, + 74, + 138, + 266, + 50, + 146, + 274, + 98, + 162, + 290, + 194, + 322, + 386, + 28, + 44, + 140, + 268, + 84, + 148, + 276, + 100, + 164, + 292, + 196, + 324, + 388, + 56, + 88, + 152, + 280, + 104, + 168, + 296, + 200, + 328, + 392, + 112, + 176, + 304, + 208, + 336, + 400, + 224, + 352, + 416, + 448, + 508, + 506, + 502, + 494, + 478, + 446, + 382, + 254, + 505, + 501, + 493, + 477, + 445, + 381, + 253, + 499, + 491, + 475, + 443, + 379, + 251, + 487, + 471, + 439, + 375, + 247, + 463, + 431, + 367, + 239, + 415, + 351, + 223, + 319, + 191 + ], + "centers": [ + 92, + 57, + 81, + 224, + 11, + 240, + 9, + 256 + ], + "widths": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 8, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 9, + 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 7, + 7, + 8, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 7, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 9, + 8, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5 + ], + "actual_paid_profile": { + "1": 2412, + "2": 418, + "3": 432, + "4": 142, + "5": 82, + "8": 8 + }, + "orientation_program_sha256": { + "forward": "071ecdacc0bb3ac16046aad4119ed551a945cb0ed6c57002a548a3e2232503d8", + "backward": "f36c5831106f5637102c6bedeec76ed2b223c6671ce42fd0eceed9ef24725b23" + }, + "artifact_semantic_sha256": { + "CANONICAL-WORD.json.gz": "4ddb29fb9bc6f27e0c0fbfcf19a2a93a3496ad900d0f6d89059d0305c9576c0c", + "LOCAL-PROGRAMS.json.gz": "9f41d53659e9be84e20c661560c5687abbf5cd0660cdecbe01ad5eb29e6b8ee3", + "LOCAL-CHECKS.json": "18f09b79835aa352f04d27041d86d1338c5ad0094b888588c1c05af2dc399ffd", + "INDEPENDENT-LOCAL-REPLAY.json": "2d4680965c62db1fde1236c4857b19bf7bc97af58805e6b4109afbc452f0fdd8", + "CLIFFORD-RECIPES.json": "d0768f2164d5f64a2fdbec422f1cfde4e400818792f1904ca541958377243731", + "CLIFFORD-REVIEW.json": "4960fd1215509b5347ef7f0092868f79aea0f8e24fb84352da9a1033e4394007", + "RESIDUAL-ADAPTERS.json": "c682e9ff1b347f89771c6800f46ad98c2bb92b91c5c88452d53a9e7f0180c35f" + } + } + }, + "source_plan_sha256": "258a8b9baa245fa4096828671e2f1d1462b5af08d56890629622ef6125eaddda", + "assignment_sha256": "32ca30cd1c652ef6ad43657273a08a157e1df3545e759ab36306a0d0b516fb4a", + "source_owners_sha256": "935ff1a6823c6625daba3349b28d74acf9a3d70a5947ae155aa66c7821804add" +} diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/UPSTREAM-PINS.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/UPSTREAM-PINS.json new file mode 100644 index 0000000000..68486b84e3 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/data/UPSTREAM-PINS.json @@ -0,0 +1,23 @@ +{ + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/CANONICAL-WORD.json.gz": "66d3c3c70983224650643a0a05a21ac6c6959f84d0f4528650601016f5a76844", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/CLIFFORD-RECIPES.json": "534ace870cabe515987e00f50f71550030965006ea18978e0924590ac6944345", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/CLIFFORD-REVIEW.json": "ee9b86428278392d2c933f76d60e51f5af90d4ab67e4d3937ed2fa416e7755ab", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/INDEPENDENT-LOCAL-REPLAY.json": "ad3f2b941127688f98ce6872d00f110644f1c2b156f8adad1b6700e838ed0e26", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/INDEPENDENT-REPLAY.json": "ad3f2b941127688f98ce6872d00f110644f1c2b156f8adad1b6700e838ed0e26", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/INTEGRATION.json": "5c14538134dfffbc58fa4b4d2f26b270ec5f56d17d4bf23752c82964f45171db", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/LOCAL-CHECKS.json": "79177449e404403964ce1b2f4a9a8bd49e1916daba3123d7fd7f5cfd1f1ac0ea", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/LOCAL-PROGRAMS.json.gz": "99a18eede965accf65943e490b8d2b2ffb9f1c9bc6babdb825413a80cbea2cde", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/RESIDUAL-ADAPTERS.json": "baafef737acc16dafbe1150896feb16744f3d669fa123bb2bff19ecc4e71b275", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/SCALAR-FRAME-AUDIT.json": "73b3601a6239502475a272ea0c46945fd42034486aaf43e66a212eb4f012ca44", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/WRAPPER-CHECKS.json": "9a09146e686c4f535b04fdef3753fe01dad8f5e8881a69408a91394acb5b48f5", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/base/work/complex-nine-native/DATA-PHASES.json": "c5916ff312678f12aba403847643fbbc29f643acec60bdf836fa56cd3e8251fa", + "research/complex-k492-owner-repair/vendor/multicold/code/run_portable.py": "322d29d43dbee8130cde15d4bf05396698b5e3dfe3735813899db91cc0ba7955", + "research/complex-k492-owner-repair/vendor/multicold/engines/base_two_moment.py": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "research/complex-k492-owner-repair/vendor/multicold/engines/moment.py": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "research/complex-k492-owner-repair/vendor/multicold/engines/outer.py": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c", + "research/complex-k492-owner-repair/vendor/multicold/inputs/PR543-EXPECTED.json": "06eccee9f6b77e140833df83407e7996dc948c17d49b0779ab171fbe463fd28d", + "research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-global/vendor531/evidence/audit/PREFIX-AND-INVOICE.json": "ce1bfa49be88ae67a404f606a11db2232b7e1f2610d4418058e39749d86d8478", + "research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-global/vendor535/inputs/ROUND20-PARENT-TEMPLATE.json.gz": "025448abdf2012d327e50a009084e1501690d05e650300d2982836aa0350ae00", + "research/community-k492-audit/pr622/replay/baseline558/complex-global/controller-input/split-centres/CANONICAL-WORD.json.gz": "de2be0f4b6d24ace368fd5b834b7a00f9625d0a1824c4ff969f2db5f115db667", + "research/complex-k492-owner-repair/vendor/multicold/vendor/pr558/vendor/pr552/complex-global/vendor531/code/prepare_supplier_base.py": "f5eae94aca965d0008bc07cff8245ccb7509042ccad457d3bcb7d51c1e9409f0" +} diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/independent/audit_local.py b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/independent/audit_local.py new file mode 100644 index 0000000000..4744d8783c --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/independent/audit_local.py @@ -0,0 +1,171 @@ +"""Independent exact scalar/frame audit of the changed forward supplier. + +This does not import a generator, builder, stored compensation, or price. +All claimed endpoint matrices are derived from the input word's gates. +Optional --main checks the transported boundary against the pinned parent. +Prepared for icekylinx with OpenAI GPT-6 Astra assistance. Apache-2.0. +""" +import argparse,gzip,json,hashlib,time +from pathlib import Path +from fractions import Fraction as F +from collections import Counter + +def require(x,label): + if not x:raise RuntimeError(label) + +def basis(vs): + piv={} + for a in vs: + while a: + bit=a.bit_length()-1 + if bit in piv:a^=piv[bit] + else: + piv[bit]=a;break + for k in sorted(piv): + for j in piv: + if j>k and piv[j]>>k&1:piv[j]^=piv[k] + return tuple(piv[k] for k in sorted(piv,reverse=True)) + +def contained(a,b):return basis(a+b)==b + +def registers(e):return e[1:3] if e[0]=='add' else e[1:2] + +def apply(e,rows,dual=False): + if e[0]=='add': + t,s=e[1:3];q=F(e[3],e[4]);require(t!=s,'self add') + if dual:t,s,q=s,t,-q + dst=rows[t] + for k,x in list(rows[s].items()): + a=dst.get(k,F(0))+q*x + if a:dst[k]=a + else:dst.pop(k,None) + elif e[0]=='scale': + t=e[1];q=F(e[2],e[3]);require(q!=0,'zero scale') + if dual:q=1/q + rows[t]={k:q*x for k,x in rows[t].items()} + else:raise RuntimeError('unknown scalar primitive') + +def invert(e): + r=list(e) + if r[0]=='add':r[3]=-r[3] + else:r[2],r[3]=r[3],r[2] + return r + +def check_parent_interface(word,main): + # Read only the retained boundary data. No builder or local checker is imported. + relative="research/community-k492-audit/pr622/replay/baseline558/complex-global/base/split-centres/CANONICAL-WORD.json.gz" + path=main/relative;raw=path.read_bytes() + require(hashlib.sha256(raw).hexdigest()=="66d3c3c70983224650643a0a05a21ac6c6959f84d0f4528650601016f5a76844",'parent canonical input pin') + parent=json.loads(gzip.decompress(raw)) + tau=lambda x:x^(43 if (x&43).bit_count()%2 else 0) + ports=parent['ports'];v=word['report']['v'] + require(len(ports)==len(set(ports))==v,'parent port count') + require(set(map(tau,word['ports']))==set(ports),'transported source/target ports') + moved={i:ports.index(tau(p)) for i,p in enumerate(word['ports'])} + centers=[moved.get(r,r) for r in word['centers']] + actual=[list(basis([tau(x) for x in frame])) for frame in word['center_frames']] + expected=[parent['frames'][f] for f in parent['center_frames']] + require(len(centers)==len(set(centers))==len(actual)==8,'eight distinct centre carriers') + require(actual==expected and all(len(f)==8 for f in actual),'ordered centre frame interface') + return dict(parent_path=relative,parent_file_sha256=hashlib.sha256(raw).hexdigest(), + transport_tau=43,ordered_frame_bases_match=True,all_ports_match=True, + transported_centers=centers,source_centers=[r for r in centers if r=2*v} + for e in w['precondition']:apply(e,dirt) + compensation=[['add',y,k,-a.numerator,a.denominator,[]] for y in range(v,2*v) for k,a in sorted(dirt[y].items())] + entering=set(map(int,w.get('start_extra',{})));lowends=set(map(int,w.get('helper_final',{}))) + coldends=lowends-entering + require(not any(e[2] in entering for e in compensation),'nonzero entrance response') + require(not any(r in entering|coldends for e in w['precondition']+compensation for r in registers(e)), 'pre-wrapper touch of residual helper') + require(all(e[-1]==[] for e in w['precondition']+compensation),'nonzero frame precondition') + early=w.get('early_cleanup',[]);earlyids={i for i,U in early} + require(len(earlyids)==len(early),'duplicate early cleanup gate') + tail=[w['cleanup'][i][:-1]+[U] for i,U in early] + cleanup=[e for i,e in enumerate(w['cleanup']) if i not in earlyids] + prefix=w['precondition']+compensation+main + program=prefix+tail+cleanup + for dual in (False,True): + actual=ident() + for e in program:apply(e,actual,dual) + expected=ident() + for t in range(v):expected[t if dual else v+t][v+t if dual else t]=F(-1 if dual else 1) + bad=[i for i in range(n) if actual[i]!=expected[i]] + require(not bad,'all-column endpoint failure '+str((dual,bad[:8]))) + print('endpoint', 'dual' if dual else 'forward','PASS',flush=True) + full=basis([1< 2*max(H)**2, 'halving guard') + rows = [] + for z, accept in [(lower, True), (lower+Q(1, 10**24), False)]: + l, u = M.moment(H, m, W, z, bad) + ll, uu = B.moment(m, W, list(H.items()), z) + if bad: + fl, fu = B.moment(m, W, [(1, 32*m*m*sum(H.values()))], z) + ll, uu = ll+fl/10**16, uu+fu/10**16 + require((u < 1 and uu < 1) if accept else (l > 1 and ll > 1), 'two exact moment signs') + rows.append(dict(endpoint=str(z), accept=accept, + mercator_residual=[str(l-1), str(u-1)], + base_two_residual=[str(ll-1), str(uu-1)])) + return rows + + +def outer47(c, b, engine): + eta = beta = Q(1, 10**24) + s = min(c, (1-beta)*b)-Q(1, 10**27) + require(0 < s < c and s < (1-beta)*b, 'strict common saving') + a = Q(384599, 10**10) + for _ in range(7): + old = a + a = (1-s)*s+s*old + gap = min(s-a, 1-a-s, 1-a-s*(1-old), 1-s) + require(old < a < s < 1-a and gap > 0, 'bootstrap gap') + ceil = lambda x: -(-x.numerator//x.denominator) + cut = max(ceil(36/gap**2), ceil(2*(4+512)/gap)) + require(cut*gap**2 >= 36 and cut*gap >= 2*(4+512), 'finite bootstrap cutoff') + q = a*(1-2*eta) + margin = (1-eta)*q/(1+q) + ticks = margin*10**18 + k = Q((ticks.numerator-1)//ticks.denominator, 10**18) + bridge = {'semantic': {'C0': {'base': 2, 'exponent': 210000}, 'strict_literal_gap': 1}, + 'rows': {'degree_gap': Q(10**6)-Q(51*20161, 25)}} + result = engine.assembly(a, b, bridge, k, eta=eta, beta=beta) + require(len(result['strict_constraints']) == 47, '47 outer constraints') + require(all(x > 0 for x in result['strict_constraints'].values()), 'strict outer constraints') + rejected = [] + for name, kk, ee, be in [('next_grid', k+Q(1, 10**18), eta, beta), + ('zero_eta', k, Q(0), beta), ('zero_beta', k, eta, Q(0)), + ('unit_beta', k, eta, Q(1))]: + try: + engine.assembly(a, b, bridge, kk, eta=ee, beta=be) + except AssertionError: + rejected.append(name) + else: + raise RuntimeError('accepted negative control: '+name) + return dict(complex_b=str(b), bit_c=str(c), kappa=str(k), kappa_decimal=decimal(k), + binding='bit' if c < (1-beta)*b else 'complex', + strict_constraints_passed=47, controls_rejected=rejected) + + +def main(): + require(__debug__, 'Do not use python -O: the retained outer engine requires assertions') + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--main', type=Path, required=True, help='Pinned main checkout') + parser.add_argument('--profile', type=Path, default=HERE.parent/'data/PLAN.json', + help='Raw profile or a JSON object containing profile/global_profile') + parser.add_argument('--output', type=Path, required=True) + parser.add_argument('--headroom-c', help='Optional alternative bit saving, for comparison only') + args = parser.parse_args() + inputs = json.loads((HERE.parent/'data/UPSTREAM-PINS.json').read_text()) + selected = [SOURCE/'engines'/(n+'.py') for n in ('moment', 'base_two_moment', 'outer')] + for relative in selected: + require(sha(args.main/relative) == inputs[relative.as_posix()], 'pinned input '+str(relative)) + M, B, A = [load(args.main/SOURCE/'engines', n) for n in ('moment', 'base_two_moment', 'outer')] + supplied = json.loads(args.profile.read_text()) + H = {int(r): n for r, n in supplied.get('profile', supplied.get('global_profile', supplied)).items()} + bit_data = BIT_PATH.read_bytes() + require(hashlib.sha1(b'blob '+str(len(bit_data)).encode()+b'\0'+bit_data).hexdigest() == BIT_BLOB, 'PR589 blob pin') + record = json.loads(bit_data) + bit = record['nine'] + require('nine-stage' in bit['pipeline'] and '32 replicas' in bit['pipeline'], 'nine-stage bit record') + bit_deficit = pr589_deficit(record['word'], bit['bit']['live']) + require(sum(int(r)*n for r, n in bit['profile'].items()) == bit['bit']['rank_mass'], 'bit rank mass') + c = Q(bit['bit_lower']) + bit_checks = moment_checks(M, B, {int(r): n for r, n in bit['profile'].items()}, + 64, bit['bit']['live'], c, bit_deficit, True) + prices = {} + for mode, bad in [('native', False), ('conservative', True)]: + root = M.certify(H, 73, 7168, bad) + root = {key: root[key] for key in ('lower', 'upper', 'lower_endpoint_residual_upper', + 'upper_endpoint_residual_lower', 'strict_rational_signs')} + b = Q(root['lower']) + row = dict(root=root, exact_moments=moment_checks(M, B, H, 73, 7168, b, 2560, bad), + outer_with_bit=outer47(c, b, A)) + if args.headroom_c: + alternate = outer47(Q(args.headroom_c), b, A) + require(alternate['kappa'] == row['outer_with_bit']['kappa'], 'headroom comparison changed kappa') + row.update(outer_with_alternative_bit_rate=alternate, same_kappa_with_either_bit_rate=True) + prices[mode] = row + native_k = Q(prices['native']['outer_with_bit']['kappa']) + result = dict(status='PASS_FROZEN_PROFILE_TWO_EXACT_ENGINE_AND_OUTER47_CROSSCHECK', + profile_input_file=args.profile.name, profile_input_sha256=sha(args.profile), + global_profile=H, live=7168, m=73, rank_mass=sum(r*n for r, n in H.items()), deficit=2560, + prices=prices, bit_supplier_pr=589, bit_deficit=bit_deficit, bit_moments_with_surcharge=bit_checks, + gain_over_pr635_percent=decimal(100*(native_k/Q('0.001636241501576388')-1)), + input_sha256={**{relative.as_posix(): sha(args.main/relative) for relative in selected}, 'package:inputs/PR589-EXPECTED.json': sha(BIT_PATH)}, + scope='Independent arithmetic for the exact nominated all72 profile. Complete local, controller and finite invoice admission are separately replayed by the package driver; this receipt does not replace them. The cited PR589 bit supplier is unchanged and its exceptional-residue surcharge is retained. Any alternative c is only a headroom comparison.') + args.output.write_text(json.dumps(result, indent=2)+'\n') + print(result['status'], prices['native']['outer_with_bit']['kappa_decimal'], result['gain_over_pr635_percent']) + + +if __name__ == '__main__': + main() diff --git a/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/inputs/PR589-EXPECTED.json b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/inputs/PR589-EXPECTED.json new file mode 100644 index 0000000000..e293ddc557 --- /dev/null +++ b/research/end-cap-obstruction/inputs/repo/research/gauge44-slots/inputs/PR589-EXPECTED.json @@ -0,0 +1,222 @@ +{ + "word": { + "file": "tune/bitE8mut-p111-tuned.json.gz", + "file_sha256": "e3e301e62bc2b41dbf1ceac0acf3d35824ebeab1848c5a2142d4577b109da52f", + "content_sha256": "5642fd0e35a1acc11acff8d0c08350c1617e95f310d4d35ad63a651f9eeeba0b", + "v": 111, + "R": 439, + "punctured": [ + 10, + 15, + 51, + 53, + 56, + 66, + 72, + 89, + 111 + ], + "retained_totals": 9, + "copy_ranks": [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7 + ], + "decoder_constant": 63, + "gates": { + "D": 111, + "A": 2075, + "B": 712, + "C": 2574 + }, + "local_histogram": { + "1": 1323, + "2": 1342, + "3": 79, + "4": 44, + "5": 102, + "6": 11, + "7": 19 + }, + "legality": { + "records": 27234, + "common_frame_ADDs": 24305, + "rank_mass": 5129 + }, + "five_stage_columns": 883, + "five_stage_payload_bits": 93, + "nine_stage_columns": 1327, + "nine_stage_payload_bits": 93, + "eleven_stage_columns": 1549, + "eleven_stage_payload_bits": 93, + "base_content_sha256": "d0df3c89ae84989f4045ba1681a5e2e9fcdfa38ed0301c8abf5185537155cbe3" + }, + "interface": { + "hypotheses": { + "H1_no_target_feeds_z": true, + "H2_D_frame0_targets_from_helpers": true, + "H3_A_z_only_scatter_targets_B_split": true, + "H4_C_literal_reverse_at_full": true, + "H5_V_identity": true + }, + "conclusion": { + "U_block_form": true, + "J_identity": true, + "K_equals_D": true, + "C_is_U_inverse": true + }, + "interleaving": { + "z_gates_A": 2075, + "source_writes_A": 0, + "z_gates_B": 499, + "source_writes_B": 483, + "helper_writes_B": 16, + "sources_rewritten_B": 108, + "B_z_write_frame_dims": { + "4": 388, + "6": 111 + }, + "B_z_operand_kinds": { + "helper<-helper": 3, + "helper<-source": 13, + "source<-helper": 108, + "source<-source": 375 + }, + "B_z_operand_kinds_by_dim": { + "dim4:helper<-source": 13, + "dim4:source<-source": 375, + "dim6:helper<-helper": 3, + "dim6:source<-helper": 108 + }, + "B_z_writes_after_a_target_read_of_the_same_register": 454, + "B_target_reads_of_registers_rewritten_earlier_in_B": 111, + "target_reads_of_targets": 0, + "cleanup_gates": 2574 + } + }, + "nine": { + "pipeline": "PR #510 (PR #463 nine-stage template, 32 replicas, PR #442 hosting, PR #493 outer assembly), parameterised for v <= 120 by code/adapt9p.py", + "bit_lower": "1733427039589844234749/1000000000000000000000000", + "bit_lower_decimal": "0.001733427039589844234749", + "profile": { + "1": 381024, + "2": 400416, + "3": 22752, + "4": 26880, + "5": 29376, + "6": 17376, + "7": 26784, + "42": 288 + }, + "bit": { + "live": 28416, + "physical": 28425, + "maxchild": 42, + "rank_mass": 1808352, + "hosted_residuals": 126432, + "bank_assignments": 0, + "prefix_bits": 177, + "charged_prefix_bits": 192, + "coefficient_bits": 177, + "two_level_coefficient_bits": 393, + "charged_two_level_coefficient_bits": 512, + "row_coefficient": 18355, + "halving_depth": 2 + }, + "kappa": { + "pr548": { + "kappa": "49718254847979/31250000000000000", + "kappa_decimal": "0.001590984155135328", + "complex_lower": "796759709641153381751/500000000000000000000000", + "binding_component": "complex" + }, + "pr544": { + "kappa": "397677800014309/250000000000000000", + "kappa_decimal": "0.001590711200057236", + "complex_lower": "31864911873350496687/20000000000000000000000", + "binding_component": "complex" + }, + "pr535": { + "kappa": "793733736881443/500000000000000000", + "kappa_decimal": "0.001587467473762886", + "complex_lower": "1589991533606044174031/1000000000000000000000000", + "binding_component": "complex" + }, + "pr531": { + "kappa": "1517760977820331/1000000000000000000", + "kappa_decimal": "0.001517760977820331", + "complex_lower": "304013615566499291631/200000000000000000000000", + "binding_component": "complex" + } + } + }, + "eleven": { + "pipeline": "PR #493 (PR #445 geometry, PR #472 emitter, audit and invoice, PR #442 hosting), parameterised by PR #545's code/adapt.py", + "bit_lower": "855475950388791987811/500000000000000000000000", + "bit_lower_decimal": "0.001710951900777583975622", + "profile": { + "1": 116424, + "2": 121648, + "3": 6952, + "4": 7424, + "5": 8976, + "6": 4520, + "7": 8776, + "56": 2600 + }, + "bit": { + "live": 8880, + "physical": 8889, + "maxchild": 56, + "rank_mass": 689304, + "hosted_residuals": 38632, + "prefix_bits": 4304, + "charged_prefix_bits": 4352, + "coefficient_bits": 4304, + "three_level_coefficient_bits": 12966, + "charged_three_level_coefficient_bits": 12992, + "row_coefficient": 19431, + "halving_depth": 3 + }, + "emitted_program_sha256": "793b6f40c9aa4b8db57fec0ac0973e16884dae28707e482ee8f7a2349a5d5a4b", + "kappa": { + "pr548": { + "kappa": "49718254847979/31250000000000000", + "kappa_decimal": "0.001590984155135328", + "complex_lower": "796759709641153381751/500000000000000000000000", + "binding_component": "complex" + }, + "pr544": { + "kappa": "397677800014309/250000000000000000", + "kappa_decimal": "0.001590711200057236", + "complex_lower": "31864911873350496687/20000000000000000000000", + "binding_component": "complex" + }, + "pr535": { + "kappa": "793733736881443/500000000000000000", + "kappa_decimal": "0.001587467473762886", + "complex_lower": "1589991533606044174031/1000000000000000000000000", + "binding_component": "complex" + }, + "pr531": { + "kappa": "1517760977820331/1000000000000000000", + "kappa_decimal": "0.001517760977820331", + "complex_lower": "304013615566499291631/200000000000000000000000", + "binding_component": "complex" + } + } + }, + "base": { + "nine_bit_lower": "1733052823330162099157/1000000000000000000000000", + "nine_bit_lower_decimal": "0.001733052823330162099157", + "eleven_bit_lower": "427652201524503168379/250000000000000000000000", + "eleven_bit_lower_decimal": "0.001710608806098012673516", + "note": "PR #555's EXPECTED.json (untuned word); the tune/ pipeline is the same, with the same frozen hosting selections" + } +} diff --git a/research/end-cap-obstruction/inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz b/research/end-cap-obstruction/inputs/repo/research/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e98ce5d879e99427347acd725efc3b0c96fe5c13 GIT binary patch literal 3400 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 e_dI=Q!m1$. +The same argument gives a unit vector in $Q^\perp$ when it is nonzero. +A triple complement, and the complement of two neighboring triple +lines, contain coordinate units outside supports of sizes at most +three and six, respectively. Full tensor spaces contain coordinate +units as well. In each nonzero tensor summand, tensoring these chosen +norm-one vectors gives a norm-one vector; placing it in that orthogonal +summand gives one in the whole residual. Each residual is nondegenerate +by the decompositions above. Thus every nonzero residual is nonalternating. + +For completeness, every nondegenerate nonalternating binary symmetric +space has an orthonormal basis. Split off unit lines until the +remaining space is alternating. A nonzero nondegenerate alternating +space splits into planes with bases $a,b$ satisfying +$a\cdot a=b\cdot b=0$, $a\cdot b=1$; this follows by choosing a +nonzero $a$, choosing $b$ with $a\cdot b=1$, and taking the orthogonal +complement of their nondegenerate plane. Retain one unit vector $w$ +from the lines already split off. A plane orthogonal to $w$ can be +absorbed into that line: the three vectors +\[ + w+a,\qquad w+b,\qquad w+a+b +\] +are independent, pairwise orthogonal, and have norm one. +Use one of these new unit vectors in place of $w$ for the next plane; +the remaining planes are still orthogonal to it. Repeating this +operation absorbs every alternating plane. +\end{proof} + +The loss ratios have the exact values +\[ + \frac{L_{\rm b}}{N}=\frac{100}{539},\qquad + \frac{L_{\rm c}}{N}=\frac{101}{539}. +\] +In particular, both are smaller than $1/2$. We now turn the dimension +count into the two interfaces needed later. + +\subsection{The rational matrix interface} + +For a nondegenerate rational subspace $U\subset\mathcal F$, write +$P_U$ for the projection onto $U$ along $U^\perp$. Assign $P_U$ to +each gate or sink with label $U$. Assign the source matrix $-P_{U_a}$ +to $X_a$ and zero to every other source. +These are fixed rational $m\times m$ matrices; write $M_v$ for the matrix +at vertex $v$. Define +$\rho(X_a)=Y_a$, $\rho(Y_a)=X_a$, and let $\rho$ fix every auxiliary +wire. + +In the tape application, two address chunks are written as vectors $H,D$ +of $m$ fields. For a matrix $M$, the frame $\Phi_M$ moves the array entry +at $(H,D)$ to $(H+MD,D)$, leaving the other address fields unchanged. +The fields use a radix coprime to the fixed denominators, and addition is +modulo their common range. Hence $\Phi_M$ is an invertible +$\mathbb F_2$-linear permutation of array entries, and +$\Phi_{M'}\Phi_M=\Phi_{M'+M}$. Using $D_v=\Phi_{M_v}$ +in \eqref{eq:common-frame-identity}, the endpoint matrix difference on each +routed role is exactly the shear applied to that role. The following identity +makes it the same shear $H\gets H+D$ on every role; +Section~\ref{sec:tape-interchange} turns that shear into a field interchange +and implements an edge change with one smaller interchange per unit of its +rational rank. + +\begin{proposition}\label{prop:bit-motif-interface} +The bit network has $W_{\rm b}$ wires, uses only pointwise XOR gates, +and sends its input vector to the permutation $\rho$ of that vector. +Its rational matrices are common to all incidences of a gate and obey +\[ + M_{\mathrm{sink}(\rho(w))}-M_{\mathrm{source}(w)}=I_m + \quad\text{for every input role }w. +\] +The sum of the rational ranks of all edge differences is +\begin{align} + s_{\rm b} + &=\sum_{e}\operatorname{rank}_{\mathbb Q} + (M_{\mathrm{head}(e)}-M_{\mathrm{tail}(e)})\\ + &=W_{\rm b}m-N+2L_{\rm b} + =1771765690887858612870000000$. + +For an input $X_a$ the endpoint difference is +$P_{U_a^\perp}-(-P_{U_a})=I_m$. Every other role has zero source +matrix and identity sink matrix. This proves the interface. +\end{proof} + +\subsection{The binary phase interface} + +Use the complex scalar network and binary labels. For a binary vector +$x$, let $\operatorname{wt}(x)$ denote its integer Hamming weight, and +write $[b]\in\{0,1\}$ for the integer representative of $b\in\mathbb F_2$. +For a label $U$, let +\[ + q_U(x)=\operatorname{wt}(P_Ux)\pmod4. +\] +The projection here is over $\mathbb F_2$. +Let +\[ + H=\frac1{\sqrt2}\begin{pmatrix}1&1\\1&-1\end{pmatrix},\quad + C=H\begin{pmatrix}1&0\\0&i\end{pmatrix}H + =aI+bX,\qquad a=\frac{1+i}{2},\quad b=\frac{1-i}{2}, +\] +where $X$ interchanges the two coordinates. On functions of +$x\in\mathbb F_2^m$ define +\[ + \mathcal C_U=H^{\otimes m}\operatorname{diag}_x(i^{q_U(x)})H^{\otimes m}. +\] +The use of $H$ in this definition is an identity of matrices. Each entry +of $\mathcal C_U$ and its inverse is a Gaussian integer divided by $2^m$, +so both preserve arrays over $\mathbb Z[i,1/2]$. The kernels implemented +below have Gaussian dyadic coefficients. + +To apply the scalar network to these functions, replace the scalar on +each wire $w$ by an array +$f_w:\mathbb F_2^m\to\mathbb Z[i,1/2]$. At each address, a gate +applies its scalar linear map to the values on the wires it touches. +The frame in \eqref{eq:common-frame-identity} is $D_v=\mathcal C_U$ at a +vertex with label $U$. On an edge from label $U$ to label $V$, apply +$\mathcal C_V\mathcal C_U^{-1}$ to that wire's array. +All frames are diagonalized by the same matrix $H^{\otimes m}$. +For an integer $k\ge1$, an address for $k$ columns is +$(x^{(1)},\ldots,x^{(k)})\in(\mathbb F_2^m)^k$; every frame and edge +operator is then the tensor product of its one-column version over +these $k$ coordinates. Each scalar gate is still applied once at each +joint address, to the vector of values on the roles it touches. + +\begin{proposition}\label{prop:complex-motif-interface} +For each edge of the complex network, write $U,V$ for its tail and +head labels. Its phase-frame difference +$\mathcal C_V\mathcal C_U^{-1}$ is a product of one translation +kernel $aI+bX_v$, or its inverse, per vector in an orthonormal basis +of the edge residual. Here $(X_vf)(x)=f(x+v)$. +The sum of these basis lengths is +\[ + s_{\rm c}=W_{\rm c}m-2N+2L_{\rm c} + =18738072446366712673080000000$. + +For an edge $e$, write $\mathcal B_e$ for its residual basis and +$K_{e,v}$ for the forward or inverse translation kernel associated +with $v\in\mathcal B_e$. Taking tensor products preserves their +product, so on $k$ columns +\[ + \bigl(\mathcal C_V\mathcal C_U^{-1}\bigr)^{\otimes k} + =\prod_{v\in\mathcal B_e}K_{e,v}^{\otimes k}. +\] +Thus each residual vector contributes one factor acting on all $k$ +columns, and there are $s_{\rm c}$ such factors over the network. + +Let $\rho$ denote the underlying permutation of the complex roles: it +exchanges $X_a,Y_a$ and fixes each scratch role. +By Lemma~\ref{lem:scalar-motifs}, the pointwise scalar network sends an input array at +$X_a$ to $Y_a$ with sign $+1$, an input at $Y_a$ to $X_a$ with sign +$-1$, and each scratch input to its own output with sign $+1$. +Applying \eqref{eq:common-frame-identity} with $D_v=\mathcal C_{U_v}$, +where $U_v$ is the label at vertex $v$, shows that an input role $w$ reaches +output role $\rho(w)$ with that sign and with operator +$\mathcal C_{U_{\mathrm{sink}(\rho(w))}} + \mathcal C_{U_{\mathrm{source}(w)}}^{-1}$. +For $k$ columns, use $D_v=\mathcal C_{U_v}^{\otimes k}$ on the joint +address set in the same identity. The route operator is then the $k$th +tensor power of the displayed address operator, multiplied by its scalar +route sign once. +The zero label has frame $I$, while the full label has frame +$C^{\otimes m}$ because $q_{\mathcal F}(x)=\operatorname{wt}(x)$. +Every pair except $X_a\to Y_a$ has these zero and full labels. +For the remaining pair, write $u=u_a$. Its binary norm is one and +its weight is $3^3=27$. Orthogonal weight additivity yields +\begin{align*} + q_{U_a^\perp}(x)-q_{U_a}(x) + &=\operatorname{wt}(x)-2\operatorname{wt}(u)[u\cdot x]\\ + &=\operatorname{wt}(x)+2[u\cdot x]\pmod4. +\end{align*} +Since $2[u\cdot x]\equiv2\sum_{j\in\operatorname{supp}(u)}x_j +\pmod4$, the operator on $X_a\to Y_a$ is the tensor of $C^{-1}$ on the +27 coordinates of $\operatorname{supp}(u)$ and $C$ elsewhere. +Put $Z=\operatorname{diag}(1,-1)$. Direct multiplication gives +\[ + C=iZC^{-1}Z,\qquad C^{-1}=-iZCZ. +\] +For $k$ columns, let $Z_{a,k}$ be the tensor product of $Z$ on +those 27 coordinates in every column and the identity elsewhere. +Apply $Z_{a,k}$ before the network at $X_a$, and apply +$i^{27k}Z_{a,k}$ after the network at $Y_a$; the latter scalar is +applied once to the whole role. There are $27k$ inverse factors, so +the identity $C=iZC^{-1}Z$ turns each of them into $C$. The operator +on this pair is therefore $C^{\otimes mk}$ as well. +Only the physical $X$ outputs still carry the minus sign of the +scalar exchange. Negate those outputs and send output role $\rho(w)$ +back to role $w$. Every role, including every scratch role, now has +the required forward tensor product. +\end{proof} + +\subsection{Explicit rational bounds for the two recurrences} + +The relative rank deficits are +\[ + \eta_{\rm b}=\frac{W_{\rm b}m-s_{\rm b}}{W_{\rm b}m} + =\frac{339}{22587335000000},\qquad + \eta_{\rm c}=\frac{W_{\rm c}m-s_{\rm c}}{W_{\rm c}m} + =\frac{73}{19906842167500}. +\] +For both recurrences we may use the fixed rational exponent +\begin{equation} + \tau=\sigma=1-2^{-50}. + \label{eq:explicit-motif-exponents} +\end{equation} +Both exact deficits displayed above are greater than $20\cdot2^{-50}$. +Since $m<2^{20}$ and $\log 2<1$, we have $\log m<20$, whence +\[ + m^{1-2^{-50}} + =m\exp(-2^{-50}\log m) + >m(1-20\cdot2^{-50})>m(1-\eta) +\] +for either $\eta=\eta_{\rm b}$ or $\eta=\eta_{\rm c}$. +Consequently +\[ + \frac{s_{\rm b}}{W_{\rm b}}0$, write each chunk as $m$ +consecutive $b=e/m$ digit fields, giving vectors $H,D$ over +$\mathbb Z/q^b\mathbb Z$. We first construct the shear $H\leftarrow H+D$. + +Split whole rows cyclically into $W$ role streams within each prefix +preceding the row field. Write the original row number as +$r=Wg+(w-1)$ with $1\le w\le W$; stream $w$ has row number $g$. +These streams have exactly the same remaining shape, including the +full ranges of $H$ and $D$. Each has +logical volume $V/W$, and its row count is divisible by $W^{k-1}$. + +For a rational matrix $M$, let $\Phi_M$ act on an array by moving its +entry at address $(H,D)$ to $(H+MD,D)$, with every spectator unchanged. +Thus $\Phi_M$ is the array permutation induced by that address map. +Its inverse is $\Phi_{-M}$ and +$\Phi_{M'}\Phi_M=\Phi_{M'+M}$. On every circuit edge apply +$\Phi_{A_e}$ to that role stream; implement it by +Lemma~\ref{lem:matrix-shear}, recursively interchanging each pivot pair +of $b$-digit fields. Execute each circuit gate pointwise at matching +addresses of its role streams. + +The row split supplies the common address set used in the +frame identity~\eqref{eq:common-frame-identity}. Here the frame at a +vertex with matrix $M$ is the address permutation $\Phi_M$, and every +edge changes it by $\Phi_{M'-M}$. The same invariant proof applies +because a common address permutation commutes with every pointwise +bit gate. For the physical input arrays $f_w$, the logical arrays are +$g_w=\Phi_{-M_{\mathrm{in}(w)}}f_w$; this only specifies their +interpretation, with no initial tape operation. The logical circuit +routes $g_w$ to role $\rho(w)$. Thus its physical output satisfies +\[ + f'_{\rho(w)} + =\Phi_{M_{\mathrm{out}(\rho(w))}} + \Phi_{-M_{\mathrm{in}(w)}}f_w + =\Phi_{I_m}f_w, +\] +by~\eqref{eq:finite-shear-contract}. Merge by returning row $g$ of +output role $\rho(w)$ to the original row $Wg+(w-1)$ within the same +preceding prefix. This undoes $\rho$ and restores row order. The result +is $H\leftarrow H+D$ on every original row, including rows assigned +to scratch roles, whose initial values were arbitrary. + +To interchange the two full chunks, perform +\[ + D\leftarrow D-H,\qquad H\leftarrow H+D,\qquad D\leftarrow H-D, +\] +componentwise. Only the middle shear uses the circuit. The other two +updates target the later group and have linear cost. The transformation +sends $(H,D)$ to $(D,H)$. + +The number of recursive calls is the sum of the edge ranks, exactly $s$. +Each acts on one role stream of volume $V/W$, retaining all other +fields as spectators. Splitting, +merging, gates, and triangular operations have total cost $O(V)$ because +their number is fixed. Below we verify that scheduling the recursive +calls on fixed tapes also costs $O(V)$ at this node. Thus if $F_k$ is a +uniform upper bound for time divided by logical volume, then +\begin{equation} +\label{eq:swap-recurrence} + F_0=O(1),\qquad F_k\le(s/W)F_{k-1}+O(1). +\end{equation} +For $a=s/W1$, it is $O(a^k)$. +Hence $F_k=O(e^\tau)$. + +\paragraph{A fixed-tape depth-first schedule.} +Here we complete the implementation assertion used in +\eqref{eq:swap-recurrence}. Reserve $W$ role tapes, a fixed set of +I/O and elementary-operation work tapes, one parking stack tape, and a +separate descriptor stack. Although $W$ is large, it is fixed. +At a call boundary all reusable work tapes, other than the current I/O +and local descriptor, are empty and their heads are at their origins. +The parking and descriptor heads are at the tops of their stacks. + +Before a recursive call, append the $W-1$ inactive role streams to the +parking stack in a fixed order, with separators. Copy the active stream +to the child I/O area, and erase the parent role tapes while traversing +their current contents. Push the parent descriptor and its finite +program counter to the descriptor stack. The role and work tapes are +now available to the child, using the same tapes at every depth. +On return, copy the child output into the designated active role. +Pop the inactive streams in reverse order. To recover a stream in its +original direction, prepare its destination to the known length and +write the popped symbols from the destination's right end toward its +left end. Erase the popped stack cells as they are left. This uses +linear time and ends with the parking head at the previously saved top. +No scan passes through a parked ancestor. Cleanup is always limited to +the region visited by the current call; a reused tape is not swept to +the largest position ever visited by an ancestor. + +Each push, pop, copy, positioning operation, or erasure moves $O(V)$ +symbols at a parent node. There are only the fixed number $s$ of child +calls. This gives precisely the additional $O(V)$ term claimed above, +even though each child itself has volume $V/W$. Temporary storage is +therefore not substituted for logical volume in the factor $s/W$. + +For completeness, descriptor processing also fits this term when the +payload is one bit. Let $V_0$ be the volume at the root of one +power-width call with width $e_0=m^{k_0}$, and $V_j=V_0/W^j$ the volume +of any depth-$j$ child. Here $j\le k_0=\log_m e_0$. The root row +count is at least $W^{k_0}$, so at depth $j$ it is still at least one. +Both original chunk ranges remain present: digits outside the current +subchunks become spectators rather than being removed. Hence +\[ + V_j\ge q^{2e_0},\qquad + j\log W\le(\log_m e_0)\log W=O(e_0)=O(\log V_j). +\] +It follows that +$\log V_0=\log V_j+j\log W=O(\log(2V_j))$. +A local descriptor lists the row field, at most the current $m+m$ +fields, and a fixed number of intervals formed from intervening +spectator fields. Computing products of their lengths, subdividing +target fields, copying lengths, and storing the current instruction take +$(\log(2V_0))^{O(1)}=O(V_j)$ time at that child, since every fixed +power of $\log(2V_j)$ is $O(V_j)$. Before descending, +construct the child's descriptor by retaining its two target fields and +combining each consecutive group of spectator fields into one interval. +The ancestor's subdivision need not remain active in the child. Stack entries contain +finite instructions and binary integers, not new alphabet symbols. +These observations establish one finite machine for every recursion +depth and every choice of spectator lengths. + +\end{proof} + + +We use the rational value $\tau=1-2^{-50}$ established in +\eqref{eq:explicit-motif-exponents}. Its verification uses fixed integer +comparisons and the displayed exponential inequality; it needs no +real-arithmetic oracle. + + +\subsection{Removing width and row restrictions} + +We have proved the fast operation for power widths with enough rows. +Rows for a general array can be supplied by a few of its own high digits. +Their movement will cost less than the final bound. + +\begin{lemma}[Arbitrary-width interchange] +\label{lem:chunk-swap} +There exist fixed $0<\tau<1$ and one fixed finite-alphabet multitape +procedure with the following property. For positive integers $P,G,B$ +and $u\ge1$, it transforms an arbitrary bit array on +\[ + [P]\times[2^u]\times[G]\times[2^u]\times[B] +\] +by the address permutation +\[ + (p,h,g,d,z)\longmapsto(p,d,g,h,z) +\] +in $O(Vu^\tau)$ steps, where $V=PG B\,2^{2u}$. +The integers specifying the shape are part of the input. The time +includes their processing, all padding and unpadding, and fixed-tape +workspace cleanup. In particular, $B=1$ is allowed. +\end{lemma} + +\begin{proof} +First suppose the two ranges are $[q^e]$, where $q$ is the fixed prime +already chosen. Set +\[ + k=\lceil\log_m e\rceil,\qquad + \rho=\left\lceil\frac{k\log W}{2\log q}\right\rceil. +\] +For all sufficiently large $e$, $1\le\rho0,\quad 0<\epsilon<1. +\] +The exponents and comparison constants are fixed, and we impose their +further restrictions in Proposition~\ref{prop:simultaneous-layer}. +Two consequences explain the layout. The polynomial length $r$ grows +faster than every fixed power of $p$, so a scan of a record pays for +polynomial work on its address. Also $K/\log p\to\infty$, which will +make the exceptional set in a packed change of address bits small enough +to repair by sorting. We will obtain cost $O(Vd^{\lambda'})$, with +$\lambda'<1$ and $V$ the logical bit volume, whereas separate butterfly +factors would require $D$ whole-array passes. + +We first construct tensor products of the auxiliary two-point kernel +$C$ from Proposition~\ref{prop:complex-motif-interface}. Its phase +frames express a $C$ tensor product using smaller groups of +selected bits, separated by binary changes of basis. We implement those +changes by moving whole address chunks. Splitting complete rows among +the network's wire roles then reduces the volume of each recursive +call. Finally, we bound the intermediate dyadic values and convert the +completed $C$ layer to the normalized $H_0$ layer. The entire layer is +evaluated exactly before one final truncation. + +\subsection{Phase frames for a simultaneous butterfly layer} +\label{subsec:phase-frames} + +Hold the unselected address bits fixed and regard the stored complex +values on one wire role as a function of the selected bits. The phase +identities below express an edge's residual operator as a product of +two-point kernels on selected directions. + +Put +\[ + H_0=\frac12\begin{pmatrix}1&1\\1&-1\end{pmatrix},\qquad + H=\sqrt2 H_0,\qquad \mathsf S=\operatorname{diag}(1,i),\qquad + Z=\operatorname{diag}(1,-1). +\] +For the bit-flip matrix $X=\bigl(\begin{smallmatrix}0&1\\1&0\end{smallmatrix}\bigr)$, +define +\begin{equation}\label{eq:phase-C} + C=H\mathsf SH=aI+bX,\qquad a=\frac{1+i}{2},\quad b=\frac{1-i}{2}. +\end{equation} +Direct multiplication gives +\begin{equation}\label{eq:phase-basic-identities} + H_0=b\mathsf SC\mathsf S,\qquad C^2=X,\qquad C^4=I,\qquad + C^{-1}=bI+aX=-iZCZ. +\end{equation} +In particular, $C=iZC^{-1}Z$. These identities use only Gaussian dyadic +coefficients. The Hadamard matrices in the definition of +$\mathcal C_U$ are used to prove identities; they need not be executed +by the machine. + +Consider an edge from label $U_-$ to label $U_+$, and choose an +orthonormal basis $v_1,\ldots,v_{\rho_{\rm edge}}$ of its residual. +Proposition~\ref{prop:complex-motif-interface} gives the frame change +\[ + \mathcal C_{U_+}\mathcal C_{U_-}^{-1} + =\prod_{j=1}^{\rho_{\rm edge}}(aI+bX_{v_j})^{\epsilon_j}, + \qquad \epsilon_j\in\{1,-1\}. +\] +Here $(X_vf)(x)=f(x+v)$, and we write $C_v=aI+bX_v$. +The number of directional kernels is precisely +$\rho_{\rm edge}$, including on decreasing edges. The next step puts those directions +into coordinate positions without performing a general transpose. + +\paragraph{Implementing an arbitrary residual basis.} +For $M\in\operatorname{GL}(m,\mathbb F_2)$, let $\mathcal P_M$ be the +address permutation that moves the value at $x$ to $Mx$. Thus +$(\mathcal P_Mf)(x)=f(M^{-1}x)$, and +\begin{equation}\label{eq:phase-conjugation} + \mathcal P_MX_v\mathcal P_M^{-1}=X_{Mv}. +\end{equation} +Extend $v_1,\ldots,v_{\rho_{\rm edge}}$ to a basis of $\mathbb F_2^m$ and take these vectors as +the first $\rho_{\rm edge}$ columns of $M$. The displayed edge identity +then becomes +\begin{equation}\label{eq:phase-edge-coordinate} + \mathcal C_{U_+}\mathcal C_{U_-}^{-1} + =\mathcal P_M\left(\prod_{j=1}^{\rho_{\rm edge}}C_{e_j}^{\epsilon_j}\right) + \mathcal P_M^{-1}, +\end{equation} +where $e_j$ is the $j$th standard basis vector. The matrix $M$ need not +preserve the dot product: equation~\eqref{eq:phase-conjugation} only +uses its invertibility. + +For the array layout used below, take a group of $e=mf$ consecutive +axis chunks and divide it into $m$ consecutive slots of $f$ chunks, +numbered in physical order. +Number the chunks within each slot by $j=0,\ldots,f-1$, starting at +its least significant end. Write $x_{h,j}$ for the selected bit in +chunk $j$ of slot $h$, where $1\le h\le m$. Column $j$ is the vector +$(x_{1,j},\ldots,x_{m,j})$. A frame on this group is the tensor +product of the same phase frame +$\mathcal C_U$ of Proposition~\ref{prop:complex-motif-interface} +on these $f$ columns. + +To implement \eqref{eq:phase-edge-coordinate} on the group, first apply +$\mathcal P_M^{-1}$ separately to each column. For each +$1\le h\le\rho_{\rm edge}$, apply $(C^{\epsilon_h})^{\otimes f}$ to the +$f$ bits $x_{h,0},\ldots,x_{h,f-1}$. This is one child operation +on the $f$ axes in slot $h$. Finally apply $\mathcal P_M$ to every +column. A negative directional kernel still requires only one +forward child, because +\begin{equation}\label{eq:phase-inverse-child} + (C^{-1})^{\otimes f} + =(-i)^f Z^{\otimes f}C^{\otimes f}Z^{\otimes f}. +\end{equation} +The rightmost phase is applied first. All inverse wrappers are address +signs and constant fourth-root phases, so they add no recursive calls. + +Gaussian elimination expresses any $M\in\operatorname{GL}(m,\mathbb F_2)$ +as a product of at most $m(m-1)+3m$ elementary row additions: one clears +at most $m-1$ other entries per pivot, and each row swap is three row +additions. Reversing the elimination gives the required product since +each row addition is an involution. The number is a constant because +$m$ is fixed. Adding row $h'$ to row $h$ in every column applies +$x_{h,j}\leftarrow x_{h,j}\mathbin\oplus x_{h',j}$ for every +$0\le j1$, these segments +are disjoint, and the highest one ends immediately below $j_{f-1}$. +Write their initial values in $y$ and $z$ as +\[ + u_i=2g_i+a_i,\qquad w_i=2h_i+b_i, + \qquad a_i,b_i\in\{0,1\}. +\] +The values $g_i,h_i\in\{0,\ldots,2^{K-1}-1\}$ are the guard values. The +control for this pair of segments is the selected bit $c_i=x_{j_i}$. + +Apply each line of \eqref{eq:eight-packed-additions} simultaneously to all +these segment pairs. Physically, a line updating $y$ by sign $\varepsilon$ +and testing parity $b$ of $z$ is the single cyclic shift +\begin{equation} +\label{eq:packed-cyclic-shift} + y\longleftarrow y+ + \varepsilon\sum_{i=0}^{f-2}2^{j_i} + [\,x_{j_i}=1\,][\,z_{j_i}=b\,] + \pmod{2^L}. +\end{equation} +For a line updating $z$, interchange $y$ and $z$ in this formula. +The shift offset never depends on its target chunk, so each line is a +bijection of the rectangle. Let $S_0$ be their composition. It fixes +the spectator coordinates. + +Let $\mathcal B$ consist of the addresses for which +at least one used guard value, in either $y$ or $z$, fails +\begin{equation} +\label{eq:packed-guard-interval} + 10\le g\le 2^{K-1}-11. +\end{equation} +At an address outside $\mathcal B$, each segment initially lies in +$[20,2^K-21]$. Even displacement eight keeps it inside +$[0,2^K-1]$. Inductively, each packed addition therefore agrees with all +the independent segment additions: no segment carries into or borrows +from the next segment. When $f>1$, the bits below $j_0$ and above the +highest used segment are untouched as well. By +\eqref{eq:eight-packed-result}, $S_0$ +then agrees with the ideal permutation $T_0$ that performs the required +XORs at $j_0,\ldots,j_{f-2}$ and fixes all other address coordinates. + +There are exactly twenty excluded values for each guard in +\eqref{eq:packed-guard-interval}. Since its complete range has +$2^{K-1}$ values, the union bound over the $2(f-1)$ guards gives +\begin{equation} +\label{eq:packed-bad-fraction} + |\mathcal B|\le\delta_{\rm bad}M. +\end{equation} +Indeed, the complete $y,z$ ranges give the same guard distribution at +each choice of spectator coordinates. No record value enters this count. + +The ideal map $T_0$ preserves all guard values and therefore preserves +$\mathcal B$. Both $T_0$ and $S_0$ are bijections, and they agree off +$\mathcal B$. Taking complements in the finite rectangle gives +\[ + S_0(\mathcal B^c)=T_0(\mathcal B^c)=\mathcal B^c, + \qquad S_0(\mathcal B)=\mathcal B. +\] +Thus $T_0S_0^{-1}$ fixes $\mathcal B^c$ and permutes $\mathcal B$. +It remains to implement the rotations and this correction on tapes. + +For one rotation, move its target to the rightmost of the three chunk +positions if necessary. Let $P^{\rm sw}$ be the product of the record +field lengths before the earlier exchanged chunk, let $G^{\rm sw}$ +be the product between the exchanged chunks, and let $B^{\rm sw}$ be +$R$ times the product after the later one. Empty products are one. +The bit array has exactly the shape +\[ + [P^{\rm sw}]\times[2^L]\times[G^{\rm sw}] + \times[2^L]\times[B^{\rm sw}]. +\] +The third chunk lies inside one collapsed spectator interval. +Pass only $L$ and these three positive canonical lengths to +Lemma~\ref{lem:chunk-swap}. Each length is at most $V$, so the local +descriptor has $O(A_{\rm rect})$ bits. The swap costs $O(VL^\tau)$, including +its own padding and cleanup. + +The equal chunk lengths leave the field-length list unchanged by a +completed swap. Keep the permutation of the logical names $x,y,z$ in +finite local state. With the target now after its two controls, collapse +the remaining intervals to obtain +\[ + [\Lambda_0]\times[2^L]_{\rm control\,1}\times[\Lambda_1] + \times[2^L]_{\rm control\,2}\times[\Lambda_2] + \times[2^L]_{\rm target}\times[B_{\rm rot}], +\] +where $B_{\rm rot}$ includes the payload and every displayed spectator +length is positive. Their product with the chunk lengths is $V$. +Together with $K,f,\rho$ and the finite name permutation, these fixed +canonical lengths form an $O(A_{\rm rect})$-bit local descriptor. The offset +routine receives the two current $L$-bit logical control values. A scan +of at most $f\le L$ selected positions evaluates +\eqref{eq:packed-cyclic-shift} in $L^{O(1)}$ time, without reading the +target or spectator values. Lemma~\ref{lem:ordered-affine-streams} +therefore gives an $O(V)$ rotation: its offset work is absorbed by the +$2^L$ nonempty target blocks in each fiber. Undo the swap after the +rotation. The local descriptors and name permutation are updated at +completed swap boundaries; the primitives use their own descriptors +inside padded layouts. +There are at most sixteen swaps and eight rotations in $S_0$. + +To implement the correction, scan the stream with a record-rank counter. +All chunk names are back in their original positions. Dividing the +current rank through the fixed seven field lengths recovers the three +chunk values and their mixed-radix record strides. The strides exclude +the $R$ payload bits. All involved integers have $O(A_{\rm rect})$ bits, so +schoolbook arithmetic, descriptor copying, and resets take at most +$O(A_{\rm rect}^3)$ per record. Test membership in $\mathcal B$ and extract just +those records. For a current exceptional address $q$, compute +$q'=T_0(S_0^{-1}(q))$ by reversing the eight modular additions with +negated offsets, then applying the selected XORs directly. Each reversed +mask uses the current controls of that reversed line. There are at most +$f\le L\le A_{\rm rect}$ selected positions, so this calculation also fits +$O(A_{\rm rect}^3)$ time. + +If $q_h,q'_h$ are the current and destination values of chunk +$h\in\{x,y,z\}$ and $\sigma_h$ is its record stride, the fixed +spectator coordinates give +\[ + \operatorname{rank}(q')=\operatorname{rank}(q)+ + \sum_{h\in\{x,y,z\}}(q'_h-q_h)\sigma_h. +\] +The differences are signed. Attach this destination rank, padded to +$\lceil\log_2M\rceil\le A_{\rm rect}$ bits, to the extracted record, and mark its +hole on a fixed track of the full stream. Hold the full stream untouched +while stable binary radix sorting scans only the extracted records and +keys, least significant key bit first. Since $T_0S_0^{-1}$ permutes +$\mathcal B$, these keys are distinct and are exactly the ranks of the +marked holes. One forward full-stream scan reinserts the sorted records. +This implements $T_0$ everywhere. + +Finally apply the two-bit XOR to $x_{j_{f-1}},y_{j_{f-1}}$ by +Lemma~\ref{lem:elementary-streams}, splitting those chunks at the +selected positions and collapsing the other intervals. Its descriptor +again has a fixed number of positive lengths, each at most $V$. +This costs $O(V)$ and supplies the omitted selected position. When +$f=1$, $S_0,T_0$ are identities, $\mathcal B$ is empty, and this last +step is the entire algorithm. + +The movement costs $O(V(L^\tau+1))$. A fixed number of full record scans +costs $O(MA_{\rm rect}^3+V)$, and the at most $A_{\rm rect}$ radix passes cost +$O(|\mathcal B|A_{\rm rect}(R+A_{\rm rect}))$; skip them when the extracted bank is empty. +The initial descriptor has a fixed number of canonical integers of +$O(A_{\rm rect})$ bits, so its preparation is covered by $O(MA_{\rm rect}^3)$. +All counters, positioning, rewinds, and cleanup are included. +Equation~\eqref{eq:packed-bad-fraction} proves +\eqref{eq:packed-rectangle-time} on a fixed number of tapes. +After division by $V=MR$, its additional terms are bounded by +$A_{\rm rect}^3/R$ and +$80(f-1)2^{-K}A_{\rm rect}(1+A_{\rm rect}/R)$. Under the stated family bounds +the first tends to zero, and the second is +$O(p^2 2^{-K}(1+A_{\rm rect}/R))=o(1)$. This proves the final assertion. +\end{proof} + +\paragraph{Application to a fixed binary change of basis.} +An invertible matrix over $\mathbb F_2$ of fixed order $m\ge3$ is a +product of a fixed number of elementary row additions; a row exchange +is three such additions. In one invocation of the finite network on +$e=mf$ axes, slot $h$ consists of $f$ consecutive $K$-bit axis chunks. +It therefore has address-bit width $L=fK$, and its selected bits +$x_{h,j}$ occupy positions $\rho+jK$ for $0\le j1$. +For these fixed choices +there are a cutoff $p_0$, one fixed finite-alphabet multitape procedure, +and an implicit time constant with the following guarantee. The cutoff +and time constant may depend on the fixed rational parameters +and these constants. For every choice of positive integers $p,d,r$ +with $p\ge p_0$ and +\[ + a_dp^\epsilon\le d\le b_dp^\epsilon,\qquad + 2^{a_rp/d}\le r\le 2^{b_rp/d}, +\] +put $K=\lfloor d^c\rfloor$, and let $1\le D\le d$, $P,S\ge1$, and +$0\le\rhouO%E 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 3.11 with ortools (requirements.txt; the B251 solver step) and numpy (port geometry); set PYTHON to choose the interpreter. +# About 8 minutes wall on 12 cores: the four exhaustive orderings searches of group G5 take 1 to 5 minutes each and run at once. +# Author switch: EO_GROUPS="G1 G2" runs only the named groups (a partial run is never a verification). +set -uo pipefail +HERE=$(cd "$(dirname "$0")" && pwd) +OUT=${1:-$(mktemp -d "${TMPDIR:-/tmp}/end-cap-obstruction.XXXXXX")} +mkdir -p "$OUT"; OUT=$(cd "$OUT" && pwd) +case "$OUT/" in "$HERE"/*) echo "output dir must be outside the package"; exit 2;; esac +PY="${PYTHON:-python3}"; export PYTHONDONTWRITEBYTECODE=1 PYTHONINTMAXSTRDIGITS=0 +T0=$SECONDS +echo "== 0. manifest and provenance" +if ! "$PY" -B "$HERE/scripts/provenance.py" | tee "$OUT/provenance.log" | sed 's/^/ /' || grep -q '^FAIL' "$OUT/provenance.log" \ + || [ "$(grep -c '^PASS' "$OUT/provenance.log")" != 2 ]; then + echo "step 0 FAILED"; exit 1 +fi +# work tree: scripts write scratch files here, never into the package +export EO_ROOT="$OUT/tree"; mkdir -p "$EO_ROOT" "$OUT/logs" +cp -R "$HERE/cards" "$HERE/inputs" "$HERE/checks" "$HERE/evidence" "$EO_ROOT/" +export TMPDIR="$OUT/tmp"; mkdir -p "$TMPDIR" +WK="$EO_ROOT/work"; mkdir -p "$WK/ham" "$WK/in" +RP="$EO_ROOT/inputs/repo/research" +cp "$RP/static44-selective/vendor/pr531/inputs/hamming/PACKET-PROGRAMS.json.gz" "$RP/static44-selective/vendor/pr531/inputs/hamming/PROTOTYPE.json" \ + "$RP/gauge44-slots/construction/COMPLETION-PRIORITY.json" "$WK/ham/" +cp "$RP/gauge44-slots/construction/leaver/TRI-LEAVER-k8.json" "$WK/in/TRI.json" +cp "$RP/gauge44-slots/construction/leaver/CODED-CELLS-k8.json" "$WK/in/CODED-CELLS.json" +export XPARAM="$RP/gauge44-slots/construction/notri/PRIO6.json" +E_="$PY -B $EO_ROOT/checks/expect.py" +# run NAME DIR cmd... (stdout+stderr -> logs/NAME.log, exit code -> logs/NAME.rc; DIR is a card directory under cards/, or a path under the work tree) +run() { local n=$1 d=$2; shift 2; case "$d" in /*) ;; *) d="$EO_ROOT/cards/$d";; esac; ( cd "$d" && "$@" > "$OUT/logs/$n.log" 2>&1; echo $? > "$OUT/logs/$n.rc" ); } +chk() { local l=$1 n=$2; shift 2; $E_ "$l" "$OUT/logs/$n.log" "$@"; } +# overlay DIR card... (a scratch directory holding the scripts of several cards that import one another) +overlay() { local d="$WK/$1"; shift; rm -rf "$d"; mkdir -p "$d"; local c; for c in "$@"; do cp "$EO_ROOT/cards/$c"/*.py "$d/"; done; echo "$d"; } +DFS_TL=${EO_DFS_TL:-3000} # author switch: time limit (s) of the exhaustive orderings search; a run that hits it fails +want() { case " ${EO_GROUPS:-G0 G1 G2 G3 G4 G5 G6} " in *" $1 "*) return 0;; *) return 1;; esac; } + +# --- generator: the gauge-forward word of the k8 skeleton (card B252 cgx_y.py = the #1005 generator plus the deletion switches), 1 s per word +gen() { # NAME ENV=VALUE... -> $WK/o_NAME/FULL-WORD.json.gz, logs/gen-NAME.{log,rc} + local n=$1; shift; rm -rf "$WK/o_$n" + ( env "$@" "$PY" -B "$EO_ROOT/cards/B252/cgx_y.py" "$WK/ham" "$WK/o_$n" "$WK/in/TRI.json" > "$OUT/logs/gen-$n.log" 2>&1; echo $? > "$OUT/logs/gen-$n.rc" ) +} +CF16=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 +RR=10,11,12,13,16,17,18,19,26,27,28,29,34,35,36,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +echo "== generating the gauge-forward words from the vendored inputs" +gen base STAG=0 GLAZY=0 +gen cf0 STAG=0 GLAZY=1 CF=0 +gen all16 STAG=1 GLAZY=1 CF=$CF16 +gen rr STAG=0 GLAZY=1 RO=$RR +gen wr STAG=0 GLAZY=1 WRC=Wr WR=all +gen rrss STAG=1 GLAZY=1 CF=$CF16 RO=$RR +gen rrwr STAG=0 GLAZY=1 RO=$RR WRC=Wr WR=all +gen all80 STAG=1 GLAZY=1 CF=$CF16 RO=$RR WRC=Wr WR=all +gen nogl STAG=0 GLAZY=0 CF=0 +for n in base cf0 all16 rr wr rrss rrwr all80; do [ "$(cat "$OUT/logs/gen-$n.rc")" = 0 ] || { echo "generator failed for $n"; tail -3 "$OUT/logs/gen-$n.log"; exit 1; }; done +W_() { echo "$WK/o_$1/FULL-WORD.json.gz"; } +B253="$EO_ROOT/cards/B253"; B258="$EO_ROOT/cards/B258" + +g0() { # G0 model, generator, word pins + "$PY" -B "$EO_ROOT/checks/anchors.py" + "$PY" -B "$EO_ROOT/checks/wordpins.py" "$EO_ROOT" "$WK" +} +g1() { # G1 the obstruction in the deletion experiments: caps, profile, mechanism + for n in base cf0 all16; do + run caps-$n B253 "$PY" -B caps.py "$(W_ $n)" + run prof-$n B253 "$PY" -B prof.py "$(W_ $n)" + done + run endcap B258 "$PY" -B endcap.py "$(W_ base)" "$(W_ cf0)" "$(W_ all16)" "$(W_ rr)" "$(W_ wr)" "$(W_ rrss)" "$(W_ rrwr)" "$(W_ all80)" + run trace283 B253 "$PY" -B trace.py "$(W_ cf0)" 283 + run trace170 B253 "$PY" -B trace.py "$(W_ cf0)" 170 + chk G1.base-clean caps-base --has "^final cap violators \[\]$" + chk G1.base-profile prof-base --has "^\{1: 1928, 2: 736, 3: 336, 4: 168, 5: 168, 6: 32, 8: 8\}$" + chk G1.gen-base gen-base --has "CF 8 \[\] WIDEN \[\] NH 480 NVIOL 0 \[\] MASS \(6312, 6312\)" + chk G1.cf0-deletion gen-cf0 --has "NH 479 NVIOL 0 \[\] MASS \(6307, 6303\)" + chk G1.cf0-violators caps-cf0 --has "^final cap violators \[170, 171, 174, 175\]$" --has "^170 \('B', 945, \['add', 170, 591\]\)" --has "^171 \('B', 929, \['add', 171, 283\]\)" \ + --has "^174 \('B', 930, \['add', 174, 379\]\)" --has "^175 \('B', 946, \['add', 175, 598\]\)" + chk G1.cf0-profile-fails prof-cf0 --has "^FAIL \('frame violation', 170, \(256, 128, 64, 32, 16, 8, 4, 2, 1\), \(258, 130, 66, 32, 16, 8, 6, 1\)\)" + chk G1.all16-deletion gen-all16 --has "NH 464 NVIOL 0 \[\]" + chk G1.all16-violators caps-all16 --has "^final cap violators \[160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175\]$" + chk G1.all16-profile-fails prof-all16 --has "^FAIL \('frame violation', 160, " + chk G1.drag-283 trace283 --has "^B 585 \['add', 591, 283, 1, 1\] dim 7 cur \[0, 7\]" --has "^B 929 \['add', 171, 283, -1, 2\] dim 9 cur \[7, 8\]" + chk G1.cap-hit-170 trace170 --has "^B 945 \['add', 170, 591, -1, 2\] dim 9 cur \[7, 8\] inperp \[False\]" + chk G1.violators-end-FULL endcap --has "^o_base R 480 viol 0 " --has "^o_cf0 R 479 viol 4 dim9 4 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 4 " \ + --has "^o_all16 R 464 viol 16 dim9 16 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 16 " \ + --has "^o_rr R 448 viol 48 dim9 48 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 48 " \ + --has "^o_wr R 448 viol 48 dim9 48 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 48 " \ + --has "^o_rrss R 432 viol 64 dim9 64 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 64 " \ + --has "^o_rrwr R 416 viol 48 dim9 48 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 48 " \ + --has "^o_all80 R 400 viol 64 dim9 64 complement-hyperplane-possible\(u not in frame\) 0 sum\(dim-dim∩perp\) 64 " + for n in rr wr rrss rrwr all80; do chk G1.gen-$n gen-$n --has "NVIOL 0 \[\]"; done + if [ "$(cat "$OUT/logs/gen-nogl.rc")" != 0 ] && grep -q "AssertionError: ('frame violation', 299, " "$OUT/logs/gen-nogl.log"; then + echo "PASS G1.no-glazy-refused without the lazy widening the deletion is refused by the generator: frame violation at register 299" + else echo "FAIL G1.no-glazy-refused"; fi + # the 32 single-copy deletions (16 copies, STAG = 0 and 1): every legal one violates exactly 4 caps, all four ending FULL + local st cf ok=0 bad=0 four=0 refused=0 + for st in 0 1; do for cf in $(seq 0 15); do + gen sw_${st}_$cf STAG=$st GLAZY=1 CF=$cf + if [ "$(cat "$OUT/logs/gen-sw_${st}_$cf.rc")" = 0 ]; then + ok=$((ok + 1)); "$PY" -B "$B258/endcap.py" "$(W_ sw_${st}_$cf)" > "$OUT/logs/sw-$st-$cf.log" 2>&1 + grep -q "R 479 viol 4 dim9 4 complement-hyperplane-possible(u not in frame) 0 " "$OUT/logs/sw-$st-$cf.log" && four=$((four + 1)) + grep -q "NVIOL 0" "$OUT/logs/gen-sw_${st}_$cf.log" || bad=$((bad + 1)) + else refused=$((refused + 1)); fi + done; done + [ "$ok $four $bad $refused" = "24 24 0 8" ] && echo "PASS G1.single-copies 24 legal single deletions, each: R 479, 4 violators, all dim 9 = FULL, NVIOL 0; 8 refused by the generator (STAG=0, CF>=8)" \ + || echo "FAIL G1.single-copies ok=$ok four=$four nviol-bad=$bad refused=$refused" +} + +g2() { # G2 prices + run units "$EO_ROOT/checks" "$PY" -B "$EO_ROOT/checks/units.py" + run ceil B248 "$PY" -B ceil.py + run step0 B248 "$PY" -B step0.py + chk G2.base-kappa units --has "^base kappa 1\.671665283218770e-03$" + chk G2.unit-price units --has "^\+1 rank-1 local units: kappa 1\.624537144e-03 -2\.819% per unit -2\.8192%$" --has "^\+4 rank-1 local units: kappa 1\.483191993e-03 -11\.275%" \ + --has "^\+16 rank-1 local units: kappa 9\.183989999e-04 -45\.061%" --has "^\+32 rank-1 local units: kappa 1\.667976019e-04 -90\.022%" --has "^first k with no certificate: 35 " + chk G2.break-even units --has "one unit costs 2\.819% per violating y -> a deletion pays only if it breaks <= 0\.0156 caps per copy" + chk G2.ceiling ceil --has "^mass->H48 \{48: 1056\} \(0\.001730427469823602, 3\.5151885484925662\)$" --has "^S4 paid profile \{1: 384, 2: 64, 3: 32, 4: 24\} mass 704$" + chk G2.helper-value step0 --has "^base 0\.00167166528321877$" --has "2 helpers gone, mass->idle rank48 \(27 H48\) +1\.676641807e-03 \+0\.298%" +} + +g3() { # G3 geometry of the ports and the copy census + run portdims "$EO_ROOT/checks" "$PY" -B "$EO_ROOT/checks/portdims.py" + for f in geo groups rd val cp anc merge pure; do run b260-$f B260 "$PY" -B $f.py; done + run an1 B259 "$PY" -B an1.py "$(W_ cf0)" + for f in an2 an3 an4 an6; do run $f B259 "$PY" -B $f.py; done + run an5 B259 "$PY" -B an5.py "$(W_ cf0)" "$(W_ all16)" + chk G3.port-dims portdims --has "^ports 112 distinct odd-weight, 14 blocks of 8, block ranks \[4\]$" --has "^cross-block pairs 5824 dim of common perp \[7\]$" \ + --has "^cross-block triples 186368 dim of common perp \[6\]$" --has "^cross-block quads 4100096 dim 5: 4080384 dim 6 \(zero-sum, rank 3\): 19712$" + chk G3.geometry b260-geo --has "^self-dot all 1: True$" --has "^cap \(no 3 xor 0\): True$" --has "^zero-sum 4-sets \(span dim3 with 4 ports\): 24276$" \ + --has "^quad block patterns: Counter\(\{\(1, 1, 1\): 19712, \(1, 2\): 4368, \(3,\): 196\}\)$" --has "^orth degree \(excluding self\): Counter\(\{52: 112\}\)$" \ + --has "^pairs: #ports in perp\(u_a\)∩perp\(u_b\): \[\(20, 168\), \(22, 2688\), \(24, 672\), \(26, 2688\)\]$" \ + --has "\(0, 896\), \(4, 112\), \(6, 2688\), \(7, 14336\), \(8, 14560\), \(10, 40320\), \(11, 86016\), \(12, 44800\), \(14, 8960\), \(15, 14336\), \(16, 896\)\]$" + chk G3.delivery-groups b260-groups --has "^pairs dot0 cross 2688 .*\[\(\(26, 25, 2\), 2688\)\]$" --has "^quads blocks\(1, 1, 2\) 0 " --has "^quads blocks\(1, 1, 1, 1\) 19712 " --has "^quads blocks\(4,\) 196 " + chk G3.sharing-is-minimal-span b260-rd --has "^\('h', 2, 2, 1\) 13$" --has "^\('h', 2, 2, 2\) 41$" --has "^\('x', 2, 2, 2\) 25$" --has "^\('y', 2, 2, 1\) 8$" --has "^\('y', 2, 2, 2\) 16$" \ + --has "^\('h', 3, 3, 3\) 16$" --has "^\('x', 3, 3, 3\) 16$" --has "^\('h', 4, 3, 1\) 56$" + chk G3.copy-census b260-anc --has "^copies 480 merge-union reader groups \(\|T\|,span dim\): \[\('one side unread', 232\), \(\(2, 2\), 200\), \(\(3, 3\), 33\), \(\(4, 4\), 15\)\]" + chk G3.copy-at-instant-in-cap b260-merge --has "\(\(2, True, False, True\), 171\)" --has "\(\(2, True, True, True\), 29\)" --has "\(\(3, True, False, True\), 30\)" --has "\(\(3, True, True, True\), 3\)" \ + --has "\(\(4, True, False, True\), 12\)" --has "\(\(4, True, True, True\), 3\)" --absent "^ \(\([0-9], False," + chk G3.versions-and-drag b260-pure --has "\(\(False, False, False, True\), 3\)" --has "\(\(False, False, True, True\), 8\)" --has "\(\(False, True, False, False\), 5\)" --has "\(\(False, True, True, False\), 208\)" \ + --has "\(\(True, False, False, True\), 6\)" --has "\(\(True, False, True, True\), 13\)" --has "\(\(True, True, False, True\), 5\)" + chk G3.copies-by-event b260-cp --has "^copy events \(helper written from zero\): 480 Counter\(\{\('A', 'x'\): 212, \('B', 'h'\): 212, \('B', 'x'\): 44, \('A', 'h'\): 12\}\)$" + chk G3.violating-groups an1 --has "^violator targets \[58, 59, 62, 63\] blocks \[7\]$" --has "^dim ∩ over all violators 6$" + chk G3.final-frames-exceed-cap an3 --has "^regs read directly by y of >=2 blocks: 136$" --has "\[\(\(2, 1\), 80\), \(\(2, 2\), 24\), \(\(3, 2\), 32\)\]$" --has "^dim ∩ distribution Counter\(\{7: 104, 6: 32\}\)$" + chk G3.second-encoding-excess an4 --has "^n 136 sum excess per reg: min/median/max 1 3\.0 13$" --has "^regs with 0 excess 0$" + chk G3.deleted-copy-excess an6 --has "^283 T \[12, 37, 59\] blocks \[1, 4, 7\] dimI 6 final 9 op-excess 22$" --has "^315 T \[59, 68, 109\] blocks \[7, 8, 13\] dimI 6 final 9 op-excess 14$" \ + --has "^379 T \[62, 76, 101\] blocks \[7, 9, 12\] dimI 6 final 9 op-excess 16$" --has "^591 T \[58\] blocks \[7\] dimI 8 final 9 op-excess 4$" + if [ "$(grep -o 'op-excess [0-9]*' "$OUT/logs/an6.log" | awk '{s += $2} END {print s}')" = 103 ]; then echo "PASS G3.deleted-copy-total-excess sum of op-excess over the registers whose frame changes: 103 mass"; else echo "FAIL G3.deleted-copy-total-excess"; fi + chk G3.violator-sources an2 --has "^\|I\| 64 dim 6$" --has "^y 170 final dim 9 readers \[169, 197, 237, 427, 591, 594\]$" + chk G3.violators-of-16 an5 --has "^work \[\(\[58, 59, 62, 63\], 24, 328, 207\)\]$" --has "^work \[\(\[48, 49, 50, 51\], 20, 243, 130\), \(\[52, 53, 54, 55\], 20, 231, 118\), \(\[56, 57, 58, 59\], 20, 284, 154\), \(\[60, 61, 62, 63\], 20, 287, 157\)\]$" +} + +g4() { # G4 frame conflicts, rematerialisation and the hoist/slide windows (cards B251, B254, B257 on the #1018 word, cards B249 sim) + local D; D=$(overlay b251 B249 B251) + run b251-chain "$D" bash -c "for s in graph vals proj inc; do $PY -B \$s.py || exit 1; done; $PY -B mis.py h 1 200 && $PY -B mis.py all 1 200 && $PY -B cls2.py && $PY -B fin.py" + chk G4.decoupler-bound b251-chain --has "^Y events 926 Counter\(\{'B': 926\}\)$" --has "^592 incarnations; L not inside own cap: 54$" \ + --has "^status OPTIMAL MIS\(max pairwise-conflicting incarnations\) = 111\.0 bound 111\.0$" --has "^status OPTIMAL MIS\(max pairwise-conflicting incarnations\) = 124\.0 bound 124\.0$" \ + --has "^greedy chain cover \(UB on registers for this set under model\) 113$" --has "^chi hist Counter\(\{1: 548, 2: 22\}\)$" \ + --has "^cold0/endFULL 237 164 0 73 0$" --has "^cold0/endU 48 0 0 48 0$" --has "^enter1/endFULL 106 66 0 40 0$" --has "^enter1/endU 30 30 0 0 0$" --has "^enter4/endFULL 32 32 0 0 0$" --has "^enter5/endFULL 24 24 0 0 0$" + D=$(overlay b254 B249 B251 B254) + run b254-chain "$D" bash -c "for s in graph vals proj inc; do $PY -B \$s.py >/dev/null || exit 1; done; $PY -B mis.py h 1 200 >/dev/null; $PY -B set161.py && $PY -B rm161.py && $PY -B roles2.py && $PY -B sim161.py && $PY -B joint.py" + chk G4.161-helpers b254-chain --has "^161$" --has "^algebra-ok 65 " --has "^49 \('cold0/endFULL', 'Cglue\+Arot\+Awr', 'rotlock'\) ex 225$" --has "^12 \('cold0/endFULL', 'Cglue\+Awr', 'algOK'\) ex 408$" \ + --has "^12 \('cold0/endFULL', 'Cglue\+Awr', 'rotlock'\) ex 402$" --has "^13 \('cold0/endU', 'Brelay', 'algOK'\) ex 500$" --has "^1 \('cold0/endU', 'Brelay\+Awr', 'rotlock'\) ex 498$" \ + --has "^34 \('cold0/endU', 'other\+Arot\+Awr', 'rotlock'\) ex 273$" --has "^40 \('enter1/endFULL', 'Brelay', 'algOK'\) ex 474$" --has "^baseline True 5586$" \ + --has "^Counter\(\{\('enter1/endFULL', False\): 40, \('cold0/endU', False\): 13, \('cold0/endFULL', False\): 12\}\)$" --has "^feasible single \[\]$" --has "^Counter\(\{'bail': 158, 'infeas': 3\}\)$" \ + --has "^all65 65 \(False, \"op \('B', 574\) reg 160 F dim 3 end dim 8 cur 0\"\)$" --has "^Brelay53 53 \(False, \"op \('B', 1432\) reg 139 F dim 9 end dim 8 cur 7\"\)$" + D=$(overlay b257 B249 B257) + run b257-hoist "$D" "$PY" -B hoist.py + run b257-slide "$D" "$PY" -B slide.py + run b257-cls "$D" "$PY" -B cls.py + run b257-det "$D" "$PY" -B det.py + chk G4.hoist b257-hoist --has "^W alg-ok 172; window-ok 64 frame-ok 0$" --has "^Counter\(\{'read-x': 108, \"frame:op \('B',\": 62, 'frame:target level': 2\}\)$" + chk G4.slide b257-slide --has "^Counter\(\{'no-position': 86, 'window-ok': 86\}\) frame-ok 0 \[\]$" + chk G4.slide-placements b257-cls --has "^not-placeable \(first blocking class\): \{'both': 86\}$" --has "169, \('target level y#', 'S'\): 3\}$" + chk G4.hoist-first-violation b257-det --has "^Z Counter\(\{\"op \('B', #\) reg # F dim #\": 62, 'target level y2': 1, 'target level y42': 1\}\)$" +} + +g5() { # G5 version reconstruction and reordering of the CF=0 cluster (card B256), four absorption variants, exhaustive + local D="$EO_ROOT/cards/B256" v + run b256-plan B256 "$PY" -B plan.py + run b256-pair B256 "$PY" -B pair.py + run b256-cluster B256 "$PY" -B cluster.py + run b256-cluster2 B256 "$PY" -B cluster2.py + run b256-e1 B256 "$PY" -B e1.py + run b256-e2 B256 "$PY" -B e2.py + run b256-e6 B256 "$PY" -B e6.py + run b256-leaves B256 "$PY" -B leaves.py + for v in "pre pre" "post pre" "pre post" "post post"; do + set -- $v + ( cd "$D" && VA=$1 VB=$2 TL=$DFS_TL "$PY" -B dfs.py > "$OUT/logs/dfs-$1$2.log" 2>&1; echo $? > "$OUT/logs/dfs-$1$2.rc" ) & + done + wait + run b256-e7 B256 "$PY" -B e7.py 20 + chk G5.expansion-no-floor b256-plan --has "^\[58\] 4 \[\]$" --has "^\[58, 63\] 4 \[\]$" --has "^\[\(283, 517, 2449, Fraction\(1, 1\)\), \(281, 515, 2450, Fraction\(1, 1\)\), \(299, 671, 2475, Fraction\(1, 1\)\), \(297, 669, 2476, Fraction\(1, 1\)\)\]$" + chk G5.pair-alone b256-pair --has "^Counter\(\{.*\(True, True, True, True\): 128\b" + chk G5.relaxation-has-orders b256-cluster --has "^340$" --has "^also perp63 340$" + chk G5.precedence-kills b256-cluster2 --has "^solutions 0$" + chk G5.absorb-at-once-fails b256-e2 --has "^ widened 33 caps \[124, 125, 126, 127, 149, 150, 170, 171, 174, 175\] FAIL \('frame violation', 124, " --count "valsame True" 4 + chk G5.hoist-readers-fails b256-e6 --has "^239 value True changed 46 caps \[124, 125, 126, 127, 148, 151, 171, 174\] FAIL " --count "value True" 4 + chk G5.leaves-all-written b256-leaves --has "^y 170 src 591 support 18 leaves: \[\]$" --has "^y 175 src 598 support 18 leaves: \[\]$" + chk G5.relaxation-orders-in-word b256-e7 --count "caps \[(12[4-7]|14[89]|15[01])" 20 --absent "caps \[\]" + for v in prepre postpre prepost postpost; do + "$PY" -B "$EO_ROOT/checks/dfs_exhaustive.py" "G5.dfs-$v" "$OUT/logs/dfs-$v.log" "$DFS_TL" + done +} + +g6() { # G6 cold-slot capacity, coded pairs and partner end caps (cards B244, B247, B248) + local D; D=$(overlay b244 B240 B244) + run b244-ev "$D" "$PY" -B ev.py + run b244-classify "$D" "$PY" -B classify.py + run b244-lift "$D" "$PY" -B lift.py + chk G6.tail-reproduces b244-ev --has "^\{'1': 2412, '2': 418, '3': 432, '4': 142, '5': 82, '8': 8\} \{'1': 2412, '2': 418, '3': 432, '4': 142, '5': 82, '8': 8\}$" --has "^0\.00167166528321877$" --has "^0 non-lazy gates$" + chk G6.splits-partner-end-cap b244-classify --has "^32 \('T->E', 'partner_end_cap', 1, 5\)$" --has "^22 \('T->E', 'partner_end_cap', 1, 1\)$" --has "^16 \('T->E', 'partner_end_cap', 2, 1\)$" --has "^8 \('T->E', 'partner_end_cap', 3, 1\)$" --has "^78$" --absent "partner_uncapped" + chk G6.lift-gates b244-lift --has "^2 \[\(0\.0, 83, 8, " --has "\(0\.0, 104, 8, " + chk G6.coded-pair-capacity gen-base --has "PROBE \{'pairs': 112, 'own_cold_T': 112, .*'warm_T': 0, .*'second_pair_prev_half_in_partner_hyper': 0, 'second_pair_cases': 224, 'second_pair_prev_bothkeys_in_partner': 0, 'second_pair_prev_selloads_in_partner': 0, 'raw_half_cases': 448, 'raw_half_in_partner': 0" + mkdir -p "$WK/b248"; cp "$EO_ROOT/cards/B248/gen/ana1.py" "$WK/b248/" + run b248-gen "$WK/b248" "$PY" -B "$EO_ROOT/cards/B248/gen/cgx_inst.py" "$WK/ham" "$WK/b248/out" "$WK/in/TRI.json" + run b248-ana "$WK/b248" "$PY" -B ana1.py + chk G6.noncoded-gate b248-ana --has "^pairs 168 selected 56$" --has "^nonselected raw-half frames inside hyper\(Pt\),hyper\(Pu\): \{\(True, True\): 112\}$" --has "^\{\(True, True, False\): 56, \(False, True, False\): 112\}$" \ + --has "^\{\(False, False\): 112\} \{\(7, 7\): 112\}$" --has "^\{'sel:False': 224, 'non:False': 224\}$" --has "^\{False: 896\}$" +} + +for g in G0 G1 G2 G3 G4 G5 G6; do + want $g || continue + f=$(echo "$g" | tr 'G' 'g') + ( $f > "$OUT/$g.out" 2>&1; echo $? > "$OUT/$g.rc" ) & +done +wait +status=0; npass=0; nfail=0 +for g in G0 G1 G2 G3 G4 G5 G6; do + want $g || continue + echo "== $g"; sed 's/^/ /' "$OUT/$g.out" + p=$(grep -c '^PASS' "$OUT/$g.out"); f=$(grep -c '^FAIL' "$OUT/$g.out") + npass=$((npass + p)); nfail=$((nfail + f)) + if [ "$(cat "$OUT/$g.rc")" != 0 ] || [ "$f" != 0 ] || [ "$p" = 0 ]; then echo " FAILED: $g (exit $(cat "$OUT/$g.rc"), $f FAIL lines)"; status=1; fi +done +echo "== done in $((SECONDS - T0))s: $((npass + 2)) PASS (2 in step 0), $nfail FAIL; logs in $OUT" +exit $status