From a4948baee6c7ea35323db74ff636620c6af2925a Mon Sep 17 00:00:00 2001 From: Chafik Boukhalfa Date: Mon, 12 Oct 2026 02:32:36 +0400 Subject: [PATCH] Compose retimed local word with asynchronous whole owners --- .gitattributes | 4 + .../retimed-asynchronous-whole-owners.yml | 29 + .../FRESH-COMPARISON.json | 14 + .../LINUX-RECEIPT.json | 140 + .../LINUX-RESULT.json | 112 + .../LINUX-TOOLCHAIN.json | 7 + .../MACOS-RECEIPT.json | 140 + .../MACOS-TOOLCHAIN.json | 7 + .../PLAN-TRANSFER.json | 54 + .../retimed-asynchronous-validation/README.md | 41 + .../RESULT.json | 112 + .../SOURCE-BYTE-AUDIT.json | 602 + .../admission/ASYNC-AUDIT.json | 59 + .../admission/EXACT-ASSEMBLY.json | 127 + .../admission/GLOBAL-PREFIX.json | 13 + .../admission/PREFIX-AND-INVOICE.json | 69 + .../all-instance-columns.log | 5 + .../async-controller.log | 59 + .../async-emit.log | 47 + .../common-labels.log | 1 + .../exact-assembly.log | 1 + .../finite-invoice.log | 69 + .../gaussian-selftest.log | 0 .../integrate.log | 1 + .../lemma-controls.log | 15 + .../lemmaG/E2E-gauge80-kernel42.json | 17 + .../lemmaG/INSTANCES-gauge80-kernel42.json | 215 + .../lemmaG/MUTANTS.json | 247 + .../lemmaG/PREOP-GUARDS-lg_e2e.json | 6 + .../lemmaG/PREOP-GUARDS-lg_instances.json | 6 + .../phases.log | 16 + .../pipeline-controls.log | 1 + .../plan-transfer.log | 1 + .../programs.log | 2 + .../scalar-readback.log | 3 + .../scalar.log | 4 + .../selection-controls.log | 1 + .../transfer.log | 1 + .../transfer/TRANSFER.json | 54 + .../whole-program.log | 30 + .../word-controls.log | 1 + .../wrappers.log | 1 + .../.gitattributes | 1 + .../EXPECTED.json | 24 + .../retimed-asynchronous-whole-owners/LICENSE | 201 + .../MANIFEST.json | 111 + .../NOTICE.md | 26 + .../PROOF.md | 89 + .../README.md | 56 + .../SOURCE.json | 508 + .../code/build_plan.py | 32 + .../code/build_retimed.py | 90 + .../code/guarded_lemma.py | 32 + .../code/lg_mutants_retimed.py | 199 + .../data/PR495-FULL-WORD.json.gz | Bin 0 -> 37843 bytes .../data/PR502-EXPECTED.json | 23 + .../data/PR502-RESULT.json | 109 + .../references/PR502-PROOF.md | 41 + .../references/UPSTREAM-REPLAY.json | 33 + .../complex/e8-complex-gauge-kernel/NOTICE.md | 6 + .../code/adapters_gk.py | 59 + .../code/assemble_gk.py | 77 + .../e8-complex-gauge-kernel/code/audit_gk.py | 189 + .../code/audit_hosted_gk.py | 270 + .../code/controls_gk.py | 127 + .../code/controls_hosting.py | 84 + .../code/controls_pipeline.py | 71 + .../code/controls_sel.py | 8 + .../e8-complex-gauge-kernel/code/emit_gk.py | 156 + .../e8-complex-gauge-kernel/code/gk_common.py | 94 + .../e8-complex-gauge-kernel/code/gk_word.py | 194 + .../e8-complex-gauge-kernel/code/hosted_gk.py | 150 + .../code/integrate_gk.py | 123 + .../code/lemmaG/check.py | 49 + .../e8-complex-gauge-kernel/code/lemmaG/gd.py | 170 + .../code/lemmaG/lg_e2e.py | 41 + .../code/lemmaG/lg_instances.py | 125 + .../code/lemmaG/lg_lib.py | 216 + .../code/lemmaG/lg_mutants.py | 185 + .../code/lemmaG/lg_phys.py | 137 + .../code/lemmaG/run_labels.py | 23 + .../e8-complex-gauge-kernel/code/make_meta.py | 12 + .../code/onehost_gk.py | 111 + .../e8-complex-gauge-kernel/code/replay_gk.py | 271 + .../code/run_variant.py | 64 + .../data/selections/gauge80-kernel42.json | 470 + .../vendor/clifford_exact.py | 149 + .../vendor/pr505/ADVERSARIAL-REVIEW.md | 27 + .../vendor/pr505/EXPECTED.json | 8 + .../vendor/pr505/LICENSE | 201 + .../vendor/pr505/MANIFEST.json | 66 + .../vendor/pr505/NOTICE.md | 18 + .../vendor/pr505/PROOF.md | 42 + .../vendor/pr505/README.md | 81 + .../vendor/pr505/RESEARCH.md | 62 + .../vendor/pr505/SCHEDULING-LEMMA.md | 25 + .../vendor/pr505/SNAPSHOT.md | 17 + .../vendor/pr505/SOURCE-FILES.json | 148 + .../vendor/pr505/SOURCES.json | 46 + .../vendor/pr505/code/assemble.py | 42 + .../vendor/pr505/code/audit_async.py | 137 + .../vendor/pr505/code/audit_async_invoice.py | 99 + .../vendor/pr505/code/emit_async.py | 89 + .../vendor/pr505/evidence/ASYNC-AUDIT.json | 59 + .../vendor/pr505/evidence/EXACT-ASSEMBLY.json | 127 + .../vendor/pr505/evidence/GLOBAL-PREFIX.json | 13 + .../pr505/evidence/OWNERS-AND-PROFILE.json | 36 + .../pr505/evidence/PREFIX-AND-INVOICE.json | 69 + .../vendor/pr505/evidence/RESULT.json | 68 + .../vendor/pr505/evidence/STEPS.json | 57 + .../vendor/pr505/inputs/ASYNC-3.json | 13195 +++ .../vendor/pr505/inputs/ASYNC-OWNERS.json.gz | Bin 0 -> 458396 bytes .../vendor/pr505/inputs/BASE-WORD.json.gz | Bin 0 -> 35646 bytes .../vendor/pr505/inputs/PR493-EXPECTED.json | 91 + .../hamming/PACKET-PROGRAMS.json.gz | Bin 0 -> 3400 bytes .../complex-network/hamming/PROTOTYPE.json | 21364 +++++ .../work/complex-nine-native/DATA-PHASES.json | 73604 ++++++++++++++++ .../GLOBAL-TEMPLATE.json.gz | Bin 0 -> 415067 bytes .../verified/gcert1-e8-retimed.json.gz | Bin 0 -> 23365 bytes .../inputs/work/odd-stages/clifford_exact.py | 149 + .../pr361/code/engines/base_two_moment.py | 63 + .../inputs/work/pr361/code/engines/moment.py | 113 + .../inputs/work/pr361/code/engines/outer.py | 58 + .../e8-bit/data/bit/bitE8-r865.json.gz | Bin 0 -> 33865 bytes .../vendor/pr505/references/PR493-NOTICE.md | 11 + .../vendor/pr505/references/PR496-PROOF.md | 105 + .../kernel/APPENDIX-MANIFEST.json | 12 + .../kernel/APPENDIX-SOURCES.json | 112 + .../research-notes/kernel/BASE-WORD.json.gz | Bin 0 -> 35684 bytes .../kernel/COMPONENT-SELECTION.json | 528 + .../kernel/JOINT-47-SELECTION.json | 457 + .../kernel/JOINT-51-SELECTION.json | 458 + .../kernel/LOCAL-CANDIDATE-AUDITS.json | 164 + .../pr505/research-notes/kernel/REBUILD.json | 26 + .../kernel/RESEARCH-APPENDIX.md | 52 + .../kernel/audit_component_scalar.py | 55 + .../kernel/rebuild_candidate.py | 13 + .../pr505/vendor/audit_scalar_invoice.py | 82 + .../code/adapters_gk.py | 59 + .../e8-complex-gauge-kernel/code/audit_gk.py | 189 + .../e8-complex-gauge-kernel/code/emit_gk.py | 156 + .../e8-complex-gauge-kernel/code/gk_common.py | 94 + .../e8-complex-gauge-kernel/code/gk_word.py | 194 + .../code/integrate_gk.py | 123 + .../code/onehost_gk.py | 111 + .../e8-complex-gauge-kernel/code/replay_gk.py | 271 + .../data/selections/gauge80-kernel42.json | 470 + .../code/complex_phases_full.py | 39 + .../vendor/clifford_exact.py | 149 + .../vendor/pr505/verify.py | 49 + .../vendor/pr505/verify.sh | 10 + .../verify.py | 126 + 152 files changed, 121829 insertions(+) create mode 100644 .github/workflows/retimed-asynchronous-whole-owners.yml create mode 100644 research/retimed-asynchronous-validation/FRESH-COMPARISON.json create mode 100644 research/retimed-asynchronous-validation/LINUX-RECEIPT.json create mode 100644 research/retimed-asynchronous-validation/LINUX-RESULT.json create mode 100644 research/retimed-asynchronous-validation/LINUX-TOOLCHAIN.json create mode 100644 research/retimed-asynchronous-validation/MACOS-RECEIPT.json create mode 100644 research/retimed-asynchronous-validation/MACOS-TOOLCHAIN.json create mode 100644 research/retimed-asynchronous-validation/PLAN-TRANSFER.json create mode 100644 research/retimed-asynchronous-validation/README.md create mode 100644 research/retimed-asynchronous-validation/RESULT.json create mode 100644 research/retimed-asynchronous-validation/SOURCE-BYTE-AUDIT.json create mode 100644 research/retimed-asynchronous-validation/admission/ASYNC-AUDIT.json create mode 100644 research/retimed-asynchronous-validation/admission/EXACT-ASSEMBLY.json create mode 100644 research/retimed-asynchronous-validation/admission/GLOBAL-PREFIX.json create mode 100644 research/retimed-asynchronous-validation/admission/PREFIX-AND-INVOICE.json create mode 100644 research/retimed-asynchronous-validation/all-instance-columns.log create mode 100644 research/retimed-asynchronous-validation/async-controller.log create mode 100644 research/retimed-asynchronous-validation/async-emit.log create mode 100644 research/retimed-asynchronous-validation/common-labels.log create mode 100644 research/retimed-asynchronous-validation/exact-assembly.log create mode 100644 research/retimed-asynchronous-validation/finite-invoice.log create mode 100644 research/retimed-asynchronous-validation/gaussian-selftest.log create mode 100644 research/retimed-asynchronous-validation/integrate.log create mode 100644 research/retimed-asynchronous-validation/lemma-controls.log create mode 100644 research/retimed-asynchronous-validation/lemmaG/E2E-gauge80-kernel42.json create mode 100644 research/retimed-asynchronous-validation/lemmaG/INSTANCES-gauge80-kernel42.json create mode 100644 research/retimed-asynchronous-validation/lemmaG/MUTANTS.json create mode 100644 research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_e2e.json create mode 100644 research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_instances.json create mode 100644 research/retimed-asynchronous-validation/phases.log create mode 100644 research/retimed-asynchronous-validation/pipeline-controls.log create mode 100644 research/retimed-asynchronous-validation/plan-transfer.log create mode 100644 research/retimed-asynchronous-validation/programs.log create mode 100644 research/retimed-asynchronous-validation/scalar-readback.log create mode 100644 research/retimed-asynchronous-validation/scalar.log create mode 100644 research/retimed-asynchronous-validation/selection-controls.log create mode 100644 research/retimed-asynchronous-validation/transfer.log create mode 100644 research/retimed-asynchronous-validation/transfer/TRANSFER.json create mode 100644 research/retimed-asynchronous-validation/whole-program.log create mode 100644 research/retimed-asynchronous-validation/word-controls.log create mode 100644 research/retimed-asynchronous-validation/wrappers.log create mode 100644 research/retimed-asynchronous-whole-owners/.gitattributes create mode 100644 research/retimed-asynchronous-whole-owners/EXPECTED.json create mode 100644 research/retimed-asynchronous-whole-owners/LICENSE create mode 100644 research/retimed-asynchronous-whole-owners/MANIFEST.json create mode 100644 research/retimed-asynchronous-whole-owners/NOTICE.md create mode 100644 research/retimed-asynchronous-whole-owners/PROOF.md create mode 100644 research/retimed-asynchronous-whole-owners/README.md create mode 100644 research/retimed-asynchronous-whole-owners/SOURCE.json create mode 100644 research/retimed-asynchronous-whole-owners/code/build_plan.py create mode 100644 research/retimed-asynchronous-whole-owners/code/build_retimed.py create mode 100644 research/retimed-asynchronous-whole-owners/code/guarded_lemma.py create mode 100644 research/retimed-asynchronous-whole-owners/code/lg_mutants_retimed.py create mode 100644 research/retimed-asynchronous-whole-owners/data/PR495-FULL-WORD.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/data/PR502-EXPECTED.json create mode 100644 research/retimed-asynchronous-whole-owners/data/PR502-RESULT.json create mode 100644 research/retimed-asynchronous-whole-owners/references/PR502-PROOF.md create mode 100644 research/retimed-asynchronous-whole-owners/references/UPSTREAM-REPLAY.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/NOTICE.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_hosted_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/make_meta.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/run_variant.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/complex/split-centres-global/vendor/clifford_exact.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/ADVERSARIAL-REVIEW.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/EXPECTED.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/LICENSE create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/MANIFEST.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/NOTICE.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/PROOF.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/README.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/RESEARCH.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/SCHEDULING-LEMMA.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/SNAPSHOT.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCE-FILES.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCES.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/code/assemble.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async_invoice.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/code/emit_async.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/ASYNC-AUDIT.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/EXACT-ASSEMBLY.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/GLOBAL-PREFIX.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/OWNERS-AND-PROFILE.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/PREFIX-AND-INVOICE.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/RESULT.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/STEPS.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-3.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-OWNERS.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/BASE-WORD.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/PR493-EXPECTED.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/complex-network/hamming/PROTOTYPE.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/complex-nine-native/DATA-PHASES.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/odd-stages/clifford_exact.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr361/code/engines/base_two_moment.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr361/code/engines/moment.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr361/code/engines/outer.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR493-NOTICE.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR496-PROOF.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/BASE-WORD.json.gz create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/COMPONENT-SELECTION.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/JOINT-47-SELECTION.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/JOINT-51-SELECTION.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/REBUILD.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/RESEARCH-APPENDIX.md create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/audit_component_scalar.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/rebuild_candidate.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/audit_scalar_invoice.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/split-centres-global/code/complex_phases_full.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/split-centres-global/vendor/clifford_exact.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/verify.py create mode 100644 research/retimed-asynchronous-whole-owners/vendor/pr505/verify.sh create mode 100644 research/retimed-asynchronous-whole-owners/verify.py diff --git a/.gitattributes b/.gitattributes index 6825630198..175dfe3d09 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,3 +18,7 @@ research/coordinated-frames-and-entrance-banks/** -text -whitespace # Frozen PR210 package and round-nine evidence retain their audited bytes. research/five-stage-source527-banks/** -text -whitespace research/community-round9-audit/** -text -whitespace + +# Preserve frozen source and validation bytes for the asynchronous retiming witness. +research/retimed-asynchronous-whole-owners/** -text -whitespace +research/retimed-asynchronous-validation/** -text -whitespace diff --git a/.github/workflows/retimed-asynchronous-whole-owners.yml b/.github/workflows/retimed-asynchronous-whole-owners.yml new file mode 100644 index 0000000000..ab3595745b --- /dev/null +++ b/.github/workflows/retimed-asynchronous-whole-owners.yml @@ -0,0 +1,29 @@ +name: retimed-asynchronous-whole-owners +on: + pull_request: + paths: ['research/retimed-asynchronous-whole-owners/**', '.github/workflows/retimed-asynchronous-whole-owners.yml'] + push: + paths: ['research/retimed-asynchronous-whole-owners/**', '.github/workflows/retimed-asynchronous-whole-owners.yml'] + workflow_dispatch: +permissions: + contents: read +jobs: + verify: + runs-on: ubuntu-latest + timeout-minutes: 45 + strategy: + fail-fast: false + matrix: + python-version: ['3.13', '3.14'] + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + with: + python-version: ${{ matrix.python-version }} + - run: python -m pip install numpy + - name: Fresh local physics, asynchronous owners, finite invoice and exact assembly + run: python -B research/retimed-asynchronous-whole-owners/verify.py "$RUNNER_TEMP/retimed-asynchronous" + - name: Require an unchanged tracked tree + run: git diff --exit-code diff --git a/research/retimed-asynchronous-validation/FRESH-COMPARISON.json b/research/retimed-asynchronous-validation/FRESH-COMPARISON.json new file mode 100644 index 0000000000..a830155e53 --- /dev/null +++ b/research/retimed-asynchronous-validation/FRESH-COMPARISON.json @@ -0,0 +1,14 @@ +{ + "unit": "research-resume-20261011-async-retimed", + "linux_output": "/home/cfky/offload/check-async-retimed-fresh", + "linux_run": "/home/cfky/research/integer-mult/runs/resume-20261011-async-retimed", + "macos_pid": 61726, + "macos_output": "/private/tmp/async-retimed-macos314-fresh", + "manifest": "5803b204360b144ff8e111abae713e27cae320d89cce1b6ef72410c9752bcb35", + "stage": "PASS_BOTH_FRESH_RESULTS_IDENTICAL", + "updated_utc": "2026-10-11T22:31:36Z", + "macos_pid_live": false, + "macos_terminal_artifacts": true, + "linux_exit": 0, + "result_sha256": "94585e3cdc8605de54323755ce6014a101bdc6b9a1cf73adbac0458805df6619" +} diff --git a/research/retimed-asynchronous-validation/LINUX-RECEIPT.json b/research/retimed-asynchronous-validation/LINUX-RECEIPT.json new file mode 100644 index 0000000000..74b5e86eb2 --- /dev/null +++ b/research/retimed-asynchronous-validation/LINUX-RECEIPT.json @@ -0,0 +1,140 @@ +{ + "status": "PASS_FRESH_RETIMED_ASYNCHRONOUS_WHOLE_OWNER", + "python": "3.14.8", + "steps": [ + { + "name": "transfer", + "exit_code": 0, + "seconds": 0.486, + "log_sha256": "169f130afac947949d346fdfb20422042d2c8cd2d0b23fd6a2309b6a41f9011d" + }, + { + "name": "word-controls", + "exit_code": 0, + "seconds": 1.704, + "log_sha256": "7138c95893d4135181074f2cb27e2c48873f1a736668e7d8e79b2a01eb3ae8a1" + }, + { + "name": "selection-controls", + "exit_code": 0, + "seconds": 0.617, + "log_sha256": "90c066e392fa1fdd018d9679d84b25f4e6478cabb9c06180f36063dcb2ea0be0" + }, + { + "name": "pipeline-controls", + "exit_code": 0, + "seconds": 7.412, + "log_sha256": "a6ca3979a17f335cad7e216f2925762fc687ed057db5cdc25f7aa6271a5c405e" + }, + { + "name": "scalar", + "exit_code": 0, + "seconds": 0.833, + "log_sha256": "2fba60a482245a4fdd5ebc242dab702692ea5fd51ff28590dce7cae874a55d4b" + }, + { + "name": "programs", + "exit_code": 0, + "seconds": 0.515, + "log_sha256": "4eaec4d39a6e9b8fb5ddc15cc8b154f2eb6c25708f1c7905e3243a350ec7c5c5" + }, + { + "name": "phases", + "exit_code": 0, + "seconds": 103.781, + "log_sha256": "3cd42d87715b793a630ae8a9290eb76f7f0c02f867fe5b2b3944c46016ca84ae" + }, + { + "name": "wrappers", + "exit_code": 0, + "seconds": 0.656, + "log_sha256": "539afb02eeb2975f6e647ccf0e520be953919361fdf1c88432ed17f99d3fcf6e" + }, + { + "name": "integrate", + "exit_code": 0, + "seconds": 0.589, + "log_sha256": "ce500ae60a967e87b72ea1e2e6d59a32daf2f01c139685612f073caa87a0d098" + }, + { + "name": "scalar-readback", + "exit_code": 0, + "seconds": 3.354, + "log_sha256": "04a057c55168c3dbfe452a4fc62fc90f55f1844d9e8c62e48e78e59b58ae1137" + }, + { + "name": "plan-transfer", + "exit_code": 0, + "seconds": 0.314, + "log_sha256": "38395f337ac789dab2a60b10cdf798a1019e6fc8fe238ecdd4bdab4b777e9230" + }, + { + "name": "async-emit", + "exit_code": 0, + "seconds": 2.036, + "log_sha256": "ad13ccd443d4265518c7b77958bd8ccfa86337f6f42a7e576e07202eea8b3dde" + }, + { + "name": "async-controller", + "exit_code": 0, + "seconds": 8.964, + "log_sha256": "f9c0a25bf69d084351289829a9fce3e3d003a3581e4103a2fb7c106093bb78f7" + }, + { + "name": "gaussian-selftest", + "exit_code": 0, + "seconds": 0.593, + "log_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "name": "common-labels", + "exit_code": 0, + "seconds": 0.503, + "log_sha256": "102e97dc2f1e050fd224b85dcd2a6f2c4a42e586c603a98ffa7df243d3694ba0" + }, + { + "name": "whole-program", + "exit_code": 0, + "seconds": 57.496, + "log_sha256": "6f84a2083936ec97fdbb120c31b9d5dd49812f486374dcdd213f662fdf4d5b8d" + }, + { + "name": "all-instance-columns", + "exit_code": 0, + "seconds": 134.265, + "log_sha256": "f6650d34310e67a61f1487659c1f3ddcba535e34c7eeaf14698072c7fb9e161f" + }, + { + "name": "lemma-controls", + "exit_code": 0, + "seconds": 16.254, + "log_sha256": "d3abcc78068e9140456b5640511bb04cd411ede2bb4ba4fd87acc458f230c535" + }, + { + "name": "finite-invoice", + "exit_code": 0, + "seconds": 0.949, + "log_sha256": "d7df4b706e59905fb0f8bb8517b773334ca74564d23384211c1b684cf44630a4" + }, + { + "name": "exact-assembly", + "exit_code": 0, + "seconds": 0.242, + "log_sha256": "6ba26e1b4302bdc8ded9ec207b734bb037ecf356a51f6b5b2d89c4fc8a6fb412" + } + ], + "artifacts": { + "RESULT.json": "94585e3cdc8605de54323755ce6014a101bdc6b9a1cf73adbac0458805df6619", + "transfer/TRANSFER.json": "e50bed2a2a3c58526917d1aa092a913bab12ec37d119a500156d6281e3a9ec16", + "PLAN-TRANSFER.json": "8b7bb7ac95dd268df8c067705b83fa678541182f81daaeef8714de3b85ad4ede", + "admission/ASYNC-AUDIT.json": "f9c0a25bf69d084351289829a9fce3e3d003a3581e4103a2fb7c106093bb78f7", + "admission/PREFIX-AND-INVOICE.json": "d7df4b706e59905fb0f8bb8517b773334ca74564d23384211c1b684cf44630a4", + "admission/EXACT-ASSEMBLY.json": "7d2dcc280a4b807794927882d4a94371fdd4e649dc81eb139558ababe7d68893", + "admission/GLOBAL-PREFIX.json": "946d7c70c40758fcb90c58e5253745bb15a665cf3252c34b67217433f4762f5e", + "lemmaG/INSTANCES-gauge80-kernel42.json": "1aad0c115b154abf911470a650d5a6b60f3dc8c30c66ffbf31ea7231c10d6143", + "lemmaG/E2E-gauge80-kernel42.json": "37f22b340468a0b142470e072f1a779a8cba5270fb407f3f008479374d3d3e7b", + "lemmaG/PREOP-GUARDS-lg_instances.json": "43da15d612714a16af35540e70b17c9d9c522fb34b03b378e5e4b8359233d634", + "lemmaG/PREOP-GUARDS-lg_e2e.json": "3b0130e80b98c543188be9b5d3c778ee11c09983f15ae2c62fd11f893ed916be", + "lemmaG/MUTANTS.json": "8f974c1e828c65c9410560dbba65bf5cb057a0e810a366bf7226ec5a158e21da" + } +} diff --git a/research/retimed-asynchronous-validation/LINUX-RESULT.json b/research/retimed-asynchronous-validation/LINUX-RESULT.json new file mode 100644 index 0000000000..6f53d1de91 --- /dev/null +++ b/research/retimed-asynchronous-validation/LINUX-RESULT.json @@ -0,0 +1,112 @@ +{ + "asynchronous_template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "binding_component": "complex", + "bit_charged_three_level_coefficient_bits": 6464, + "bit_lower": "391360506745414227149/250000000000000000000000", + "bit_scope": "Pinned PR493 operator reused; its published profile is independently repriced by both moment engines.", + "bootstrap": [ + { + "cutoff_log2": "10771261563667", + "gap": "114260989736356947327697669006171977445634861037303644032599946463917431079809/62500000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "5726584986749628443", + "gap": "39176300406575945195810607812444446707311611735413675123889579768974862575012819998283046228934952661747086629864127/15625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "3044562182120388518369251", + "gap": "13432252924533585208247928483896891822215904583765205366456615004223923972800005620395915932771112886179715744191330975841568666532373040317333507727476481/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "1618653857795776509605324228181", + "gap": "4605473634727277885099896383062386619421157355501013228302208169789180835447262943078605920209817408437683905201954415563552532599460384220646452114541878297085168199070565579528913740563111743/976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "860563902009851566130221515682178170", + "gap": "1579064027407344477536557817777860888945134224038025964916330620309742322845404353104802148464641079972302848676283762080212621108690393875901708744042965622120626709796524627344614799694372503007152211462025646705633096662481472129/244140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "457522295996565195596976439065977442685980", + "gap": "541408636855556955063219085392507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "canonical_word_sha256": "bae9701c7fde304860cc89d72d1bcb503f392b25cff04401202e833301e2ef18", + "complex_lower": "342866804295765301697/250000000000000000000000", + "external_row_allowance": 20161, + "global_prefix_bits": 205, + "global_profile": { + "1": 171856, + "16": 1, + "2": 19008, + "3": 41592, + "4": 6048, + "48": 408, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224 + }, + "kappa": "68479443547277/50000000000000000", + "kappa_decimal": "0.001369588870945540", + "live": 7680, + "local_program_sha256": "39af027100077ecdf4dea36c937faa813b195e5be4554f09b4f35f1ca230d518", + "next_b_rejected": "1371467217183061206789/1000000000000000000000000", + "outer_controls": [ + "next_grid", + "zero_eta", + "zero_beta", + "unit_beta" + ], + "physical": 8258, + "source_manifest_sha256": "5803b204360b144ff8e111abae713e27cae320d89cce1b6ef72410c9752bcb35", + "status": "PASS_FRESH_RETIMED_ASYNCHRONOUS_WHOLE_OWNER", + "strict_outer_constraints": { + "Gaussian_arithmetic_above_kappa": "9740907193452233132026546316939019357784378101068809219772846736742960417019129469196756916510399147705912560964758782292859399371354172387966249425225875806875131511215897923552260550683356061614356130677587285215818492471104842953509255983751331016207784263688028247138309374949927266662951247612569295149/9779018234542803331970724211349700891097324522966583671327826080168205428907886098865572380266672276277704512610801469438654725227367036393359317128700215274940856819622997186012397251196791046103364271062285609929940241261325573384507166287473876666736207571882429587136532598804082062235119327709957791067840000000000000000", + "K_dominates_log": "41853857946260419996053833771554864641231442552758688220317366255067992437687558429271722996206804412912913575403728627969414426767396733451849691666184004942311534133693472098563848668105812784271937079670511958049906871999885795521640706713447756965754013776727876251015709130163984683083527830861652602252100906381902913/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "K_geometry": "22930037451696260420037907691717815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "alpha_below_one": "61035156249999999969524275732946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "alpha_below_one_fourth": "15196008275580609350911505992244537485389804459061954325329954383482111024893740412093271432837117763903173785470218975374132577405471608901924217294739729627962599685205373424757065446336908177679221389385508222526418466157178905791185911969108619951258921655156975893848152105238457793074542522622329298854247899093618097087/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "alpha_positive": "83707715892520855292750587989370156949765108073332661119773866780709957774831617384185411329557667780739515484158320623765430762289385462699715718854356739132489095455559678387305258658077831857285284149313042989113160813642302622106535355069312340516402675909320336052680080392920429167831426924479749689252100906381902913/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "artificial_boundary": "1711663021908560666729963763218778959456690444074720180119602633436452807700275589274691401949345887432405643587160346477834424851199671054659251474746609021175914962006163955405049982923323807839539078442427038043207088293474042269994623019319702583826996198321553511177958465747214189826428858655779827547022243697280854291261/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "balanced_prefix_above_kappa": "2476998998443982064766913898286341002300032176237956877242615318257513876576024731404334320965167081309293418960392140733127906662259151583408722286041173492767682347418792369501563880106461010223274812514299342409692366134286457237316599205222266239518424061892897927984162851437887274306234504286139517901/1527971599147313020620425658023390764233956956713528698644972825026282098266857202947745684416667543168391330095437729599789800816776099436462393301359408636709508878066093310314437070499498600953650667353482126551553162697082120841329244732417793229177532433106629622990083218563137822224237394954680904854350000000000000000", + "beta_below_one": "999999999999999999/1000000000000000000", + "beta_positive": "1/1000000000000000000", + "bit_positive": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bulk_exposure_above_kappa": "114645156098705843816752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_below_one": "30475724267053739579962092308282184715320860865729426027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_positive": "41853857946260420037907691717815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cell_above_band": "61035156249999999908405411767053739587591486839532184715320860865729426027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/122237727931785041649634052641871261138716556537082295891597826002102567861348576235819654753333403453471306407635018367983184065342087954916991464108752690936760710245287464825154965639959888076292053388278570124124253015766569667306339578593423458334202594648530369839206657485051025777938991596374472388348000000000000000000", + "compact_leaf": "354442551898424302516051295416926027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_phase_layer_above_kappa": "18980547985933380882929764805259004761321504390488563571952849864624635566183350569131772730969990762818041777299088222666762116909661042938926579693635297121163469387053981183742536192139248185392482903216344317162784068744086727919747089456089460206817832575725366099881592657494989041639942186629172260933/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "compact_reservations": "1/4000000000000000000", + "complex_above_bit": "625177387904327780672838226017507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "complex_below_one_over32": "7469633195704234698303/250000000000000000000000", + "coordinate_movement_above_kappa": "114645156098705843816752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "delta_below_one_eighth": "999999999999999999/8000000000000000000", + "delta_positive": "1/8000000000000000000", + "dimension_above_kappa": "1523786213352686978804815527920591300532956941572812303655059351211674778975758115309768192159357188235942990869729351709503618143616041296665513360899742946699213407975080182453245276919293768547913212752978883671721649817217221568363121401868664008139066772115636616528340843329760105759925456483206369451884504286139517901/1527971599147313020620425658023390764233956956713528698644972825026282098266857202947745684416667543168391330095437729599789800816776099436462393301359408636709508878066093310314437070499498600953650667353482126551553162697082120841329244732417793229177532433106629622990083218563137822224237394954680904854350000000000000000", + "epsilon_below_one": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "epsilon_positive": "30517578124999999969482421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "gamma_sublinear": "1/2000000000000000000", + "guard_width": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "lambda_above_internal": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_sigma": "708885103796848605657279978738179834873925224966223684872475333073903923752537057321982020354266657388025211854998521309146724326664674608408825585061962272620523472787712919672503071416084815428906329088169859266769376762912823019607245498272190286712459578284052604058752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_tau": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_prime_above_lambda": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_prime_below_one": "41853857946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "leaf_saving_above_bit": "541469672011806955063219085392507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "literal_scalar_guard": "1", + "phase_boundary": "66966172714016678122314073802244043078109454365103071959991266570453171639973993802219935996217322433608874720656483825447024228080589971000569307979087645456418070926813195871808694662089024228079945321456030576687859236985335891472577495726966507096143211056283352132014331887817851373932267287032510854452100906381902913/48895091172714016659853621056748504455486622614832918356639130400841027144539430494327861901333361381388522563054007347193273626136835181966796585643501076374704284098114985930061986255983955230516821355311428049649701206306627866922535831437369383333681037859412147935682662994020410311175596638549788955339200000000000000000", + "phase_local": "334830863570083512849298300796261865024599913696776498516512869934561749797695971113667541329662847987699126936685872598541528775421317838186911881983393144273554463386756916119753718597909946295365366567168229175492684463496803581615903245204499841820294648704875094862666307969459096076318821486188332211252100906381902913/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "prime_interval_packing": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "q_below_internal": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_leaf": "354442551898424302516051295416926027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_reservations": "1/4000000000000000000", + "q_positive": "41853857946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "record_suffix": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "row_product_gap": "23971789/25", + "scalar_work_above_kappa": "365760407768090869950297710565346745083326009063802526385918994420676578286826812965738577666093382146119120431753987925304669049625942264616147699739399586108638998025684912913961479407043789616650956655218252254519715327544190741144070978187206733739397201240731076017664391858799207444512772786688704767073/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "short_record_fallback": "1860087088980691749515962045411391569220114847167535207176248690649676507265380825804070862892908205272608648051923512574623062491544518391213412474182057911290098440675138295661834404433043338390084357501690454170481232063362840158529852266892690313026750408281407921884346643449396150217101111261046357415683170175801323439052834291021040208319174003106260523193085931811488237607626194482108458821221933536435893769014573574584481865550916355845712399156312010268113536192329657347931644768001143360835419821022332270013057219576443738176668132478025076811609623063025788950151388528190957885569/1865199705990372339624543039579334428996529488175694212213101593049660764485909671567072368672689872031727697870407384765368409200166137007400382447948496870983287204670524060442428064574583253117249349796731111513126419307961573292638238198752189000460855020882116239001566428910080349394821038763038213933532714843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "small_field_exposure": "1/1000000000000000000" + } +} diff --git a/research/retimed-asynchronous-validation/LINUX-TOOLCHAIN.json b/research/retimed-asynchronous-validation/LINUX-TOOLCHAIN.json new file mode 100644 index 0000000000..9cecd5cf34 --- /dev/null +++ b/research/retimed-asynchronous-validation/LINUX-TOOLCHAIN.json @@ -0,0 +1,7 @@ +{ + "python": "3.14.8 (main, Oct 9 2026, 15:22:55) [Clang 22.1.3 ]", + "executable": "/home/cfky/offload/venv314/bin/python", + "platform": "Linux-6.17.0-1032-nvidia-aarch64-with-glibc2.39", + "machine": "aarch64", + "numpy": "2.5.4" +} diff --git a/research/retimed-asynchronous-validation/MACOS-RECEIPT.json b/research/retimed-asynchronous-validation/MACOS-RECEIPT.json new file mode 100644 index 0000000000..268ef009f5 --- /dev/null +++ b/research/retimed-asynchronous-validation/MACOS-RECEIPT.json @@ -0,0 +1,140 @@ +{ + "status": "PASS_FRESH_RETIMED_ASYNCHRONOUS_WHOLE_OWNER", + "python": "3.14.8", + "steps": [ + { + "name": "transfer", + "exit_code": 0, + "seconds": 0.376, + "log_sha256": "169f130afac947949d346fdfb20422042d2c8cd2d0b23fd6a2309b6a41f9011d" + }, + { + "name": "word-controls", + "exit_code": 0, + "seconds": 1.471, + "log_sha256": "7138c95893d4135181074f2cb27e2c48873f1a736668e7d8e79b2a01eb3ae8a1" + }, + { + "name": "selection-controls", + "exit_code": 0, + "seconds": 0.522, + "log_sha256": "90c066e392fa1fdd018d9679d84b25f4e6478cabb9c06180f36063dcb2ea0be0" + }, + { + "name": "pipeline-controls", + "exit_code": 0, + "seconds": 6.002, + "log_sha256": "a6ca3979a17f335cad7e216f2925762fc687ed057db5cdc25f7aa6271a5c405e" + }, + { + "name": "scalar", + "exit_code": 0, + "seconds": 0.696, + "log_sha256": "99c7c9b194b10d91c4e6b9ba2d87ccffc1077b9e54da2b90ab6dd3f5196ccae0" + }, + { + "name": "programs", + "exit_code": 0, + "seconds": 0.408, + "log_sha256": "4eaec4d39a6e9b8fb5ddc15cc8b154f2eb6c25708f1c7905e3243a350ec7c5c5" + }, + { + "name": "phases", + "exit_code": 0, + "seconds": 82.625, + "log_sha256": "68f94c68caf64ecb2b68b14eb6289348a369c651c802eeb8f1a252d236756654" + }, + { + "name": "wrappers", + "exit_code": 0, + "seconds": 0.557, + "log_sha256": "539afb02eeb2975f6e647ccf0e520be953919361fdf1c88432ed17f99d3fcf6e" + }, + { + "name": "integrate", + "exit_code": 0, + "seconds": 0.453, + "log_sha256": "ce500ae60a967e87b72ea1e2e6d59a32daf2f01c139685612f073caa87a0d098" + }, + { + "name": "scalar-readback", + "exit_code": 0, + "seconds": 2.698, + "log_sha256": "04a057c55168c3dbfe452a4fc62fc90f55f1844d9e8c62e48e78e59b58ae1137" + }, + { + "name": "plan-transfer", + "exit_code": 0, + "seconds": 0.258, + "log_sha256": "38395f337ac789dab2a60b10cdf798a1019e6fc8fe238ecdd4bdab4b777e9230" + }, + { + "name": "async-emit", + "exit_code": 0, + "seconds": 1.688, + "log_sha256": "ad13ccd443d4265518c7b77958bd8ccfa86337f6f42a7e576e07202eea8b3dde" + }, + { + "name": "async-controller", + "exit_code": 0, + "seconds": 7.993, + "log_sha256": "f9c0a25bf69d084351289829a9fce3e3d003a3581e4103a2fb7c106093bb78f7" + }, + { + "name": "gaussian-selftest", + "exit_code": 0, + "seconds": 0.523, + "log_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "name": "common-labels", + "exit_code": 0, + "seconds": 0.401, + "log_sha256": "d93047434768535deca938e68581c30fead070104d6ac4070bfce1161e739a78" + }, + { + "name": "whole-program", + "exit_code": 0, + "seconds": 50.688, + "log_sha256": "02813e0449acd5cee74791de5b54680b0238e81a58c9043bf2abcf9cbf82fdad" + }, + { + "name": "all-instance-columns", + "exit_code": 0, + "seconds": 87.397, + "log_sha256": "03d601457a4ffdda88f81545b909372b415491966ab4c4a1efd177cce4c5bbda" + }, + { + "name": "lemma-controls", + "exit_code": 0, + "seconds": 15.783, + "log_sha256": "1c4ebdab47d2260aa7b1cbcef92c41cd8644fa5cf8ae55adcda23af3b61a82b1" + }, + { + "name": "finite-invoice", + "exit_code": 0, + "seconds": 0.764, + "log_sha256": "d7df4b706e59905fb0f8bb8517b773334ca74564d23384211c1b684cf44630a4" + }, + { + "name": "exact-assembly", + "exit_code": 0, + "seconds": 0.23, + "log_sha256": "6ba26e1b4302bdc8ded9ec207b734bb037ecf356a51f6b5b2d89c4fc8a6fb412" + } + ], + "artifacts": { + "RESULT.json": "94585e3cdc8605de54323755ce6014a101bdc6b9a1cf73adbac0458805df6619", + "transfer/TRANSFER.json": "68ecde838061fb5427721febacc27e99d4550cba416c017e1a68cec5930e13e1", + "PLAN-TRANSFER.json": "8b7bb7ac95dd268df8c067705b83fa678541182f81daaeef8714de3b85ad4ede", + "admission/ASYNC-AUDIT.json": "f9c0a25bf69d084351289829a9fce3e3d003a3581e4103a2fb7c106093bb78f7", + "admission/PREFIX-AND-INVOICE.json": "d7df4b706e59905fb0f8bb8517b773334ca74564d23384211c1b684cf44630a4", + "admission/EXACT-ASSEMBLY.json": "7d2dcc280a4b807794927882d4a94371fdd4e649dc81eb139558ababe7d68893", + "admission/GLOBAL-PREFIX.json": "946d7c70c40758fcb90c58e5253745bb15a665cf3252c34b67217433f4762f5e", + "lemmaG/INSTANCES-gauge80-kernel42.json": "d4cdf3c5e1fd4971746fc2187e4ffba7ba082fd176786882c922a6f94fd8a3b9", + "lemmaG/E2E-gauge80-kernel42.json": "186aa61173fd22c7835b15d202e88486a729d3854fa26af97956a5f51c2b4e62", + "lemmaG/PREOP-GUARDS-lg_instances.json": "43da15d612714a16af35540e70b17c9d9c522fb34b03b378e5e4b8359233d634", + "lemmaG/PREOP-GUARDS-lg_e2e.json": "3b0130e80b98c543188be9b5d3c778ee11c09983f15ae2c62fd11f893ed916be", + "lemmaG/MUTANTS.json": "96386393eea71ce6374f31cae5fbffc2862637cd2ce5d7061dc94bf464112e84" + } +} diff --git a/research/retimed-asynchronous-validation/MACOS-TOOLCHAIN.json b/research/retimed-asynchronous-validation/MACOS-TOOLCHAIN.json new file mode 100644 index 0000000000..5843c41568 --- /dev/null +++ b/research/retimed-asynchronous-validation/MACOS-TOOLCHAIN.json @@ -0,0 +1,7 @@ +{ + "python": "3.14.8 (main, Sep 30 2026, 17:55:09) [Clang 21.0.0 (clang-2100.3.34.2)]", + "executable": "/Users/chafreaky/Documents/personal/integer-mult-research-20261008/resume-20261011/gauge-nine/venv314/bin/python", + "platform": "macOS-27.0.1-arm64-arm-64bit-Mach-O", + "machine": "arm64", + "numpy": "2.5.4" +} diff --git a/research/retimed-asynchronous-validation/PLAN-TRANSFER.json b/research/retimed-asynchronous-validation/PLAN-TRANSFER.json new file mode 100644 index 0000000000..d7a341a116 --- /dev/null +++ b/research/retimed-asynchronous-validation/PLAN-TRANSFER.json @@ -0,0 +1,54 @@ +{ + "status": "PASS_UNCHANGED_WIDTH_ASYNC_PLAN_TRANSFER", + "preserved_fields": [ + "centers", + "center_frames", + "target_levels", + "root_lines", + "ports", + "cut", + "precondition", + "start_extra", + "scatter" + ], + "helper_widths": { + "5": 4, + "7": 14, + "8": 104, + "9": 438 + }, + "old_local_profile": { + "1": 2057, + "2": 928, + "3": 50, + "4": 274, + "5": 314, + "6": 2, + "7": 1, + "8": 17 + }, + "new_local_profile": { + "1": 2385, + "2": 264, + "3": 530, + "4": 84, + "5": 270, + "6": 92, + "7": 1, + "8": 17 + }, + "predicted_profile": { + "1": 171856, + "2": 19008, + "3": 41592, + "4": 6048, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224, + "16": 1, + "48": 408 + }, + "plan_sha256": "bdfdc2f64ff8f9d64f05b8330d4f7c11b02ea41ac67d41d4c82a624434be0fe2", + "scope": "Only local paid profile changes. The independent emitted-controller audit must reconstruct all owners, events and actual paid children." +} diff --git a/research/retimed-asynchronous-validation/README.md b/research/retimed-asynchronous-validation/README.md new file mode 100644 index 0000000000..dabae80e38 --- /dev/null +++ b/research/retimed-asynchronous-validation/README.md @@ -0,0 +1,41 @@ +# Fresh verification receipts + +Two independent fresh runs of the frozen package passed all 20 stages on +macOS arm64 and Linux aarch64, using Python 3.14.8 and NumPy. Their complete +stable `RESULT.json` bytes are identical: + +`94585e3cdc8605de54323755ce6014a101bdc6b9a1cf73adbac0458805df6619`. + +Both runs used source manifest +`5803b204360b144ff8e111abae713e27cae320d89cce1b6ef72410c9752bcb35`. +`SOURCE-BYTE-AUDIT.json` records 109 manifest checks and 99 source files +compared directly against their pinned Git blobs. The proof and source +package were frozen before these runs. + +The platform receipts retain every step's exit status, elapsed time and log +hash; toolchain records identify both environments. The included stage logs +and detailed admission/guard artifacts are from macOS. The Linux result and +receipt are retained separately. Only the stable complete result is claimed +byte-identical across platforms; timings and diagnostic logs may differ. + +The result is conditional κ = 0.001369588870945540, with complex supplier +b = 0.001371467217183061206788. Fresh checks cover both physical orientations, +all helper instances, whole-program columns and dense inputs, 19 asynchronous +controller mutations, 14 local controls, the finite invoice, two rational +moment engines and all 47 strict outer inequalities. + +The unchanged #493 bit operator is a source-pinned dependency; these runs +reprice its histogram but do not rebuild it. The inherited all-size and +analytic interfaces remain conditions, as specified in the package README +and proof. These receipts do not turn the conditional result into an +unconditional theorem. + +Reproduce from the repository root with a new output directory: + +```sh +python3.14 -m pip install numpy +python3.14 -B research/retimed-asynchronous-whole-owners/verify.py /absolute/new/output +``` + +The dedicated GitHub workflow runs the same full verifier on Python 3.13 +and 3.14. Its remote status is separate from these completed local runs. diff --git a/research/retimed-asynchronous-validation/RESULT.json b/research/retimed-asynchronous-validation/RESULT.json new file mode 100644 index 0000000000..6f53d1de91 --- /dev/null +++ b/research/retimed-asynchronous-validation/RESULT.json @@ -0,0 +1,112 @@ +{ + "asynchronous_template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "binding_component": "complex", + "bit_charged_three_level_coefficient_bits": 6464, + "bit_lower": "391360506745414227149/250000000000000000000000", + "bit_scope": "Pinned PR493 operator reused; its published profile is independently repriced by both moment engines.", + "bootstrap": [ + { + "cutoff_log2": "10771261563667", + "gap": "114260989736356947327697669006171977445634861037303644032599946463917431079809/62500000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "5726584986749628443", + "gap": "39176300406575945195810607812444446707311611735413675123889579768974862575012819998283046228934952661747086629864127/15625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "3044562182120388518369251", + "gap": "13432252924533585208247928483896891822215904583765205366456615004223923972800005620395915932771112886179715744191330975841568666532373040317333507727476481/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "1618653857795776509605324228181", + "gap": "4605473634727277885099896383062386619421157355501013228302208169789180835447262943078605920209817408437683905201954415563552532599460384220646452114541878297085168199070565579528913740563111743/976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "860563902009851566130221515682178170", + "gap": "1579064027407344477536557817777860888945134224038025964916330620309742322845404353104802148464641079972302848676283762080212621108690393875901708744042965622120626709796524627344614799694372503007152211462025646705633096662481472129/244140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "cutoff_log2": "457522295996565195596976439065977442685980", + "gap": "541408636855556955063219085392507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "canonical_word_sha256": "bae9701c7fde304860cc89d72d1bcb503f392b25cff04401202e833301e2ef18", + "complex_lower": "342866804295765301697/250000000000000000000000", + "external_row_allowance": 20161, + "global_prefix_bits": 205, + "global_profile": { + "1": 171856, + "16": 1, + "2": 19008, + "3": 41592, + "4": 6048, + "48": 408, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224 + }, + "kappa": "68479443547277/50000000000000000", + "kappa_decimal": "0.001369588870945540", + "live": 7680, + "local_program_sha256": "39af027100077ecdf4dea36c937faa813b195e5be4554f09b4f35f1ca230d518", + "next_b_rejected": "1371467217183061206789/1000000000000000000000000", + "outer_controls": [ + "next_grid", + "zero_eta", + "zero_beta", + "unit_beta" + ], + "physical": 8258, + "source_manifest_sha256": "5803b204360b144ff8e111abae713e27cae320d89cce1b6ef72410c9752bcb35", + "status": "PASS_FRESH_RETIMED_ASYNCHRONOUS_WHOLE_OWNER", + "strict_outer_constraints": { + "Gaussian_arithmetic_above_kappa": "9740907193452233132026546316939019357784378101068809219772846736742960417019129469196756916510399147705912560964758782292859399371354172387966249425225875806875131511215897923552260550683356061614356130677587285215818492471104842953509255983751331016207784263688028247138309374949927266662951247612569295149/9779018234542803331970724211349700891097324522966583671327826080168205428907886098865572380266672276277704512610801469438654725227367036393359317128700215274940856819622997186012397251196791046103364271062285609929940241261325573384507166287473876666736207571882429587136532598804082062235119327709957791067840000000000000000", + "K_dominates_log": "41853857946260419996053833771554864641231442552758688220317366255067992437687558429271722996206804412912913575403728627969414426767396733451849691666184004942311534133693472098563848668105812784271937079670511958049906871999885795521640706713447756965754013776727876251015709130163984683083527830861652602252100906381902913/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "K_geometry": "22930037451696260420037907691717815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "alpha_below_one": "61035156249999999969524275732946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "alpha_below_one_fourth": "15196008275580609350911505992244537485389804459061954325329954383482111024893740412093271432837117763903173785470218975374132577405471608901924217294739729627962599685205373424757065446336908177679221389385508222526418466157178905791185911969108619951258921655156975893848152105238457793074542522622329298854247899093618097087/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "alpha_positive": "83707715892520855292750587989370156949765108073332661119773866780709957774831617384185411329557667780739515484158320623765430762289385462699715718854356739132489095455559678387305258658077831857285284149313042989113160813642302622106535355069312340516402675909320336052680080392920429167831426924479749689252100906381902913/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "artificial_boundary": "1711663021908560666729963763218778959456690444074720180119602633436452807700275589274691401949345887432405643587160346477834424851199671054659251474746609021175914962006163955405049982923323807839539078442427038043207088293474042269994623019319702583826996198321553511177958465747214189826428858655779827547022243697280854291261/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "balanced_prefix_above_kappa": "2476998998443982064766913898286341002300032176237956877242615318257513876576024731404334320965167081309293418960392140733127906662259151583408722286041173492767682347418792369501563880106461010223274812514299342409692366134286457237316599205222266239518424061892897927984162851437887274306234504286139517901/1527971599147313020620425658023390764233956956713528698644972825026282098266857202947745684416667543168391330095437729599789800816776099436462393301359408636709508878066093310314437070499498600953650667353482126551553162697082120841329244732417793229177532433106629622990083218563137822224237394954680904854350000000000000000", + "beta_below_one": "999999999999999999/1000000000000000000", + "beta_positive": "1/1000000000000000000", + "bit_positive": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bulk_exposure_above_kappa": "114645156098705843816752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_below_one": "30475724267053739579962092308282184715320860865729426027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_positive": "41853857946260420037907691717815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cell_above_band": "61035156249999999908405411767053739587591486839532184715320860865729426027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/122237727931785041649634052641871261138716556537082295891597826002102567861348576235819654753333403453471306407635018367983184065342087954916991464108752690936760710245287464825154965639959888076292053388278570124124253015766569667306339578593423458334202594648530369839206657485051025777938991596374472388348000000000000000000", + "compact_leaf": "354442551898424302516051295416926027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_phase_layer_above_kappa": "18980547985933380882929764805259004761321504390488563571952849864624635566183350569131772730969990762818041777299088222666762116909661042938926579693635297121163469387053981183742536192139248185392482903216344317162784068744086727919747089456089460206817832575725366099881592657494989041639942186629172260933/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "compact_reservations": "1/4000000000000000000", + "complex_above_bit": "625177387904327780672838226017507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "complex_below_one_over32": "7469633195704234698303/250000000000000000000000", + "coordinate_movement_above_kappa": "114645156098705843816752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "delta_below_one_eighth": "999999999999999999/8000000000000000000", + "delta_positive": "1/8000000000000000000", + "dimension_above_kappa": "1523786213352686978804815527920591300532956941572812303655059351211674778975758115309768192159357188235942990869729351709503618143616041296665513360899742946699213407975080182453245276919293768547913212752978883671721649817217221568363121401868664008139066772115636616528340843329760105759925456483206369451884504286139517901/1527971599147313020620425658023390764233956956713528698644972825026282098266857202947745684416667543168391330095437729599789800816776099436462393301359408636709508878066093310314437070499498600953650667353482126551553162697082120841329244732417793229177532433106629622990083218563137822224237394954680904854350000000000000000", + "epsilon_below_one": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "epsilon_positive": "30517578124999999969482421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "gamma_sublinear": "1/2000000000000000000", + "guard_width": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "lambda_above_internal": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_sigma": "708885103796848605657279978738179834873925224966223684872475333073903923752537057321982020354266657388025211854998521309146724326664674608408825585061962272620523472787712919672503071416084815428906329088169859266769376762912823019607245498272190286712459578284052604058752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_tau": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_prime_above_lambda": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_prime_below_one": "41853857946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "leaf_saving_above_bit": "541469672011806955063219085392507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "literal_scalar_guard": "1", + "phase_boundary": "66966172714016678122314073802244043078109454365103071959991266570453171639973993802219935996217322433608874720656483825447024228080589971000569307979087645456418070926813195871808694662089024228079945321456030576687859236985335891472577495726966507096143211056283352132014331887817851373932267287032510854452100906381902913/48895091172714016659853621056748504455486622614832918356639130400841027144539430494327861901333361381388522563054007347193273626136835181966796585643501076374704284098114985930061986255983955230516821355311428049649701206306627866922535831437369383333681037859412147935682662994020410311175596638549788955339200000000000000000", + "phase_local": "334830863570083512849298300796261865024599913696776498516512869934561749797695971113667541329662847987699126936685872598541528775421317838186911881983393144273554463386756916119753718597909946295365366567168229175492684463496803581615903245204499841820294648704875094862666307969459096076318821486188332211252100906381902913/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "prime_interval_packing": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "q_below_internal": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_leaf": "354442551898424302516051295416926027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_reservations": "1/4000000000000000000", + "q_positive": "41853857946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "record_suffix": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "row_product_gap": "23971789/25", + "scalar_work_above_kappa": "365760407768090869950297710565346745083326009063802526385918994420676578286826812965738577666093382146119120431753987925304669049625942264616147699739399586108638998025684912913961479407043789616650956655218252254519715327544190741144070978187206733739397201240731076017664391858799207444512772786688704767073/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "short_record_fallback": "1860087088980691749515962045411391569220114847167535207176248690649676507265380825804070862892908205272608648051923512574623062491544518391213412474182057911290098440675138295661834404433043338390084357501690454170481232063362840158529852266892690313026750408281407921884346643449396150217101111261046357415683170175801323439052834291021040208319174003106260523193085931811488237607626194482108458821221933536435893769014573574584481865550916355845712399156312010268113536192329657347931644768001143360835419821022332270013057219576443738176668132478025076811609623063025788950151388528190957885569/1865199705990372339624543039579334428996529488175694212213101593049660764485909671567072368672689872031727697870407384765368409200166137007400382447948496870983287204670524060442428064574583253117249349796731111513126419307961573292638238198752189000460855020882116239001566428910080349394821038763038213933532714843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "small_field_exposure": "1/1000000000000000000" + } +} diff --git a/research/retimed-asynchronous-validation/SOURCE-BYTE-AUDIT.json b/research/retimed-asynchronous-validation/SOURCE-BYTE-AUDIT.json new file mode 100644 index 0000000000..623207f8ca --- /dev/null +++ b/research/retimed-asynchronous-validation/SOURCE-BYTE-AUDIT.json @@ -0,0 +1,602 @@ +{ + "status": "PASS", + "manifest_sha256": "5803b204360b144ff8e111abae713e27cae320d89cce1b6ef72410c9752bcb35", + "manifest_files": 109, + "git_verified_source_files": 99, + "sources": [ + { + "local_path": "code/build_retimed.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/code/build_retimed.py", + "sha256": "5177c0f1200d30fb532e58964d67d3cb08f7b9854ea97107f776f1883e36de97" + }, + { + "local_path": "code/guarded_lemma.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/code/guarded_lemma.py", + "sha256": "e572010d33bbb39f4756c785270b5fc9cb82ee6ee4d4cd75d0a1ca49d773a587" + }, + { + "local_path": "code/lg_mutants_retimed.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/code/lg_mutants_retimed.py", + "sha256": "8f3c5a0fd63a19c70bc2c9026544ec58139b99ade5f1bafd296ccce480d97a4d" + }, + { + "local_path": "data/PR495-FULL-WORD.json.gz", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/data/PR495-FULL-WORD.json.gz", + "sha256": "66655cd858afb515dfd4cad43c4fef01f9185af670e144750e9977588ebd4ecf" + }, + { + "local_path": "data/PR502-EXPECTED.json", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/EXPECTED.json", + "sha256": "97056026d52482a79a26efdb49d7cf6f44adff837eaa6b7b836e09d8baf76166" + }, + { + "local_path": "data/PR502-RESULT.json", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled-validation/RESULT.json", + "sha256": "4a951fc558757d045f8296b4014e4be71553ac7514a4d996d4bf0232ebefec5f" + }, + { + "local_path": "references/PR502-PROOF.md", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/PROOF.md", + "sha256": "23370c65953ed2c6fde92c6a5fbcad6a3d106213a8047ad4e40271b4152fd503" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/NOTICE.md", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/NOTICE.md", + "sha256": "7c7a022afe969a09ad5320935daf7db256b8f25ee56ecdcf9fc40eb0836e74ce" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "sha256": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py", + "sha256": "e377ef9d9e90168290a4640250c0fb9c05015104bcc4827bc5ce63f6ca63763a" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "sha256": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/audit_hosted_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/audit_hosted_gk.py", + "sha256": "c46c69c1c6fdccce991bf5d5ec7def344d2749c53ad2db976a50ba3a6c37d657" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py", + "sha256": "cf83aa95f03aa812c413905df9f75f13ac8f92f5db6a83cf9b1868aea2dd9de0" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py", + "sha256": "573966c7ad1deac24464414d3886171f594bb3ae3e7236a9ac2447cc40b20211" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py", + "sha256": "cc6fb8bf4644cc3a1799f3bc90dc074adb5663d1889c92f7f73ec9f307acbd36" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py", + "sha256": "d2777571d59736c3fe62b81506ae62c22a3816fbc3abf9303d914e6da6d64258" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "sha256": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "sha256": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py", + "sha256": "8d2c29a5f79e6a1391f96baf44dd9fbe35203b6c11b02a7b2d238cf792ea163f" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "sha256": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py", + "sha256": "f572b7129a546e1b1193fdd5baee4f731a5b9b8a4e8dc7ac170bcad7758e5b9a" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py", + "sha256": "64cdb2cfefc9ec3ed80c277a18848778427c3d3dbda9b7be13f740522478e1de" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py", + "sha256": "8fe3719e8ec5ec49af480b40c15f07612a356f5071ea30e17ae2d8931b3f20ce" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py", + "sha256": "47dcf2e9ae2d99699424d684abebc3d1d2d25b7aa6d440761e19835d140f5fbb" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py", + "sha256": "00068882bf2f2ebadd3f87c94204f226c7938966124bafb9ce6da89bfaf91b45" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py", + "sha256": "cf0d1f8e90a0780244b6de38d6aad08dd42f4c439397a6d5a61fccd23fe7e798" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py", + "sha256": "0ca37829b596d83d0b94c5f0b6b278a100f22e626b2ab3b5210a38f9657c8a27" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py", + "sha256": "5f053e553b1c26e553a844e2891a73b6cc6b79404a7bb5d4722529f7db0d592c" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/make_meta.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/make_meta.py", + "sha256": "06e44ae4fc4f3a88989828d6cbdf95524a2d9f65753045cbb3e6cfd7e042d96a" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "sha256": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "sha256": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/code/run_variant.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/run_variant.py", + "sha256": "feecf7dff32860a02fbfb96da1049ba35d05b3baf74c4f741b878d4d91903903" + }, + { + "local_path": "vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "sha256": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb" + }, + { + "local_path": "vendor/complex/split-centres-global/vendor/clifford_exact.py", + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/split-centres-global/vendor/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + { + "local_path": "vendor/pr505/ADVERSARIAL-REVIEW.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/ADVERSARIAL-REVIEW.md", + "sha256": "6c8f69452df88c2082568d83ff3692176d391fd1e1db6533d071049ec873163c" + }, + { + "local_path": "vendor/pr505/EXPECTED.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/EXPECTED.json", + "sha256": "10d4b326f1d1836995a2722e0901c0f62ceb98b345b51095d84765df3776b6c2" + }, + { + "local_path": "vendor/pr505/LICENSE", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/LICENSE", + "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" + }, + { + "local_path": "vendor/pr505/MANIFEST.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/MANIFEST.json", + "sha256": "8395a05166d83a27ee9dfa4b16a2e63b93668eedf178edd587270c3ffcc6fa97" + }, + { + "local_path": "vendor/pr505/NOTICE.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/NOTICE.md", + "sha256": "b4bf5b4520f22256c18e6378a51cd8270335aed268a84b42d9284273a51eedc3" + }, + { + "local_path": "vendor/pr505/PROOF.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/PROOF.md", + "sha256": "1fd10bedaf12f5221c1f22f4e508279ca1a16af7d0733dfdaac6a2a02a8a668a" + }, + { + "local_path": "vendor/pr505/README.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/README.md", + "sha256": "e7d793bbc8fa7355f7ab6f4c001965eff3b22ea0e3c029191ec92ee801f9607c" + }, + { + "local_path": "vendor/pr505/RESEARCH.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/RESEARCH.md", + "sha256": "00287d17523ce726545bb10171afcb77b0d0cf3bfd8fd835e21b38bad57b0be7" + }, + { + "local_path": "vendor/pr505/SCHEDULING-LEMMA.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SCHEDULING-LEMMA.md", + "sha256": "73effa4a41524fb800e0213bd61f470a0cc61f4110af13dcf4037daf24300511" + }, + { + "local_path": "vendor/pr505/SNAPSHOT.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SNAPSHOT.md", + "sha256": "8f09e56f76399e3b749f7a284be09a6fbfd1ec2cfaf39c8769a7e99ca69fec7d" + }, + { + "local_path": "vendor/pr505/SOURCE-FILES.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SOURCE-FILES.json", + "sha256": "5e174966d33cc1bee5d3421c553954dd5ee764630eb3e2e4395fe04ef2595136" + }, + { + "local_path": "vendor/pr505/SOURCES.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SOURCES.json", + "sha256": "f344c729873c4aac9e5081acfa2f7043334eba1d5af9e5914a3acdfea42f99f1" + }, + { + "local_path": "vendor/pr505/code/assemble.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/assemble.py", + "sha256": "9db68cad2738d76052b25c8bdf6485edd6f14025bf47107d2425b10a2bdf69e0" + }, + { + "local_path": "vendor/pr505/code/audit_async.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/audit_async.py", + "sha256": "d01ad6a70c4d3132bcd631f175d23bbee44fecc15f2a80a0f14d0d1d2b0a7206" + }, + { + "local_path": "vendor/pr505/code/audit_async_invoice.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/audit_async_invoice.py", + "sha256": "6a6e4ea681b34db6d0642e1fddc76d9ffd0cdbaf32119f33ca1232db78a148d2" + }, + { + "local_path": "vendor/pr505/code/emit_async.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/emit_async.py", + "sha256": "3dca3efbce0e1b775801d072e64995472749553f6f7f3250bb6a898cfe117fbc" + }, + { + "local_path": "vendor/pr505/evidence/ASYNC-AUDIT.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/ASYNC-AUDIT.json", + "sha256": "e3f3c8dd3d9ead17031574f86fe7c7887f5f08ead36877b0baa93def9db58431" + }, + { + "local_path": "vendor/pr505/evidence/EXACT-ASSEMBLY.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/EXACT-ASSEMBLY.json", + "sha256": "b50c77f8089f9697844dbfb3ad2fb6d954e2bb71bfd544fa970da35cf21b25d0" + }, + { + "local_path": "vendor/pr505/evidence/GLOBAL-PREFIX.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/GLOBAL-PREFIX.json", + "sha256": "098cdaa38a9bca8a4aca4aa5be03d6a36e40fe2f81948ab901a23d7cf65922de" + }, + { + "local_path": "vendor/pr505/evidence/OWNERS-AND-PROFILE.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/OWNERS-AND-PROFILE.json", + "sha256": "c091ef330ae4566838b3a6c214d57847ce7c9962d5fc161f4ad155cd6bc69b21" + }, + { + "local_path": "vendor/pr505/evidence/PREFIX-AND-INVOICE.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/PREFIX-AND-INVOICE.json", + "sha256": "3d38891f6db3fd70728f1bcba7d1f1356250903a15f3916ca91ae1ad98a24c73" + }, + { + "local_path": "vendor/pr505/evidence/RESULT.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/RESULT.json", + "sha256": "a8459c77267a3d0c0aba8e1ff31144b32442f6ead3635697a578140f7ccb1720" + }, + { + "local_path": "vendor/pr505/evidence/STEPS.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/STEPS.json", + "sha256": "8d73f35dff32e272525d584b62a984dda8faa5c4dbebcc58016b40cbced905b6" + }, + { + "local_path": "vendor/pr505/inputs/ASYNC-3.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/ASYNC-3.json", + "sha256": "8d16c05f4b3239fb5f9ec93958c9436c0cc0c76f6d4899a12bce5b84007d0893" + }, + { + "local_path": "vendor/pr505/inputs/ASYNC-OWNERS.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/ASYNC-OWNERS.json.gz", + "sha256": "52cb8c2b5869b429e3fe3b7a8b061792f020f6fad9f402dc4e4656110b9af068" + }, + { + "local_path": "vendor/pr505/inputs/BASE-WORD.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/BASE-WORD.json.gz", + "sha256": "da4c5007092fd9456403179ef2a4391aef9fc5310e3eec5f2ab6c49b24147387" + }, + { + "local_path": "vendor/pr505/inputs/PR493-EXPECTED.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/PR493-EXPECTED.json", + "sha256": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb" + }, + { + "local_path": "vendor/pr505/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz", + "sha256": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9" + }, + { + "local_path": "vendor/pr505/inputs/work/complex-network/hamming/PROTOTYPE.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-network/hamming/PROTOTYPE.json", + "sha256": "b155f101a2b7ec8cfc4e7b6e7147b2d51f0dc31d3ea3499bdfa79d399a76be47" + }, + { + "local_path": "vendor/pr505/inputs/work/complex-nine-native/DATA-PHASES.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-nine-native/DATA-PHASES.json", + "sha256": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a" + }, + { + "local_path": "vendor/pr505/inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz", + "sha256": "1b84904a31a733aab9bfdda3f528c06719f590d2133a43687a8bded955dc991e" + }, + { + "local_path": "vendor/pr505/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz", + "sha256": "77b0c0fa19ef3da1c7316010e13493aa5eea1a50c3506eddc08f7480e659878b" + }, + { + "local_path": "vendor/pr505/inputs/work/odd-stages/clifford_exact.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/odd-stages/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + { + "local_path": "vendor/pr505/inputs/work/pr361/code/engines/base_two_moment.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr361/code/engines/base_two_moment.py", + "sha256": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098" + }, + { + "local_path": "vendor/pr505/inputs/work/pr361/code/engines/moment.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr361/code/engines/moment.py", + "sha256": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482" + }, + { + "local_path": "vendor/pr505/inputs/work/pr361/code/engines/outer.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr361/code/engines/outer.py", + "sha256": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c" + }, + { + "local_path": "vendor/pr505/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz", + "sha256": "1fb726ea3818fe0837cceb0dd22a71a0814f064e5e781628104610d6468e0e55" + }, + { + "local_path": "vendor/pr505/references/PR493-NOTICE.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/references/PR493-NOTICE.md", + "sha256": "08415e4ce4b9f81afdb4ee9b9ca01a055b81dec36dbc1fbc5ecafcdc8bfe94ed" + }, + { + "local_path": "vendor/pr505/references/PR496-PROOF.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/references/PR496-PROOF.md", + "sha256": "144f1bf6952b3e31e99cf372a2cae9a13f96c9988808fe8a57ec70b09ee2007c" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/APPENDIX-MANIFEST.json", + "sha256": "19565a7d405d86d6432f44221f040702d38822b351b52969f308567112ef9424" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/APPENDIX-SOURCES.json", + "sha256": "2ed72f0c9d97317ac7627614601a3fb41633bf5536d70ec6b24733a63dccfb37" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/BASE-WORD.json.gz", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/BASE-WORD.json.gz", + "sha256": "8b91151043fd61afe379314e4fb1e647cf9cd3cfe98462920d3faba5b1f268f2" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/COMPONENT-SELECTION.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/COMPONENT-SELECTION.json", + "sha256": "b682f7cff6de4f40bdadfc64a9ecb9b03a8d77dbf29be3748fa9d742dc894071" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/JOINT-47-SELECTION.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/JOINT-47-SELECTION.json", + "sha256": "89ca715918bfbb04fad2eaee8a95a40324859cd0955512eb13077502e7d950e3" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/JOINT-51-SELECTION.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/JOINT-51-SELECTION.json", + "sha256": "7094bb647cc9951a5385660a9ec5f012a427fd118baacaf3d5e9f28cb436acc7" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json", + "sha256": "68a6adf3bcfbe8e8e4ffb7b4a672da5649c85f84c42813940e6dbb3cf20c2b99" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/REBUILD.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/REBUILD.json", + "sha256": "e18727e4191e18838382948ced1c7506d74b3d43caa3853ce751684eef52d8d6" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/RESEARCH-APPENDIX.md", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/RESEARCH-APPENDIX.md", + "sha256": "24ec2b2ff1174fcec7342307cff723e01c90513415f348665c43d0220ba04e3a" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/audit_component_scalar.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/audit_component_scalar.py", + "sha256": "feab9aa6dbcd8f9fffa6dbdb981d15ffc850402ae91cf45f946ff069cac54037" + }, + { + "local_path": "vendor/pr505/research-notes/kernel/rebuild_candidate.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/rebuild_candidate.py", + "sha256": "f8063d539f772fb63712bed787a1c472da28c9baf38b88e3ae14806632d4afb7" + }, + { + "local_path": "vendor/pr505/vendor/audit_scalar_invoice.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/audit_scalar_invoice.py", + "sha256": "652eed65fe8f72ab486dcdbe761f401f8a2d43530f2fb0c5c7777be488cd4648" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "sha256": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "sha256": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "sha256": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "sha256": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "sha256": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "sha256": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "sha256": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3" + }, + { + "local_path": "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "sha256": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb" + }, + { + "local_path": "vendor/pr505/vendor/complex/split-centres-global/code/complex_phases_full.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/split-centres-global/code/complex_phases_full.py", + "sha256": "0f2795aaffafe0c64d77f3748ef2109a3c42c58da867e4cf269a0a8cb6109466" + }, + { + "local_path": "vendor/pr505/vendor/complex/split-centres-global/vendor/clifford_exact.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/split-centres-global/vendor/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + { + "local_path": "vendor/pr505/verify.py", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/verify.py", + "sha256": "5f36c115ba65135b95117229cba7ca78ad2bc47032036d88d8ee25bbcde1a084" + }, + { + "local_path": "vendor/pr505/verify.sh", + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/verify.sh", + "sha256": "2b1b51f757d8ddf81941c8c96007a2256336856c2e017bcf6c3a37576c82bc8b" + } + ] +} diff --git a/research/retimed-asynchronous-validation/admission/ASYNC-AUDIT.json b/research/retimed-asynchronous-validation/admission/ASYNC-AUDIT.json new file mode 100644 index 0000000000..36c80d7545 --- /dev/null +++ b/research/retimed-asynchronous-validation/admission/ASYNC-AUDIT.json @@ -0,0 +1,59 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_WHOLE_OWNER_CONTROLLER_PHASES_AND_SPECTATORS", + "template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "complex_template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "complex_live": 7680, + "complex_profile": { + "1": 171856, + "2": 19008, + "3": 41592, + "4": 6048, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224, + "16": 1, + "48": 408 + }, + "complex_hosted_residuals": 40320, + "physical": 8258, + "rank_mass": 558144, + "deficit": 2496, + "entering_helper_roles": 8784, + "cross_replica_helper_roles": 33114, + "one_owner_per_complete_invocation": true, + "helper_busy_family_window_checks": 40320, + "complete_invocations": 72, + "actual_orthogonal_73column_maps": 3194, + "actual_sigma_stream_sha256": "f2e2f8346abac2d6eb8f51877644f271791cf0385823f2c0be72628063a2c1ee", + "all_actual_residual_and_spectator_charts": true, + "idle_remainders": 9615, + "mutations_rejected": [ + "wrong call time", + "alias two whole owners", + "helper on active data family", + "owner in private namespace", + "unbound change of owner replica", + "omit complete invocation", + "reorder invocation replicas", + "interleave local invocations", + "change local instruction stream", + "wrong residual width", + "wrong spectator coordinate", + "omit spectator route", + "overlap residual footprint", + "omit idle remainder", + "underpay idle remainder", + "omit bridge touch", + "remove one-owner rule", + "duplicate frozen role", + "understate physical reserve" + ], + "widths": { + "5": 4, + "7": 14, + "8": 104, + "9": 438 + }, + "scope": "Independent exact asynchronous chronology, per-replica phase projection, owner/chart/paid-profile audit. Uses unchanged source local program and normalized residual-wrapper identities; all-size compilation and complete coefficient invoice are separate inherited obligations." +} diff --git a/research/retimed-asynchronous-validation/admission/EXACT-ASSEMBLY.json b/research/retimed-asynchronous-validation/admission/EXACT-ASSEMBLY.json new file mode 100644 index 0000000000..2c1673e780 --- /dev/null +++ b/research/retimed-asynchronous-validation/admission/EXACT-ASSEMBLY.json @@ -0,0 +1,127 @@ +{ + "status": "PASS_ASYNC_COMPLEX_AND_CITED_BIT_EXACT_ASSEMBLY", + "complex_lower": "342866804295765301697/250000000000000000000000", + "complex_decimal": "0.001371467217183061206788", + "next_b_rejected": "1371467217183061206789/1000000000000000000000000", + "exact_moment_receipts": [ + { + "endpoint": "342866804295765301697/250000000000000000000000", + "mercator": [ + "-5556101797119264649454153410231455384193887/13479973333575319897333507543509815336818572211270286240551805124608", + "-2778050898559632324727076705115727692096943/6739986666787659948666753771754907668409286105635143120275902562304" + ], + "base_two": [ + "-16100594536113315581/39062500000000000000000000000000000000000000", + "-4121742201245008788621/10000000000000000000000000000000000000000000000" + ], + "accept": true + }, + { + "endpoint": "1371467217183061206789/1000000000000000000000000", + "mercator": [ + "76614887197383941681257654853192027770616233/26959946667150639794667015087019630673637144422540572481103610249216", + "76614887197383941681257654853192027770616235/26959946667150639794667015087019630673637144422540572481103610249216" + ], + "base_two": [ + "28418037799111933235749/10000000000000000000000000000000000000000000000", + "3552255974888991654483/1250000000000000000000000000000000000000000000" + ], + "accept": false + } + ], + "bit_lower": "391360506745414227149/250000000000000000000000", + "bit_result_sha256": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb", + "bit_template_sha256": "e37b52e4861c39154b5891460fb45df8651c92cd68961078f8f06596f057c822", + "bit_prefix_bits": 2176, + "bit_charged_three_level_coefficient_bits": 6464, + "external_row_allowance": 20161, + "kappa": "68479443547277/50000000000000000", + "kappa_decimal": "0.001369588870945540", + "binding_component": "complex", + "strict_outer_constraints": { + "bit_positive": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "complex_above_bit": "625177387904327780672838226017507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "complex_below_one_over32": "7469633195704234698303/250000000000000000000000", + "beta_positive": "1/1000000000000000000", + "beta_below_one": "999999999999999999/1000000000000000000", + "leaf_saving_above_bit": "541469672011806955063219085392507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_positive": "41853857946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_internal": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_leaf": "354442551898424302516051295416926027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_positive": "41853857946260420037907691717815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_below_one": "30475724267053739579962092308282184715320860865729426027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_reservations": "1/4000000000000000000", + "lambda_above_tau": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_sigma": "708885103796848605657279978738179834873925224966223684872475333073903923752537057321982020354266657388025211854998521309146724326664674608408825585061962272620523472787712919672503071416084815428906329088169859266769376762912823019607245498272190286712459578284052604058752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_internal": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_prime_above_lambda": "83707715892520824984441752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_leaf": "354442551898424302516051295416926027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_reservations": "1/4000000000000000000", + "lambda_prime_below_one": "41853857946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "epsilon_positive": "30517578124999999969482421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "epsilon_below_one": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "guard_width": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "K_geometry": "22930037451696260420037907691717815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "K_dominates_log": "41853857946260419996053833771554864641231442552758688220317366255067992437687558429271722996206804412912913575403728627969414426767396733451849691666184004942311534133693472098563848668105812784271937079670511958049906871999885795521640706713447756965754013776727876251015709130163984683083527830861652602252100906381902913/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "record_suffix": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "phase_local": "334830863570083512849298300796261865024599913696776498516512869934561749797695971113667541329662847987699126936685872598541528775421317838186911881983393144273554463386756916119753718597909946295365366567168229175492684463496803581615903245204499841820294648704875094862666307969459096076318821486188332211252100906381902913/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "phase_boundary": "66966172714016678122314073802244043078109454365103071959991266570453171639973993802219935996217322433608874720656483825447024228080589971000569307979087645456418070926813195871808694662089024228079945321456030576687859236985335891472577495726966507096143211056283352132014331887817851373932267287032510854452100906381902913/48895091172714016659853621056748504455486622614832918356639130400841027144539430494327861901333361381388522563054007347193273626136835181966796585643501076374704284098114985930061986255983955230516821355311428049649701206306627866922535831437369383333681037859412147935682662994020410311175596638549788955339200000000000000000", + "gamma_sublinear": "1/2000000000000000000", + "cell_above_band": "61035156249999999908405411767053739587591486839532184715320860865729426027100543499474358034662855941045086311666649136632173398091245408004203983664478011270752133972811827265809822438678133793711258590010027980926986652930357468968936746058357583173415105351644135416449351337867407540198335628737243555515252100906381902913/122237727931785041649634052641871261138716556537082295891597826002102567861348576235819654753333403453471306407635018367983184065342087954916991464108752690936760710245287464825154965639959888076292053388278570124124253015766569667306339578593423458334202594648530369839206657485051025777938991596374472388348000000000000000000", + "prime_interval_packing": "41853857946260442926091285467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087", + "alpha_positive": "83707715892520855292750587989370156949765108073332661119773866780709957774831617384185411329557667780739515484158320623765430762289385462699715718854356739132489095455559678387305258658077831857285284149313042989113160813642302622106535355069312340516402675909320336052680080392920429167831426924479749689252100906381902913/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "alpha_below_one": "61035156249999999969524275732946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "alpha_below_one_fourth": "15196008275580609350911505992244537485389804459061954325329954383482111024893740412093271432837117763903173785470218975374132577405471608901924217294739729627962599685205373424757065446336908177679221389385508222526418466157178905791185911969108619951258921655156975893848152105238457793074542522622329298854247899093618097087/61118863965892520824817026320935630569358278268541147945798913001051283930674288117909827376666701726735653203817509183991592032671043977458495732054376345468380355122643732412577482819979944038146026694139285062062126507883284833653169789296711729167101297324265184919603328742525512888969495798187236194174000000000000000000", + "delta_positive": "1/8000000000000000000", + "delta_below_one_eighth": "999999999999999999/8000000000000000000", + "short_record_fallback": "1860087088980691749515962045411391569220114847167535207176248690649676507265380825804070862892908205272608648051923512574623062491544518391213412474182057911290098440675138295661834404433043338390084357501690454170481232063362840158529852266892690313026750408281407921884346643449396150217101111261046357415683170175801323439052834291021040208319174003106260523193085931811488237607626194482108458821221933536435893769014573574584481865550916355845712399156312010268113536192329657347931644768001143360835419821022332270013057219576443738176668132478025076811609623063025788950151388528190957885569/1865199705990372339624543039579334428996529488175694212213101593049660764485909671567072368672689872031727697870407384765368409200166137007400382447948496870983287204670524060442428064574583253117249349796731111513126419307961573292638238198752189000460855020882116239001566428910080349394821038763038213933532714843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "small_field_exposure": "1/1000000000000000000", + "artificial_boundary": "1711663021908560666729963763218778959456690444074720180119602633436452807700275589274691401949345887432405643587160346477834424851199671054659251474746609021175914962006163955405049982923323807839539078442427038043207088293474042269994623019319702583826996198321553511177958465747214189826428858655779827547022243697280854291261/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "literal_scalar_guard": "1", + "row_product_gap": "23971789/25", + "balanced_prefix_above_kappa": "2476998998443982064766913898286341002300032176237956877242615318257513876576024731404334320965167081309293418960392140733127906662259151583408722286041173492767682347418792369501563880106461010223274812514299342409692366134286457237316599205222266239518424061892897927984162851437887274306234504286139517901/1527971599147313020620425658023390764233956956713528698644972825026282098266857202947745684416667543168391330095437729599789800816776099436462393301359408636709508878066093310314437070499498600953650667353482126551553162697082120841329244732417793229177532433106629622990083218563137822224237394954680904854350000000000000000", + "coordinate_movement_above_kappa": "114645156098705843816752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_phase_layer_above_kappa": "18980547985933380882929764805259004761321504390488563571952849864624635566183350569131772730969990762818041777299088222666762116909661042938926579693635297121163469387053981183742536192139248185392482903216344317162784068744086727919747089456089460206817832575725366099881592657494989041639942186629172260933/30559431982946260412408513160467815284679139134270573972899456500525641965337144058954913688333350863367826601908754591995796016335521988729247866027188172734190177561321866206288741409989972019073013347069642531031063253941642416826584894648355864583550648662132592459801664371262756444484747899093618097087000000000000000000", + "bulk_exposure_above_kappa": "114645156098705843816752720672219327161773982492384453236549016268699580761215942364775828224158620382755473957501232357543618958979923210819292294305314801993707232343042181470234444630122508967163028545307080060833940375447813291457177462624793684211679190434506971752100906381902913/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Gaussian_arithmetic_above_kappa": "9740907193452233132026546316939019357784378101068809219772846736742960417019129469196756916510399147705912560964758782292859399371354172387966249425225875806875131511215897923552260550683356061614356130677587285215818492471104842953509255983751331016207784263688028247138309374949927266662951247612569295149/9779018234542803331970724211349700891097324522966583671327826080168205428907886098865572380266672276277704512610801469438654725227367036393359317128700215274940856819622997186012397251196791046103364271062285609929940241261325573384507166287473876666736207571882429587136532598804082062235119327709957791067840000000000000000", + "scalar_work_above_kappa": "365760407768090869950297710565346745083326009063802526385918994420676578286826812965738577666093382146119120431753987925304669049625942264616147699739399586108638998025684912913961479407043789616650956655218252254519715327544190741144070978187206733739397201240731076017664391858799207444512772786688704767073/244475455863570083299268105283742522277433113074164591783195652004205135722697152471639309506666806906942612815270036735966368130684175909833982928217505381873521420490574929650309931279919776152584106776557140248248506031533139334612679157186846916668405189297060739678413314970102051555877983192748944776696000000000000000000", + "dimension_above_kappa": "1523786213352686978804815527920591300532956941572812303655059351211674778975758115309768192159357188235942990869729351709503618143616041296665513360899742946699213407975080182453245276919293768547913212752978883671721649817217221568363121401868664008139066772115636616528340843329760105759925456483206369451884504286139517901/1527971599147313020620425658023390764233956956713528698644972825026282098266857202947745684416667543168391330095437729599789800816776099436462393301359408636709508878066093310314437070499498600953650667353482126551553162697082120841329244732417793229177532433106629622990083218563137822224237394954680904854350000000000000000" + }, + "outer_controls": [ + "next_grid", + "zero_eta", + "zero_beta", + "unit_beta" + ], + "bootstrap": [ + { + "gap": "114260989736356947327697669006171977445634861037303644032599946463917431079809/62500000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "10771261563667" + }, + { + "gap": "39176300406575945195810607812444446707311611735413675123889579768974862575012819998283046228934952661747086629864127/15625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "5726584986749628443" + }, + { + "gap": "13432252924533585208247928483896891822215904583765205366456615004223923972800005620395915932771112886179715744191330975841568666532373040317333507727476481/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "3044562182120388518369251" + }, + { + "gap": "4605473634727277885099896383062386619421157355501013228302208169789180835447262943078605920209817408437683905201954415563552532599460384220646452114541878297085168199070565579528913740563111743/976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "1618653857795776509605324228181" + }, + { + "gap": "1579064027407344477536557817777860888945134224038025964916330620309742322845404353104802148464641079972302848676283762080212621108690393875901708744042965622120626709796524627344614799694372503007152211462025646705633096662481472129/244140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "860563902009851566130221515682178170" + }, + { + "gap": "541408636855556955063219085392507615546763450983731300419238784057635224171775841379617244526042498767642456381041020076789180707705694685198006292767656957818529765555369877491032836971454692919939166059624552186708542822537375206315788320809565493028247899093618097087/61035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "457522295996565195596976439065977442685980" + } + ], + "complex_template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "owner_audit_sha256": "2f90bf4342e10f112403483fee87aab1f6d1f6e03250995eebf9a5524960222b", + "invoice_sha256": "d7df4b706e59905fb0f8bb8517b773334ca74564d23384211c1b684cf44630a4", + "bit_scope": "PR493 published profile and operator reused as a pinned dependency; this verifier reprices its published profile but does not reconstruct that unchanged bit operator.", + "scope": "Conditional finite witness. Inherited compiler, precision/tape and analytic-transfer contracts remain assumed; changed-host operator admission recorded separately." +} diff --git a/research/retimed-asynchronous-validation/admission/GLOBAL-PREFIX.json b/research/retimed-asynchronous-validation/admission/GLOBAL-PREFIX.json new file mode 100644 index 0000000000..5d0f1b6e8d --- /dev/null +++ b/research/retimed-asynchronous-validation/admission/GLOBAL-PREFIX.json @@ -0,0 +1,13 @@ +{ + "status": "PASS_ASYNC_GLOBAL_PREFIX", + "template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "global_prefix_bits": 205, + "retained_payload_bits": 512, + "complete_invocation_cover_sweeps": 72, + "bridge_factor_two_sweeps": 72, + "local_scalar_coefficient_work_prefix_bits": 20, + "stream_input_sup_to_l2_bits": 37, + "primitive_arithmetic_margin_bits": 4, + "controller_audit_sha256": "f9c0a25bf69d084351289829a9fce3e3d003a3581e4103a2fb7c106093bb78f7", + "proof": "Each complete normalized invocation has unitary helper endpoints and a data shear with at most two unitary summands. Distinct full orthogonal owner charts act by right-translation bijections on the retained cover group. Thus the maximum full-stream L2 norm grows by at most2per complete local cover sweep and individual bridge. All72local sweeps and72individual bridge sweeps are counted. Unit-modulus phases, idle children, terminal translations and normalized spectator endpoints are unitary. The independently replayed scalar/Horner envelope costs20bits, initial sup-to-L2 conversion37bits, primitive margin4bits: total205<512. All-size child/compiler and precision/tape interfaces remain inherited." +} diff --git a/research/retimed-asynchronous-validation/admission/PREFIX-AND-INVOICE.json b/research/retimed-asynchronous-validation/admission/PREFIX-AND-INVOICE.json new file mode 100644 index 0000000000..de63e93089 --- /dev/null +++ b/research/retimed-asynchronous-validation/admission/PREFIX-AND-INVOICE.json @@ -0,0 +1,69 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_SCALAR_PREFIX_AND_FINITE_INVOICE", + "template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "global_prefix_bits": 205, + "charged_prefix_bits": 512, + "complete_invocation_sweeps": 72, + "bridge_sweeps": 72, + "row_prefix_extra": 1024, + "local": { + "backward": { + "events": 25082, + "macros": 19708, + "real_component_primitives": 221516, + "prefix_l1": "1039266", + "prefix_bits": 20, + "coefficient_work_primitive_count": 109970, + "all_exact_columns": 800, + "all_560_dirty_helper_columns_restored": true, + "private_centres_and_coefficient_work_cleared": true + }, + "forward": { + "events": 25082, + "macros": 19708, + "real_component_primitives": 221420, + "prefix_l1": "32209", + "prefix_bits": 15, + "coefficient_work_primitive_count": 109906, + "all_exact_columns": 800, + "all_560_dirty_helper_columns_restored": true, + "private_centres_and_coefficient_work_cleared": true + } + }, + "entering_helpers": 122, + "entrance_rank": 148, + "local_adapters": 391344, + "local_primitive_bound": 10149247009100, + "wrapper_elementary_factors_charged": 2529792, + "compiler": 25934336, + "unhosted_pervertex": 1299225185815824, + "hosted_rebased_pervertex": 1299225185483184, + "conservative_pervertex_used": 1299225185815824, + "finite": { + "physical_stock_bits": 2641, + "router_bits": 7984, + "literal_bits": 35282, + "physical_row_coefficient": 16467, + "retained_row_coefficient": 20161, + "required_C0_bits": 200012, + "halving_integer_inequality": [ + 5329, + 4608 + ], + "G_exponent": 30000, + "E_exponent": 100000, + "C0_exponent": 210000 + }, + "strict_checks": { + "local_primitive_bound": true, + "logical": true, + "router": true, + "literal": true, + "mass": true, + "precision": true, + "tape": true, + "row": true, + "halving": true + }, + "scope": "Exact finite recount conditional on inherited all-size compiler/precision/tape and analytic-transfer contracts. Signed accumulation uses the supplier scalar primitive convention. Async prefix counts all72individual bridges and72complete invocations;512bits are charged, and an additional2*512 enters the two-level physical row bound." +} diff --git a/research/retimed-asynchronous-validation/all-instance-columns.log b/research/retimed-asynchronous-validation/all-instance-columns.log new file mode 100644 index 0000000000..a291589ab8 --- /dev/null +++ b/research/retimed-asynchronous-validation/all-instance-columns.log @@ -0,0 +1,5 @@ +gauge80-kernel42 I-tr 2945 failures 0 66 +gauge80-kernel42 I-comp gates 420 inputs 130 failures 0 72 +gauge80-kernel42 I-centre failures 0 83 +gauge80-kernel42 I-helper 122 failures 0 87 +PRE_OPERATION_EXACTNESS_BOUNDS {'add_calls': 1116, 'scale_calls': 884, 'primitive_calls': 102522, 'maximum_proved_numerator_bits': 14} diff --git a/research/retimed-asynchronous-validation/async-controller.log b/research/retimed-asynchronous-validation/async-controller.log new file mode 100644 index 0000000000..36c80d7545 --- /dev/null +++ b/research/retimed-asynchronous-validation/async-controller.log @@ -0,0 +1,59 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_WHOLE_OWNER_CONTROLLER_PHASES_AND_SPECTATORS", + "template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "complex_template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "complex_live": 7680, + "complex_profile": { + "1": 171856, + "2": 19008, + "3": 41592, + "4": 6048, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224, + "16": 1, + "48": 408 + }, + "complex_hosted_residuals": 40320, + "physical": 8258, + "rank_mass": 558144, + "deficit": 2496, + "entering_helper_roles": 8784, + "cross_replica_helper_roles": 33114, + "one_owner_per_complete_invocation": true, + "helper_busy_family_window_checks": 40320, + "complete_invocations": 72, + "actual_orthogonal_73column_maps": 3194, + "actual_sigma_stream_sha256": "f2e2f8346abac2d6eb8f51877644f271791cf0385823f2c0be72628063a2c1ee", + "all_actual_residual_and_spectator_charts": true, + "idle_remainders": 9615, + "mutations_rejected": [ + "wrong call time", + "alias two whole owners", + "helper on active data family", + "owner in private namespace", + "unbound change of owner replica", + "omit complete invocation", + "reorder invocation replicas", + "interleave local invocations", + "change local instruction stream", + "wrong residual width", + "wrong spectator coordinate", + "omit spectator route", + "overlap residual footprint", + "omit idle remainder", + "underpay idle remainder", + "omit bridge touch", + "remove one-owner rule", + "duplicate frozen role", + "understate physical reserve" + ], + "widths": { + "5": 4, + "7": 14, + "8": 104, + "9": 438 + }, + "scope": "Independent exact asynchronous chronology, per-replica phase projection, owner/chart/paid-profile audit. Uses unchanged source local program and normalized residual-wrapper identities; all-size compilation and complete coefficient invoice are separate inherited obligations." +} diff --git a/research/retimed-asynchronous-validation/async-emit.log b/research/retimed-asynchronous-validation/async-emit.log new file mode 100644 index 0000000000..21ec332231 --- /dev/null +++ b/research/retimed-asynchronous-validation/async-emit.log @@ -0,0 +1,47 @@ +{ + "status": "EMITTED_ASYNCHRONOUS_WHOLE_OWNER_COMPLEX_TEMPLATE", + "template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "parent_template_sha256": "1abda640b9cfa5d1e60aaa1cfcd35c72a962cbc0bb5adcc0e541e70bc81973d9", + "live": 7680, + "physical": 8258, + "global_profile": { + "1": 171856, + "2": 19008, + "3": 41592, + "4": 6048, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224, + "16": 1, + "48": 408 + }, + "rank_mass": 558144, + "deficit": 2496, + "maxchild": 48, + "hosted_residuals": 40320, + "banks_per_stage": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "entering_helper_roles": 8784, + "unique_actual_73column_sigmas": 3194, + "sigma_stream_sha256": "f2e2f8346abac2d6eb8f51877644f271791cf0385823f2c0be72628063a2c1ee", + "cross_replica_helper_roles": 33114, + "asynchronous_order_sha256": "e4748b9ffaf60576efc61160413da3a7528ef3549bc0af96cf7ed799e2de1156", + "source_artifacts": { + "split-centres/CANONICAL-WORD.json.gz": "bae9701c7fde304860cc89d72d1bcb503f392b25cff04401202e833301e2ef18", + "split-centres/LOCAL-PROGRAMS.json.gz": "39af027100077ecdf4dea36c937faa813b195e5be4554f09b4f35f1ca230d518", + "split-centres/LOCAL-CHECKS.json": "ece1b3d5ee31525844a66dab0288c1b5a74bf57d3e83157823249139dc05916b", + "split-centres/RESIDUAL-ADAPTERS.json": "546196e37830b9ccbc544834cb6f37ba4ad841faf96f025fe5155f5ba3924e07", + "work/complex-nine-native/DATA-PHASES.json": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a" + }, + "scope": "New emitted complete-invocation placement; independent controller/spectator/normalization and complete finite invoice admission required." +} diff --git a/research/retimed-asynchronous-validation/common-labels.log b/research/retimed-asynchronous-validation/common-labels.log new file mode 100644 index 0000000000..883b3837cc --- /dev/null +++ b/research/retimed-asynchronous-validation/common-labels.log @@ -0,0 +1 @@ +gauge80-kernel42 {"forward": {"n_label_violations": 0, "scalar_violations": [], "compensation_gates": 420, "kernel_updates": 111, "entering": 122, "entrance_rank": 148, "local_mass": 6884, "paid_profile": {"1": 2385, "2": 264, "3": 530, "4": 84, "5": 270, "6": 92, "7": 1, "8": 17}}, "backward": {"n_label_violations": 0, "scalar_violations": [], "compensation_gates": 0, "kernel_updates": 0, "entering": 122, "entrance_rank": 148, "local_mass": 6884, "paid_profile": {"1": 2385, "2": 264, "3": 530, "4": 84, "5": 270, "6": 92, "7": 1, "8": 17}}} {'n': 72, 'ok': True, 'orient': {'forward': 40, 'backward': 32}} 0.3 diff --git a/research/retimed-asynchronous-validation/exact-assembly.log b/research/retimed-asynchronous-validation/exact-assembly.log new file mode 100644 index 0000000000..3bbf682026 --- /dev/null +++ b/research/retimed-asynchronous-validation/exact-assembly.log @@ -0,0 +1 @@ +PASS_ASYNC_COMPLEX_AND_CITED_BIT_EXACT_ASSEMBLY b 0.001371467217183061206788 kappa 0.001369588870945540 diff --git a/research/retimed-asynchronous-validation/finite-invoice.log b/research/retimed-asynchronous-validation/finite-invoice.log new file mode 100644 index 0000000000..de63e93089 --- /dev/null +++ b/research/retimed-asynchronous-validation/finite-invoice.log @@ -0,0 +1,69 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_SCALAR_PREFIX_AND_FINITE_INVOICE", + "template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "global_prefix_bits": 205, + "charged_prefix_bits": 512, + "complete_invocation_sweeps": 72, + "bridge_sweeps": 72, + "row_prefix_extra": 1024, + "local": { + "backward": { + "events": 25082, + "macros": 19708, + "real_component_primitives": 221516, + "prefix_l1": "1039266", + "prefix_bits": 20, + "coefficient_work_primitive_count": 109970, + "all_exact_columns": 800, + "all_560_dirty_helper_columns_restored": true, + "private_centres_and_coefficient_work_cleared": true + }, + "forward": { + "events": 25082, + "macros": 19708, + "real_component_primitives": 221420, + "prefix_l1": "32209", + "prefix_bits": 15, + "coefficient_work_primitive_count": 109906, + "all_exact_columns": 800, + "all_560_dirty_helper_columns_restored": true, + "private_centres_and_coefficient_work_cleared": true + } + }, + "entering_helpers": 122, + "entrance_rank": 148, + "local_adapters": 391344, + "local_primitive_bound": 10149247009100, + "wrapper_elementary_factors_charged": 2529792, + "compiler": 25934336, + "unhosted_pervertex": 1299225185815824, + "hosted_rebased_pervertex": 1299225185483184, + "conservative_pervertex_used": 1299225185815824, + "finite": { + "physical_stock_bits": 2641, + "router_bits": 7984, + "literal_bits": 35282, + "physical_row_coefficient": 16467, + "retained_row_coefficient": 20161, + "required_C0_bits": 200012, + "halving_integer_inequality": [ + 5329, + 4608 + ], + "G_exponent": 30000, + "E_exponent": 100000, + "C0_exponent": 210000 + }, + "strict_checks": { + "local_primitive_bound": true, + "logical": true, + "router": true, + "literal": true, + "mass": true, + "precision": true, + "tape": true, + "row": true, + "halving": true + }, + "scope": "Exact finite recount conditional on inherited all-size compiler/precision/tape and analytic-transfer contracts. Signed accumulation uses the supplier scalar primitive convention. Async prefix counts all72individual bridges and72complete invocations;512bits are charged, and an additional2*512 enters the two-level physical row bound." +} diff --git a/research/retimed-asynchronous-validation/gaussian-selftest.log b/research/retimed-asynchronous-validation/gaussian-selftest.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/retimed-asynchronous-validation/integrate.log b/research/retimed-asynchronous-validation/integrate.log new file mode 100644 index 0000000000..e702705ac3 --- /dev/null +++ b/research/retimed-asynchronous-validation/integrate.log @@ -0,0 +1 @@ +PASS prospective kappa 0.001182545659671074 gain 18.445166359221734 percent diff --git a/research/retimed-asynchronous-validation/lemma-controls.log b/research/retimed-asynchronous-validation/lemma-controls.log new file mode 100644 index 0000000000..6d961e57b9 --- /dev/null +++ b/research/retimed-asynchronous-validation/lemma-controls.log @@ -0,0 +1,15 @@ +{"mutant": "M1 compensation gate with the target still at label 0", "violates": "G0 (common label at a nonzero-frame compensation)", "checker_flags": ["ACC", "G0"], "rejected": true, "first_messages": ["forward: G0 add at 13053 ('L', 200)<-('L', 374) frame 2 but labels 0,2 (A)", "forward: G0 add at 13064 ('L', 200)<-('L', 375) frame 2 but labels 0,2 (A)", "backward: G0 add at 13053 ('L', 374)<-('L', 200) frame 2 but labels 2,0 (A)"], "physics": {"forward": "FAIL (registers [186, 200])", "backward": "FAIL (registers [374, 375])"}, "seconds": 3.5} +{"mutant": "M2 physical T_E on an entering helper (no virtual entrance)", "violates": "G1 (virtual entrance)", "checker_flags": ["ACC", "G1"], "rejected": true, "first_messages": ["forward: G1 wrapper on non-entering register 374", "forward: G1 wrapper pre of 374 at frame 2 but start 0", "backward: G1 wrapper on non-entering register 374"], "physics": {"forward": "FAIL (registers [374])", "backward": "FAIL (registers [374])"}, "seconds": 1.0} +{"mutant": "M3 target visits its entrance levels out of nesting order (descends E2 -> E1)", "violates": "G2 (monotone nested chain; selection condition (b))", "checker_flags": ["ACC", "G2"], "rejected": true, "first_messages": ["forward: G2 climb at 13505 of 200 4->2 not ascending nested", "forward: ACC paid profile {2: 265, 1: 2384, -1: 1, 3: 530, 4: 84, 6: 92, 5: 270, 8: 17, 7: 1} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}", "backward: G2 climb at 13505 of 200 4->2 not ascending nested"], "physics": {"forward": "PASS", "backward": "PASS"}, "seconds": 1.1} +{"mutant": "M3b entering helper leaves the nested chain (E_j -> X -> F, X not containing E_j)", "violates": "G2 (monotone nested chain; selection condition (a))", "checker_flags": ["ACC", "G2"], "rejected": true, "first_messages": ["forward: G2 climb at 14058 of 374 2->8 not ascending nested", "forward: ACC paid profile {1: 2385, 2: 264, 0: 1, 3: 530, 4: 84, 6: 92, 5: 270, 8: 17, 7: 1} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}", "backward: G2 climb at 14058 of 374 2->8 not ascending nested"], "physics": {"forward": "PASS", "backward": "PASS"}, "seconds": 1.0} +{"mutant": "M4 scatter into a level-L1 target after the copy descended below L1", "violates": "G3 (scatter meets the target at its level)", "checker_flags": ["G0"], "rejected": true, "first_messages": ["forward: G0 add at 18384 ('L', 194)<-('C', 1) frame 5 but labels 5,4 (centers)"], "physics": {"forward": "FAIL (registers [129, 194])"}, "seconds": 0.5} +{"mutant": "M5 last centre descent step skipped (level-0 targets scattered at L_last)", "violates": "G3 (chain reaches every served level; bottom 0)", "checker_flags": ["ACC", "G0"], "rejected": true, "first_messages": ["forward: G0 add at 18398 ('L', 127)<-('C', 1) frame 0 but labels 0,2 (centers)", "forward: G0 add at 18399 ('L', 185)<-('C', 1) frame 0 but labels 0,2 (centers)"], "physics": {"forward": "FAIL (registers [121, 122, 123, 127])"}, "seconds": 0.5} +{"mutant": "M6 centre copy taken at the wrong label (after the first descent)", "violates": "G3 (copy at the centre label c_k)", "checker_flags": ["G3"], "rejected": true, "first_messages": ["forward: G3 centre step at 18380 on a dead copy 1", "forward: G3 copy at 18381 from ('L', 64) at label 481 but frame 5"], "physics": {"forward": "FAIL (registers [121, 122, 123, 124])"}, "seconds": 0.4} +{"mutant": "M7 a child of another register runs while a centre copy is live", "violates": "G3 (copy lifetime)", "checker_flags": ["G3"], "rejected": true, "first_messages": ["forward: G3 climb at 18382 of 503 while centre copy [1] live"], "physics": {"forward": "PASS"}, "seconds": 0.5} +{"mutant": "M8 centre chain leaves the centre frame (c_k -> X -> L1, X not inside c_k)", "violates": "G3 (nested chain inside c_k; selection condition (c))", "checker_flags": ["ACC", "G3"], "rejected": true, "first_messages": ["forward: G3 centre step at 18349 480->74 not a strict nested descent", "forward: ACC paid profile {1: 2386, 2: 264, 3: 530, 4: 84, 6: 92, 5: 270, 7: 2, 8: 16} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}"], "physics": {"forward": "PASS"}, "seconds": 0.5} +{"mutant": "M9 compensation coefficient doubled", "violates": "S (scalar identity)", "checker_flags": ["S"], "rejected": true, "first_messages": ["forward: S column mismatch at register 186", "forward: S column mismatch at register 200", "backward: S column mismatch at register 374"], "physics": {"forward": "FAIL (registers [186, 200])", "backward": "FAIL (registers [374])"}, "seconds": 1.2} +{"mutant": "M10 compensation moved after the helper started climbing", "violates": "G0 + S (compensation reads the entrance value)", "checker_flags": ["G0"], "rejected": true, "first_messages": ["forward: G0 add at 14058 ('L', 200)<-('L', 374) frame 2 but labels 4,148 (A)", "backward: G0 add at 14058 ('L', 374)<-('L', 200) frame 2 but labels 148,4 (A)"], "physics": {"forward": "FAIL (registers [186, 200])", "backward": "FAIL (registers [374])"}, "seconds": 1.2} +{"mutant": "M11 kernel donor update with the donor still at label 0", "violates": "G0 (common label at a nonzero-frame kernel update; inherited #471)", "checker_flags": ["ACC", "G0"], "rejected": true, "first_messages": ["forward: G0 add at 13547 ('L', 368)<-('L', 396) frame 6 but labels 0,6 (A)", "forward: ACC paid profile {1: 2384, 2: 263, 3: 531, 4: 84, 6: 92, 5: 270, 8: 17, 7: 1} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}", "backward: G0 add at 13547 ('L', 396)<-('L', 368) frame 6 but labels 6,0 (A)"], "physics": {"forward": "FAIL (registers [130, 188, 206, 221])", "backward": "FAIL (registers [396])"}, "seconds": 1.1} +{"mutant": "M12 R_E^-1 wrapper after the first gate on the helper", "violates": "G1 (wrapper surrounds the whole invocation)", "checker_flags": ["G1"], "rejected": true, "first_messages": ["forward: G1 pre wrapper of 374 not the first event touching it", "forward: G1 pre wrapper of 374 outside entry adapters", "backward: G1 pre wrapper of 374 not the first event touching it"], "physics": {"forward": "FAIL (registers [186, 200])", "backward": "FAIL (registers [374])"}, "seconds": 1.2} +{"mutant": "M13 L_E^-1 wrapper dropped", "violates": "G1 (wrapper surrounds the whole invocation)", "checker_flags": ["G1"], "rejected": true, "first_messages": ["forward: G1 entering helper 374 without post wrapper", "backward: G1 entering helper 374 without post wrapper"], "physics": {"forward": "FAIL (registers [374])", "backward": "FAIL (registers [374])"}, "seconds": 1.0} +rejected by the checker: 14 / 14 diff --git a/research/retimed-asynchronous-validation/lemmaG/E2E-gauge80-kernel42.json b/research/retimed-asynchronous-validation/lemmaG/E2E-gauge80-kernel42.json new file mode 100644 index 0000000000..286399d0e9 --- /dev/null +++ b/research/retimed-asynchronous-validation/lemmaG/E2E-gauge80-kernel42.json @@ -0,0 +1,17 @@ +{ + "variant": "gauge80-kernel42", + "seed": 2026, + "columns": 806, + "kinds": { + "port": 240, + "entering": 244, + "random": 256, + "centre": 16, + "target_level": 50 + }, + "batches": 26, + "failures": [], + "dense": 8, + "seconds": 50.4, + "status": "PASS" +} \ No newline at end of file diff --git a/research/retimed-asynchronous-validation/lemmaG/INSTANCES-gauge80-kernel42.json b/research/retimed-asynchronous-validation/lemmaG/INSTANCES-gauge80-kernel42.json new file mode 100644 index 0000000000..a4aadd6bba --- /dev/null +++ b/research/retimed-asynchronous-validation/lemmaG/INSTANCES-gauge80-kernel42.json @@ -0,0 +1,215 @@ +{ + "variant": "gauge80-kernel42", + "I-tr": { + "transitions": 2945, + "columns_each": 512, + "failures": [] + }, + "I-comp": { + "compensation_gates": 420, + "targets": 50, + "entering_helpers_compensating": 80, + "input_registers": 130, + "columns_each": 512, + "target_levels_after_segment": [ + 2, + 4, + 5 + ], + "failures": [] + }, + "I-centre": { + "centres": 16, + "detail": [ + { + "centre": 0, + "register": 99, + "frame": 480, + "path_dims": [ + 8, + 0 + ], + "targets": 28 + }, + { + "centre": 1, + "register": 64, + "frame": 481, + "path_dims": [ + 8, + 4, + 2, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 2, + "register": 365, + "frame": 482, + "path_dims": [ + 8, + 2, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 3, + "register": 30, + "frame": 483, + "path_dims": [ + 8, + 4, + 2, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 4, + "register": 393, + "frame": 484, + "path_dims": [ + 8, + 4, + 2, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 5, + "register": 98, + "frame": 485, + "path_dims": [ + 8, + 2, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 6, + "register": 421, + "frame": 486, + "path_dims": [ + 8, + 4, + 2, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 7, + "register": 96, + "frame": 487, + "path_dims": [ + 8, + 1, + 0 + ], + "targets": 28 + }, + { + "centre": 8, + "register": 35, + "frame": 967, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 9, + "register": 0, + "frame": 964, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 10, + "register": 13, + "frame": 965, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 11, + "register": 54, + "frame": 970, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 12, + "register": 40, + "frame": 968, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 13, + "register": 119, + "frame": 971, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 14, + "register": 22, + "frame": 966, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + }, + { + "centre": 15, + "register": 51, + "frame": 969, + "path_dims": [ + 1, + 0 + ], + "targets": 1 + } + ], + "failures": [] + }, + "I-helper": { + "entering_helpers": 122, + "widths": { + "8": 104, + "7": 14, + "5": 4 + }, + "columns_each": 512, + "failures": [] + }, + "seconds": 87.2 +} \ No newline at end of file diff --git a/research/retimed-asynchronous-validation/lemmaG/MUTANTS.json b/research/retimed-asynchronous-validation/lemmaG/MUTANTS.json new file mode 100644 index 0000000000..ce4dae10a4 --- /dev/null +++ b/research/retimed-asynchronous-validation/lemmaG/MUTANTS.json @@ -0,0 +1,247 @@ +[ + { + "mutant": "M1 compensation gate with the target still at label 0", + "violates": "G0 (common label at a nonzero-frame compensation)", + "checker_flags": [ + "ACC", + "G0" + ], + "rejected": true, + "first_messages": [ + "forward: G0 add at 13053 ('L', 200)<-('L', 374) frame 2 but labels 0,2 (A)", + "forward: G0 add at 13064 ('L', 200)<-('L', 375) frame 2 but labels 0,2 (A)", + "backward: G0 add at 13053 ('L', 374)<-('L', 200) frame 2 but labels 2,0 (A)" + ], + "physics": { + "forward": "FAIL (registers [186, 200])", + "backward": "FAIL (registers [374, 375])" + }, + "seconds": 3.5 + }, + { + "mutant": "M2 physical T_E on an entering helper (no virtual entrance)", + "violates": "G1 (virtual entrance)", + "checker_flags": [ + "ACC", + "G1" + ], + "rejected": true, + "first_messages": [ + "forward: G1 wrapper on non-entering register 374", + "forward: G1 wrapper pre of 374 at frame 2 but start 0", + "backward: G1 wrapper on non-entering register 374" + ], + "physics": { + "forward": "FAIL (registers [374])", + "backward": "FAIL (registers [374])" + }, + "seconds": 1.0 + }, + { + "mutant": "M3 target visits its entrance levels out of nesting order (descends E2 -> E1)", + "violates": "G2 (monotone nested chain; selection condition (b))", + "checker_flags": [ + "ACC", + "G2" + ], + "rejected": true, + "first_messages": [ + "forward: G2 climb at 13505 of 200 4->2 not ascending nested", + "forward: ACC paid profile {2: 265, 1: 2384, -1: 1, 3: 530, 4: 84, 6: 92, 5: 270, 8: 17, 7: 1} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}", + "backward: G2 climb at 13505 of 200 4->2 not ascending nested" + ], + "physics": { + "forward": "PASS", + "backward": "PASS" + }, + "seconds": 1.1 + }, + { + "mutant": "M3b entering helper leaves the nested chain (E_j -> X -> F, X not containing E_j)", + "violates": "G2 (monotone nested chain; selection condition (a))", + "checker_flags": [ + "ACC", + "G2" + ], + "rejected": true, + "first_messages": [ + "forward: G2 climb at 14058 of 374 2->8 not ascending nested", + "forward: ACC paid profile {1: 2385, 2: 264, 0: 1, 3: 530, 4: 84, 6: 92, 5: 270, 8: 17, 7: 1} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}", + "backward: G2 climb at 14058 of 374 2->8 not ascending nested" + ], + "physics": { + "forward": "PASS", + "backward": "PASS" + }, + "seconds": 1.0 + }, + { + "mutant": "M4 scatter into a level-L1 target after the copy descended below L1", + "violates": "G3 (scatter meets the target at its level)", + "checker_flags": [ + "G0" + ], + "rejected": true, + "first_messages": [ + "forward: G0 add at 18384 ('L', 194)<-('C', 1) frame 5 but labels 5,4 (centers)" + ], + "physics": { + "forward": "FAIL (registers [129, 194])" + }, + "seconds": 0.5 + }, + { + "mutant": "M5 last centre descent step skipped (level-0 targets scattered at L_last)", + "violates": "G3 (chain reaches every served level; bottom 0)", + "checker_flags": [ + "ACC", + "G0" + ], + "rejected": true, + "first_messages": [ + "forward: G0 add at 18398 ('L', 127)<-('C', 1) frame 0 but labels 0,2 (centers)", + "forward: G0 add at 18399 ('L', 185)<-('C', 1) frame 0 but labels 0,2 (centers)" + ], + "physics": { + "forward": "FAIL (registers [121, 122, 123, 127])" + }, + "seconds": 0.5 + }, + { + "mutant": "M6 centre copy taken at the wrong label (after the first descent)", + "violates": "G3 (copy at the centre label c_k)", + "checker_flags": [ + "G3" + ], + "rejected": true, + "first_messages": [ + "forward: G3 centre step at 18380 on a dead copy 1", + "forward: G3 copy at 18381 from ('L', 64) at label 481 but frame 5" + ], + "physics": { + "forward": "FAIL (registers [121, 122, 123, 124])" + }, + "seconds": 0.4 + }, + { + "mutant": "M7 a child of another register runs while a centre copy is live", + "violates": "G3 (copy lifetime)", + "checker_flags": [ + "G3" + ], + "rejected": true, + "first_messages": [ + "forward: G3 climb at 18382 of 503 while centre copy [1] live" + ], + "physics": { + "forward": "PASS" + }, + "seconds": 0.5 + }, + { + "mutant": "M8 centre chain leaves the centre frame (c_k -> X -> L1, X not inside c_k)", + "violates": "G3 (nested chain inside c_k; selection condition (c))", + "checker_flags": [ + "ACC", + "G3" + ], + "rejected": true, + "first_messages": [ + "forward: G3 centre step at 18349 480->74 not a strict nested descent", + "forward: ACC paid profile {1: 2386, 2: 264, 3: 530, 4: 84, 6: 92, 5: 270, 7: 2, 8: 16} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}" + ], + "physics": { + "forward": "PASS" + }, + "seconds": 0.5 + }, + { + "mutant": "M9 compensation coefficient doubled", + "violates": "S (scalar identity)", + "checker_flags": [ + "S" + ], + "rejected": true, + "first_messages": [ + "forward: S column mismatch at register 186", + "forward: S column mismatch at register 200", + "backward: S column mismatch at register 374" + ], + "physics": { + "forward": "FAIL (registers [186, 200])", + "backward": "FAIL (registers [374])" + }, + "seconds": 1.2 + }, + { + "mutant": "M10 compensation moved after the helper started climbing", + "violates": "G0 + S (compensation reads the entrance value)", + "checker_flags": [ + "G0" + ], + "rejected": true, + "first_messages": [ + "forward: G0 add at 14058 ('L', 200)<-('L', 374) frame 2 but labels 4,148 (A)", + "backward: G0 add at 14058 ('L', 374)<-('L', 200) frame 2 but labels 148,4 (A)" + ], + "physics": { + "forward": "FAIL (registers [186, 200])", + "backward": "FAIL (registers [374])" + }, + "seconds": 1.2 + }, + { + "mutant": "M11 kernel donor update with the donor still at label 0", + "violates": "G0 (common label at a nonzero-frame kernel update; inherited #471)", + "checker_flags": [ + "ACC", + "G0" + ], + "rejected": true, + "first_messages": [ + "forward: G0 add at 13547 ('L', 368)<-('L', 396) frame 6 but labels 0,6 (A)", + "forward: ACC paid profile {1: 2384, 2: 263, 3: 531, 4: 84, 6: 92, 5: 270, 8: 17, 7: 1} != word {'1': 2385, '2': 264, '3': 530, '4': 84, '5': 270, '6': 92, '7': 1, '8': 17}", + "backward: G0 add at 13547 ('L', 396)<-('L', 368) frame 6 but labels 6,0 (A)" + ], + "physics": { + "forward": "FAIL (registers [130, 188, 206, 221])", + "backward": "FAIL (registers [396])" + }, + "seconds": 1.1 + }, + { + "mutant": "M12 R_E^-1 wrapper after the first gate on the helper", + "violates": "G1 (wrapper surrounds the whole invocation)", + "checker_flags": [ + "G1" + ], + "rejected": true, + "first_messages": [ + "forward: G1 pre wrapper of 374 not the first event touching it", + "forward: G1 pre wrapper of 374 outside entry adapters", + "backward: G1 pre wrapper of 374 not the first event touching it" + ], + "physics": { + "forward": "FAIL (registers [186, 200])", + "backward": "FAIL (registers [374])" + }, + "seconds": 1.2 + }, + { + "mutant": "M13 L_E^-1 wrapper dropped", + "violates": "G1 (wrapper surrounds the whole invocation)", + "checker_flags": [ + "G1" + ], + "rejected": true, + "first_messages": [ + "forward: G1 entering helper 374 without post wrapper", + "backward: G1 entering helper 374 without post wrapper" + ], + "physics": { + "forward": "FAIL (registers [374])", + "backward": "FAIL (registers [374])" + }, + "seconds": 1.0 + } +] \ No newline at end of file diff --git a/research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_e2e.json b/research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_e2e.json new file mode 100644 index 0000000000..8664755d26 --- /dev/null +++ b/research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_e2e.json @@ -0,0 +1,6 @@ +{ + "add_calls": 251154, + "scale_calls": 8858, + "primitive_calls": 853381, + "maximum_proved_numerator_bits": 29 +} diff --git a/research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_instances.json b/research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_instances.json new file mode 100644 index 0000000000..bf92f58dd7 --- /dev/null +++ b/research/retimed-asynchronous-validation/lemmaG/PREOP-GUARDS-lg_instances.json @@ -0,0 +1,6 @@ +{ + "add_calls": 1116, + "scale_calls": 884, + "primitive_calls": 102522, + "maximum_proved_numerator_bits": 14 +} diff --git a/research/retimed-asynchronous-validation/phases.log b/research/retimed-asynchronous-validation/phases.log new file mode 100644 index 0000000000..b6620b5abb --- /dev/null +++ b/research/retimed-asynchronous-validation/phases.log @@ -0,0 +1,16 @@ +exact phase edges 0 / 2952 seconds 0.32952712499536574 +exact phase edges 200 / 2952 seconds 4.732293708017096 +exact phase edges 400 / 2952 seconds 10.104311374947429 +exact phase edges 600 / 2952 seconds 15.57243349996861 +exact phase edges 800 / 2952 seconds 21.00197866698727 +exact phase edges 1000 / 2952 seconds 26.506034124991857 +exact phase edges 1200 / 2952 seconds 32.14390787505545 +exact phase edges 1400 / 2952 seconds 37.7949232920073 +exact phase edges 1600 / 2952 seconds 43.45703604200389 +exact phase edges 1800 / 2952 seconds 49.14179050002713 +exact phase edges 2000 / 2952 seconds 54.90944983297959 +exact phase edges 2200 / 2952 seconds 60.385002374998294 +exact phase edges 2400 / 2952 seconds 65.86366866703611 +exact phase edges 2600 / 2952 seconds 71.52855341695249 +exact phase edges 2800 / 2952 seconds 76.99615658295806 +PASS exact local phases 82.58938675001264 seconds diff --git a/research/retimed-asynchronous-validation/pipeline-controls.log b/research/retimed-asynchronous-validation/pipeline-controls.log new file mode 100644 index 0000000000..b827bfe104 --- /dev/null +++ b/research/retimed-asynchronous-validation/pipeline-controls.log @@ -0,0 +1 @@ +10 controls rejected by the certifying scripts diff --git a/research/retimed-asynchronous-validation/plan-transfer.log b/research/retimed-asynchronous-validation/plan-transfer.log new file mode 100644 index 0000000000..72ee86e11a --- /dev/null +++ b/research/retimed-asynchronous-validation/plan-transfer.log @@ -0,0 +1 @@ +PASS_UNCHANGED_WIDTH_ASYNC_PLAN_TRANSFER diff --git a/research/retimed-asynchronous-validation/programs.log b/research/retimed-asynchronous-validation/programs.log new file mode 100644 index 0000000000..b0473cdce1 --- /dev/null +++ b/research/retimed-asynchronous-validation/programs.log @@ -0,0 +1,2 @@ +PASS emitted forward 25082 events +PASS emitted backward 25082 events diff --git a/research/retimed-asynchronous-validation/scalar-readback.log b/research/retimed-asynchronous-validation/scalar-readback.log new file mode 100644 index 0000000000..5e6f612b47 --- /dev/null +++ b/research/retimed-asynchronous-validation/scalar-readback.log @@ -0,0 +1,3 @@ +independent emitted replay PASS forward +independent emitted replay PASS backward +PASS independent local/global replay and two exact moments diff --git a/research/retimed-asynchronous-validation/scalar.log b/research/retimed-asynchronous-validation/scalar.log new file mode 100644 index 0000000000..04cf1f2c51 --- /dev/null +++ b/research/retimed-asynchronous-validation/scalar.log @@ -0,0 +1,4 @@ +full main columns 800 replayed +PASS exact arbitrary dirt and restored sources/helpers +PASS exact inverse-transpose on every column +PASS prospective b 0.001183945732643359 gain 18.467004511682045 percent; seconds 0.6544058750150725 diff --git a/research/retimed-asynchronous-validation/selection-controls.log b/research/retimed-asynchronous-validation/selection-controls.log new file mode 100644 index 0000000000..1762db2e9f --- /dev/null +++ b/research/retimed-asynchronous-validation/selection-controls.log @@ -0,0 +1 @@ +4 selection controls refused diff --git a/research/retimed-asynchronous-validation/transfer.log b/research/retimed-asynchronous-validation/transfer.log new file mode 100644 index 0000000000..9a17535ea4 --- /dev/null +++ b/research/retimed-asynchronous-validation/transfer.log @@ -0,0 +1 @@ +PASS_STRUCTURAL_MAIN_WORD_RETIMING_TRANSFER {'A': 224, 'B': 504} diff --git a/research/retimed-asynchronous-validation/transfer/TRANSFER.json b/research/retimed-asynchronous-validation/transfer/TRANSFER.json new file mode 100644 index 0000000000..b41792e989 --- /dev/null +++ b/research/retimed-asynchronous-validation/transfer/TRANSFER.json @@ -0,0 +1,54 @@ +{ + "status": "PASS_STRUCTURAL_MAIN_WORD_RETIMING_TRANSFER", + "source_files": { + "/Users/chafreaky/Documents/personal/integer-mult-research-20261008/e8-async-retimed/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/BASE-WORD.json.gz": "da4c5007092fd9456403179ef2a4391aef9fc5310e3eec5f2ab6c49b24147387", + "/Users/chafreaky/Documents/personal/integer-mult-research-20261008/e8-async-retimed/research/retimed-asynchronous-whole-owners/data/PR495-FULL-WORD.json.gz": "66655cd858afb515dfd4cad43c4fef01f9185af670e144750e9977588ebd4ecf", + "/Users/chafreaky/Documents/personal/integer-mult-research-20261008/e8-async-retimed/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb" + }, + "changed_frames": { + "A": 224, + "B": 504 + }, + "discarded_prefix_events": { + "A": 229, + "B": 0 + }, + "preserved_gauge_fields": [ + "centers", + "center_frames", + "target_levels", + "root_lines", + "ports", + "cut", + "precondition", + "start_extra", + "scatter" + ], + "entering_helpers": 122, + "entrance_rank": 148, + "local_profile": { + "1": 2385, + "2": 264, + "3": 530, + "4": 84, + "5": 270, + "6": 92, + "7": 1, + "8": 17 + }, + "transfer_controls_rejected": [ + [ + "A", + 1 + ], + [ + "B", + 3 + ] + ], + "outputs": { + "RETIMED-BASE.json.gz": "5b0632330c1aca9f33601e1c222e8dc2d1a0f279e29fef9e1d889489af7195af", + "FULL-WORD.json.gz": "8d5a3d6e20f9c3593938a251ffc64aa8d810c324979e5bcf26a33840c544afe2" + }, + "scope": "Structural transfer; scalar, frame, phase, whole-program, hosting and finite assembly checks must run independently." +} diff --git a/research/retimed-asynchronous-validation/whole-program.log b/research/retimed-asynchronous-validation/whole-program.log new file mode 100644 index 0000000000..aa5b5a5e64 --- /dev/null +++ b/research/retimed-asynchronous-validation/whole-program.log @@ -0,0 +1,30 @@ +gauge80-kernel42 batch 0 failures so far 0 5 +gauge80-kernel42 batch 1 failures so far 0 7 +gauge80-kernel42 batch 2 failures so far 0 10 +gauge80-kernel42 batch 3 failures so far 0 12 +gauge80-kernel42 batch 4 failures so far 0 14 +gauge80-kernel42 batch 5 failures so far 0 17 +gauge80-kernel42 batch 6 failures so far 0 19 +gauge80-kernel42 batch 7 failures so far 0 22 +gauge80-kernel42 batch 8 failures so far 0 22 +gauge80-kernel42 batch 9 failures so far 0 22 +gauge80-kernel42 batch 10 failures so far 0 23 +gauge80-kernel42 batch 11 failures so far 0 23 +gauge80-kernel42 batch 12 failures so far 0 24 +gauge80-kernel42 batch 13 failures so far 0 24 +gauge80-kernel42 batch 14 failures so far 0 24 +gauge80-kernel42 batch 15 failures so far 0 26 +gauge80-kernel42 batch 16 failures so far 0 28 +gauge80-kernel42 batch 17 failures so far 0 31 +gauge80-kernel42 batch 18 failures so far 0 32 +gauge80-kernel42 batch 19 failures so far 0 34 +gauge80-kernel42 batch 20 failures so far 0 36 +gauge80-kernel42 batch 21 failures so far 0 39 +gauge80-kernel42 batch 22 failures so far 0 41 +gauge80-kernel42 batch 23 failures so far 0 43 +gauge80-kernel42 batch 24 failures so far 0 46 +gauge80-kernel42 batch 25 failures so far 0 46 +gauge80-kernel42 dense 0 failures so far 0 48 +gauge80-kernel42 dense 1 failures so far 0 50 +gauge80-kernel42 PASS 806 basis columns + 8 dense 50.4 s +PRE_OPERATION_EXACTNESS_BOUNDS {'add_calls': 251154, 'scale_calls': 8858, 'primitive_calls': 853381, 'maximum_proved_numerator_bits': 29} diff --git a/research/retimed-asynchronous-validation/word-controls.log b/research/retimed-asynchronous-validation/word-controls.log new file mode 100644 index 0000000000..a0db1a4768 --- /dev/null +++ b/research/retimed-asynchronous-validation/word-controls.log @@ -0,0 +1 @@ +8 controls rejected diff --git a/research/retimed-asynchronous-validation/wrappers.log b/research/retimed-asynchronous-validation/wrappers.log new file mode 100644 index 0000000000..b840c13ba9 --- /dev/null +++ b/research/retimed-asynchronous-validation/wrappers.log @@ -0,0 +1 @@ +Lemma A (exact): L^-1 S_E R^-1 = C_[w] x I for 16 entrance frames, global phase included; 5 wrapper mutations rejected; all-even-weight: True diff --git a/research/retimed-asynchronous-whole-owners/.gitattributes b/research/retimed-asynchronous-whole-owners/.gitattributes new file mode 100644 index 0000000000..bd2de00cda --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/.gitattributes @@ -0,0 +1 @@ +* -text -whitespace diff --git a/research/retimed-asynchronous-whole-owners/EXPECTED.json b/research/retimed-asynchronous-whole-owners/EXPECTED.json new file mode 100644 index 0000000000..1e598034a2 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/EXPECTED.json @@ -0,0 +1,24 @@ +{ + "asynchronous_template_sha256": "61cb5130c9a909a5fd412885608bbd697aac4d9d56d46c87d1af995a8e2f0f4e", + "bit_lower": "391360506745414227149/250000000000000000000000", + "canonical_word_sha256": "bae9701c7fde304860cc89d72d1bcb503f392b25cff04401202e833301e2ef18", + "complex_lower": "342866804295765301697/250000000000000000000000", + "global_prefix_bits": 205, + "global_profile": { + "1": 171856, + "16": 1, + "2": 19008, + "3": 41592, + "4": 6048, + "48": 408, + "5": 22941, + "6": 6624, + "7": 2209, + "8": 1224 + }, + "kappa": "68479443547277/50000000000000000", + "kappa_decimal": "0.001369588870945540", + "live": 7680, + "local_program_sha256": "39af027100077ecdf4dea36c937faa813b195e5be4554f09b4f35f1ca230d518", + "physical": 8258 +} diff --git a/research/retimed-asynchronous-whole-owners/LICENSE b/research/retimed-asynchronous-whole-owners/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/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/retimed-asynchronous-whole-owners/MANIFEST.json b/research/retimed-asynchronous-whole-owners/MANIFEST.json new file mode 100644 index 0000000000..0256234116 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/MANIFEST.json @@ -0,0 +1,111 @@ +{ + ".gitattributes": "e97602ab9cac70102245345c5ab0fc9830df8b17f1072b188265a662a3a547ae", + "EXPECTED.json": "ff5cf5f84bfbdaa53ae27691afa49c147adbed1f1d296b417aa23136380d29b4", + "LICENSE": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "NOTICE.md": "037efdfc64c74e1b17d7a3f9870b2b0114d9a2530119cb926175a3791f9c4a89", + "PROOF.md": "19584ee027eff089512f8c7a9c7045a26393b39331cab89a555d6a61658be636", + "README.md": "82af6ee1c545dfb58d82f62ac95e31793325ff6291e84239b3115d1e8bf37e84", + "SOURCE.json": "feee494e0cdf011324c6bfb1311cc77d1bee898f948279652c19772026707bed", + "code/build_plan.py": "748c7ae6b606cefa9ddcf55771714f426480ce7753c081324ba5b1429ee39ffb", + "code/build_retimed.py": "5177c0f1200d30fb532e58964d67d3cb08f7b9854ea97107f776f1883e36de97", + "code/guarded_lemma.py": "e572010d33bbb39f4756c785270b5fc9cb82ee6ee4d4cd75d0a1ca49d773a587", + "code/lg_mutants_retimed.py": "8f3c5a0fd63a19c70bc2c9026544ec58139b99ade5f1bafd296ccce480d97a4d", + "data/PR495-FULL-WORD.json.gz": "66655cd858afb515dfd4cad43c4fef01f9185af670e144750e9977588ebd4ecf", + "data/PR502-EXPECTED.json": "97056026d52482a79a26efdb49d7cf6f44adff837eaa6b7b836e09d8baf76166", + "data/PR502-RESULT.json": "4a951fc558757d045f8296b4014e4be71553ac7514a4d996d4bf0232ebefec5f", + "references/PR502-PROOF.md": "23370c65953ed2c6fde92c6a5fbcad6a3d106213a8047ad4e40271b4152fd503", + "references/UPSTREAM-REPLAY.json": "bffedf9ffd9bd4d85780047368c63a034494854bbb13d6d9b5a244665ab307ae", + "vendor/complex/e8-complex-gauge-kernel/NOTICE.md": "7c7a022afe969a09ad5320935daf7db256b8f25ee56ecdcf9fc40eb0836e74ce", + "vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c", + "vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py": "e377ef9d9e90168290a4640250c0fb9c05015104bcc4827bc5ce63f6ca63763a", + "vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc", + "vendor/complex/e8-complex-gauge-kernel/code/audit_hosted_gk.py": "c46c69c1c6fdccce991bf5d5ec7def344d2749c53ad2db976a50ba3a6c37d657", + "vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py": "cf83aa95f03aa812c413905df9f75f13ac8f92f5db6a83cf9b1868aea2dd9de0", + "vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py": "573966c7ad1deac24464414d3886171f594bb3ae3e7236a9ac2447cc40b20211", + "vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py": "cc6fb8bf4644cc3a1799f3bc90dc074adb5663d1889c92f7f73ec9f307acbd36", + "vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py": "d2777571d59736c3fe62b81506ae62c22a3816fbc3abf9303d914e6da6d64258", + "vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23", + "vendor/complex/e8-complex-gauge-kernel/code/gk_common.py": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "vendor/complex/e8-complex-gauge-kernel/code/gk_word.py": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b", + "vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py": "8d2c29a5f79e6a1391f96baf44dd9fbe35203b6c11b02a7b2d238cf792ea163f", + "vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py": "f572b7129a546e1b1193fdd5baee4f731a5b9b8a4e8dc7ac170bcad7758e5b9a", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py": "64cdb2cfefc9ec3ed80c277a18848778427c3d3dbda9b7be13f740522478e1de", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py": "8fe3719e8ec5ec49af480b40c15f07612a356f5071ea30e17ae2d8931b3f20ce", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py": "47dcf2e9ae2d99699424d684abebc3d1d2d25b7aa6d440761e19835d140f5fbb", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py": "00068882bf2f2ebadd3f87c94204f226c7938966124bafb9ce6da89bfaf91b45", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py": "cf0d1f8e90a0780244b6de38d6aad08dd42f4c439397a6d5a61fccd23fe7e798", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py": "0ca37829b596d83d0b94c5f0b6b278a100f22e626b2ab3b5210a38f9657c8a27", + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py": "5f053e553b1c26e553a844e2891a73b6cc6b79404a7bb5d4722529f7db0d592c", + "vendor/complex/e8-complex-gauge-kernel/code/make_meta.py": "06e44ae4fc4f3a88989828d6cbdf95524a2d9f65753045cbb3e6cfd7e042d96a", + "vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590", + "vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3", + "vendor/complex/e8-complex-gauge-kernel/code/run_variant.py": "feecf7dff32860a02fbfb96da1049ba35d05b3baf74c4f741b878d4d91903903", + "vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb", + "vendor/complex/split-centres-global/vendor/clifford_exact.py": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "vendor/pr505/ADVERSARIAL-REVIEW.md": "6c8f69452df88c2082568d83ff3692176d391fd1e1db6533d071049ec873163c", + "vendor/pr505/EXPECTED.json": "10d4b326f1d1836995a2722e0901c0f62ceb98b345b51095d84765df3776b6c2", + "vendor/pr505/LICENSE": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "vendor/pr505/MANIFEST.json": "8395a05166d83a27ee9dfa4b16a2e63b93668eedf178edd587270c3ffcc6fa97", + "vendor/pr505/NOTICE.md": "b4bf5b4520f22256c18e6378a51cd8270335aed268a84b42d9284273a51eedc3", + "vendor/pr505/PROOF.md": "1fd10bedaf12f5221c1f22f4e508279ca1a16af7d0733dfdaac6a2a02a8a668a", + "vendor/pr505/README.md": "e7d793bbc8fa7355f7ab6f4c001965eff3b22ea0e3c029191ec92ee801f9607c", + "vendor/pr505/RESEARCH.md": "00287d17523ce726545bb10171afcb77b0d0cf3bfd8fd835e21b38bad57b0be7", + "vendor/pr505/SCHEDULING-LEMMA.md": "73effa4a41524fb800e0213bd61f470a0cc61f4110af13dcf4037daf24300511", + "vendor/pr505/SNAPSHOT.md": "8f09e56f76399e3b749f7a284be09a6fbfd1ec2cfaf39c8769a7e99ca69fec7d", + "vendor/pr505/SOURCE-FILES.json": "5e174966d33cc1bee5d3421c553954dd5ee764630eb3e2e4395fe04ef2595136", + "vendor/pr505/SOURCES.json": "f344c729873c4aac9e5081acfa2f7043334eba1d5af9e5914a3acdfea42f99f1", + "vendor/pr505/code/assemble.py": "9db68cad2738d76052b25c8bdf6485edd6f14025bf47107d2425b10a2bdf69e0", + "vendor/pr505/code/audit_async.py": "d01ad6a70c4d3132bcd631f175d23bbee44fecc15f2a80a0f14d0d1d2b0a7206", + "vendor/pr505/code/audit_async_invoice.py": "6a6e4ea681b34db6d0642e1fddc76d9ffd0cdbaf32119f33ca1232db78a148d2", + "vendor/pr505/code/emit_async.py": "3dca3efbce0e1b775801d072e64995472749553f6f7f3250bb6a898cfe117fbc", + "vendor/pr505/evidence/ASYNC-AUDIT.json": "e3f3c8dd3d9ead17031574f86fe7c7887f5f08ead36877b0baa93def9db58431", + "vendor/pr505/evidence/EXACT-ASSEMBLY.json": "b50c77f8089f9697844dbfb3ad2fb6d954e2bb71bfd544fa970da35cf21b25d0", + "vendor/pr505/evidence/GLOBAL-PREFIX.json": "098cdaa38a9bca8a4aca4aa5be03d6a36e40fe2f81948ab901a23d7cf65922de", + "vendor/pr505/evidence/OWNERS-AND-PROFILE.json": "c091ef330ae4566838b3a6c214d57847ce7c9962d5fc161f4ad155cd6bc69b21", + "vendor/pr505/evidence/PREFIX-AND-INVOICE.json": "3d38891f6db3fd70728f1bcba7d1f1356250903a15f3916ca91ae1ad98a24c73", + "vendor/pr505/evidence/RESULT.json": "a8459c77267a3d0c0aba8e1ff31144b32442f6ead3635697a578140f7ccb1720", + "vendor/pr505/evidence/STEPS.json": "8d73f35dff32e272525d584b62a984dda8faa5c4dbebcc58016b40cbced905b6", + "vendor/pr505/inputs/ASYNC-3.json": "8d16c05f4b3239fb5f9ec93958c9436c0cc0c76f6d4899a12bce5b84007d0893", + "vendor/pr505/inputs/ASYNC-OWNERS.json.gz": "52cb8c2b5869b429e3fe3b7a8b061792f020f6fad9f402dc4e4656110b9af068", + "vendor/pr505/inputs/BASE-WORD.json.gz": "da4c5007092fd9456403179ef2a4391aef9fc5310e3eec5f2ab6c49b24147387", + "vendor/pr505/inputs/PR493-EXPECTED.json": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb", + "vendor/pr505/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9", + "vendor/pr505/inputs/work/complex-network/hamming/PROTOTYPE.json": "b155f101a2b7ec8cfc4e7b6e7147b2d51f0dc31d3ea3499bdfa79d399a76be47", + "vendor/pr505/inputs/work/complex-nine-native/DATA-PHASES.json": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a", + "vendor/pr505/inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz": "1b84904a31a733aab9bfdda3f528c06719f590d2133a43687a8bded955dc991e", + "vendor/pr505/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz": "77b0c0fa19ef3da1c7316010e13493aa5eea1a50c3506eddc08f7480e659878b", + "vendor/pr505/inputs/work/odd-stages/clifford_exact.py": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "vendor/pr505/inputs/work/pr361/code/engines/base_two_moment.py": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "vendor/pr505/inputs/work/pr361/code/engines/moment.py": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "vendor/pr505/inputs/work/pr361/code/engines/outer.py": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c", + "vendor/pr505/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz": "1fb726ea3818fe0837cceb0dd22a71a0814f064e5e781628104610d6468e0e55", + "vendor/pr505/references/PR493-NOTICE.md": "08415e4ce4b9f81afdb4ee9b9ca01a055b81dec36dbc1fbc5ecafcdc8bfe94ed", + "vendor/pr505/references/PR496-PROOF.md": "144f1bf6952b3e31e99cf372a2cae9a13f96c9988808fe8a57ec70b09ee2007c", + "vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json": "19565a7d405d86d6432f44221f040702d38822b351b52969f308567112ef9424", + "vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json": "2ed72f0c9d97317ac7627614601a3fb41633bf5536d70ec6b24733a63dccfb37", + "vendor/pr505/research-notes/kernel/BASE-WORD.json.gz": "8b91151043fd61afe379314e4fb1e647cf9cd3cfe98462920d3faba5b1f268f2", + "vendor/pr505/research-notes/kernel/COMPONENT-SELECTION.json": "b682f7cff6de4f40bdadfc64a9ecb9b03a8d77dbf29be3748fa9d742dc894071", + "vendor/pr505/research-notes/kernel/JOINT-47-SELECTION.json": "89ca715918bfbb04fad2eaee8a95a40324859cd0955512eb13077502e7d950e3", + "vendor/pr505/research-notes/kernel/JOINT-51-SELECTION.json": "7094bb647cc9951a5385660a9ec5f012a427fd118baacaf3d5e9f28cb436acc7", + "vendor/pr505/research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json": "68a6adf3bcfbe8e8e4ffb7b4a672da5649c85f84c42813940e6dbb3cf20c2b99", + "vendor/pr505/research-notes/kernel/REBUILD.json": "e18727e4191e18838382948ced1c7506d74b3d43caa3853ce751684eef52d8d6", + "vendor/pr505/research-notes/kernel/RESEARCH-APPENDIX.md": "24ec2b2ff1174fcec7342307cff723e01c90513415f348665c43d0220ba04e3a", + "vendor/pr505/research-notes/kernel/audit_component_scalar.py": "feab9aa6dbcd8f9fffa6dbdb981d15ffc850402ae91cf45f946ff069cac54037", + "vendor/pr505/research-notes/kernel/rebuild_candidate.py": "f8063d539f772fb63712bed787a1c472da28c9baf38b88e3ae14806632d4afb7", + "vendor/pr505/vendor/audit_scalar_invoice.py": "652eed65fe8f72ab486dcdbe761f401f8a2d43530f2fb0c5c7777be488cd4648", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3", + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb", + "vendor/pr505/vendor/complex/split-centres-global/code/complex_phases_full.py": "0f2795aaffafe0c64d77f3748ef2109a3c42c58da867e4cf269a0a8cb6109466", + "vendor/pr505/vendor/complex/split-centres-global/vendor/clifford_exact.py": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "vendor/pr505/verify.py": "5f36c115ba65135b95117229cba7ca78ad2bc47032036d88d8ee25bbcde1a084", + "vendor/pr505/verify.sh": "2b1b51f757d8ddf81941c8c96007a2256336856c2e017bcf6c3a37576c82bc8b", + "verify.py": "a0df93cdf61c367c165413a7a2c9f75c64f2af4f5a7fd3ee49008dbd6c2e5e99" +} diff --git a/research/retimed-asynchronous-whole-owners/NOTICE.md b/research/retimed-asynchronous-whole-owners/NOTICE.md new file mode 100644 index 0000000000..f46d7c3f1d --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/NOTICE.md @@ -0,0 +1,26 @@ +# Credits and source boundaries + +New composition, deterministic plan transfer, fresh verification wrapper and +reproduction analysis: chafreaky with OpenAI Codex. + +- Dugongue, PR #505: asynchronous complete-invocation schedule, frozen owner + witness, independent event/owner auditor and prefix invoice. +- chafreaky, PR #502: the transferred retimed gauge word and fresh physical + replay; PR #458: paid two-sided residual wrappers; PR #497: moment-aware + placement work referenced by the source authors. +- Ali Romman, PR #495: source retiming schedule. +- DreamingOfClouds, PR #484: gauge80-kernel42 local construction and physical + checkers; eumemic, PR #496: whole-owner pooling and PR #493: bit supplier. +- DaysSky, PR #442: idle-axis hosting; icekylinx, PR #433: split-centre word; + Zhihao Chen, PR #425: mutable-source interfaces; Dylan Crow, PR #370; + Jacob Sussman and the E8/Hamming construction authors. + +All original headers and notices in copied files are preserved. Detailed +ancestry, including #417/#434/#435/#440, #401/#408–416, #361/#315 and the +OpenAI math inspirations used by #505, remains in the vendored notices. +Those inspirations do not constitute formal verification of this instance. +The source authors retain credit for their individual contributions. + +Files copied from PR #502 and PR #505 are individually pinned to Git bytes +in SOURCE.json. New code is distributed under the included Apache-2.0 +license; retained code remains under its existing notices. diff --git a/research/retimed-asynchronous-whole-owners/PROOF.md b/research/retimed-asynchronous-whole-owners/PROOF.md new file mode 100644 index 0000000000..dd2bb1652e --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/PROOF.md @@ -0,0 +1,89 @@ +# Conditional retiming and asynchronous composition + +## Local interface equality + +Use #502's source-pinned builder. It transfers only the frame fields of +#495's original-word tail, discarding its separate kernel prefix. The 224 +changed A frames and 504 changed B frames preserve every scalar field. The +frozen #484 gauge80-kernel42 selection is then applied unchanged. + +The retimed and original gauged words have identical centres, centre frames, +target levels, root lines, ports, centre scatter, preconditioner and virtual +helper entrances. Their 560 helper widths agree helper by helper: +438 width nine, 104 width eight, 14 width seven and four width five. +The new word is exactly #502's canonical word and emitted local programs, +checked by pinned byte anchors as well as fresh scalar and physical replay. + +Consequently every completed normalized invocation has the same retained +endpoint interface as #505's local dependency: the intended data shear, +one whole residual on each helper owner, and restoration of its private +workspace and borrowed spectators. The retiming changes the paid internal +children, not that endpoint. This statement remains conditional on the +inherited all-size realization contracts, as in both source constructions. + +## Keep the actual asynchronous schedule and owners + +Retain #505's order `(stage + 3*replica/7, stage, replica)` and its frozen +whole physical owners. The order still consists of 72 indivisible complete +cover invocations. Each replica's full local/bridge/idle/terminal projection +is unchanged, and the two final whole-stock events execute once. + +Because the widths and endpoints agree, the same owner-relative open +intervals and disjoint pending blocks remain valid. The independent auditor +reconstructs those intervals from actual last data and bridge touches; it +does not trust search-time stage windows. All 800 owners in each invocation +are distinct. The same actual orthogonal charts and spectator coordinates +apply, with their recipes rebound to the newly emitted local program. + +Replace each completed invocation by its retained endpoint. On every +physical family, active data operations stay in their original order. +Between consecutive touches, the helper residual blocks commute and, +together with the explicitly emitted remainder, reproduce the old pending +child. The argument is #505's sufficient scheduling lemma applied to the +newly checked local interface. It never interleaves unfinished invocations +or splits one residual across physical families. + +## Recompute the paid profile and price + +The unchanged idle remainders are combined with 72 instances of the new +local profile. The plan builder predicts the result by replacing the old +72 local profiles; the independent controller audit then counts the actual +emitted local children and every remainder without trusting that prediction. + +``` +rank 1 2 3 4 5 6 7 8 16 48 +count 171856 19008 41592 6048 22941 6624 2209 1224 1 408 +``` + +Live stock is 7,680; physical stock is 8,258. Rank mass is 558,144, leaving +deficit 73*7680-558144=2496. The maximum child is 48, and depth two still +passes the retained strict condition 73²=5329>2*48²=4608. + +The exact rational moment lower bound, including the inherited bad-cover +allowance, is 1371467217183061206788/10^24. Both independent engines accept +it and reject the next 10^-24 grid point. The nonbinding #493 bit histogram +is independently repriced as a pinned dependency, not treated as a newly +verified bit operator. + +## Prefix, finite invoice and outer assembly + +The newly emitted scalar/Horner envelope is independently reconstructed. +The completed-call norm argument counts 72 local sweeps and 72 individual +bridge sweeps. It needs 20+37+72+72+4=205 bits; 512 are charged. The two-level +row bill includes another 2*512 bits and stays below the retained 20,161 +allowance. Stock, literal operations, routing, explicit remainder operations +and halving are all recounted for this emitted template. + +Six bootstrap levels and all 47 strict outer inequalities yield +κ=68479443547277/50000000000000000=0.001369588870945540. The next κ grid point, +zero eta, zero beta and unit beta are rejected. The price is recomputed from +the combined controller; it is not a sum of independently reported gains. + +## Verification boundary + +Finite replay establishes this concrete local word, owner assignment, +schedule, physical identities, invoice and exact conditional assembly. +It does not prove the inherited all-size compiler, mutable-basis/common-label, +Lemma A realization, restored-row, precision/tape or analytic-transfer +contracts. No unconditional theorem, formal Lean certification, runtime +speedup or attainment of κ=1 is claimed. diff --git a/research/retimed-asynchronous-whole-owners/README.md b/research/retimed-asynchronous-whole-owners/README.md new file mode 100644 index 0000000000..043798d938 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/README.md @@ -0,0 +1,56 @@ +# Retimed local word with asynchronous whole owners + +This composes #502's retimed gauge80-kernel42 word with #505's asynchronous +whole-owner schedule. The conditional result is +**κ = 0.001369588870945540**, with complex supplier +**b = 0.001371467217183061206788**. The unchanged #493 bit supplier remains +nonbinding at c = 0.001565442026981656908596. + +The local word's helper widths and normalized endpoint interfaces are +unchanged, so the same 40,320 whole-owner assignments remain available. +The verifier regenerates their actual charts and events, recomputes the +paid profile and invoice, and freshly checks the retimed local physics. +No improvements are added as numerical percentages. + +``` +python3.14 -m pip install numpy +python3.14 -B research/retimed-asynchronous-whole-owners/verify.py /absolute/new/output +``` + +Python 3.13 or 3.14 and NumPy are required. The verifier is offline and +accepts no cached complex receipts. It checks: + +- Exact retiming transfer, structural/word/pipeline controls, all scalar + columns, both emitted local programs, exact phases and paid wrappers. +- #502's exact canonical-word and local-program byte anchors. +- Every transition and helper instance on 512 local basis columns, plus + 806 basis and eight dense whole-program inputs in both orientations. + Python-integer guards precede fixed-width arithmetic. +- All 72 complete invocations, 40,320 owner uses, actual 73-column charts, + replica event projections, disjoint pending blocks, and 19 controller + mutations. Fourteen local label/accounting controls are also rejected; + not every accounting mutation changes the physical operator. +- The 205-bit global prefix bound with 512 bits charged, the finite row + invoice, two independent rational moment engines, six bootstrap levels, + all 47 strict outer inequalities, and next-grid/parameter controls. + +The published #493 bit operator is a pinned dependency. This verifier +reprices its published histogram with both engines; it does not rebuild +that unchanged bit operator. #502's separate full verification included it. + +The all-size compiler, common-label/mutable-basis transport, #484 Lemma A +realization, restored-row, precision/tape and analytic-transfer interfaces +remain explicit conditions. This is neither an unconditional multiplication +theorem nor a Lean proof, and κ is an exponent saving, not measured runtime. +The disputed cross-family split interface of #448/#494 is not used. + +`PROOF.md` gives the composition; `SOURCE.json` pins all copied source bytes. +`references/UPSTREAM-REPLAY.json` records #505's two reproduced packaging +issues: its missing manifest-listed `.gitattributes`, and a final template +hash that embeds the CRLF encoding of the residual-adapter JSON. Its eleven +mathematical replay stages and exact numerical result passed locally; its +published verifier did not pass unchanged. This package has its own complete +manifest and does not fabricate the missing file or weaken source hashes. + +Prepared by chafreaky with OpenAI Codex. Source credit and retained notices +are in `NOTICE.md` and the byte-pinned vendor directories. diff --git a/research/retimed-asynchronous-whole-owners/SOURCE.json b/research/retimed-asynchronous-whole-owners/SOURCE.json new file mode 100644 index 0000000000..4f32dca756 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/SOURCE.json @@ -0,0 +1,508 @@ +{ + "files": { + "code/build_retimed.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/code/build_retimed.py", + "sha256": "5177c0f1200d30fb532e58964d67d3cb08f7b9854ea97107f776f1883e36de97" + }, + "code/guarded_lemma.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/code/guarded_lemma.py", + "sha256": "e572010d33bbb39f4756c785270b5fc9cb82ee6ee4d4cd75d0a1ca49d773a587" + }, + "code/lg_mutants_retimed.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/code/lg_mutants_retimed.py", + "sha256": "8f3c5a0fd63a19c70bc2c9026544ec58139b99ade5f1bafd296ccce480d97a4d" + }, + "data/PR495-FULL-WORD.json.gz": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/data/PR495-FULL-WORD.json.gz", + "sha256": "66655cd858afb515dfd4cad43c4fef01f9185af670e144750e9977588ebd4ecf" + }, + "data/PR502-EXPECTED.json": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/EXPECTED.json", + "sha256": "97056026d52482a79a26efdb49d7cf6f44adff837eaa6b7b836e09d8baf76166" + }, + "data/PR502-RESULT.json": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled-validation/RESULT.json", + "sha256": "4a951fc558757d045f8296b4014e4be71553ac7514a4d996d4bf0232ebefec5f" + }, + "references/PR502-PROOF.md": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/PROOF.md", + "sha256": "23370c65953ed2c6fde92c6a5fbcad6a3d106213a8047ad4e40271b4152fd503" + }, + "vendor/complex/e8-complex-gauge-kernel/NOTICE.md": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/NOTICE.md", + "sha256": "7c7a022afe969a09ad5320935daf7db256b8f25ee56ecdcf9fc40eb0836e74ce" + }, + "vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "sha256": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c" + }, + "vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py", + "sha256": "e377ef9d9e90168290a4640250c0fb9c05015104bcc4827bc5ce63f6ca63763a" + }, + "vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "sha256": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc" + }, + "vendor/complex/e8-complex-gauge-kernel/code/audit_hosted_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/audit_hosted_gk.py", + "sha256": "c46c69c1c6fdccce991bf5d5ec7def344d2749c53ad2db976a50ba3a6c37d657" + }, + "vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py", + "sha256": "cf83aa95f03aa812c413905df9f75f13ac8f92f5db6a83cf9b1868aea2dd9de0" + }, + "vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py", + "sha256": "573966c7ad1deac24464414d3886171f594bb3ae3e7236a9ac2447cc40b20211" + }, + "vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py", + "sha256": "cc6fb8bf4644cc3a1799f3bc90dc074adb5663d1889c92f7f73ec9f307acbd36" + }, + "vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py", + "sha256": "d2777571d59736c3fe62b81506ae62c22a3816fbc3abf9303d914e6da6d64258" + }, + "vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "sha256": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23" + }, + "vendor/complex/e8-complex-gauge-kernel/code/gk_common.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198" + }, + "vendor/complex/e8-complex-gauge-kernel/code/gk_word.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "sha256": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b" + }, + "vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py", + "sha256": "8d2c29a5f79e6a1391f96baf44dd9fbe35203b6c11b02a7b2d238cf792ea163f" + }, + "vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "sha256": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py", + "sha256": "f572b7129a546e1b1193fdd5baee4f731a5b9b8a4e8dc7ac170bcad7758e5b9a" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py", + "sha256": "64cdb2cfefc9ec3ed80c277a18848778427c3d3dbda9b7be13f740522478e1de" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py", + "sha256": "8fe3719e8ec5ec49af480b40c15f07612a356f5071ea30e17ae2d8931b3f20ce" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py", + "sha256": "47dcf2e9ae2d99699424d684abebc3d1d2d25b7aa6d440761e19835d140f5fbb" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py", + "sha256": "00068882bf2f2ebadd3f87c94204f226c7938966124bafb9ce6da89bfaf91b45" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py", + "sha256": "cf0d1f8e90a0780244b6de38d6aad08dd42f4c439397a6d5a61fccd23fe7e798" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py", + "sha256": "0ca37829b596d83d0b94c5f0b6b278a100f22e626b2ab3b5210a38f9657c8a27" + }, + "vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py", + "sha256": "5f053e553b1c26e553a844e2891a73b6cc6b79404a7bb5d4722529f7db0d592c" + }, + "vendor/complex/e8-complex-gauge-kernel/code/make_meta.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/make_meta.py", + "sha256": "06e44ae4fc4f3a88989828d6cbdf95524a2d9f65753045cbb3e6cfd7e042d96a" + }, + "vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "sha256": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590" + }, + "vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "sha256": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3" + }, + "vendor/complex/e8-complex-gauge-kernel/code/run_variant.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/code/run_variant.py", + "sha256": "feecf7dff32860a02fbfb96da1049ba35d05b3baf74c4f741b878d4d91903903" + }, + "vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "sha256": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb" + }, + "vendor/complex/split-centres-global/vendor/clifford_exact.py": { + "commit": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "path": "research/e8-retimed-pooled/vendor/pr496/vendor/complex/split-centres-global/vendor/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + "vendor/pr505/ADVERSARIAL-REVIEW.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/ADVERSARIAL-REVIEW.md", + "sha256": "6c8f69452df88c2082568d83ff3692176d391fd1e1db6533d071049ec873163c" + }, + "vendor/pr505/EXPECTED.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/EXPECTED.json", + "sha256": "10d4b326f1d1836995a2722e0901c0f62ceb98b345b51095d84765df3776b6c2" + }, + "vendor/pr505/LICENSE": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/LICENSE", + "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" + }, + "vendor/pr505/MANIFEST.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/MANIFEST.json", + "sha256": "8395a05166d83a27ee9dfa4b16a2e63b93668eedf178edd587270c3ffcc6fa97" + }, + "vendor/pr505/NOTICE.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/NOTICE.md", + "sha256": "b4bf5b4520f22256c18e6378a51cd8270335aed268a84b42d9284273a51eedc3" + }, + "vendor/pr505/PROOF.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/PROOF.md", + "sha256": "1fd10bedaf12f5221c1f22f4e508279ca1a16af7d0733dfdaac6a2a02a8a668a" + }, + "vendor/pr505/README.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/README.md", + "sha256": "e7d793bbc8fa7355f7ab6f4c001965eff3b22ea0e3c029191ec92ee801f9607c" + }, + "vendor/pr505/RESEARCH.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/RESEARCH.md", + "sha256": "00287d17523ce726545bb10171afcb77b0d0cf3bfd8fd835e21b38bad57b0be7" + }, + "vendor/pr505/SCHEDULING-LEMMA.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SCHEDULING-LEMMA.md", + "sha256": "73effa4a41524fb800e0213bd61f470a0cc61f4110af13dcf4037daf24300511" + }, + "vendor/pr505/SNAPSHOT.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SNAPSHOT.md", + "sha256": "8f09e56f76399e3b749f7a284be09a6fbfd1ec2cfaf39c8769a7e99ca69fec7d" + }, + "vendor/pr505/SOURCE-FILES.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SOURCE-FILES.json", + "sha256": "5e174966d33cc1bee5d3421c553954dd5ee764630eb3e2e4395fe04ef2595136" + }, + "vendor/pr505/SOURCES.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/SOURCES.json", + "sha256": "f344c729873c4aac9e5081acfa2f7043334eba1d5af9e5914a3acdfea42f99f1" + }, + "vendor/pr505/code/assemble.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/assemble.py", + "sha256": "9db68cad2738d76052b25c8bdf6485edd6f14025bf47107d2425b10a2bdf69e0" + }, + "vendor/pr505/code/audit_async.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/audit_async.py", + "sha256": "d01ad6a70c4d3132bcd631f175d23bbee44fecc15f2a80a0f14d0d1d2b0a7206" + }, + "vendor/pr505/code/audit_async_invoice.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/audit_async_invoice.py", + "sha256": "6a6e4ea681b34db6d0642e1fddc76d9ffd0cdbaf32119f33ca1232db78a148d2" + }, + "vendor/pr505/code/emit_async.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/code/emit_async.py", + "sha256": "3dca3efbce0e1b775801d072e64995472749553f6f7f3250bb6a898cfe117fbc" + }, + "vendor/pr505/evidence/ASYNC-AUDIT.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/ASYNC-AUDIT.json", + "sha256": "e3f3c8dd3d9ead17031574f86fe7c7887f5f08ead36877b0baa93def9db58431" + }, + "vendor/pr505/evidence/EXACT-ASSEMBLY.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/EXACT-ASSEMBLY.json", + "sha256": "b50c77f8089f9697844dbfb3ad2fb6d954e2bb71bfd544fa970da35cf21b25d0" + }, + "vendor/pr505/evidence/GLOBAL-PREFIX.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/GLOBAL-PREFIX.json", + "sha256": "098cdaa38a9bca8a4aca4aa5be03d6a36e40fe2f81948ab901a23d7cf65922de" + }, + "vendor/pr505/evidence/OWNERS-AND-PROFILE.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/OWNERS-AND-PROFILE.json", + "sha256": "c091ef330ae4566838b3a6c214d57847ce7c9962d5fc161f4ad155cd6bc69b21" + }, + "vendor/pr505/evidence/PREFIX-AND-INVOICE.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/PREFIX-AND-INVOICE.json", + "sha256": "3d38891f6db3fd70728f1bcba7d1f1356250903a15f3916ca91ae1ad98a24c73" + }, + "vendor/pr505/evidence/RESULT.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/RESULT.json", + "sha256": "a8459c77267a3d0c0aba8e1ff31144b32442f6ead3635697a578140f7ccb1720" + }, + "vendor/pr505/evidence/STEPS.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/evidence/STEPS.json", + "sha256": "8d73f35dff32e272525d584b62a984dda8faa5c4dbebcc58016b40cbced905b6" + }, + "vendor/pr505/inputs/ASYNC-3.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/ASYNC-3.json", + "sha256": "8d16c05f4b3239fb5f9ec93958c9436c0cc0c76f6d4899a12bce5b84007d0893" + }, + "vendor/pr505/inputs/ASYNC-OWNERS.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/ASYNC-OWNERS.json.gz", + "sha256": "52cb8c2b5869b429e3fe3b7a8b061792f020f6fad9f402dc4e4656110b9af068" + }, + "vendor/pr505/inputs/BASE-WORD.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/BASE-WORD.json.gz", + "sha256": "da4c5007092fd9456403179ef2a4391aef9fc5310e3eec5f2ab6c49b24147387" + }, + "vendor/pr505/inputs/PR493-EXPECTED.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/PR493-EXPECTED.json", + "sha256": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb" + }, + "vendor/pr505/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz", + "sha256": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9" + }, + "vendor/pr505/inputs/work/complex-network/hamming/PROTOTYPE.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-network/hamming/PROTOTYPE.json", + "sha256": "b155f101a2b7ec8cfc4e7b6e7147b2d51f0dc31d3ea3499bdfa79d399a76be47" + }, + "vendor/pr505/inputs/work/complex-nine-native/DATA-PHASES.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-nine-native/DATA-PHASES.json", + "sha256": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a" + }, + "vendor/pr505/inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz", + "sha256": "1b84904a31a733aab9bfdda3f528c06719f590d2133a43687a8bded955dc991e" + }, + "vendor/pr505/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz", + "sha256": "77b0c0fa19ef3da1c7316010e13493aa5eea1a50c3506eddc08f7480e659878b" + }, + "vendor/pr505/inputs/work/odd-stages/clifford_exact.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/odd-stages/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + "vendor/pr505/inputs/work/pr361/code/engines/base_two_moment.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr361/code/engines/base_two_moment.py", + "sha256": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098" + }, + "vendor/pr505/inputs/work/pr361/code/engines/moment.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr361/code/engines/moment.py", + "sha256": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482" + }, + "vendor/pr505/inputs/work/pr361/code/engines/outer.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr361/code/engines/outer.py", + "sha256": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c" + }, + "vendor/pr505/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz", + "sha256": "1fb726ea3818fe0837cceb0dd22a71a0814f064e5e781628104610d6468e0e55" + }, + "vendor/pr505/references/PR493-NOTICE.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/references/PR493-NOTICE.md", + "sha256": "08415e4ce4b9f81afdb4ee9b9ca01a055b81dec36dbc1fbc5ecafcdc8bfe94ed" + }, + "vendor/pr505/references/PR496-PROOF.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/references/PR496-PROOF.md", + "sha256": "144f1bf6952b3e31e99cf372a2cae9a13f96c9988808fe8a57ec70b09ee2007c" + }, + "vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/APPENDIX-MANIFEST.json", + "sha256": "19565a7d405d86d6432f44221f040702d38822b351b52969f308567112ef9424" + }, + "vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/APPENDIX-SOURCES.json", + "sha256": "2ed72f0c9d97317ac7627614601a3fb41633bf5536d70ec6b24733a63dccfb37" + }, + "vendor/pr505/research-notes/kernel/BASE-WORD.json.gz": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/BASE-WORD.json.gz", + "sha256": "8b91151043fd61afe379314e4fb1e647cf9cd3cfe98462920d3faba5b1f268f2" + }, + "vendor/pr505/research-notes/kernel/COMPONENT-SELECTION.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/COMPONENT-SELECTION.json", + "sha256": "b682f7cff6de4f40bdadfc64a9ecb9b03a8d77dbf29be3748fa9d742dc894071" + }, + "vendor/pr505/research-notes/kernel/JOINT-47-SELECTION.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/JOINT-47-SELECTION.json", + "sha256": "89ca715918bfbb04fad2eaee8a95a40324859cd0955512eb13077502e7d950e3" + }, + "vendor/pr505/research-notes/kernel/JOINT-51-SELECTION.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/JOINT-51-SELECTION.json", + "sha256": "7094bb647cc9951a5385660a9ec5f012a427fd118baacaf3d5e9f28cb436acc7" + }, + "vendor/pr505/research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json", + "sha256": "68a6adf3bcfbe8e8e4ffb7b4a672da5649c85f84c42813940e6dbb3cf20c2b99" + }, + "vendor/pr505/research-notes/kernel/REBUILD.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/REBUILD.json", + "sha256": "e18727e4191e18838382948ced1c7506d74b3d43caa3853ce751684eef52d8d6" + }, + "vendor/pr505/research-notes/kernel/RESEARCH-APPENDIX.md": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/RESEARCH-APPENDIX.md", + "sha256": "24ec2b2ff1174fcec7342307cff723e01c90513415f348665c43d0220ba04e3a" + }, + "vendor/pr505/research-notes/kernel/audit_component_scalar.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/audit_component_scalar.py", + "sha256": "feab9aa6dbcd8f9fffa6dbdb981d15ffc850402ae91cf45f946ff069cac54037" + }, + "vendor/pr505/research-notes/kernel/rebuild_candidate.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/research-notes/kernel/rebuild_candidate.py", + "sha256": "f8063d539f772fb63712bed787a1c472da28c9baf38b88e3ae14806632d4afb7" + }, + "vendor/pr505/vendor/audit_scalar_invoice.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/audit_scalar_invoice.py", + "sha256": "652eed65fe8f72ab486dcdbe761f401f8a2d43530f2fb0c5c7777be488cd4648" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "sha256": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "sha256": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "sha256": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "sha256": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "sha256": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "sha256": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "sha256": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3" + }, + "vendor/pr505/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "sha256": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb" + }, + "vendor/pr505/vendor/complex/split-centres-global/code/complex_phases_full.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/split-centres-global/code/complex_phases_full.py", + "sha256": "0f2795aaffafe0c64d77f3748ef2109a3c42c58da867e4cf269a0a8cb6109466" + }, + "vendor/pr505/vendor/complex/split-centres-global/vendor/clifford_exact.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/vendor/complex/split-centres-global/vendor/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + "vendor/pr505/verify.py": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/verify.py", + "sha256": "5f36c115ba65135b95117229cba7ca78ad2bc47032036d88d8ee25bbcde1a084" + }, + "vendor/pr505/verify.sh": { + "commit": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "path": "research/asynchronous-whole-owners/verify.sh", + "sha256": "2b1b51f757d8ddf81941c8c96007a2256336856c2e017bcf6c3a37576c82bc8b" + } + }, + "sources": { + "PR502": "4d30b8322184598e65e90a92389e17e1baedd9eb", + "PR505": "4ee769c8e28837482272b5f4742497da8e2fc9d4" + }, + "upstream_packaging": { + "PR505_missing_file": ".gitattributes", + "manifest_expected_sha256": "4ce4b6e6b8435f8c3a8387387732964a2ebf0183e8d77b8247ae8061b033e462", + "note": "Absent from the upstream Git tree. No missing source file is fabricated; this derivative hashes all actually vendored files in its complete manifest." + } +} diff --git a/research/retimed-asynchronous-whole-owners/code/build_plan.py b/research/retimed-asynchronous-whole-owners/code/build_plan.py new file mode 100644 index 0000000000..29464e7619 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/code/build_plan.py @@ -0,0 +1,32 @@ +"""Transfer a frozen asynchronous ownership plan to the unchanged-width word.""" +from pathlib import Path +from collections import Counter +import sys, json, gzip, hashlib + +package, base, changed, source, output, receipt = map(Path, sys.argv[1:7]) +sys.path.insert(0, str(package/'code')) +import gk_word as G +read=lambda p:json.loads(gzip.decompress(p.read_bytes()) if p.suffix=='.gz' else p.read_bytes()) +old=G.build(read(base),read(package/'data/selections/gauge80-kernel42.json')) +new=read(changed) +keys=['centers','center_frames','target_levels','root_lines','ports','cut','precondition','start_extra','scatter'] +assert all(old[k]==new[k] for k in keys) +assert G.widths_of(old)==G.widths_of(new) +old_local=G.profile(old);new_local=G.profile(new) +assert old_local==Counter({int(r):n for r,n in old['report']['local_profile'].items()}) +assert new_local==Counter({int(r):n for r,n in new['report']['local_profile'].items()}) +plan=read(source);profile=Counter({int(r):n for r,n in plan['profile'].items()}) +for r,n in old_local.items():profile[r]-=72*n +for r,n in new_local.items():profile[r]+=72*n +assert all(n>=0 for n in profile.values()) +assert 73*7680-sum(r*n for r,n in profile.items())==2496 +plan['profile']=dict(sorted((r,n) for r,n in profile.items() if n)) +output.write_text(json.dumps(plan,indent=2)+'\n') +assert {k:v for k,v in read(output).items() if k!='profile'}=={k:v for k,v in read(source).items() if k!='profile'} +result=dict(status='PASS_UNCHANGED_WIDTH_ASYNC_PLAN_TRANSFER',preserved_fields=keys, + helper_widths=dict(sorted(Counter(G.widths_of(new)).items())), + old_local_profile=dict(sorted(old_local.items())),new_local_profile=dict(sorted(new_local.items())), + predicted_profile=plan['profile'],plan_sha256=hashlib.sha256(output.read_bytes()).hexdigest(), + scope='Only local paid profile changes. The independent emitted-controller audit must reconstruct all owners, events and actual paid children.') +receipt.write_text(json.dumps(result,indent=2)+'\n') +print(result['status'],flush=True) diff --git a/research/retimed-asynchronous-whole-owners/code/build_retimed.py b/research/retimed-asynchronous-whole-owners/code/build_retimed.py new file mode 100644 index 0000000000..8ed4e8f141 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/code/build_retimed.py @@ -0,0 +1,90 @@ +"""Transfer PR495's main-word frame schedule onto PR484's frozen gauge selection. + +Prepared by OpenAI Codex. Apache-2.0. +Usage: build_retimed.py COMPLEX484_PACKAGE BASE_WORD RETIMED495_WORD OUT +The caller must independently replay the resulting physical programs. This +builder certifies the structural transfer, not the inherited all-size contracts. +""" +from pathlib import Path +import copy +import gzip +import hashlib +import json +import sys + +if not __debug__: + raise RuntimeError('assertions must remain enabled') +assert len(sys.argv) == 5, __doc__ +package, base_path, schedule_path, out = map(lambda s: Path(s).resolve(), sys.argv[1:]) +assert not out.exists() +sys.path.insert(0, str(package / 'code')) +import gk_word as G + + +def read(path): + raw = path.read_bytes() + return json.loads(gzip.decompress(raw) if path.suffix == '.gz' else raw) + + +def transfer(base, candidate): + word = copy.deepcopy(base) + changed, prefixes = {}, {} + for part in ('A', 'B'): + assert len(candidate[part]) >= len(base[part]) + tail = candidate[part][-len(base[part]):] + # Discard the separate PR495 entrance kernel. Only the frame field of + # the identical original scalar word is permitted to cross this gate. + assert [e[:-1] for e in tail] == [e[:-1] for e in base[part]], part + changed[part] = sum(x[-1] != y[-1] for x, y in zip(base[part], tail)) + prefixes[part] = len(candidate[part]) - len(base[part]) + word[part] = copy.deepcopy(tail) + word['cleanup'] = [G.inverse(e, G.FULL) for e in reversed(word['A'] + word['B']) + if not G.V <= e[1] < 2 * G.V] + return word, changed, prefixes + + +base, candidate = read(base_path), read(schedule_path) +assert len(base['A']) == 2736 and len(base['B']) == 840 +selection_path = package / 'data/selections/gauge80-kernel42.json' +selection = read(selection_path) +word, changed, discarded = transfer(base, candidate) +assert changed == {'A': 224, 'B': 504} +assert discarded == {'A': 229, 'B': 0} +original_gauge = G.build(base, selection) +retimed_gauge = G.build(word, selection) +preserved = ['centers', 'center_frames', 'target_levels', 'root_lines', 'ports', + 'cut', 'precondition', 'start_extra', 'scatter'] +assert all(original_gauge[k] == retimed_gauge[k] for k in preserved) +assert len(retimed_gauge['start_extra']) == 122 +assert sum(map(len, retimed_gauge['start_extra'].values())) == 148 + +# Check that the transfer gate cannot smuggle a changed scalar coefficient or +# register through the otherwise identical main-word tail. +controls = [] +for part, field in [('A', 1), ('B', 3)]: + bad = copy.deepcopy(candidate) + event = bad[part][-len(base[part])] + event[field] += 1 + try: + transfer(base, bad) + except AssertionError: + controls.append([part, field]) + else: + raise AssertionError('changed scalar field accepted') +assert len(controls) == 2 + +out.mkdir(parents=True) +for name, value in [('RETIMED-BASE.json.gz', word), ('FULL-WORD.json.gz', retimed_gauge)]: + (out / name).write_bytes(G.dump(value)) +receipt = dict( + status='PASS_STRUCTURAL_MAIN_WORD_RETIMING_TRANSFER', + source_files={str(p): hashlib.sha256(p.read_bytes()).hexdigest() + for p in [base_path, schedule_path, selection_path]}, + changed_frames=changed, discarded_prefix_events=discarded, + preserved_gauge_fields=preserved, entering_helpers=122, entrance_rank=148, + local_profile=retimed_gauge['report']['local_profile'], + transfer_controls_rejected=controls, + outputs={p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in out.iterdir()}, + scope='Structural transfer; scalar, frame, phase, whole-program, hosting and finite assembly checks must run independently.') +(out / 'TRANSFER.json').write_text(json.dumps(receipt, indent=2) + '\n') +print(receipt['status'], changed, flush=True) diff --git a/research/retimed-asynchronous-whole-owners/code/guarded_lemma.py b/research/retimed-asynchronous-whole-owners/code/guarded_lemma.py new file mode 100644 index 0000000000..9e4d0d7a71 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/code/guarded_lemma.py @@ -0,0 +1,32 @@ +"""Guard PR484 dyadic int64 expansions before executing exact arithmetic. +OpenAI Codex. Upstream simulator is unchanged; inherited identity checked fresh. +Usage: guarded_lemma.py COMPLEX_PACKAGE SCRIPT [script arguments...] +""" +import sys,runpy,json +from pathlib import Path +SRC=Path(sys.argv[1]).resolve()/'code/lemmaG';script=sys.argv[2];args=sys.argv[3:] +sys.path.insert(0,str(SRC));import gd +stats=dict(add_calls=0,scale_calls=0,primitive_calls=0,maximum_proved_numerator_bits=0) +def maxabs(a):return max(abs(int(a.min())),abs(int(a.max())))if a.size else 0 +def record_bound(x,op): + stats['maximum_proved_numerator_bits']=max(stats['maximum_proved_numerator_bits'],x.bit_length());assert x<1<<63,(op,'mathematical int64 overflow',x) +oldadd=gd.GD.add_scaled +def add(self,src,num,den): + assert den>0 and den&(den-1)==0 + e=den.bit_length()-1;D=max(self.d,src.d+e);sa=D-self.d;sb=D-src.d-e + for a,b in((self.re,src.re),(self.im,src.im)):record_bound((maxabs(a)< the clause is needed for the operator identity; PASS => the clause is an accounting clause + (paid children / rank mass / lifetimes), needed for the cost certificate, not for exactness.""" +import copy, json, random, sys, time +from lg_lib import load, check_labels, scalar_replay, Frames, rank2 +from lg_phys import Model, run, expected, compare +from gd import GD +import os +SP = os.environ['LG_BASE'] # the output directory of verify.py: //{split-centres,hosted} +d = load(f'{SP}/gauge80-kernel42'); c0 = d['c']; m = Model(d); v = c0['v']; start = c0['start']; Fr = Frames(c0['frames']) +FW, BW = d['progs']['forward'], d['progs']['backward'] +iA = FW.index(['phase', 'A']); iC = FW.index(['phase', 'centers']); iB = FW.index(['phase', 'B']) + + +def comp_gates(ev): + out = [] + for i in range(iA + 1, iC): + e = ev[i] + if e[0] == 'scalar' and e[1][0] == 'add': + t, s = e[1][1][1], e[1][2][1] + if v <= t < 2 * v and start[s] != 0 and e[2] == start[s]: out.append(i) + return out + + +def climbs_of(ev, r, lo=0, hi=None): + return [i for i in range(lo, hi or len(ev)) if ev[i][0] == 'climb' and ev[i][2] == r] + + +def both(fn): + """apply an index-based edit to forward and backward alike (outside the centre phase the streams are aligned)""" + return fn(copy.deepcopy(FW), 'forward'), fn(copy.deepcopy(BW), 'backward') + + +def physics(fw, bw, regs, orients=('forward', 'backward')): + rng = random.Random(7); cols = [(r, b) for r in regs for b in (0, rng.randrange(1, 512))] + [(rng.randrange(m.n), rng.randrange(512)) for _ in range(8)] + init = {} + for ci, (r, b) in enumerate(cols): init.setdefault(('L', r), GD.zeros(len(cols))).re[b, ci] = 1 + res = {} + for o, ev in (('forward', fw), ('backward', bw)): + if o not in orients or ev is None: continue + try: + got = run(m, ev, init, mode='fallback'); bad, left = compare(m, got, expected(m, init, o == 'backward')) + res[o] = 'PASS' if not bad and not left else f'FAIL (registers {bad[:4]})' + except Exception as ex: res[o] = f'FAIL ({type(ex).__name__}: {ex})' + return res + + +def checker(fw, bw, c=None): + c = c or c0; out = set(); msgs = [] + for o, ev in (('forward', fw), ('backward', bw)): + if ev is None: continue + viol, info, _ = check_labels(c, ev, o == 'backward'); sv = scalar_replay(c, ev, o == 'backward') + out |= {x[0] for x in viol + sv}; msgs += [f'{o}: {x[0]} {x[1]}' for x in (viol + sv)[:2]] + return sorted(out), msgs[:3] + + +R = [] +def record(name, clause, fw, bw, regs, c=None, orients=('forward', 'backward')): + t = time.time(); flags, msgs = checker(fw, bw, c); ph = physics(fw, bw, regs, orients) + R.append(dict(mutant=name, violates=clause, checker_flags=flags, rejected=bool(flags), first_messages=msgs, physics=ph, seconds=round(time.time() - t, 1))) + print(json.dumps(R[-1]), flush=True) + + +# ---------- choose instances --------------------------------------------------------------------------------------- +CG = comp_gates(FW) +# a target whose comps span two levels E1 < E2 with the climb E1 -> E2 in between +tgt2 = None +for i in CG: + t = FW[i][1][1][1]; cl = climbs_of(FW, t, iA, iC) + if len(cl) == 2: tgt2 = t; break +g0 = CG[0]; t0_, s0_ = FW[g0][1][1][1], FW[g0][1][2][1]; E0 = FW[g0][2] + +# M1 G0 at a compensation gate: the target is NOT at E_j (its climb 0->E removed; next climb starts at 0) +def m1(ev, o): + cl = climbs_of(ev, t0_, iA, None); a = cl[0]; assert ev[a][3] == 0 and ev[a][4] == E0 and a < g0 + nxt = cl[1]; ev[nxt] = ['climb', ev[nxt][1], t0_, 0, ev[nxt][4], Fr.dim[ev[nxt][4]]]; del ev[a]; return ev +fw, bw = both(m1); record('M1 compensation gate with the target still at label 0', 'G0 (common label at a nonzero-frame compensation)', fw, bw, [t0_, s0_]) + +# M2 G1 virtual entrance violated: a physical T_E (climb 0 -> E) is executed on the helper; its start is declared 0 +def m2(ev, o): + i = ev.index(['phase', 'A']); ev.insert(i + 1, ['climb', 'A', s0_, 0, start[s0_], Fr.dim[start[s0_]]]); return ev +c2 = copy.deepcopy(c0); c2['start'][s0_] = 0 +fw, bw = both(m2); record('M2 physical T_E on an entering helper (no virtual entrance)', 'G1 (virtual entrance)', fw, bw, [s0_], c=c2) + +# M3 G2 (target chain monotone; the (b) condition): the target visits its levels out of nesting order (E2 first, descends to E1) +def m3(ev, o): + t = tgt2; cl = climbs_of(ev, t, iA, iC); a, b = cl[0], cl[1] # 0->E1 at a, E1->E2 at b + E1, E2 = ev[a][4], ev[b][4]; assert Fr.sub(E1, E2) + g1 = [i for i in range(a + 1, b) if ev[i][0] == 'scalar' and ev[i][1][0] == 'add' and t in (ev[i][1][1][1], ev[i][1][2][1])] + E1g = [ev[i] for i in g1] + for i in reversed(g1): del ev[i] + b -= len(g1); ev[a] = ['climb', 'A', t, 0, E2, Fr.dim[E2]]; del ev[b] + iCm = ev.index(['phase', 'centers']) + last = max(i for i in range(a, iCm) if ev[i][0] == 'scalar' and ev[i][1][0] == 'add' and t in (ev[i][1][1][1], ev[i][1][2][1])) + ins = [['climb', 'A', t, E2, E1, Fr.dim[E1] - Fr.dim[E2]]] + E1g + [['climb', 'A', t, E1, E2, Fr.dim[E2] - Fr.dim[E1]]] + ev[last + 1:last + 1] = ins; return ev +fw, bw = both(m3); record('M3 target visits its entrance levels out of nesting order (descends E2 -> E1)', 'G2 (monotone nested chain; selection condition (b))', fw, bw, [tgt2]) + +# M3b G2 for a helper (selection condition (a)): the entering helper's first climb detours through a frame that does not contain E_j +def m3b(ev, o): + cl = climbs_of(ev, s0_); i = cl[0]; a, b = ev[i][3], ev[i][4] + X = next(f for f in range(len(Fr.F)) if Fr.dim[f] == Fr.dim[a] and not Fr.sub(a, f) and Fr.sub(f, b)) + ev[i:i + 1] = [['climb', ev[i][1], s0_, a, X, 0], ['climb', ev[i][1], s0_, X, b, Fr.dim[b] - Fr.dim[X]]]; return ev +fw, bw = both(m3b); record('M3b entering helper leaves the nested chain (E_j -> X -> F, X not containing E_j)', 'G2 (monotone nested chain; selection condition (a))', fw, bw, [s0_]) + +# centre mutants (forward stream; the centre phase is orientation specific) +cents = {} +for i in range(iC + 1, iB): + e = FW[i] + if e[0] == 'center': cents.setdefault(e[1], []).append(i) +kdeep = next(k for k, L in cents.items() if len(L) >= 3) # a centre with a chain c_k -> L1 -> L2 -> ... -> 0 +st = cents[kdeep]; rk = c0['centers'][kdeep] +scat_after = lambda i: [j for j in range(i + 1, iB) if FW[j][0] == 'scalar' and FW[j][1][0] == 'add' and FW[j][1][2] == ['C', kdeep] and all(FW[q][0] != 'center' for q in range(i + 1, j))] +lev1 = scat_after(st[0]) # scatters at the first served level L1 != 0 +tl = FW[lev1[0]][1][1][1] + +def m4(ev, o): # scatter into a level-L1 target after the copy has descended further + e = ev[lev1[0]]; del ev[lev1[0]]; j = st[1] # st[1] index shifts by one + ev.insert(j, e); return ev +record('M4 scatter into a level-L1 target after the copy descended below L1', 'G3 (scatter meets the target at its level)', m4(copy.deepcopy(FW), 'f'), None, [rk, tl], orients=('forward',)) + +def m5(ev, o): # the last descent L_last -> 0 skipped; level-0 targets scattered at L_last + j = st[-1]; del ev[j]; return ev +r5 = [FW[j][1][1][1] for j in scat_after(st[-1])][:2] +record('M5 last centre descent step skipped (level-0 targets scattered at L_last)', 'G3 (chain reaches every served level; bottom 0)', m5(copy.deepcopy(FW), 'f'), None, [rk] + r5, orients=('forward',)) + +def m6(ev, o): # copy made after the first descent: the copy is declared at L1 while the centre register is at c_k + cp = next(j for j in range(iC, st[0]) if ev[j][0] == 'scalar' and ev[j][1][0] == 'copy' and ev[j][1][1] == ['C', kdeep]) + e = ev[cp]; del ev[cp]; ev.insert(st[0], ['scalar', e[1], FW[st[0]][3]]); return ev +record('M6 centre copy taken at the wrong label (after the first descent)', 'G3 (copy at the centre label c_k)', m6(copy.deepcopy(FW), 'f'), None, [rk, tl], orients=('forward',)) + +def m7(ev, o): # a climb of an unrelated register moved inside a live centre phase + touched = {x[1] for e in ev[iC:iB] if e[0] == 'scalar' for x in e[1][1:] if isinstance(x, list) and x[0] == 'L'} + def free(i): # no event touches the register between the centre phase and this climb + r = ev[i][2] + for q in range(iC, i): + e = ev[q] + if e[0] in ('climb',) and e[2] == r: return False + if e[0] == 'scalar' and any(isinstance(x, list) and x == ['L', r] for x in e[1][1:]): return False + return True + j = next(i for i in range(iB, len(ev)) if ev[i][0] == 'climb' and ev[i][2] not in touched and free(i)); e = ev[j]; del ev[j] + ev.insert(st[0] + 1, ['climb', 'centers', e[2], e[3], e[4], e[5]]); return ev +fw7 = m7(copy.deepcopy(FW), 'f'); r7 = fw7[st[0] + 1][2] +record('M7 a child of another register runs while a centre copy is live', 'G3 (copy lifetime)', fw7, None, [r7, rk], orients=('forward',)) + +# Portability: retiming changes the frame catalog. Choose an available first +# centre descent and a recorded one-dimension extension outside that centre, +# instead of assuming the first deep centre has such a catalog entry. +m8_candidates = [(steps[0], k, f) for k, steps in cents.items() for f in range(len(Fr.F)) + if Fr.dim[f] == Fr.dim[FW[steps[0]][3]] + 1 + and Fr.sub(FW[steps[0]][3], f) and not Fr.sub(f, FW[steps[0]][2])] +j8, k8, X8 = m8_candidates[0] +rk8 = c0['centers'][k8] +tl8 = next(e[1][1][1] for e in FW[iC:iB] if e[0] == 'scalar' and e[1][0] == 'add' and e[1][2] == ['C', k8]) +assert FW[j8][2] == c0['center_frames'][k8] and not Fr.sub(X8, FW[j8][2]) +def m8(ev, o): + a, b = ev[j8][2], ev[j8][3] + ev[j8:j8 + 1] = [['center', k8, a, X8, Fr.dim[a] - Fr.dim[X8]], ['center', k8, X8, b, 1]] + return ev +record('M8 centre chain leaves the centre frame (c_k -> X -> L1, X not inside c_k)', 'G3 (nested chain inside c_k; selection condition (c))', m8(copy.deepcopy(FW), 'f'), None, [rk8, tl8], orients=('forward',)) +assert 'G3' in R[-1]['checker_flags'] + +# M9 coefficient of one compensation doubled (labels intact) +def m9(ev, o): + e = ev[g0]; e[1][3] *= 2; return ev +fw, bw = both(m9); record('M9 compensation coefficient doubled', 'S (scalar identity)', fw, bw, [t0_, s0_]) + +# M10 compensation executed after the helper's first climb (not as the first gate on j) +def m10(ev, o): + e = ev[g0]; j = climbs_of(ev, s0_)[0]; del ev[g0]; ev.insert(j, e); return ev +fw, bw = both(m10); record('M10 compensation moved after the helper started climbing', 'G0 + S (compensation reads the entrance value)', fw, bw, [t0_, s0_]) + +# M11 kernel update with the donor still at label 0 +kg = next(i for i in range(iA + 1, iC) if FW[i][0] == 'scalar' and FW[i][1][0] == 'add' and FW[i][1][1][1] >= 2 * v and start[FW[i][1][2][1]] != 0 and FW[i][2] != 0) +dn = FW[kg][1][1][1] +def m11(ev, o): + cl = climbs_of(ev, dn); a = cl[0]; assert ev[a][3] == 0 and a < kg + ev[cl[1]] = ['climb', ev[cl[1]][1], dn, 0, ev[cl[1]][4], Fr.dim[ev[cl[1]][4]]]; del ev[a]; return ev +fw, bw = both(m11); record('M11 kernel donor update with the donor still at label 0', 'G0 (common label at a nonzero-frame kernel update; inherited #471)', fw, bw, [dn, FW[kg][1][2][1]]) + +# M12 pre wrapper after the helper's first gate +def m12(ev, o): + p = ev.index(['residual_adapter', 'pre', s0_, start[s0_]]); e = ev[p]; del ev[p]; ev.insert(g0, e); return ev +fw, bw = both(m12); record('M12 R_E^-1 wrapper after the first gate on the helper', 'G1 (wrapper surrounds the whole invocation)', fw, bw, [s0_, t0_]) + +# M13 post wrapper dropped +def m13(ev, o): + ev.remove(['residual_adapter', 'post', s0_, start[s0_]]); return ev +fw, bw = both(m13); record('M13 L_E^-1 wrapper dropped', 'G1 (wrapper surrounds the whole invocation)', fw, bw, [s0_]) + +json.dump(R, open('MUTANTS.json', 'w'), indent=1) +print('rejected by the checker:', sum(r['rejected'] for r in R), '/', len(R)) + +assert len(R) == 14 and all(r['rejected'] for r in R) diff --git a/research/retimed-asynchronous-whole-owners/data/PR495-FULL-WORD.json.gz b/research/retimed-asynchronous-whole-owners/data/PR495-FULL-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..79b1622b1e20d5fbe3d02894fb04c5a4487f4d80 GIT binary patch literal 37843 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�^`@$ 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%0D# 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 2·8². The unchanged #493 bit supplier is rebuilt using real Boost. Its actual three-level coefficient and row allowance enter the six bootstrap levels and all 47 strict outer inequalities, producing κ = 1343518018117309/10^18. The next κ grid point, zero eta, zero beta and unit beta are rejected. + +## 4. Scope and weakest steps + +The new finite evidence establishes the transferred schedule and its whole-owner composition under the same contracts as #484 and #496. The outstanding all-size compiler, common-label transport, mutable-basis/restored-row, precision/tape and analytic-transfer obligations remain conditions. In particular, #484's Lemma A realization with borrowed spectators is retained. Neither successful finite replay nor the small serial reuse model proves those all-size interfaces. This construction does not use the disputed cross-family splitting interface of #448/#494, makes no comparison under that different interface, and does not attain κ = 1. diff --git a/research/retimed-asynchronous-whole-owners/references/UPSTREAM-REPLAY.json b/research/retimed-asynchronous-whole-owners/references/UPSTREAM-REPLAY.json new file mode 100644 index 0000000000..012e5714de --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/references/UPSTREAM-REPLAY.json @@ -0,0 +1,33 @@ +{ + "completed_stages": [ + "construct", + "scalar", + "emit-local", + "phases", + "adapters", + "parent-integration", + "parent-replay", + "emit-async", + "independent-async", + "invoice", + "two-moments-assembly" + ], + "fresh_adapter_lf_sha256": "546196e37830b9ccbc544834cb6f37ba4ad841faf96f025fe5155f5ba3924e07", + "fresh_template_sha256": "aa7418710aba299895453a437fdfc02564f73f2ed202a0b4a6c4b296a079b995", + "missing_expected_sha256": "4ce4b6e6b8435f8c3a8387387732964a2ebf0183e8d77b8247ae8061b033e462", + "missing_manifest_file": ".gitattributes", + "numerical_result": { + "bit_lower": "391360506745414227149/250000000000000000000000", + "complex_lower": "679773808909616785409/500000000000000000000000", + "kappa": "67885087881447/50000000000000000", + "kappa_decimal": "0.001357701757628940" + }, + "only_template_field_difference": "residual_adapter_sha256", + "present_manifest_files_verified": 63, + "published_adapter_crlf_sha256": "a4cec4b3ccaebb33cf169b50230c4033eb956f9e75fad64cf6647a3f794c5cca", + "published_template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "scope": "Published verify.py fails unchanged. A wrapper allowed only the known absent metadata file; all eleven mathematical stages then passed, before the final serialized-template anchor failed. Exact CRLF reconstruction and one-field substitution reproduce that anchor. No mathematical assertion or source-file hash was weakened.", + "source_head": "4ee769c8e28837482272b5f4742497da8e2fc9d4", + "status": "ALL_11_MATHEMATICAL_STAGES_PASS_WITH_DOCUMENTED_PACKAGING_AND_NEWLINE_EXCEPTIONS", + "template_after_one_proven_newline_hash_substitution": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b" +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/NOTICE.md b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/NOTICE.md new file mode 100644 index 0000000000..60c3bb3c7a --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/NOTICE.md @@ -0,0 +1,6 @@ +Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +`code/audit_gk.py`, `emit_gk.py`, `integrate_gk.py`, `replay_gk.py` are marked copies of PR #433's `complex_audit.py`, `complex_emit.py`, +`complex_integrate.py`, `complex_replay.py` (icekylinx with Codex assistance; adapted from PR #425 by jacklightChen / Zhihao Chen, OpenAI Codex); +`hosted_gk.py` of PR #442's `complex_hosted.py` and `audit_hosted_gk.py`, `assemble_gk.py` of its `audit.py`, `assemble.py` (DaysSky, with Claude +assistance). `assemble_gk.py` also follows the generalisation of `assemble.py` in the eleven-stage package of DreamingOfClouds. Every changed line +is marked `GK:`. PR #433's exact phase script `complex_phases_full.py` is run unchanged. diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py new file mode 100644 index 0000000000..252ca9393d --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py @@ -0,0 +1,59 @@ +"""Paid residual wrappers for entering helpers (Lemma A): generation and independent decoding. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. The wrapper construction follows PR #458 +(chafreaky): a helper that starts at frame E and ends at FULL has the physical residual S_E = T_FULL T_E^-1 (apply T_E^-1 first); +S_E = L_E (C_[w] x I) R_E with R_E applied first; the wrappers R_E^-1 before the whole local invocation and L_E^-1 after its +full-frame cleanup turn the residual into the coordinate factor C_[w] x I and restore the other 9 - w coordinates identically. +usage: adapters_gk.py CANONICAL-WORD.json.gz RESIDUAL-ADAPTERS.json OUT-LEMMA-A.json +Writes the recipes (generation uses clifford_exact.lower_child) and then DECODES the serialized monomials with the primitive +constructors of clifford_exact (not lower_child) and checks, for every entrance frame, that L_E^-1 S_E R_E^-1 has exactly the +tableau and zero-state vector (global phase included) of fourier(9, range(w)); mutated recipes (wrong phase, swapped sides, wrong +translation, wrong width) must be rejected.""" +import copy, gzip, json, sys +from pathlib import Path +R = Path(__file__).resolve().parent.parent.parent +sys.path.insert(0, str(R / 'split-centres-global/vendor')) +from clifford_exact import canonical_frame, lower_child, fourier, diag, perm, xgate, Op, identity +n = 9; FULL = tuple(1 << i for i in range(n)) +def monomial_op(rec): + """decode a serialized monomial (matrix rows, quadratic rows, Z4 linear part, translation, phase)""" + out = diag(n, tuple(rec['quadratic_rows']), tuple(rec['linear_Z4'])).then(perm(n, tuple(rec['matrix_rows']))).then(xgate(n, rec['offset'])) + return out.then(Op(n, identity(n), [('phase', rec['phase'])])) +def S_of(U): + return canonical_frame(n, tuple(U)).adjoint().then(canonical_frame(n, FULL)) +def wrapped_ok(U, rec): + """exactly: L^-1 S R^-1 = C_[w] x I (apply order: R^-1, S, L^-1)""" + w = n - len(U); S = S_of(U); Rm = monomial_op(rec['right']); Lm = monomial_op(rec['left']) + net = Rm.adjoint().then(S).then(Lm.adjoint()); target = fourier(n, range(w)) + return rec['rank'] == w and net.tab == target.tab and net.zero_state() == target.zero_state() +def main(): + c = json.load(gzip.open(sys.argv[1])); frames = c['frames']; v = c['v'] + starts = sorted({c['start'][r] for r in range(2 * v, len(c['start'])) if c['start'][r] != 0}) + recipes = {} + for f in starts: + U = frames[f]; rec, compiled = lower_child(S_of(U)) + recipes[str(f)] = dict(frame=f, vectors=list(U), entrance_rank=len(U), rank=rec['rank'], left=rec['left'], right=rec['right']) + Path(sys.argv[2]).write_text(json.dumps(dict(status='RESIDUAL_ADAPTER_RECIPES', recipes=recipes), sort_keys=True, separators=(',', ':')) + '\n') + # ---- independent decode of the serialized file + data = json.loads(Path(sys.argv[2]).read_text())['recipes'] + dot = lambda a, b: bin(a & b).count('1') & 1 + detail = [] + for f in starts: + rec = data[str(f)]; U = frames[f] + assert wrapped_ok(U, rec), ('wrapper product is not C_[w] x I', f) + detail.append(dict(frame=f, entrance_rank=len(U), residual_width=n - len(U), vectors=list(U), all_even_weight=all(bin(x).count('1') % 2 == 0 for x in U), + totally_isotropic=all(dot(a, b) == 0 for a in U for b in U))) + controls = [] + def reject(name, fn): + f = starts[0]; rec = copy.deepcopy(data[str(f)]); fn(rec) + if wrapped_ok(frames[f], rec): raise AssertionError('mutated wrapper accepted: ' + name) + controls.append(name) + reject('wrong global phase', lambda r: r['right'].__setitem__('phase', (r['right']['phase'] + 1) % 4)) + reject('wrong translation', lambda r: r['left'].__setitem__('offset', r['left']['offset'] ^ 1)) + reject('wrong quadratic form', lambda r: r['right'].__setitem__('quadratic_rows', [x ^ 2 if i == 0 else x for i, x in enumerate(r['right']['quadratic_rows'])]) if False else r['right']['linear_Z4'].__setitem__(0, (r['right']['linear_Z4'][0] + 2) % 4)) + reject('sides swapped', lambda r: (r.__setitem__('left', r['right']), r.__setitem__('right', r['left']))) + reject('wrong width', lambda r: r.__setitem__('rank', r['rank'] + 1)) + res = dict(status='PASS_RESIDUAL_WRAPPERS_ARE_EXACT', frames=len(detail), wrappers_reject=controls, all_even_weight=all(d['all_even_weight'] for d in detail), + all_totally_isotropic=all(d['totally_isotropic'] for d in detail), detail=detail) + Path(sys.argv[3]).write_text(json.dumps(res, indent=1) + '\n') + print('Lemma A (exact): L^-1 S_E R^-1 = C_[w] x I for', len(detail), 'entrance frames, global phase included;', len(controls), 'wrapper mutations rejected; all-even-weight:', res['all_even_weight']) +if __name__ == '__main__': main() diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py new file mode 100644 index 0000000000..5973da7f80 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/assemble_gk.py @@ -0,0 +1,77 @@ +# Adapted from DaysSky PR442's assemble.py (complex half and strict outer assembly) and DreamingOfClouds' assemble_k.py by +# DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Apache-2.0. +"""Certified complex saving b for the gauge + kernel word under #442's whole-residual hosting: two exact moment engines, fresh +finite invoices with the hosted stock, then #434's strict outer assembly (six bootstrap levels, 47 inequalities, next-grid and +parameter controls) for each bit supplier listed in BITS.json (pinned inputs: c, charged two-level coefficient bits, row coefficient). +usage: assemble_gk.py PARENT_CHANGED PARENT_SC HOSTED_DIR AUDIT.json BITS.json OUT.json""" +import gzip, hashlib, importlib.util, json, math, sys +from fractions import Fraction as Q +from pathlib import Path +par, psc, cd, ap, bitsp, outp = map(Path, sys.argv[1:7]) +def load(name): + sp = importlib.util.spec_from_file_location('gk_' + name, par / 'work/pr361/code/engines' / (name + '.py')) + mod = importlib.util.module_from_spec(sp); sp.loader.exec_module(mod); return mod +M, Other, Outer = load('moment'), load('base_two_moment'), load('outer') +audit = json.loads(ap.read_text()); ch = json.loads((cd / 'HOSTED.json').read_text()) +assert audit['complex_template_sha256'] == ch['template_sha256'] +# ---------------- complex: two moments and the parent's invoice with the hosted stock +PC = {int(r): n for r, n in audit['complex_profile'].items()}; mc, WC = 73, audit['complex_live']; EC = sum(PC.values()) +massc = sum(r * z for r, z in PC.items()); assert mc * WC - massc == 2496 +rc = M.certify(PC, mc, WC, True); b = Q(int(Q(rc['lower']) * 10 ** 18), 10 ** 18) +fbc = 32 * mc * mc * EC +l3, h3 = Other.moment(mc, WC, list(PC.items()), b); b3, bh3 = Other.moment(mc, WC, [(1, fbc)], b); assert h3 + bh3 / 10 ** 16 < 1 +grid = Q(1, 10 ** 18) +l4, h4 = Other.moment(mc, WC, list(PC.items()), b + grid); b4, bh4 = Other.moment(mc, WC, [(1, fbc)], b + grid); assert l4 + b4 / 10 ** 16 > 1 # next grid point rejected +integ = json.loads((psc / 'INTEGRATION.json').read_text()); inv = integ['finite_invoice'] +physc = ch['physical']; v = 120 +compilerc = 64 * (mc + 1) ** 3 +pervertex = inv['pervertex'] - integ['physical'] * (64 + 1) + physc * (64 + 1) - integ['live'] + WC # stock-dependent terms re-based +r_ = mc // 2; group = 2 ** (r_ * r_) * math.prod(2 ** (2 * i) - 1 for i in range(1, r_ + 1)); stock = group * physc +smass = group * massc; logical = group * max(pervertex, inv['pervertex']) + 64; router = compilerc * (logical + 1) * (stock + 1) ** 2 +GG, EE, C0 = 1 << 30000, 1 << 100000, 1 << 210000; BB = smass + EE +literal = 2 * GG * stock ** 2 + 8 * smass + 4 * stock + 4 + 32 * mc +assert logical < 1 << 6050 and router < GG and literal < EE and BB < 1 << 100001 and 32 * mc * BB * BB < C0 and 2 * BB + 18 < C0 +depth = 2; assert mc ** depth > 2 * max(PC) ** depth +rowc = depth * stock.bit_length() + 9909 + 252; assert rowc < 20161 +# ---------------- outer assembly for each bit supplier, exactly as #434's combined.py +bits = json.loads(bitsp.read_text()); eta = beta = Q(1, 10 ** 18) +def ceil(x): return -((-x.numerator) // x.denominator) +def bootstrap(s_): + chn = [Q(384599, 10 ** 10)] + for j_ in range(6): chn.append((1 - s_) * s_ + s_ * chn[-1]) + q_ = chn[-1] * (1 - 2 * eta); mg = (1 - eta) * q_ / (1 + q_); tk = mg / grid + return chn, grid * ((tk.numerator - 1) // tk.denominator) +results = [] +for sup in bits: + c = Q(sup['c']); two_bits = int(sup['charged_two_level_coefficient_bits']); row = int(sup['row_coefficient']); ALLOW = max(20161, row, rowc) + s = min(c, (1 - beta) * b) - Q(1, 10 ** 24); assert 0 < s < c and s < (1 - beta) * b + chain = [Q(384599, 10 ** 10)]; cutoffs = [] + for j in range(6): + old = chain[-1]; a = (1 - s) * s + s * old + gap = min(s - a, 1 - a - s, 1 - a - s * (1 - old), 1 - s); assert old < a < s < 1 - a and gap > 0 + cutoff = max(ceil(36 / gap ** 2), ceil(2 * (4 + two_bits) / gap)); assert cutoff * gap ** 2 >= 36 and cutoff * gap >= 2 * (4 + two_bits) + cutoffs.append(dict(gap=str(gap), cutoff_log2=str(cutoff))); chain.append(a) + q = chain[-1] * (1 - 2 * eta); margin = (1 - eta) * q / (1 + q); ticks = margin / grid; k = grid * ((ticks.numerator - 1) // ticks.denominator) + bridge = {'semantic': {'C0': {'base': 2, 'exponent': 210000}, 'strict_literal_gap': 1}, 'rows': {'degree_gap': Q(10 ** 6) - Q(51 * ALLOW, 25)}} + a = Outer.assembly(chain[-1], b, bridge, k, eta=eta, beta=beta) + assert len(a['strict_constraints']) == 47 and all(x > 0 for x in a['strict_constraints'].values()) + controls = [] + for name, kk, ee, bb in [('next_grid', k + grid, eta, beta), ('zero_eta', k, Q(0), beta), ('zero_beta', k, eta, Q(0)), ('unit_beta', k, eta, Q(1))]: + try: Outer.assembly(chain[-1], b, bridge, kk, eta=ee, beta=bb) + except AssertionError: controls.append(name) + else: raise AssertionError(name) + results.append(dict(label=sup['label'], source=sup.get('source', ''), bit_lower=str(c), kappa=str(k), kappa_decimal=format(float(k), '.18f'), + binding_component='bit' if c < (1 - beta) * b else 'complex', external_row_allowance=ALLOW, + strict_outer_constraints={n: str(x) for n, x in a['strict_constraints'].items()}, outer_controls=controls, bootstrap=cutoffs)) +# kappa the complex supplier alone supports (a hypothetical bit supplier that does not bind) +c_hyp = b / (1 - beta) + Q(1, 10 ** 24); s_cx = min(c_hyp, (1 - beta) * b) - Q(1, 10 ** 24) +_, k_cx = bootstrap(s_cx) +res = dict(status='PASS_COMPLEX_GAUGE_KERNEL_CERTIFICATION', complex_lower=str(b), complex_decimal=format(float(b), '.18f'), + complex_cap_kappa=str(k_cx), complex_cap_kappa_decimal=format(float(k_cx), '.18f'), + complex=dict(live=WC, physical=physc, maxchild=max(PC), rank_mass=massc, hosted_residuals=audit['complex_hosted_residuals'], + physical_stock_bits=stock.bit_length(), router_bits=router.bit_length(), literal_bits=literal.bit_length(), row_coefficient=rowc, + pervertex_bits=pervertex.bit_length()), + suppliers=results, complex_template_sha256=ch['template_sha256'], widths=audit['widths']) +outp.write_text(json.dumps(res, indent=2) + '\n') +print(res['status'], 'b', res['complex_decimal'], 'complex-cap kappa', res['complex_cap_kappa_decimal']) +for r_ in results: print(' ', r_['label'], 'kappa', r_['kappa_decimal'], 'binding', r_['binding_component'], 'controls', r_['outer_controls']) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py new file mode 100644 index 0000000000..e80ca6b8b3 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py @@ -0,0 +1,189 @@ +# GK: modified copy of PR #433's complex_audit.py (icekylinx with Codex; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:"; with a word that has no start_extra / target_levels the +# behaviour and the written files are PR #433's. +# Modified from PR425 by icekylinx with Codex assistance. +"""Read-back audit, independent of the Hamming producer and its row state.""" +import copy,gzip,hashlib,importlib.util,json,math,time +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +OUT=Path('split-centres');p=OUT/'FULL-WORD.json.gz' +word=json.load(gzip.open(p));v=120;n=240+word['report']['R'];start=time.monotonic() +def apply(e,rows): + if e[0]=='scale': + _,t,a,b,*_=e;q=Q(a,b);assert q + rows[t]={j:q*x for j,x in rows[t].items()} + else: + _,t,s,a,b,*_=e;q=Q(a,b);assert t!=s + 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 ident():return [{r:Q(1)} for r in range(n)] +def inv(e): + e=copy.deepcopy(e) + if e[0]=='add':e[3]*=-1 + else:e[2],e[3]=e[3],e[2] + return e +def dual(e): + e=inv(e) + if e[0]=='add':e[1],e[2]=e[2],e[1] + return e + +main=word['A']+word['cut']+word['B'] +assert all(not 120<=e[2]<240 for e in word['A']+word['B'] if e[0]=='add' and not 120<=e[1]<240) +matrix=ident() +for e in main:apply(e,matrix) +print('full main columns',n,'replayed',flush=True) +# Compute -A_Y^-1 B_S using only rows of the explicit main operator. +dirty=[{} for r in range(n)] +for r in range(v,2*v):dirty[r]={j:x for j,x in matrix[r].items() if j>=2*v} +for e in word['precondition']:apply(e,dirty) +comp=[] +for r in range(v,2*v): + for j,q in sorted(dirty[r].items()):comp.append(['add',r,j,-q.numerator,q.denominator,[]]) + +cleanup=[inv(e) for e in reversed(word['A']+word['B']) if not v<=e[1]<2*v] +assert [e[:-1] for e in cleanup]==[e[:-1] for e in word['cleanup']] +program=word['precondition']+comp+main+cleanup +actual=ident() +for e in program:apply(e,actual) +expected=ident() +for t in range(v):expected[v+t][t]=Q(1) +assert actual==expected +print('PASS exact arbitrary dirt and restored sources/helpers',flush=True) +back=ident() +for e in program:apply(dual(e),back) +expected_back=ident() +for t in range(v):expected_back[t][v+t]=Q(-1) +assert back==expected_back +print('PASS exact inverse-transpose on every column',flush=True) +# Independent sparse vector controls avoid repeating a dense full replay. +def vector(es,x): + x=list(map(Q,x)) + for e in es: + if e[0]=='scale':x[e[1]]*=Q(e[2],e[3]) + else:x[e[1]]+=Q(e[3],e[4])*x[e[2]] + return x +sample=[((i*137+13)%101)-50 for i in range(n)] +want=vector(program,sample) +controls={ + 'missing_dirty_compensation':word['precondition']+main+cleanup, + 'missing_Y_inverse_basis':comp+main+cleanup, + 'missing_source_cleanup':word['precondition']+comp+main, + 'wrong_dual_event_order':[dual(e) for e in reversed(program)], +} +for name,es in controls.items(): + expected_sample=vector([dual(e) for e in program],sample) if name=='wrong_dual_event_order' else want + assert vector(es,sample)!=expected_sample,name + +# Orthogonal transvection and a port permutation bring the new geometry onto +# the already fixed 120-port routing family. Every incidence is transformed. +old=json.load(gzip.open('work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz')) +def tau(x):return x^(43 if (x&43).bit_count()%2 else 0) +assert 43 .bit_count()%2==0 +assert set(map(tau,word['ports']))==set(old['ports']) +mapping={i:old['ports'].index(tau(q)) for i,q in enumerate(word['ports'])} +mapping.update({v+i:v+mapping[i] for i in range(v)}) +mapping.update({r:r for r in range(2*v,n)}) +def basis(vs): + b={} + for x in vs: + for k in sorted(b,reverse=True): + if x>>k&1:x^=b[k] + if x: + k=x.bit_length()-1 + for j in b: + if b[j]>>k&1:b[j]^=x + b[k]=x + return tuple(b[k] for k in sorted(b,reverse=True)) +def perp(x):return basis([z for z in range(1,512) if not (x&z).bit_count()%2]) +full=tuple(1<0 + edges.add((old,f));paid[delta]+=1;cur[r]=f +for part in ('A','B'): + if part=='B': + assert all(cur[r]==f for r,f in zip(can['centers'],can['center_frames'])) + assert all(cur[r]==tlev.get(r-v,0) for r in range(v,2*v)) # GK: targets sit at their level + for r_c,f in zip(can['centers'],can['center_frames']): + # GK: a centre copy descends cf -> served levels (descending chain) -> lowest served level; at the defaults the + # only served level is 0 and this is PR #433's single child of rank |cf| + served={tlev.get(e[1]-v,0) for e in can['cut'] if e[2]==r_c} + o=f + for Lv in sorted(served,key=lambda x:-len(frames[x])): + assert basis(frames[Lv]+frames[o])==tuple(frames[o]),('centre level outside the previous frame',r_c) + if Lv!=o: + paid[len(frames[o])-len(frames[Lv])]+=1 + if not(o==f and Lv==0):edges.add((o,Lv));edges.add((Lv,o)) # (cf,0),(0,cf) are added by the phase script + o=Lv + for e in can[part]: + rs=[e[1]]+([e[2]] if e[0]=='add' else []) + for r in rs:climb(r,e[-1]);incidences+=1 +for r,f in enumerate(can['final']):climb(r,f) +assert dict(paid)=={int(r):x for r,x in word['report']['local_profile'].items()} +# GK: entrances lower the helper climb by their rank; centre descents may stop above frame zero +if not word.get('start_extra') and not word.get('target_levels'):assert sum(r*x for r,x in paid.items())==9*can['R']+240*8+72 +else:assert sum(r*x for r,x in paid.items())==sum(int(r)*x for r,x in word['report']['local_profile'].items()) +can['local_profile']=dict(sorted(paid.items()));can['edges']=sorted(edges) +cp=OUT/'CANONICAL-WORD.json.gz';cp.write_bytes(gzip.compress(json.dumps(can,sort_keys=True,separators=(',',':')).encode(),mtime=0)) + +def engine(name): + p=Path('work/pr361/code/engines')/(name+'.py');s=importlib.util.spec_from_file_location('hamming_'+name,p) + m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m +M,M2=engine('moment'),engine('base_two_moment');m,W=73,word['report'].get('live',12720) # GK: unhosted stock of the word +HG={int(r):z for r,z in word['report']['global_profile'].items()} +root=M.certify(HG,m,W,True);b=Q(int(Q(root['lower'])*10**18),10**18);grid=Q(1,10**18) +assert M.moment(HG,m,W,b,True)[1]<1> i & 1)); a = q ^ (1 << z); order = list(range(L)); order[0], order[z] = order[z], order[0] + return [(1 << i) ^ (a if a >> i & 1 else 0) for i in order] + [1 << i for i in range(L, M)] + + +def audit_complex(t, parent_t, local_checks, widths, strict=False, charts=None): + """strict = PR #458's rule: at most one helper per physical family per invocation, spectators placed exactly. + charts = (ports, DATA-PHASES recipes) for the spectator chart.""" + R = len(widths) + assert t['local_programs'] == parent_t['local_programs'] and len(t['calls']) == 72 + prank = {} + for it in parent_t['idle_children']: prank.setdefault(it['child'], it['rank']) + stage_pair = {e['stage']: e['pair'] for e in t['recipe'] if e['kind'] == 'local'} + ev = []; side = {}; pairs = {} + for e in t['execution_schedule']: + if e['kind'] == 'local_cover_sweep': ev.append(('local', e['stage'], stage_pair[e['stage']])) + elif e['kind'] == 'bridge': ev.append(('bridge', e['dst'], e['src'])) + elif e['kind'] == 'idle_cover_sweep': + for sd, ch in enumerate(e['child_indices']): + if ch in prank: ev.append(('idle', ch, e['pair'])); side[ch] = sd; pairs[ch] = e['pair'] + W = wins(ev); hs = t['hosting'] + if strict: + assert hs.get('max_helpers_per_physical_family_per_call') == 1 + seen = {} # the children of one (pair, side) share their families: windows disjoint + for i in W: + for s_ in W[i]: + k = (pairs[i], side[i], s_); assert k not in seen, ('overlapping windows in one family group', k); seen[k] = i + used = defaultdict(set); hosted = {} + for i, port, off, w, s, h in hs['slots']: + assert w == widths[h] and s in W[i] and 0 <= off and off + w <= prank[i] and 0 <= port < V + cells = set(range(off, off + w)); assert not cells & used[i, port]; used[i, port] |= cells + assert (s, h) not in hosted; hosted[s, h] = (i, port, off, w) + rem = {} + for it in parent_t['idle_children']: rem[it['child'], it['port']] = it['rank'] - len(used[it['child'], it['port']]) + got = {(it['child'], it['port']): it['rank'] for it in t['idle_children']} + assert got == {k: r for k, r in rem.items() if r} and all(it['replicas'] == T for it in t['idle_children']) + LIVE = t['live']; occ = defaultdict(set); bw = {}; specs = []; foot = defaultdict(set) + for c in t['calls']: + s, rep, p = c['stage'], c['replica'], c['pair']; own = c['owners']; assert len(own) == 2 * V + R + if strict: # PR #458's rule on EVERY register class of the invocation (no register class is filtered out) + cnt = Counter(f for f, r in own) + for i_, (f, r) in enumerate(own): + assert f < LIVE, ('owner in the private namespace', f) # centres, reserved tableau and coefficient are never owners + if f < DATA: assert cnt[f] == 1, ('two helpers on one physical family in one invocation (data class)', s, rep) # active wires and hosted helpers of any width + elif i_ >= 2 * V and widths[i_ - 2 * V] < L: assert cnt[f] == 1, ('an entering helper shares its bank family in one invocation (bank class)', s, rep) + else: assert i_ >= 2 * V and r[0] == 2, ('bank class: helpers only', s, rep) # width-9 helpers share a pure bank as in #433 (no wrapper acts on them) + assert own[:2 * V] == next(q for q in parent_t['calls'] if (q['stage'], q['replica']) == (s, rep))['owners'][:2 * V] + for h, (f, r) in enumerate(own[2 * V:]): + w = widths[h] + if (s, h) in hosted: + i, port, off, w2 = hosted[s, h] + assert w2 == w and f == rep * 960 + (2 * pairs[i] + side[i]) * V + port and pairs[i] != p + if not strict: assert r[0] in (3, 4) and r[1:3] == [i, off] and (r[0] == 3 or w < L) # PR #442's rule: slot only (a spectator record, if any, is not read) + elif w == L: assert r == [3, i, off] + else: # exact host chart: residual vectors = pending[off:off+w] in B_q, spectators = the first unused indices + ports_, recipes = charts; B = idle_basis(ports_[port]); pend = [int(x) for x in recipes[port]['idle_children'][i]['orthogonal_axes']] + occ_ = [B.index(x) for x in pend[off:off + w]]; sp = [j for j in range(M) if j not in occ_][:L - w] + assert r == [4, i, off, w, sp] and len(set(occ_) | set(sp)) == L + else: + assert r[0] == 2 and DATA <= f < LIVE + if w == L: assert len(r) == 2; off = r[1] * L # [2, slot]: a width-9 residual of a pure width-9 bank (#433) + else: assert len(r) == 4 and r[2] == w and isinstance(r[3], list); off = r[1] # [2, offset, width, spectator cells]: a banked ENTERING residual + assert 0 <= off and off + w <= M + cells = set(range(off, off + w)); assert not cells & occ[f]; occ[f] |= cells; bw.setdefault(f, []).append((w, len(r) == 2)) + if w < L: specs.append((f, off, w, r[3])) + fp = cells | (set(r[3]) if w < L else set()) + if strict: assert len(fp) == L and not fp & foot[s, rep, f], ('footprints overlap on a bank family', s, rep, f); foot[s, rep, f] |= fp + banks = sorted(occ); assert banks == list(range(DATA, LIVE)) + if strict: # bank chart: the spectators of a banked entering helper are the first cells beyond every residual cell of the bank + for f, off, w, sp in specs: + n_ = len(occ[f]); assert occ[f] == set(range(n_)) and sp == list(range(n_, n_ + L - w)) and n_ + L - w <= M, ('bank spectators are not the first cells beyond the residuals', f) + pn = parent_t['private_namespace']; C_ = pn['centers'][1] - pn['centers'][0] # the private registers sit beyond the live stock and do not overlap it + assert t['physical'] == LIVE + C_ + R + 2 and t['private_namespace'] == {'centers': [LIVE, LIVE + C_], 'reserved_tableau': [LIVE + C_, LIVE + C_ + R], 'coefficient': [t['physical'] - 2, t['physical']]}, 'private namespace' + paid = Counter() + for c in t['calls']: + for r_, z in local_checks[c['orientation']]['paid_profile'].items(): paid[int(r_)] += z + for (ch, port), r_ in rem.items(): + if r_: paid[r_] += T + for f in banks: + pad = M - len(occ[f]); assert pad > 0 and occ[f] == set(range(len(occ[f]))) # packed from offset 0, rest is the pad + pure = all(w == L for w, _ in bw[f]); assert all(sh == (pure and w == L) for w, sh in bw[f]) and (pure or all(w < L for w, _ in bw[f])) # a bank holds only width-9 residuals (short route) or only entering ones + for part in split_pad(pad): paid[part] += 1 # a pad above 51 is paid as nested commuting children (73^2 > 2*child^2) + mass = sum(r * n for r, n in paid.items()); assert M * LIVE - mass == 2496 + assert M * M > 2 * max(paid) ** 2 + return paid, len(hosted) * T + + +def main(): + psc, cd, outp = map(Path, sys.argv[1:4]) + pct = json.loads(gzip.decompress((psc / 'GLOBAL-TEMPLATE.json.gz').read_bytes())) + can = json.loads(gzip.decompress((psc / 'CANONICAL-WORD.json.gz').read_bytes())) + widths = [L - len(can['frames'][can['start'][2 * V + i]]) for i in range(len(can['start']) - 2 * V)] + ct = json.loads(gzip.decompress((cd / 'GLOBAL-TEMPLATE.json.gz').read_bytes())) + ch = json.loads((cd / 'HOSTED.json').read_text()) + assert hashlib.sha256(gzip.decompress((cd / 'GLOBAL-TEMPLATE.json.gz').read_bytes())).hexdigest() == ch['template_sha256'] + lc = json.loads((psc / 'LOCAL-CHECKS.json').read_text()) + strict = '--one-helper-per-family' in sys.argv; sys.argv = [a for a in sys.argv if a != '--one-helper-per-family'] + charts = None + if strict: + ph = json.loads(Path('work/complex-nine-native/DATA-PHASES.json').read_text()); assert [p['q'] for p in ph['recipes']] == can['ports']; charts = (can['ports'], ph['recipes']) + cp, chh = audit_complex(ct, pct, lc, widths, strict, charts); assert cp == Counter({int(k): v for k, v in ch['global_profile'].items()}) + prank = {} + for it in pct['idle_children']: prank.setdefault(it['child'], it['rank']) + controls = []; skipped = [] + def reject(name, fn): + q = copy.deepcopy(ct); fn(q) + try: audit_complex(q, pct, lc, widths, strict, charts) + except (AssertionError, KeyError, IndexError, StopIteration): controls.append(name) + else: raise AssertionError('mutation accepted: ' + name) + sl0 = lambda q: q['hosting']['slots'][0] + reject('hosted residual outside its window', lambda q: sl0(q).__setitem__(4, next(s for s in range(9) if s not in q['hosting']['windows'][str(sl0(q)[0])][2]))) + reject('remainder child understated', lambda q: q['idle_children'][0].__setitem__('rank', q['idle_children'][0]['rank'] - 1)) + reject('dropped bank', lambda q: q.__setitem__('live', q['live'] - 1)) + reject('duplicated hosted residual', lambda q: q['hosting']['slots'].append(list(sl0(q)))) + reject('hosted width not the entrance width', lambda q: sl0(q).__setitem__(3, sl0(q)[3] + 1)) + def overlap(q): # two different residuals of one (child, port) forced onto the same coordinates + seen = {} + for sl in q['hosting']['slots']: + k = (sl[0], sl[1]) + if k in seen: sl[2] = seen[k][2]; return + seen[k] = sl + raise RuntimeError('no (child, port) with two residuals: control not applicable') + reject('overlapping hosted coordinates', overlap) + reject('hosted owner on the active pair', lambda q: q['calls'][0]['owners'].__setitem__(240 + next(h for h in range(len(widths)) if q['calls'][0]['owners'][240 + h][1][0] == 3), [0, [3, 0, 0]])) + reject('missing remainder child', lambda q: q['idle_children'].pop()) + if strict: + def share_family(q): # move a stage-s helper onto the family of another stage-s helper of the same child, at free coordinates + used_ = defaultdict(set); by = defaultdict(list) + for sl in q['hosting']['slots']: + used_[sl[0], sl[1]] |= set(range(sl[2], sl[2] + sl[3])); by[sl[0], sl[4]].append(sl) + for (i, s_), sls in by.items(): + for a in sls: + for sl in sls: + if sl is a or sl[1] == a[1]: continue + w = sl[3]; free = [o for o in range(0, prank[i] - w + 1) if not (set(range(o, o + w)) & used_[i, a[1]])] + if not free: continue + old_port = sl[1]; sl[1] = a[1]; sl[2] = free[0] + for c in q['calls']: + if c['stage'] == s_: + f0, r0 = c['owners'][2 * V + sl[5]] + c['owners'][2 * V + sl[5]] = [f0 + (a[1] - old_port), [3, i, sl[2]] if w == L else [4, i, sl[2], w, None]] + return a, sl + raise RuntimeError('control not applicable') + def refresh_remainders(q): # keep the remainder children consistent with the (mutated) slots + used_ = defaultdict(int) + for sl in q['hosting']['slots']: used_[sl[0], sl[1]] += sl[3] + q['idle_children'] = [dict(child=it['child'], port=it['port'], rank=it['rank'] - used_[it['child'], it['port']], hosted=used_[it['child'], it['port']], replicas=T) + for it in pct['idle_children'] if it['rank'] - used_[it['child'], it['port']] > 0] + q = copy.deepcopy(ct) + try: a, sl = share_family(q); refresh_remainders(q) + except RuntimeError: a = sl = None # no free coordinates in this word's hosting: control not applicable (recorded below) + if sl is not None: + if sl[3] < L: # complete the spectator record so that only the family rule is violated + ports_, recipes = charts + for c in q['calls']: + if c['stage'] == sl[4]: + f0, r0 = c['owners'][2 * V + sl[5]]; B = idle_basis(ports_[sl[1]]); pend = [int(x) for x in recipes[sl[1]]['idle_children'][sl[0]]['orthogonal_axes']] + occ_ = [B.index(x) for x in pend[sl[2]:sl[2] + sl[3]]]; r0[4] = [j for j in range(M) if j not in occ_][:L - sl[3]] + audit_complex(q, pct, lc, widths, False, charts) # the PR #442 rule accepts this template ... + try: audit_complex(q, pct, lc, widths, True, charts) + except AssertionError: controls.append('two helpers on one physical family in one invocation (accepted by the #442 rule, rejected here)') + else: raise AssertionError('mutation accepted: two helpers on one family') + else: skipped.append('two helpers on one physical family: no free coordinates to build the violation in this word') + def entering_owner(q): # (owner record of the first hosted entering helper in call 0) + return next(o for o in q['calls'][0]['owners'][2 * V:] if o[1][0] == 4) + def spectator_is_residual(q): + o = entering_owner(q); f = o[0]; i, off, w = o[1][1], o[1][2], o[1][3]; port = (f % 960) % V # family = rep*960 + (2*pair+side)*V + port + B = idle_basis(charts[0][port]); pend = [int(x) for x in charts[1][port]['idle_children'][i]['orthogonal_axes']] + o[1][4] = [B.index(pend[off])] + o[1][4][1:] + reject('a spectator coordinate that is a residual coordinate', spectator_is_residual) + reject('spectator coordinates shifted', lambda q: entering_owner(q)[1].__setitem__(4, [x + 1 for x in entering_owner(q)[1][4]])) + reject('spectator record dropped', lambda q: entering_owner(q)[1].__setitem__(slice(4, None), [])) + reject('entering helper routed without a spectator record', lambda q: entering_owner(q).__setitem__(1, [3, entering_owner(q)[1][1], entering_owner(q)[1][2]])) + reject('rule flag removed from the template', lambda q: q['hosting'].pop('max_helpers_per_physical_family_per_call')) + # ---- the rule on the other register classes: banks, the private namespace (centres, tableau, coefficient), copies (replicas), data wires + def reject_with(name, fn, must): + q = copy.deepcopy(ct); fn(q) + try: audit_complex(q, pct, lc, widths, strict, charts) + except (AssertionError, KeyError, IndexError, StopIteration) as e: + assert any(m_ in str(e) for m_ in must), (name, str(e)); controls.append(name) + else: raise AssertionError('mutation accepted: ' + name) + def banked_pos(q): # (call, index) of the first banked ENTERING owner + return next((c, i) for c in q['calls'] for i, o in enumerate(c['owners']) if i >= 2 * V and o[1][0] == 2 and len(o[1]) == 4) + def pack_banks_by_call(q): + """re-lay every entering bank of a stage so that eight entering helpers (their footprints are nine cells each) share a bank family, whatever their + replica: residuals packed from cell 0, the spectators of the bank's helpers in its pad (cells after the residuals), disjoint. The layout of + 'nine-cell bank slots': cell-level everything is valid (residuals packed from 0, pad recomputed, disjoint footprints); only the one-owner rule is + violated. RuntimeError when the stage cannot be re-laid on its own bank families.""" + for s_ in sorted({c['stage'] for c in q['calls']}): + items = [(c, i) for c in sorted((c for c in q['calls'] if c['stage'] == s_), key=lambda c: c['replica']) for i, o in enumerate(c['owners']) + if i >= 2 * V and o[1][0] == 2 and len(o[1]) == 4] + if not items: continue + fams = sorted({c['owners'][i][0] for c, i in items}); groups = [items[k:k + M // L] for k in range(0, len(items), M // L)] + if len(groups) != len(fams): raise RuntimeError('control not applicable') + for f0, grp in zip(fams, groups): + cells = sum(c['owners'][i][1][2] for c, i in grp); off = 0; spec = cells + for c, i in grp: + w = c['owners'][i][1][2]; c['owners'][i] = [f0, [2, off, w, list(range(spec, spec + L - w))]]; off += w; spec += L - w + if any(o[1][0] == 2 and len(o[1]) == 4 for c in ct['calls'] for o in c['owners'][2 * V:]): + q = copy.deepcopy(ct) + try: pack_banks_by_call(q) + except RuntimeError: q = None; skipped.append('two entering helpers on one bank family: the entering banks of this word cannot be re-laid eight per family') + if q is not None: + audit_complex(q, pct, lc, widths, False, charts) # the PR #442 rule accepts this layout (cells disjoint, spectators not read) ... + try: audit_complex(q, pct, lc, widths, True, charts) + except AssertionError as e: + assert 'bank class' in str(e), str(e); controls.append('two entering helpers on one bank family in one invocation, disjoint footprints, spectators in the pad (accepted by the #442 rule, rejected here)') + else: raise AssertionError('mutation accepted: two entering helpers on one bank family') + reject_with('a bank spectator that is a residual cell', lambda q: (lambda r: r.__setitem__(3, [r[1]]))(banked_pos(q)[0]['owners'][banked_pos(q)[1]][1]), ('footprints overlap', 'bank spectators')) + reject_with('bank spectator cells shifted', lambda q: (lambda r: r.__setitem__(3, [x + 1 for x in r[3]]))(banked_pos(q)[0]['owners'][banked_pos(q)[1]][1]), ('bank spectators',)) + reject_with('bank spectator count wrong', lambda q: (lambda r: r.__setitem__(3, r[3] * 2))(banked_pos(q)[0]['owners'][banked_pos(q)[1]][1]), ('bank spectators',)) + reject_with('bank spectator record dropped', lambda q: (lambda o: o.__setitem__(1, o[1][:3]))(banked_pos(q)[0]['owners'][banked_pos(q)[1]]), ('',)) + reject_with('a banked entering helper on an active data family', lambda q: (lambda c, i: c['owners'][i].__setitem__(0, c['owners'][0][0]))(*banked_pos(q)), ('data class',)) + reject_with('a bank owner in the private namespace (centres)', lambda q: (lambda c, i: c['owners'][i].__setitem__(0, q['live'] + 1))(*banked_pos(q)), ('private namespace', '')) + reject_with('a bank owner in the private namespace (reserved tableau)', lambda q: (lambda c, i: c['owners'][i].__setitem__(0, q['live'] + 16 + 5))(*banked_pos(q)), ('private namespace', '')) + else: skipped.append('bank controls: this word has no banked entering helper') + for bi in [i for i, e in enumerate(ct['execution_schedule']) if e['kind'] == 'bridge']: # copies: the children of one (pair, side) share their families + q = copy.deepcopy(ct); q['execution_schedule'].pop(bi) + try: audit_complex(q, pct, lc, widths, True, charts) + except AssertionError as e: + if 'overlapping windows' in str(e): controls.append('windows of two idle children of one family group overlap (a bridge removed from the schedule)'); break + else: skipped.append('windows of two idle children of one family group: no schedule mutation creates an overlap in this word') + reject_with('private namespace left at the parent\'s ranges', lambda q: q.__setitem__('private_namespace', pct['private_namespace']), ('private namespace',)) + reject_with('private namespace overlapping the live stock', lambda q: q['private_namespace'].__setitem__('centers', [q['live'] - 1, q['live'] + 15]), ('private namespace',)) + reject_with('hosted helper on the data family of another replica', lambda q: next(o for o in q['calls'][0]['owners'][2 * V:] if o[1][0] in (3, 4)).__setitem__(0, next(o for o in q['calls'][0]['owners'][2 * V:] if o[1][0] in (3, 4))[0] + 960), ('',)) + reject_with('active owner on the family of another replica', lambda q: q['calls'][0]['owners'][0].__setitem__(0, q['calls'][0]['owners'][0][0] + 960), ('',)) + reject_with('a second owner on an active data family', lambda q: q['calls'][0]['owners'].__setitem__(1, [q['calls'][0]['owners'][0][0], q['calls'][0]['owners'][1][1]]), ('data class',)) + res = dict(status='PASS_INDEPENDENT_HOSTING_AUDIT_WITH_ENTRANCE_WIDTHS', one_helper_per_family=strict, complex_template_sha256=ch['template_sha256'], + complex_profile={str(k): v for k, v in sorted(cp.items())}, complex_live=ct['live'], complex_hosted_residuals=chh, + complex_maxchild=max(cp), widths=dict(sorted(Counter(widths).items())), mutations_rejected=controls, controls_not_applicable=skipped) + outp.write_text(json.dumps(res, indent=2) + '\n'); print(json.dumps({k: v for k, v in res.items() if 'profile' not in k})) + + +if __name__ == '__main__': main() diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py new file mode 100644 index 0000000000..135c1c3e24 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_gk.py @@ -0,0 +1,127 @@ +"""Mutation controls for the kernel and gauge gates, with an independent in-memory checker. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +usage: controls_gk.py GK_FULL-WORD.json.gz OUT.json +The checker (exact_ok) replays the explicit program precondition + compensation + main + cleanup on every column with arbitrary +helper dirt, forward and inverse-transpose, as audit_gk.py does, but shares no code with it or with gk_word.py except +`profile` (frame chains). Every control must be REJECTED; the unmutated word must be accepted.""" +import copy, gzip, json, sys +from fractions import Fraction as Q +from pathlib import Path +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from gk_common import V, FULL, basis +import gk_word as GW + + +def ap(e, rows): + if e[0] == 'scale': + q = Q(e[2], e[3]); rows[e[1]] = {j: q * x for j, x in rows[e[1]].items()} + else: + q = Q(e[3], e[4]); t, s = e[1], e[2] + for j, x in list(rows[s].items()): + z = rows[t].get(j, Q(0)) + q * x + if z: rows[t][j] = z + else: rows[t].pop(j, None) + + +def inv(e): + e = copy.deepcopy(e) + if e[0] == 'add': e[3] *= -1 + else: e[2], e[3] = e[3], e[2] + return e + + +def dual(e): + e = inv(e) + if e[0] == 'add': e[1], e[2] = e[2], e[1] + return e + + +def exact_ok(w): + """raises AssertionError unless the word is an exact arbitrary-dirt, inverse-transpose program with frame-legal compensation""" + R = w['report']['R']; n = 2 * V + R + ident = lambda: [{r: Q(1)} for r in range(n)] + A, B, cut, prec = w['A'], w['B'], w['cut'], w['precondition'] + main = A + cut + B + M = ident() + for e in main: ap(e, M) + dirty = [{} for _ in range(n)] + for r in range(V, 2 * V): dirty[r] = {j: x for j, x in M[r].items() if j >= 2 * V} + for e in prec: ap(e, dirty) + comp = [['add', r, j, -x.numerator, x.denominator, []] for r in range(V, 2 * V) for j, x in sorted(dirty[r].items())] + start = {int(r) for r in w.get('start_extra', {})} + assert not any(e[2] in start for e in comp), 'a helper with a frame-zero compensation must start at frame zero' + cleanup = [inv(e) for e in reversed(A + B) if not V <= e[1] < 2 * V] + program = list(prec) + comp + main + cleanup + actual = ident() + for e in program: ap(e, actual) + expected = ident() + for t in range(V): expected[V + t][t] = Q(1) + assert actual == expected, 'arbitrary-dirt exactness' + back = ident() + for e in program: ap(dual(e), back) + eb = ident() + for t in range(V): eb[t][V + t] = Q(-1) + assert back == eb, 'inverse-transpose exactness' + GW.profile(w) # frame chains, entrance containment, centre chains and levels + + +def controls(w): + out = [] + exact_ok(w) + def expect_reject(name, fn): + q = copy.deepcopy(w); fn(q) + try: exact_ok(q) + except (AssertionError, KeyError, StopIteration): out.append(name) + else: raise AssertionError('mutation accepted: ' + name) + kern = [i for i, e in enumerate(w['A']) if e[0] == 'add' and e[1] >= 2 * V and e[2] >= 2 * V and e[5] and e[-1] and str(e[2]) in w['start_extra']] + gaug = [i for i, e in enumerate(w['A']) if e[0] == 'add' and V <= e[1] < 2 * V and str(e[2]) in w['start_extra']] + assert kern and gaug, 'word has neither kernel nor gauge gates' + expect_reject('kernel: donor update omitted', lambda q: q['A'].pop(kern[0])) + expect_reject('kernel: donor update sign flipped', lambda q: q['A'][kern[0]].__setitem__(3, -q['A'][kern[0]][3])) + expect_reject('gauge: compensation gate omitted', lambda q: q['A'].pop(gaug[0])) + expect_reject('gauge: compensation coefficient doubled', lambda q: q['A'][gaug[0]].__setitem__(3, 2 * q['A'][gaug[0]][3])) + def bad_entrance(q): # entrance outside the helper's first frame (the gate frames are unchanged) + e = q['A'][gaug[0]]; h = str(e[2]); E = e[-1] + q['start_extra'][h] = [next(x for x in range(1, 512) if basis(E + [x]) != basis(E))] + expect_reject('gauge: entrance not inside the first frame of its gates', bad_entrance) + expect_reject('gauge: start_extra of a compensated helper without gauge or kernel', lambda q: q['start_extra'].__setitem__(str(2 * V + next(h for h in range(q['report']['R']) if str(2 * V + h) not in q['start_extra'])), [1])) + expect_reject('gauge: target level forgotten', lambda q: q['target_levels'].pop(next(iter(q['target_levels'])))) + def wrong_level(q): # a target level that its compensation gates do not produce + t = next(iter(q['target_levels'])); E = q['target_levels'][t] + q['target_levels'][t] = [next(x for x in range(1, 512) if basis(E + [x]) != basis(E))] + expect_reject('gauge: target level different from the compensation frame', wrong_level) + return out + + +def selection_controls(base, sel): + """structural controls on the selection itself (gk_word.build must refuse)""" + out = [] + GW.build(base, sel) + def refuse(name, fn): + q = copy.deepcopy(sel); fn(q) + try: GW.build(base, q) + except (AssertionError, KeyError, StopIteration): out.append(name) + else: raise AssertionError('selection accepted: ' + name) + h0 = next(iter(sel['gauge'])) + first = GW.first_frames(base) + refuse('gauge: entrance outside the first frame', lambda q: q['gauge'].__setitem__(h0, list(first[int(h0)]) + [next(x for x in range(1, 512) if basis(list(first[int(h0)]) + [x]) != basis(list(first[int(h0)])))])) + col = GW.responses(base) + def incomparable(q): # two entering helpers sharing a target with incomparable entrances + hs = [int(h) for h in q['gauge']] + for a in hs: + for b in hs: + if a < b and set(col[a]) & set(col[b]): + ea = basis(q['gauge'][str(a)]) + other = [x for x in GW.span(first[b]) if x and x not in GW.span(ea) and len(basis(ea)) == 1 and basis([x]) != ea] + if other: q['gauge'][str(b)] = [other[0]]; return + raise RuntimeError('control not applicable') + refuse('gauge: non-nested entrances at one target', incomparable) + c0 = sel['kernel'][0] + refuse('kernel: pivot outside the donor span', lambda q: q['kernel'][0].__setitem__('donors', q['kernel'][0]['donors'][:-1]) if len(c0['donors']) > 1 and GW.solve_relation(col, c0['donors'][:-1], c0['pivots'][0]) is None else (_ for _ in ()).throw(RuntimeError('control not applicable'))) + refuse('kernel: entrance outside a donor first frame', lambda q: q['kernel'][0].__setitem__('E', [next(x for x in range(1, 512) if x not in GW.span(first[c0['donors'][0]]))])) + return out + + +if __name__ == '__main__': + w = json.load(gzip.open(sys.argv[1])); res = controls(w) + Path(sys.argv[2]).write_text(json.dumps(dict(status='PASS_GAUGE_KERNEL_MUTATION_CONTROLS', rejected=res), indent=2) + '\n'); print(len(res), 'controls rejected') diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py new file mode 100644 index 0000000000..8907924d6c --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_hosting.py @@ -0,0 +1,84 @@ +"""Mutation controls of the one-owner rule on EVERY register class, run through the generating scripts (hosted_gk.py, integrate_gk.py). Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +usage: controls_hosting.py VARIANT_WORKDIR SELECTION.json KEY OUT.json (cwd = VARIANT_WORKDIR, as the inherited scripts expect) +Register classes of one invocation: active data wires, hosted helpers (data families), banked helpers (bank families), the private namespace +(centres, reserved tableau, coefficient), copies (replicas). The rule: an entering helper is the only owner of its physical family in the invocation; +a family of the data class has one owner; nothing is owned in the private namespace. +(a) the generator's rule function `hosted_gk.one_helper_rule` is run on mutated owner arrays of a real invocation, one mutation per class; +(b) the whole hosting generator is run with a bank tiling that puts eight entering helpers of ONE invocation on one bank family, each with a disjoint + 9-cell footprint (8 residual cells and a spectator in the pad): hosted_gk.py must refuse it, while the unmutated tiling must be accepted; +(c) the parent-template generator integrate_gk.py is run on the same mutated tiling and must refuse it. +(The independent audit has its own controls for the same layout in audit_hosted_gk.py, and replay_gk.py for the parent template.)""" +import copy, gzip, json, os, runpy, shutil, sys, tempfile +from collections import Counter +from pathlib import Path +CODE = Path(__file__).resolve().parent; sys.path.insert(0, str(CODE)) +import gk_common as GC +import hosted_gk as HG +work = Path(sys.argv[1]).resolve(); selp = Path(sys.argv[2]).resolve(); key = sys.argv[3]; outp = Path(sys.argv[4]).resolve() +os.chdir(work) +V, L, M, DATA = GC.V, GC.L, GC.M, GC.DATA +can = json.load(gzip.open('split-centres/CANONICAL-WORD.json.gz')); R = can['R'] +widths = [L - len(can['frames'][can['start'][2 * V + i]]) for i in range(R)] +hosted = json.loads(gzip.decompress((work / 'hosted/GLOBAL-TEMPLATE.json.gz').read_bytes())); W = hosted['live'] +call = next(c for c in hosted['calls'] if any(o[1][0] == 2 and len(o[1]) == 4 for o in c['owners'][2 * V:])) # an invocation with banked entering helpers +good = call['owners']; HG.one_helper_rule(good, widths, W) +out = [] +def refused(name, fn, must): + o = copy.deepcopy(good); fn(o) + try: HG.one_helper_rule(o, widths, W) + except AssertionError as e: + assert must in str(e), (name, str(e)); out.append(dict(control=name, rejected_by='hosted_gk.one_helper_rule', message=str(e)[:100])) + else: raise AssertionError('accepted by the generator rule: ' + name) +ent = [i for i in range(2 * V, 2 * V + R) if good[i][1][0] == 2 and len(good[i][1]) == 4]; a, b = ent[0], ent[1] +host_ = [i for i in range(2 * V, 2 * V + R) if good[i][1][0] in (3, 4)] +def join(o): # bank class: b joins a's bank family at the next free cells with a spectator of its own + fa = o[a][0]; free = 64; o[b] = [fa, [2, free, widths[b - 2 * V], [free + widths[b - 2 * V]]]] +refused('bank class: two entering helpers on one bank family', join, 'shares its bank family') +refused('bank class: spectator is a residual cell of its own helper', lambda o: o[a][1].__setitem__(3, [o[a][1][1]]), 'footprints overlap') +refused('bank class: an active data wire on a bank family', lambda o: o.__setitem__(3, [DATA, [1, 0, 3]]), 'bank family owned by a non-helper') +refused('data class: two hosted helpers on one data family', lambda o: o.__setitem__(host_[1], [o[host_[0]][0], o[host_[1]][1]]), 'two owners on one data family') +refused('data class: a hosted helper on an active data family', lambda o: o.__setitem__(host_[0], [o[0][0], o[host_[0]][1]]), 'two owners on one data family') +refused('private namespace: a bank owner in the centres', lambda o: o.__setitem__(a, [W + 3, o[a][1]]), 'private namespace') +refused('private namespace: a bank owner in the reserved tableau', lambda o: o.__setitem__(a, [W + len(can['centers']) + 5, o[a][1]]), 'private namespace') +refused('private namespace: a bank owner at the coefficient registers', lambda o: o.__setitem__(a, [hosted['physical'] - 1, o[a][1]]), 'private namespace') +# ---- (b), (c): a tiling with eight entering helpers of one invocation per bank family +def packed_tile(items): + """the layout of 'nine-cell bank slots': entering helpers in replica order, as many per bank family as fit with a disjoint spectator cell each + (eight residuals of width 8 and eight spectators in the pad of 9), whatever their replica""" + wide = [x for x in items if x[2] == L]; ent_ = [x for x in items if x[2] < L] + assign, nb, pads = saved(wide) if wide else ({}, 0, Counter()) + if not ent_: return assign, nb, pads + pads = Counter(pads); banks = [] + for x in ent_: # every footprint is nine cells (w residual + 9 - w spectators), so a bank takes M // 9 = 8 of them + if not banks or len(banks[-1]) == M // L: banks.append([]) + banks[-1].append(x) + for bk, mem in enumerate(banks): + cells = sum(y[2] for y in mem); off = 0; spec = cells + for rep, h, w in mem: + assign[(rep, h)] = (nb + bk, off, w, False, tuple(range(spec, spec + L - w))); off += w; spec += L - w + assert spec <= M + for part in GC.split_pad(M - cells): pads[part] += 1 + return assign, nb + len(banks), pads +saved = GC.tile +tmpd = Path(tempfile.mkdtemp(prefix='gkhost-', dir=work)) +try: + HG.ONEPER = True; HG.SELECTION = str(selp); HG.KEY = key; HG.DISCOVER = False; HG.DISCOVER_TO = None + HG.tile = saved; HG.main(Path('split-centres'), tmpd / 'ok') # the real tiling is accepted + HG.tile = packed_tile + try: HG.main(Path('split-centres'), tmpd / 'packed') + except AssertionError as e: + assert 'shares its bank family' in str(e), str(e); out.append(dict(control='hosting generator: eight entering helpers of one invocation on one bank family', rejected_by='hosted_gk.py', message=str(e)[:100])) + else: raise AssertionError('hosted_gk.py accepted the packed bank tiling') +finally: HG.tile = saved +# parent template generator, in a throw-away copy of the variant directory +t2 = tmpd / 'parent'; t2.mkdir(); os.symlink(work / 'work', t2 / 'work'); shutil.copytree(work / 'split-centres', t2 / 'split-centres'); shutil.copy(work / 'BIT-PRICE.json', t2 / 'BIT-PRICE.json') +GC.tile = packed_tile; os.chdir(t2) +try: + try: runpy.run_path(str(CODE / 'integrate_gk.py'), run_name='__main__') + except AssertionError as e: + assert 'shares its bank family' in str(e), str(e); out.append(dict(control='parent template generator: eight entering helpers of one invocation on one bank family', rejected_by='integrate_gk.py', message=str(e)[:100])) + else: raise AssertionError('integrate_gk.py accepted the packed bank tiling') +finally: GC.tile = saved; os.chdir(work) +shutil.rmtree(tmpd, ignore_errors=True) +outp.write_text(json.dumps(dict(status='PASS_ONE_OWNER_RULE_CONTROLS_ON_EVERY_REGISTER_CLASS', controls=out), indent=1) + '\n'); print(len(out), 'generator controls rejected') diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py new file mode 100644 index 0000000000..02ecc1326c --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_pipeline.py @@ -0,0 +1,71 @@ +"""Mutation controls that run through the CERTIFYING scripts (audit_gk.py, emit_gk.py). Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +usage: controls_pipeline.py VARIANT_WORKDIR SELECTION.json OUT.json +Every control writes a mutated FULL-WORD.json.gz into a fresh copy of the variant's split-centres directory and runs audit_gk.py then +emit_gk.py there; the pair must FAIL (nonzero exit). The unmutated word must pass. The selection-level words are built with +gk_word.build(check=False), so the structural assertions of the builder are NOT what rejects them.""" +import copy, gzip, json, os, shutil, subprocess, sys, tempfile +from pathlib import Path +CODE = Path(__file__).resolve().parent; sys.path.insert(0, str(CODE)) +import gk_word as GW +from gk_common import V, basis +work = Path(sys.argv[1]).resolve(); sel = json.loads(Path(sys.argv[2]).read_text()) +base = json.load(gzip.open(work / 'sc_base/FULL-WORD.json.gz')) +good = json.load(gzip.open(work / 'split-centres/FULL-WORD.json.gz')) +env = dict(os.environ, PYTHONDONTWRITEBYTECODE='1'); env.pop('PYTHONOPTIMIZE', None) +def run_pair(word): + tmp = Path(tempfile.mkdtemp(prefix='gkctl-', dir=work)) + try: + os.symlink(work / 'work', tmp / 'work'); shutil.copytree(work / 'sc_base', tmp / 'split-centres') + (tmp / 'split-centres/FULL-WORD.json.gz').write_bytes(GW.dump(word)) + for script in ('audit_gk.py', 'emit_gk.py'): + q = subprocess.run([sys.executable, '-B', str(CODE / script)], cwd=tmp, env=env, capture_output=True, text=True) + if q.returncode: return script, (q.stderr.strip().splitlines() or ['?'])[-1][:160] + return None, '' + finally: shutil.rmtree(tmp, ignore_errors=True) +assert run_pair(good) == (None, ''), 'the unmutated word must pass the certifying scripts' +out = [] +def expect_fail(name, word, must=None): + script, msg = run_pair(word) + assert script is not None, ('mutation accepted by the certifying scripts: ' + name) + if must: assert must in msg, (name, msg) + out.append(dict(control=name, rejected_by=script, message=msg)) +def mut(fn): + w = copy.deepcopy(good); fn(w); return w +kern = next(i for i, e in enumerate(good['A']) if e[0] == 'add' and e[1] >= 2 * V and e[2] >= 2 * V and str(e[2]) in good['start_extra']) +gaug = next(i for i, e in enumerate(good['A']) if e[0] == 'add' and V <= e[1] < 2 * V and str(e[2]) in good['start_extra']) +expect_fail('kernel: donor update omitted', mut(lambda w: w['A'].pop(kern))) +expect_fail('kernel: donor update sign flipped', mut(lambda w: w['A'][kern].__setitem__(3, -w['A'][kern][3]))) +expect_fail('gauge: compensation gate omitted', mut(lambda w: w['A'].pop(gaug))) +expect_fail('gauge: compensation coefficient doubled', mut(lambda w: w['A'][gaug].__setitem__(3, 2 * w['A'][gaug][3]))) +def bad_entrance(w): + e = w['A'][gaug]; E = e[-1]; w['start_extra'][str(e[2])] = [next(x for x in range(1, 512) if basis(E + [x]) != basis(E))] +expect_fail('gauge: entrance outside the frame of its gates', mut(bad_entrance)) +expect_fail('helper with a frame-zero compensation given an entrance', mut(lambda w: w['start_extra'].__setitem__(str(2 * V + next(h for h in range(w['report']['R']) if str(2 * V + h) not in w['start_extra'])), [1]))) +# ---- register classes other than helpers: a data or target register has #433's own start frame and adapter; a helper-style entrance (start_extra: residual wrapper, +# spectators, bank footprint) is defined for helper registers only +expect_fail('helper-style entrance given to a data register', mut(lambda w: w['start_extra'].__setitem__('3', [1, 2][:1]))) +expect_fail('helper-style entrance given to a target register', mut(lambda w: w['start_extra'].__setitem__(str(V + 3), [1]))) +expect_fail('target level forgotten', mut(lambda w: w['target_levels'].pop(next(iter(w['target_levels']))))) +# ---- centre chain broken: two entering helpers a, b whose targets share a centre, b's entrance replaced by an incomparable line that is +# otherwise legal (inside b's frames); the word is built without the builder's structural checks, and `profile` (a second checker) +# is used only to find the case: the certifying script must reject it by its own centre-chain assertion. +col = GW.responses(base); first = GW.first_frames(base) +gh = sorted(int(h) for h in sel['gauge']); done = False +for b in gh: + if done: break + for x in sorted(GW.span(first[b])): + if not x or done: continue + E0 = basis(sel['gauge'][str(b)]) + if basis([x]) == E0 or len(E0) != 1: continue + for a in gh: + if a == b or set(col[a]) & set(col[b]): continue + sel2 = {'gauge': {str(a): sel['gauge'][str(a)], str(b): [x]}} + w = GW.build(base, sel2, check=False) + try: GW.profile(w) + except AssertionError as e: + if 'served levels must descend' not in str(e): continue + else: continue + expect_fail('centre levels not a chain (word built without the builder\'s structural checks)', w, 'centre level outside the previous frame'); done = True; break +assert done, 'no centre-chain control available' +Path(sys.argv[3]).write_text(json.dumps(dict(status='PASS_CERTIFYING_PIPELINE_MUTATION_CONTROLS', controls=out), indent=1) + '\n'); print(len(out), 'controls rejected by the certifying scripts') diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py new file mode 100644 index 0000000000..183a72ab12 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/controls_sel.py @@ -0,0 +1,8 @@ +"""Selection-level mutation controls. usage: controls_sel.py BASE_FULL-WORD.json.gz SELECTION.json OUT.json (Apache-2.0)""" +import gzip, json, sys +from pathlib import Path +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import controls_gk as C +base = json.load(gzip.open(sys.argv[1])); sel = json.loads(Path(sys.argv[2]).read_text()) +res = C.selection_controls(base, sel) +Path(sys.argv[3]).write_text(json.dumps(dict(status='PASS_SELECTION_MUTATION_CONTROLS', refused=res), indent=2) + '\n'); print(len(res), 'selection controls refused') diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py new file mode 100644 index 0000000000..0dd1853bb5 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py @@ -0,0 +1,156 @@ +# GK: modified copy of PR #433's complex_emit.py (icekylinx with Codex assistance; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:". On a word without start_extra / target_levels the behaviour +# and every written file equal PR #433's (regression anchor in verify.py). +import sys as _sys, os as _os; _sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) +# Adapted from PR425 by icekylinx with Codex assistance. +"""Emit both local programs, integrate the fixed nine-stage geometry, and bill. + +The expanded scalar interface is justified in PROOF.txt. This script does not +claim a Lean proof or discharge the inherited all-size/analytic interfaces. +""" +import copy,gzip,hashlib,importlib.util,json,math +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +OUT=Path('split-centres');cp=OUT/'CANONICAL-WORD.json.gz' +c=json.load(gzip.open(cp)) +frames=c['frames'];v,R,h=c['v'],c['R'],c['h'];n=2*v+R +def digest(x):return hashlib.sha256(json.dumps(x,sort_keys=True,separators=(',',':')).encode()).hexdigest() +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 dual(e): + e=list(e) + if e[0]=='add':e[1],e[2]=e[2],e[1];e[3]*=-1 + else:e[2],e[3]=e[3],e[2] + return e +def scalar(e,back): + e=dual(e) if back else list(e) + if e[0]=='add':return ['add',['L',e[1]],['L',e[2]],e[3],e[4]] + return ['scale',['L',e[1]],e[2],e[3]] +def primitive_bound(e): + if e[0] in ('clear','copy'):return 1 + q=Q(e[3],e[4]) if e[0]=='add' else Q(e[2],e[3]) + a,b=abs(q.numerator),q.denominator + assert b&(b-1)==0 + if e[0]=='scale': + assert a&(a-1)==0 + return abs(a.bit_length()-b.bit_length())+int(q<0) + # Exact binary Horner multiplication on a cleared private stream, repeated + # halving, signed accumulation into the target, then clear the private stream. + return 3+(a.bit_length()-1)+a.bit_count()+(b.bit_length()-1) + +def emit(back): + out=[];cur=c['start'].copy() + def event(e):out.append(e) + def scal(e,f):event(['scalar',e,f]) + event(['phase','zero_frame_precondition']) + for e in c['precondition']+c['compensation']: + regs=[e[1]]+([e[2]] if e[0]=='add' else []) + assert all(c['start'][r]==0 for r in regs) + scal(scalar(e,back),0) + event(['phase','entry_adapters']) + # GK: a helper that starts at a nonzero entrance frame has NO entry adapter; its paid wrapper R_E^-1 (Lemma A) precedes every gate + # that touches it and L_E^-1 follows the full-frame cleanup. Words without entrances emit PR #433's events. + entering=[r for r,f in enumerate(c['start']) if r>=2*v and f!=0] + for r,f in enumerate(c['start']): + if r in entering:event(['residual_adapter','pre',r,f]) + else:event(['adapter','old_to_new',r,f]) + def climb(r,f,part): + old=cur[r] + if old==f:return + assert basis(frames[old]+frames[f])==tuple(frames[f]) + rank=len(frames[f])-len(frames[old]);assert rank>0 + event(['climb',part,r,old,f,rank]);cur[r]=f + for part in ('A','centers','B','final'): + event(['phase',part]) + if part in ('A','B'): + for e in c[part]: + regs=[e[1]]+([e[2]] if e[0]=='add' else []) + for r in regs:climb(r,e[-1],part) + scal(scalar(e,back),e[-1]) + elif part=='centers': + # GK: targets sit at their nonzero-frame-compensation level (0 at the defaults); a centre copy descends + # cf -> served levels (descending chain) -> lowest served level and scatters into each target at its level + lv=lambda r:c.get('target_levels',{}).get(str(r-v),0) + assert all(cur[r]==lv(r) for r in range(v,2*v)) + for k,r in enumerate(c['centers']): + cf=c['center_frames'][k];assert cur[r]==cf + terms=[e for e in c['cut'] if e[2]==r] + path=[cf]+sorted({lv(e[1]) for e in terms}-{cf},key=lambda x:-len(frames[x])) + C=['C',k] + if not back: + scal(['clear',C],cf);scal(['copy',C,['L',r]],cf) + for a in range(len(path)): + if a>0:event(['center',k,path[a-1],path[a],len(frames[path[a-1]])-len(frames[path[a]])]) + for e in terms: + if lv(e[1])==path[a]:scal(['add',['L',e[1]],C,e[3],e[4]],path[a]) + scal(['clear',C],path[-1]) + else: + scal(['clear',C],path[-1]) + for a in range(len(path)-1,-1,-1): + for e in terms: + if lv(e[1])==path[a]:scal(['add',C,['L',e[1]],e[3],e[4]],path[a]) + if a>0:event(['center',k,path[a],path[a-1],len(frames[path[a-1]])-len(frames[path[a]])]) + scal(['add',['L',r],C,-1,1],cf);scal(['clear',C],cf) + else: + for r,f in enumerate(c['final']):climb(r,f,part) + event(['phase','exit_adapters']) + for r,f in enumerate(c['final']):event(['adapter','new_to_old',r,f]) + event(['phase','full_frame_cleanup']) + for e in c['cleanup']: + regs=[e[1]]+([e[2]] if e[0]=='add' else []) + assert all(c['final'][r]==1 for r in regs) + scal(scalar(e,back),1) + for r in entering:event(['residual_adapter','post',r,c['start'][r]]) # GK: L_E^-1 after the full-frame cleanup + event(['phase','done']) + return out + +def check_local(events,back): + # Literal scalar replay of the emitted stream, including center lifetimes. + state={('L',r):{r:Q(1)} for r in range(n)};live=[];paid=Counter();prims=0;macros=0 + for e in events: + if e[0]=='climb':assert not live;paid[e[5]]+=1 + elif e[0]=='center':assert live==[e[1]];paid[e[4]]+=1 + elif e[0]=='scalar': + op=e[1];tag=op[0];t=tuple(op[1]);macros+=1;prims+=2*primitive_bound(op) + if tag=='clear': + state[t]={} + if t[0]=='C' and t[1] in live:live.remove(t[1]) + elif tag=='copy':state[t]=dict(state.get(tuple(op[2]),{}));live.append(t[1]) + elif tag=='scale':state[t]={j:Q(op[2],op[3])*x for j,x in state[t].items()} + else: + s=tuple(op[2]);q=Q(op[3],op[4]);row=state.setdefault(t,{}) + if t[0]=='C' and t[1] not in live:live.append(t[1]) + for j,x in list(state.get(s,{}).items()): + z=row.get(j,Q(0))+q*x + if z:row[j]=z + else:row.pop(j,None) + assert not live and all(not row for r,row in state.items() if r[0]=='C') + for r in range(n): + expected={r:Q(1)} + if back and r> 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/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py new file mode 100644 index 0000000000..15782ba625 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/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/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py new file mode 100644 index 0000000000..ae62c773b3 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/hosted_gk.py @@ -0,0 +1,150 @@ +# GK: modified copy of PR #442's complex_hosted.py (DaysSky) by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +# Every change is marked "GK:". At the defaults (no --selection / --key, all residual widths 9) the written files equal PR #442's. +"""Idle-axis hosting for #433's compressed nine-stage complex template (m=73, R=560, whole rank-nine residuals). +Local programs, data routes and the cover correction are unchanged; bank slots of hosted residuals move onto pending +idle-child coordinates of untouched data families; unhosted width-9 residuals are re-tiled eight per bank with one paid pad +(a final partial bank pays the larger pad); unhosted ENTERING residuals (GK) go to banks of their own, at most one per replica (hence per invocation) in a bank, with spectators in the pad. usage: complex_hosted.py SPLIT_CENTRES_DIR OUT""" +import gzip, hashlib, json, math, sys, time +from collections import Counter, defaultdict +from pathlib import Path +HERE = Path(__file__).resolve().parent +PKG442 = HERE.parent.parent / 'idle-axis-hosting' # GK: PR #442's package supplies hosting_core and the default SELECTION.json +sys.path.insert(0, str(PKG442)); sys.path.insert(0, str(HERE)) +import hosting_core as HC +from gk_common import tile, widths_of, basis, route +import onehost_gk as OH +V, K, T, L, M, R = 120, 4, 8, 9, 73, 560 +DATA = 2 * K * V * T +DISCOVER = False; SELECTION = None; KEY = 'complex'; DISCOVER_TO = None; ONEPER = False +def one_helper_rule(own, widths, W): + """GK: PR #458's rule on every register class of one invocation (own = the 2V active data owners followed by the R helper owners). + data families (f < DATA): the active families and every hosted helper (any width) are pairwise distinct; + bank families (DATA <= f < W): an ENTERING helper (width < 9) is the only owner of its family; width-9 helpers share a pure bank as in + PR #433 (no wrapper acts on them) and their eight 9-cell slots are disjoint; + every other family (the private namespace, f >= W) is owned by nobody; the active owners carry route [1, ...] and are never helpers.""" + fam = Counter(f for f, r in own) + for i, (f, r) in enumerate(own): + helper = i >= 2 * V; w = widths[i - 2 * V] if helper else None + if f < DATA: assert fam[f] == 1, ('two owners on one data family in one invocation', f) + elif f < W: + assert helper and r[0] == 2, ('a bank family owned by a non-helper', f) + if w < L: assert fam[f] == 1, ('an entering helper shares its bank family in one invocation', f) + else: raise AssertionError(('owner in the private namespace', f)) + assert (r[0] == 1) == (not helper) + cells = defaultdict(set) # disjoint footprints (residual cells and spectators) of the helpers of one bank family + for i, (f, r) in enumerate(own): + if i >= 2 * V and f >= DATA: + w = widths[i - 2 * V]; foot = set(range(r[1] * L, r[1] * L + L)) if len(r) == 2 else set(range(r[1], r[1] + w)) | set(r[3]) + assert len(foot) == L and not foot & cells[f], ('footprints overlap on a bank family', f); cells[f] |= foot +def main(src, out): + t0 = time.monotonic(); out.mkdir(parents=True, exist_ok=False) + blob = gzip.decompress((src / 'GLOBAL-TEMPLATE.json.gz').read_bytes()); t = json.loads(blob) + integ = json.loads((src / 'INTEGRATION.json').read_text()); checks = json.loads((src / 'LOCAL-CHECKS.json').read_text()) + assert hashlib.sha256(blob).hexdigest() == integ['global_template_sha256'] and t['live'] == integ['live'] + rank = {} + for it in t['idle_children']: + assert it['replicas'] == T; rank.setdefault(it['child'], it['rank']); assert rank[it['child']] == it['rank'] + pair_of_stage = {e['stage']: e['pair'] for e in t['recipe'] if e['kind'] == 'local'} + sched = []; side_of = {}; pair_of = {} + for e in t['execution_schedule']: + if e['kind'] == 'local_cover_sweep': sched.append(dict(kind='local', stage=e['stage'], pair=pair_of_stage[e['stage']])) + elif e['kind'] == 'bridge': sched.append(dict(kind='bridge', dst=e['dst'], src=e['src'])) + elif e['kind'] == 'idle_cover_sweep': + for sd, ch in enumerate(e['child_indices']): + if ch in rank: + sched.append(dict(kind='idle', pair=e['pair'], rank=rank[ch], idx=ch)); side_of[ch] = sd; pair_of[ch] = e['pair'] + # GK: residual widths from the word's entrance frames (all 9 at the defaults) + canon = json.loads(gzip.decompress((src / 'CANONICAL-WORD.json.gz').read_bytes())) + widths = [L - len(canon['frames'][canon['start'][2 * V + i]]) for i in range(R)] + win = {k: x for k, x in HC.windows(sched).items() if x[1] >= min(widths) and x[2]} + avail = {} + for w_ in widths: avail[(0, w_)] = avail.get((0, w_), 0) + 1 + avail = {(s, w_): z for s in range(L) for (_, w_), z in avail.items()} + sel = Path(SELECTION) if SELECTION else PKG442 / 'SELECTION.json'; key = KEY + if ONEPER: # GK: whole residuals, at most one helper per physical family per invocation (PR #458's rule) + OH.check_disjoint_groups(win, pair_of, side_of) + if DISCOVER: + psel, val = OH.solve(win, V, avail, M, HC.cost(1, M) / 8); OH.save(DISCOVER_TO or sel, key, psel, val); sel = DISCOVER_TO or sel + psel, val = OH.load(sel, key) + slots, rem = OH.expand(win, psel, widths, V) + ph = json.loads(Path('work/complex-nine-native/DATA-PHASES.json').read_text()) + assert [p['q'] for p in ph['recipes']] == canon['ports'] and len(ph['recipes']) == V + else: + if DISCOVER: + ys, zs, val = HC.solve(win, V, avail, M, pad_value=HC.cost(1, M) / 8); HC.save_selection(DISCOVER_TO or sel, key, ys, zs, val) + sel = DISCOVER_TO or sel + ys, zs, val = HC.load_selection(sel, key) + helpers = {s: [(h, widths[h]) for h in sorted(range(R), key=lambda h: (-widths[h], h))] for s in range(L)} # GK: widest first + slots, rem = HC.expand(win, ys, zs, helpers, V) + hosted = {(s, h): (i, port, off) for i, port, off, w, s, h in slots} + # re-tile unhosted residuals: per stage, z = rank among (replica, helper) unhosted pairs; eight per bank + base = [DATA]; tl = {}; partial = Counter() + for s in range(L): # GK: width-9 residuals: eight per bank and one pad, as in PR #442; entering residuals: one per replica per bank (gk_common.tile) + left = [(rep, h, widths[h]) for rep in range(T) for h in range(R) if (s, h) not in hosted] + asg, nb, pads = tile(left) + for (rep, h), x_ in asg.items(): tl[s, rep, h] = x_ + base.append(base[-1] + nb); partial.update(pads) + W = base[-1] + for c in t['calls']: + s, rep, p = c['stage'], c['replica'], c['pair']; own = c['owners'][:2 * V] + for h in range(R): + if (s, h) in hosted: + i, port, off = hosted[s, h]; w_ = widths[h] + if ONEPER and w_ < L: # GK: explicit spectator chart (PR #458's route record); width 9 has no spectator and keeps [3, i, off] + rt = [4, i, off, w_, OH.spectators(canon['ports'][port], [int(x) for x in ph['recipes'][port]['idle_children'][i]['orthogonal_axes']], off, w_)] + else: rt = [3, i, off] + own.append([rep * 960 + (2 * pair_of[i] + side_of[i]) * V + port, rt]) + else: + b, off_, w_, pure_, sp_ = tl[s, rep, h]; own.append([base[s] + b, route(off_, w_, pure_, sp_)]) + assert len({(f, json.dumps(r)) for f, r in own}) == 2 * V + R and all(f < W for f, r in own) # every owner lies in the live stock: none in the private namespace + if ONEPER: one_helper_rule(own, widths, W) # GK: the rule on EVERY register class, not only the data families + c['owners'] = own + if ONEPER: # GK: bank chart across all invocations: residual cells packed from 0, the spectators of an entering helper are the first cells beyond them + occ = defaultdict(set) + for c in t['calls']: + for h, (f, r) in enumerate(c['owners'][2 * V:]): + if f >= DATA: occ[f] |= set(range(r[1] * L, r[1] * L + L)) if len(r) == 2 else set(range(r[1], r[1] + widths[h])) + for c in t['calls']: + for h, (f, r) in enumerate(c['owners'][2 * V:]): + if f >= DATA and widths[h] < L: + assert occ[f] == set(range(len(occ[f]))) and r[2] == widths[h] and r[3] == list(range(len(occ[f]), len(occ[f]) + L - widths[h])) and len(occ[f]) + L - widths[h] <= M, ('bank spectator chart', f, r) + paid = Counter() + for c in t['calls']: + for r_, z in checks[c['orientation']]['paid_profile'].items(): paid[int(r_)] += z + newidle = [] + for it in t['idle_children']: + ch, port = it['child'], it['port']; rr = rem.get((ch, port), it['rank']) if ch in win else it['rank'] + if rr: newidle.append(dict(child=ch, port=port, rank=rr, hosted=it['rank'] - rr, replicas=T)); paid[rr] += T + for r_, n in partial.items(): paid[r_] += L * n if False else n * 1 + # padding: one pad child per bank per stage (already per-stage counted above), the template replays all stages + mass = sum(r * n for r, n in paid.items()); D = M * W - mass + assert D == 2496, D + t.update(version='hamming-mutable-basis-nine-v1+idle-axis-hosting', live=W, idle_children=newidle, + physical=W + R + (integ['physical'] - integ['live'] - R), + hosting=dict(windows={str(i): [w[0], w[1], sorted(w[2])] for i, w in win.items()}, sides=side_of, pairs=pair_of, + slots=[list(x) for x in slots], banks=[base[s + 1] - base[s] for s in range(L)])) + if ONEPER: # GK + C_ = len(canon['centers']); t['private_namespace'] = {'centers': [W, W + C_], 'reserved_tableau': [W + C_, W + C_ + R], 'coefficient': [t['physical'] - 2, t['physical']]} # re-based on the hosted stock (the parent's ranges lie beyond the hosted physical stock) + t['hosting']['max_helpers_per_physical_family_per_call'] = 1 + t['route_semantics']['helper'] += '; entering helpers: paid wrappers R_E^-1 before and L_E^-1 after the invocation, route [4, child, offset, width, spectator indices]; an entering helper is the only owner of its physical family in the invocation (data or bank); a banked entering helper is [2, offset, width, spectator cells] with the spectators the first cells of the bank beyond every residual cell' + t['bank_padding']['families'] = list(range(DATA, W)); t['cover_final_correction']['families'] = [0, W] + t['cover_final_correction']['charged_calls_per_cover'] = W + for e in t['execution_schedule']: + if e['kind'] == 'bank_padding_cover_sweep': e['families'] = [DATA, W] + elif e['kind'] == 'translate_every_live_family': e.update(t['cover_final_correction']) + tb = json.dumps(t, sort_keys=True, separators=(',', ':')).encode(); (out / 'GLOBAL-TEMPLATE.json.gz').write_bytes(gzip.compress(tb, mtime=0)) + res = dict(status='PASS_IDLE_AXIS_HOSTED_COMPLEX_TEMPLATE', parent_template_sha256=integ['global_template_sha256'], + template_sha256=hashlib.sha256(tb).hexdigest(), live=W, physical=t['physical'], global_profile=dict(sorted(paid.items())), + rank_mass=mass, deficit=D, maxchild=max(paid), hosted_residuals=len(slots) * T, banks_per_stage=t['hosting']['banks'], + saved_cost_proxy=val, seconds=time.monotonic() - t0) + (out / 'HOSTED.json').write_text(json.dumps(res, indent=2) + '\n') + print(json.dumps({k: res[k] for k in ('live', 'maxchild', 'hosted_residuals', 'banks_per_stage', 'deficit')})) +if __name__ == '__main__': + # GK: --selection FILE --key NAME choose a frozen selection of this package; --discover-to FILE recomputes it with scipy + argv = sys.argv[1:]; opts = {} + for o in ('--selection', '--key', '--discover-to'): + if o in argv: i = argv.index(o); opts[o] = argv[i + 1]; del argv[i:i + 2] + SELECTION = opts.get('--selection'); KEY = opts.get('--key', 'complex'); DISCOVER_TO = Path(opts['--discover-to']) if '--discover-to' in opts else None + ONEPER = '--one-helper-per-family' in argv + DISCOVER = '--discover' in argv or DISCOVER_TO is not None; args = [a for a in argv if a not in ('--discover', '--one-helper-per-family')] + main(Path(args[0]), Path(args[1])) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py new file mode 100644 index 0000000000..df261063e1 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py @@ -0,0 +1,123 @@ +# GK: modified copy of PR #433's complex_integrate.py (icekylinx with Codex assistance; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:". On a word without start_extra / target_levels the behaviour +# and every written file equal PR #433's (regression anchor in verify.py). +import sys as _sys, os as _os; _sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) +# Adapted from PR425 for heterogeneous centres by icekylinx, with Codex assistance. +import copy,gzip,hashlib,importlib.util,json,math +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path +OUT=Path('split-centres');cp=OUT/'CANONICAL-WORD.json.gz' +c=json.load(gzip.open(cp));audit=json.loads((OUT/'SCALAR-FRAME-AUDIT.json').read_text()) +phase=json.loads((OUT/'CLIFFORD-REVIEW.json').read_text());sha=lambda p:hashlib.sha256(Path(p).read_bytes()).hexdigest() +assert phase['canonical_word_sha256']==audit['canonical_word_sha256']==sha(cp) +assert phase['all_child_equalities_include_global_phase'] +programs=json.load(gzip.open(OUT/'LOCAL-PROGRAMS.json.gz'));checks=json.loads((OUT/'LOCAL-CHECKS.json').read_text()) +frames=c['frames'];v,R,h=c['v'],c['R'],c['h'];n=2*v+R;private_centres=len(c['centers']) +for z in checks.values():z['paid_profile']={int(r):n for r,n in z['paid_profile'].items()} +old=Path('work/complex-nine-native');template=json.load(gzip.open(old/'GLOBAL-TEMPLATE.json.gz')) +data_phase=json.loads((old/'DATA-PHASES.json').read_text()) +assert template['exact_data_phase_recipe_sha256']==sha(old/'DATA-PHASES.json') +assert data_phase['status']=='PASS_EXACT_Z4_DATA_ROUTE_IDLE_AND_TERMINAL_PHASES' +m,T,L,k=73,8,9,4 +# GK: residual widths 9 - dim(start frame); banks tile per width class (all 9: PR #433's eight residuals + one pad) +from gk_common import tile,route +widths=[h-len(frames[c['start'][2*v+i]]) for i in range(R)] +assign,nb,pads=tile([(rep,i,widths[i]) for rep in range(T) for i in range(R)]);entering0=any(w_2*maxchild**depth +assert local_bound<1<<48 and logical<1<<6050 and router0 + bound=max(math.ceil(36/gap**2),math.ceil(2*(4+512)/gap)) + assert bound*gap**2>=36 and bound*gap>=2*(4+512) + cutoffs.append(str(bound));chain.append(z) +bridge={'semantic':{'C0':{'base':2,'exponent':210000},'strict_literal_gap':1}, + 'rows':{'degree_gap':Q(10**6)-Q(51*20161,25)}} +q=chain[-1]*(1-2*eta);ticks=(1-eta)*q/(1+q)/grid;kap=Q((ticks.numerator-1)//ticks.denominator,10**18) +assembly=Outer.assembly(chain[-1],b,bridge,kap,eta=eta,beta=beta) +try:Outer.assembly(chain[-1],b,bridge,kap+grid,eta=eta,beta=beta) +except AssertionError:pass +else:raise AssertionError('next kappa grid accepted') +result={'status':'PASS_NEW_STRUCTURAL_PROGRAM_AND_FINITE_ASSEMBLY_PENDING_REPLAY', + 'canonical_word_sha256':sha(cp),'scalar_audit_sha256':sha(OUT/'SCALAR-FRAME-AUDIT.json'), + 'exact_phase_receipt_sha256':sha(OUT/'CLIFFORD-REVIEW.json'),'global_template_sha256':hashlib.sha256(blob).hexdigest(), + 'local_program_checks':checks,'R':R,'m':m,'live':W,'physical':physical, + 'bank_assignments':len(assignments),'rank_mass':mass,'deficit':2496, + 'global_profile':dict(sorted(paid.items())),'emitted_local_events_all_calls':event_count, + 'finite_invoice':{'local_primitive_bound':local_bound,'local_adapters':adapters, + 'pervertex':pervertex,'physical_stock_bits':stock.bit_length(), + 'router_bits':router.bit_length(),'literal_bits':literal.bit_length(), + 'physical_row_coefficient':row,'retained_row_coefficient':20161, + 'compiler':compiler,'G_exponent':30000,'E_exponent':100000,'C0_exponent':210000, + 'required_C0_bits':(32*m*BB*BB).bit_length(),'halving_degree':depth, + 'halving_integer_inequality':[m**depth,2*maxchild**depth]}, + 'complex_b':str(b),'bit_c':str(bit),'prospective_kappa':str(kap),'kappa_float':float(kap), + 'log2_kappa':math.log2(float(kap)), + 'kappa_gain_percent':float(100*(kap/Q(998390813251625,10**18)-1)), + 'strict_outer_constraints':{name:str(z) for name,z in assembly['strict_constraints'].items()}, + 'next_kappa_grid_rejected':True,'bootstrap_cutoffs_log2':cutoffs, + 'scope':'New finite scalar interface with a written conjugation proof, conditional on inherited all-size compiler, precision/tape and analytic transfer. Independent emitted-program replay and fresh package replay still required before final promotion.'} +(OUT/'INTEGRATION.json').write_text(json.dumps(result,indent=2)+'\n') +print('PASS prospective kappa',float(kap),'gain',result['kappa_gain_percent'],'percent',flush=True) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py new file mode 100644 index 0000000000..2c3ec7067e --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/check.py @@ -0,0 +1,49 @@ +"""Independent check stage for Lemma G (PROOF.md §2) on the emitted artefacts of one variant. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +usage: check.py BASE VARIANT OUTDIR [--mutants] +BASE/VARIANT/{split-centres,hosted} is a run_variant.py work directory (BASE = the output directory of verify.py). The scripts of this directory import no +script of the package and none of PR #433/#442 except the vendored `clifford_exact`, which is used only as the DEFINITION of the label operators T_F and of the port +gate C_q (every executed transition, data adapter and wrapper is decoded from its serialized recipe). + gd.selftest the exact Gaussian-dyadic applier agrees with the vendored state-vector routine on 19 operators + run_labels.py label / scalar / accounting checker on both orientations (clauses G0-G4, S, ACC), the 72 calls' program digests + lg_instances.py I-tr, I-comp, I-centre, I-helper: exact operator identities of every Lemma G instance on all 512 basis columns (not for the anchor) + lg_e2e.py the complete emitted program end to end, both orientations, against the transform computed from definitions + lg_mutants.py the 14 necessity controls (--mutants; headline word only) +Writes LEMMA-G-CHECK.json (deterministic content only) into OUTDIR; any failure raises.""" +import json, os, subprocess, sys +from collections import Counter +from pathlib import Path +HERE = Path(__file__).resolve().parent +base, name, outd = Path(sys.argv[1]).resolve(), sys.argv[2], Path(sys.argv[3]).resolve(); mut = '--mutants' in sys.argv[4:] +outd.mkdir(parents=True, exist_ok=True) +env = dict(os.environ, LG_BASE=str(base), PYTHONDONTWRITEBYTECODE='1', PYTHONINTMAXSTRDIGITS='0'); env.pop('PYTHONOPTIMIZE', None) +def run(script, *args): + log = outd / (Path(script).stem + '-' + name + '.log') + with log.open('w') as f: q = subprocess.run([sys.executable, '-B', str(HERE / script), *args], cwd=outd, env=env, stdout=f, stderr=subprocess.STDOUT) + if q.returncode: raise RuntimeError((script, name, log.read_text()[-2000:])) +sys.path.insert(0, str(HERE)); import lg_phys as P; from gd import selftest +S = dict(variant=name, selftest_operators=selftest(P.ce)) +run('run_labels.py', name) +L = json.loads((outd / ('LABELS-' + name + '.json')).read_text())[name] +keys = ('n_label_violations', 'scalar_violations', 'events', 'sha256', 'compensation_gates', 'kernel_updates', 'entering', 'entrance_rank', 'local_mass', 'paid_profile') +S['labels'] = {o: {k: L[o][k] for k in keys} for o in ('forward', 'backward')}; S['calls'] = {k: L['calls'][k] for k in ('n', 'ok', 'orient')}; S['inputs'] = L['inputs'] +assert all(S['labels'][o]['n_label_violations'] == 0 and S['labels'][o]['scalar_violations'] == [] for o in S['labels']) and S['calls']['ok'], 'label / scalar checker' +if name != 'anchor': + run('lg_instances.py', name) + I = json.loads((outd / ('INSTANCES-' + name + '.json')).read_text()) + S['instances'] = {'I-tr': dict(transitions=I['I-tr']['transitions'], failures=len(I['I-tr']['failures'])), + 'I-comp': dict(compensation_gates=I['I-comp']['compensation_gates'], targets=I['I-comp']['targets'], entering_helpers_compensating=I['I-comp']['entering_helpers_compensating'], + input_registers=I['I-comp']['input_registers'], failures=len(I['I-comp']['failures'])), + 'I-centre': dict(centres=I['I-centre']['centres'], chains=sorted(Counter('-'.join(map(str, d['path_dims'])) for d in I['I-centre']['detail']).items()), failures=len(I['I-centre']['failures'])), + 'I-helper': dict(entering_helpers=I['I-helper']['entering_helpers'], widths=dict(sorted(I['I-helper']['widths'].items())), failures=len(I['I-helper']['failures']))} + assert all(x['failures'] == 0 for x in S['instances'].values()), 'instance identities' +run('lg_e2e.py', name) +E = json.loads((outd / ('E2E-' + name + '.json')).read_text()) +S['end_to_end'] = dict(status=E['status'], columns=E['columns'], kinds=dict(sorted(E['kinds'].items())), dense=E['dense'], seed=E['seed'], failures=len(E['failures'])) +assert E['status'] == 'PASS' and not E['failures'], 'end-to-end identity' +if mut: + run('lg_mutants.py') + M = json.loads((outd / 'MUTANTS.json').read_text()) + S['necessity_mutants'] = [dict(mutant=m['mutant'], rejected=m['rejected'], checker_flags=m['checker_flags'], physics=m['physics']) for m in M] + assert len(M) == 14 and all(m['rejected'] for m in M), 'necessity controls' +(outd / 'LEMMA-G-CHECK.json').write_text(json.dumps(S, indent=1, sort_keys=True) + '\n'); print(name, 'PASS Lemma G independent checks', flush=True) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py new file mode 100644 index 0000000000..e6a5d77381 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/gd.py @@ -0,0 +1,170 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +"""Exact Gaussian-dyadic batch vectors on C^(2^9) and an independent applier for Clifford circuit primitives. + +A register value is (re + i*im) / 2^d with re, im int64 arrays of shape (512, k) (k simultaneous input columns). +Every operation asserts |numerator| < 2^60 afterwards, so int64 never wraps: a result is exact or the run aborts. + +Primitive semantics (written here from the documented conventions of the vendored compiler, not imported): + ('P', G) v'[G x] = v[x] (G given by its 9 rows over F2) + ('X', b) v'[x] = v[x ^ b] + ('D', Q, alpha) v'[x] = i^(sum_i alpha_i x_i + 2 sum_{i G^-1, D -> conjugate phases, X -> X, phase -> -p, C(q,s) -> C(q,-s). +`selftest()` compares this applier with the vendored compiler's own state-vector routine on basis vectors.""" +import numpy as np + +N = 512; n = 9 +XS = np.arange(N, dtype=np.int64) +LIM = 1 << 60 + + +def par(x): return bin(x).count('1') & 1 + + +def mv(rows, x): return sum(par(r & x) << i for i, r in enumerate(rows)) + + +_pcache = {} +def pidx(G): + G = tuple(G) + if G not in _pcache: _pcache[G] = np.array([mv(G, x) for x in range(N)], dtype=np.int64) + return _pcache[G] + + +_dcache = {} +def qarr(Q, alpha): + key = (tuple(Q), tuple(alpha)) + if key not in _dcache: + out = np.zeros(N, dtype=np.int64) + for x in range(N): + s = sum(alpha[i] for i in range(n) if x >> i & 1) + s += 2 * sum(1 for i in range(n) for j in range(i + 1, n) if x >> i & 1 and x >> j & 1 and Q[i] >> j & 1) + out[x] = s % 4 + _dcache[key] = out + return _dcache[key] + + +class GD: + __slots__ = ('re', 'im', 'd') + def __init__(self, re, im, d=0): self.re, self.im, self.d = re, im, d + @staticmethod + def zeros(k): return GD(np.zeros((N, k), np.int64), np.zeros((N, k), np.int64), 0) + def copy(self): return GD(self.re.copy(), self.im.copy(), self.d) + def k(self): return self.re.shape[1] + def guard(self): + if self.re.size and (np.abs(self.re).max() >= LIM or np.abs(self.im).max() >= LIM): raise OverflowError('int64 guard') + def norm(self): + while self.d > 0 and not np.any((self.re | self.im) & 1): + self.re >>= 1; self.im >>= 1; self.d -= 1 + return self + def is_zero(self): return not np.any(self.re) and not np.any(self.im) + def equals(self, o): + a = self.copy().norm(); b = o.copy().norm() + if a.is_zero() and b.is_zero(): return True + return a.d == b.d and np.array_equal(a.re, b.re) and np.array_equal(a.im, b.im) + def mul_ipow(self, q): # q: scalar or (512,) array of exponents mod 4 + q = np.asarray(q) % 4 + if q.ndim: q = q[:, None] + re, im = self.re, self.im + nre = np.where(q == 0, re, np.where(q == 1, -im, np.where(q == 2, -re, im))) + nim = np.where(q == 0, im, np.where(q == 1, re, np.where(q == 2, -im, -re))) + self.re, self.im = nre, nim + return self + def apply_prim(self, p, inverse=False): + t = p[0] + if t == 'P': + idx = pidx(p[1]) + if inverse: self.re, self.im = self.re[idx], self.im[idx] + else: + r = np.empty_like(self.re); i = np.empty_like(self.im); r[idx] = self.re; i[idx] = self.im; self.re, self.im = r, i + elif t == 'X': + idx = XS ^ p[1]; self.re, self.im = self.re[idx], self.im[idx] + elif t == 'D': + q = qarr(p[1], p[2]); self.mul_ipow(-q if inverse else q) + elif t == 'phase': + self.mul_ipow(-p[1] if inverse else p[1]) + elif t == 'C': + q, s = p[1], p[2] + if inverse: s = -s + idx = XS ^ q; wr, wi = self.re[idx], self.im[idx] + re, im = self.re, self.im + self.re = re - s * im + wr + s * wi + self.im = im + s * re + wi - s * wr + self.d += 1 + else: raise ValueError(p) + self.guard() + return self + def apply_circ(self, circ, inverse=False): + for p in (reversed(circ) if inverse else circ): self.apply_prim(p, inverse) + return self.norm() + def add_scaled(self, src, num, den): + """self += (num/den) * src, den a power of two""" + assert den > 0 and den & (den - 1) == 0 + e = den.bit_length() - 1 + D = max(self.d, src.d + e) + a = self.re << (D - self.d); b = self.im << (D - self.d) + sh = D - src.d - e + a = a + num * (src.re << sh); b = b + num * (src.im << sh) + self.re, self.im, self.d = a, b, D + self.guard(); return self.norm() + def scale(self, num, den): + assert den > 0 and den & (den - 1) == 0 + self.re = self.re * num; self.im = self.im * num; self.d += den.bit_length() - 1 + self.guard(); return self.norm() + + +def circ_of(op): + """primitive list of a vendored Op (used only to read the DEFINITION of canonical frames / gates)""" + return [tuple(e) for e in op.circuit] + + +def monomial_circ(rec): + """decode a serialized Gaussian monomial: diag(Q, alpha), then perm(G), then translation, then global phase""" + return [('D', tuple(rec['quadratic_rows']), tuple(rec['linear_Z4'])), ('P', tuple(rec['matrix_rows'])), ('X', rec['offset']), ('phase', rec['phase'])] + + +def fourier_circ(axes): return [('C', 1 << i, 1) for i in axes] + + +def recipe_circ(rec): + """serialized child recipe: right monomial, Fourier on the first `rank` axes, left monomial (rank 0: the monomial in `left`)""" + if rec['rank'] == 0: return monomial_circ(rec['left']) + return monomial_circ(rec['right']) + fourier_circ(range(rec['rank'])) + monomial_circ(rec['left']) + + +def basis_batch(cols): + """GD with column c = basis vector e_{cols[c]}""" + g = GD.zeros(len(cols)) + for c, b in enumerate(cols): g.re[b, c] = 1 + return g + + +def identity_batch(): return basis_batch(list(range(N))) + + +def selftest(vendor): + import random + ce = vendor + rng = random.Random(1) + FULL = tuple(1 << i for i in range(n)) + ops = [ce.canonical_frame(n, ()), ce.canonical_frame(n, FULL), ce.canonical_frame(n, (510,)), ce.canonical_frame(n, (408, 102)), + ce.cgate(n, 7), ce.cgate(n, 13).adjoint(), ce.fourier(n, range(5))] + for _ in range(6): + U = [] + while len(U) < rng.randint(1, 8): + x = rng.randrange(1, N) + if ce.rank(U + [x]) > len(U): U.append(x) + ops.append(ce.canonical_frame(n, tuple(U))) + ops.append(ce.canonical_frame(n, tuple(U)).adjoint().then(ce.canonical_frame(n, FULL))) + for op in ops: + cols = rng.sample(range(N), 12) + g = basis_batch(cols).apply_circ(circ_of(op)) + for c, b in enumerate(cols): + vec, den = op.zero_state(b) + ref = GD(np.array([[a] for a, _ in vec], np.int64), np.array([[bb] for _, bb in vec], np.int64), den) + col = GD(g.re[:, c:c + 1].copy(), g.im[:, c:c + 1].copy(), g.d) + assert col.equals(ref), 'applier disagrees with vendored state vector' + h = g.copy().apply_circ(circ_of(op), inverse=True) + assert h.equals(basis_batch(cols)), 'inverse applier' + return len(ops) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py new file mode 100644 index 0000000000..5c13bb0ff3 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_e2e.py @@ -0,0 +1,41 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +"""End-to-end exact identity of the full emitted local program (both orientations) on >= 256 random basis columns, structured +columns (every entering helper twice, every target with a nonzero level, every centre register, every source/target port) and +dense columns (every register dirty with random Gaussian integers simultaneously). Transitions, data adapters and wrappers are +executed from their serialized recipes; the expected transform is computed from definitions (lg_phys.expected). +usage: lg_e2e.py VARIANT [n_random] [seed]""" +import sys, json, time, random +import numpy as np +from lg_lib import load +from lg_phys import Model, run, expected, compare +from gd import GD +import os +SP = os.environ['LG_BASE'] # the output directory of verify.py: //{split-centres,hosted} +name = sys.argv[1]; nr = int(sys.argv[2]) if len(sys.argv) > 2 else 256; seed = int(sys.argv[3]) if len(sys.argv) > 3 else 2026 +d = load(f'{SP}/{name}'); m = Model(d); c = d['c']; v = c['v']; rng = random.Random(seed) +cols = [('random', rng.randrange(m.n), rng.randrange(512)) for _ in range(nr)] +ent = [r for r in range(2 * v, m.n) if c['start'][r] != 0] +cols += [('entering', r, b) for r in ent for b in (0, rng.randrange(1, 512))] +cols += [('target_level', v + int(t), rng.randrange(512)) for t in c.get('target_levels', {})] +cols += [('centre', r, rng.randrange(512)) for r in c['centers']] +cols += [('port', r, rng.randrange(512)) for r in range(2 * v)] +B = 32; rep = {'variant': name, 'seed': seed, 'columns': len(cols), 'kinds': {}, 'batches': 0, 'failures': [], 'dense': 0} +for k in set(x[0] for x in cols): rep['kinds'][k] = sum(1 for x in cols if x[0] == k) +t0 = time.time() +def check(init, label): + for o in ('forward', 'backward'): + got = run(m, d['progs'][o], init); exp = expected(m, init, o == 'backward') + bad, left = compare(m, got, exp) + if bad or left: rep['failures'].append((label, o, bad[:10], [str(x) for x in left])) +for i in range(0, len(cols), B): + chunk = cols[i:i + B]; init = {} + for ci, (_, r, b) in enumerate(chunk): init.setdefault(('L', r), GD.zeros(len(chunk))).re[b, ci] = 1 + check(init, f'batch{i // B}'); rep['batches'] += 1 + print(name, 'batch', i // B, 'failures so far', len(rep['failures']), round(time.time() - t0), flush=True) +nprng = np.random.default_rng(seed) +for j in range(2): # dense: every register dirty at once, 4 independent columns per run + k = 4; init = {('L', r): GD(nprng.integers(-1000, 1001, (512, k)).astype(np.int64), nprng.integers(-1000, 1001, (512, k)).astype(np.int64), 0) for r in range(m.n)} + check(init, f'dense{j}'); rep['dense'] += k + print(name, 'dense', j, 'failures so far', len(rep['failures']), round(time.time() - t0), flush=True) +rep['seconds'] = round(time.time() - t0, 1); rep['status'] = 'PASS' if not rep['failures'] else 'FAIL' +json.dump(rep, open(f'E2E-{name}.json', 'w'), indent=1); print(name, rep['status'], rep['columns'], 'basis columns +', rep['dense'], 'dense', rep['seconds'], 's') diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py new file mode 100644 index 0000000000..023880988e --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_instances.py @@ -0,0 +1,125 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +"""Exhaustive exact operator identities for every Lemma G instance of one variant (all 512 basis columns of every input). + I-tr every transition used by the program (climbs and centre steps): serialized recipe == T_b T_a^-1 (definition) + I-comp the nonzero-frame compensation segment (head of A): for every input register (target or entering helper) the segment + acts as h_t -> T_{lam_t} (h_t + sum_j c_tj T_{E_j}^-1 h_j), h_j -> h_j (labels lam from the stream) + I-centre every centre phase, both orientations: forward h_t += q_t T_{L_t} T_{c_k}^-1 h_r ; backward h_r -= sum_t q_t T_{c_k} T_{L_t}^-1 h_t + I-helper every entering helper: L_E^-1 . (product of the recipes of ITS emitted climb chain E -> ... -> FULL) . R_E^-1 == C_[w] (x) I +usage: lg_instances.py VARIANT [skip_tr]""" +import sys, json, time +from collections import defaultdict +from lg_lib import load, check_labels +from lg_phys import Model, run +from gd import GD, identity_batch, fourier_circ +import os +SP = os.environ['LG_BASE'] # the output directory of verify.py: //{split-centres,hosted} + + +def main(name, skip_tr=False): + d = load(f'{SP}/{name}'); m = Model(d); c = d['c']; v = c['v']; start = c['start'] + I = identity_batch(); rep = {'variant': name}; t0 = time.time() + fw, bw = d['progs']['forward'], d['progs']['backward'] + # ---- I-tr ------------------------------------------------------------------------------------------------- + used = sorted({(e[3], e[4]) for e in fw + bw if e[0] == 'climb'} | {(e[2], e[3]) for e in fw + bw if e[0] == 'center'}) + if not skip_tr: + badtr = [ab for ab in used if not m.rec_transition(I.copy(), *ab).equals(m.def_transition(I.copy(), *ab))] + rep['I-tr'] = dict(transitions=len(used), columns_each=512, failures=badtr) + print(name, 'I-tr', len(used), 'failures', len(badtr), round(time.time() - t0), flush=True) + # ---- labels along the forward stream ---------------------------------------------------------------------- + lam = {r: start[r] for r in range(2 * v + c['R'])} + iA = fw.index(['phase', 'A']); seg_end = None; comp = [] + for idx in range(iA + 1, len(fw)): + e = fw[idx] + if e[0] == 'climb': lam[e[2]] = e[4]; continue + if e[0] == 'scalar' and e[1][0] == 'add': + t, s = e[1][1][1], e[1][2][1] + if v <= t < 2 * v and start[s] != 0 and e[2] == start[s]: comp.append((t, s, e[1][3], e[1][4])); continue + seg_end = idx; break + seg = fw[iA + 1:seg_end] + # labels at the end of the segment + lam_end = {r: start[r] for r in range(2 * v + c['R'])} + for e in fw[:seg_end]: + if e[0] == 'climb': lam_end[e[2]] = e[4] + tg = sorted({t for t, s, a, b in comp}); hs = sorted({s for t, s, a, b in comp}) + regs = tg + hs; badc = [] + for r in regs: + got = run(m, seg, {('L', r): I}) + exp = {} + if r in tg: exp[r] = m.def_transition(I.copy(), 0, lam_end[r]) + else: + exp[r] = I.copy() + for t, s, a, b in comp: + if s != r: continue + x = m.def_transition(I.copy(), start[r], lam_end[t]); x.scale(a, b) if b > 0 else x.scale(-a, -b) + if t in exp: exp[t].add_scaled(x, 1, 1) + else: exp[t] = x + keys = set(exp) | {k[1] for k in got if k[0] == 'L'} + for k in keys: + a_ = got.get(('L', k)); b_ = exp.get(k) + if a_ is None: a_ = GD.zeros(512) + if b_ is None: b_ = GD.zeros(512) + if not a_.equals(b_): badc.append((r, k)) + rep['I-comp'] = dict(compensation_gates=len(comp), targets=len(tg), entering_helpers_compensating=len(hs), + input_registers=len(regs), columns_each=512, target_levels_after_segment=sorted({lam_end[t] for t in tg}), failures=badc) + print(name, 'I-comp gates', len(comp), 'inputs', len(regs), 'failures', len(badc), round(time.time() - t0), flush=True) + # ---- I-centre ----------------------------------------------------------------------------------------------- + badk = []; cinfo = [] + for orient, ev in (('forward', fw), ('backward', bw)): + lamc = {r: start[r] for r in range(2 * v + c['R'])} + i0 = ev.index(['phase', 'centers']); i1 = ev.index(['phase', 'B']) + for e in ev[:i0]: + if e[0] == 'climb': lamc[e[2]] = e[4] + cent = ev[i0 + 1:i1] + groups = defaultdict(list); cur = None + for e in cent: + if e[0] == 'scalar': + op = e[1]; ks = [x[1] for x in op[1:] if isinstance(x, list) and x[0] == 'C'] + if ks: cur = ks[0] + elif e[0] == 'center': cur = e[1] + groups[cur].append(e) + for k, evs in sorted(groups.items()): + r = c['centers'][k]; cf = c['center_frames'][k]; assert lamc[r] == cf + terms = [(op[1][1], op[3], op[4]) for _, op, f in [e for e in evs if e[0] == 'scalar'] if op[0] == 'add' and op[1][0] == 'L' and op[2][0] == 'C'] if orient == 'forward' else \ + [(op[2][1], op[3], op[4]) for _, op, f in [e for e in evs if e[0] == 'scalar'] if op[0] == 'add' and op[1][0] == 'C' and op[2][0] == 'L'] + path = [cf] + [e[3] for e in evs if e[0] == 'center'] if orient == 'forward' else None + if orient == 'forward': + got = run(m, evs, {('L', r): I}) + exp = {r: I.copy()} + for t, a, b in terms: + x = m.def_transition(I.copy(), cf, lamc[t]); x.scale(a, b) + if t in exp: exp[t].add_scaled(x, 1, 1) + else: exp[t] = x + for kk in set(exp) | {q[1] for q in got if q[0] == 'L'}: + a_, b_ = got.get(('L', kk)), exp.get(kk) + if not (a_ or GD.zeros(512)).equals(b_ or GD.zeros(512)): badk.append((orient, k, kk)) + if any(q[0] == 'C' and not y.is_zero() for q, y in got.items()): badk.append((orient, k, 'copy not cleared')) + cinfo.append(dict(centre=k, register=r, frame=cf, path_dims=[len(m.frames[f]) for f in path], targets=len(terms))) + else: + for t, a, b in terms: + got = run(m, evs, {('L', t): I}) + x = m.def_transition(I.copy(), lamc[t], cf); x.scale(-a, b) + exp = {t: I.copy(), r: x} + for kk in set(exp) | {q[1] for q in got if q[0] == 'L'}: + a_, b_ = got.get(('L', kk)), exp.get(kk) + if not (a_ or GD.zeros(512)).equals(b_ or GD.zeros(512)): badk.append((orient, k, t, kk)) + if any(q[0] == 'C' and not y.is_zero() for q, y in got.items()): badk.append((orient, k, t, 'copy not cleared')) + rep['I-centre'] = dict(centres=len(c['centers']), detail=cinfo, failures=badk) + print(name, 'I-centre failures', len(badk), round(time.time() - t0), flush=True) + # ---- I-helper ----------------------------------------------------------------------------------------------- + badh = []; widths = defaultdict(int) + for r in range(2 * v, 2 * v + c['R']): + if start[r] == 0: continue + chain = [(e[3], e[4]) for e in fw if e[0] == 'climb' and e[2] == r] + assert chain[0][0] == start[r] and chain[-1][1] == 1 + Rc, Lc, w = m.wraps[start[r]]; widths[w] += 1 + g = I.copy().apply_circ(Rc, inverse=True) + for a, b in chain: m.rec_transition(g, a, b) + g.apply_circ(Lc, inverse=True) + if not g.equals(I.copy().apply_circ(fourier_circ(range(w)))): badh.append(r) + rep['I-helper'] = dict(entering_helpers=sum(widths.values()), widths=dict(widths), columns_each=512, failures=badh) + print(name, 'I-helper', sum(widths.values()), 'failures', len(badh), round(time.time() - t0), flush=True) + rep['seconds'] = round(time.time() - t0, 1) + json.dump(rep, open(f'INSTANCES-{name}.json', 'w'), indent=1) + + +if __name__ == '__main__': main(sys.argv[1], len(sys.argv) > 2) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py new file mode 100644 index 0000000000..5aada23535 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_lib.py @@ -0,0 +1,216 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +"""Independent Lemma G checker: labels, scalar replay, accounting. Reads only the EMITTED artefacts of one variant +(CANONICAL-WORD.json.gz, LOCAL-PROGRAMS.json.gz or the hosted GLOBAL-TEMPLATE's local_programs). No package script is imported. + +Semantics checked (see LEMMA-G.md): + every register r carries a label lam(r) in the frame table; private centre copies ('C',k) too. + G0 every scalar add / copy has both operands at ONE current label equal to the annotated frame; scale is annotated at the + operand's label; a clear (re)declares the clean private copy at the annotated frame. + G1 virtual entrance: an entering helper (start frame E != 0) starts at label E, receives exactly one R_E^-1 wrapper before any + other event that touches it, and exactly one L_E^-1 wrapper after its last touch; no physical T_E (no adapter on it). + G2 every transition of a non-private register is an ascending nested climb A < B charged |B|-|A| (no live copy meanwhile). + G3 centre phase: copy at the centre's current label; every step of a copy is nested and strictly monotone (down in the forward + orientation, up in the backward one), charged |A|-|B|; every scatter/gather meets the target at the copy's label; the copy is + cleared; no non-private transition while a copy is live. + G4 endpoint labels: start = word's start (sources: port lines, targets: 0, helpers: 0 or E), final = word's final. + S the scalar matrix of the stream (frames stripped) is exactly (x,s,y)->(x,s,y+x) forward and (x-y,s,y) backward, all columns, + private copies cleared. + ACC paid profile recount; per-register climb mass telescopes to dim(final)-dim(start); centre steps sum to dim(c_k) (bottom 0). +""" +import gzip, hashlib, json +from collections import Counter, defaultdict +from fractions import Fraction as Q +from pathlib import Path + +PHASES = ['zero_frame_precondition', 'entry_adapters', 'A', 'centers', 'B', 'final', 'exit_adapters', 'full_frame_cleanup', 'done'] + + +def rank2(vs): + p = {} + for x in vs: + while x: + b = x.bit_length() - 1 + if b not in p: p[b] = x; break + x ^= p[b] + return len(p) + + +class Frames: + def __init__(self, frames): + self.F = [tuple(f) for f in frames]; self.dim = [rank2(f) for f in self.F] + assert all(self.dim[i] == len(f) for i, f in enumerate(self.F)), 'frame rows not independent' + self._sub = {} + def sub(self, a, b): # frame a contained in frame b + k = (a, b) + if k not in self._sub: self._sub[k] = rank2(list(self.F[a]) + list(self.F[b])) == self.dim[b] + return self._sub[k] + + +def digest(x): return hashlib.sha256(json.dumps(x, sort_keys=True, separators=(',', ':')).encode()).hexdigest() + + +def load(vdir, programs_from='template'): + vdir = Path(vdir); sc = vdir / 'split-centres' + c = json.loads(gzip.decompress((sc / 'CANONICAL-WORD.json.gz').read_bytes())) + lp = json.loads(gzip.decompress((sc / 'LOCAL-PROGRAMS.json.gz').read_bytes())) + tpl = None + for p in (vdir / 'hosted' / 'GLOBAL-TEMPLATE.json.gz', sc / 'GLOBAL-TEMPLATE.json.gz'): + if p.exists(): tpl = json.loads(gzip.decompress(p.read_bytes())); break + progs = tpl['local_programs'] if (programs_from == 'template' and tpl) else lp + for o in ('forward', 'backward'): assert progs[o] == lp[o], 'template programs differ from LOCAL-PROGRAMS' + rec = json.loads((sc / 'CLIFFORD-RECIPES.json').read_text()) + ra = sc / 'RESIDUAL-ADAPTERS.json' + wraps = json.loads(ra.read_text())['recipes'] if ra.exists() else {} + shas = {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in sorted(sc.glob('*')) if p.name in + ('CANONICAL-WORD.json.gz', 'LOCAL-PROGRAMS.json.gz', 'CLIFFORD-RECIPES.json', 'RESIDUAL-ADAPTERS.json')} + return dict(c=c, progs=progs, tpl=tpl, rec=rec, wraps=wraps, shas=shas, vdir=str(vdir)) + + +def check_labels(c, events, back): + """Returns (violations, info). violations: list of (clause, message).""" + v, R = c['v'], c['R']; n = 2 * v + R; Fr = Frames(c['frames']); start, final = c['start'], c['final'] + viol = []; bad = lambda cl, msg: viol.append((cl, msg)) if len(viol) < 200 else None + lam = {('L', r): start[r] for r in range(n)} + entering = {r for r in range(2 * v, n) if start[r] != 0} + # G4 start labels + P = c['ports'] + for i in range(v): + if Fr.F[start[i]] and rank2(list(Fr.F[start[i]]) + [P[i]]) != 1 or Fr.dim[start[i]] != 1: bad('G4', f'source {i} start not its port line') + if start[v + i] != 0: bad('G4', f'target {i} does not start at 0') + phase = -1; live = set(); touched_after_post = set(); pre = {}; post = {}; first_touch = {} + paid = Counter(); climb_mass = Counter(); centre_steps = defaultdict(list); centre_copy_frame = {} + gates_at_nonzero = [] # (event index, kind, dst, src, frame) + nontrivial_wrapper_frames = {} + def touch(r, idx): + if r in post: touched_after_post.add(r) + first_touch.setdefault(r, idx) + for idx, e in enumerate(events): + tag = e[0] + if tag == 'phase': + k = PHASES.index(e[1]) if e[1] in PHASES else None + if k is None or k != phase + 1: bad('ORDER', f'phase order at {idx}: {e[1]}') + phase = k if k is not None else phase + continue + ph = PHASES[phase] if phase >= 0 else None + if tag == 'scalar': + op, f = e[1], e[2]; t = tuple(op[1]); kind = op[0] + if kind == 'add': + s = tuple(op[2]) + for x in (t, s): + if x[0] == 'L': touch(x[1], idx) + lt, ls = lam.get(t), lam.get(s) + if not (lt == ls == f): bad('G0', f'add at {idx} {t}<-{s} frame {f} but labels {lt},{ls} ({ph})') + if f != 0 and t[0] == 'L' and s[0] == 'L': gates_at_nonzero.append((idx, ph, t[1], s[1], f)) + if t[0] == 'C' and back and ph == 'centers': live.add(t[1]) + elif kind == 'copy': + s = tuple(op[2]); touch(s[1], idx) + if lam.get(s) != f: bad('G3', f'copy at {idx} from {s} at label {lam.get(s)} but frame {f}') + if t in lam and lam[t] != f: bad('G3', f'copy into {t} declared at {lam[t]} but frame {f}') + lam[t] = f; live.add(t[1]); centre_copy_frame[t[1]] = f + elif kind == 'scale': + if t[0] == 'L': touch(t[1], idx) + if lam.get(t) != f: bad('G0', f'scale at {idx} {t} label {lam.get(t)} frame {f}') + elif kind == 'clear': + if t[0] != 'C': bad('G3', f'clear of a non-private register at {idx}') + lam[t] = f; live.discard(t[1]) + else: bad('G0', f'unknown scalar {kind}') + elif tag == 'climb': + _, part, r, a, b, rk = e; touch(r, idx) + if part != ph: bad('ORDER', f'climb at {idx} tagged {part} in phase {ph}') + if live: bad('G3', f'climb at {idx} of {r} while centre copy {sorted(live)} live') + if lam[('L', r)] != a: bad('G2', f'climb at {idx} of {r} from {a} but label {lam[("L", r)]}') + if not (Fr.sub(a, b) and Fr.dim[b] > Fr.dim[a]): bad('G2', f'climb at {idx} of {r} {a}->{b} not ascending nested') + if rk != Fr.dim[b] - Fr.dim[a]: bad('ACC', f'climb at {idx} charged {rk} != {Fr.dim[b] - Fr.dim[a]}') + lam[('L', r)] = b; paid[rk] += 1; climb_mass[r] += rk + elif tag == 'center': + _, k, a, b, rk = e; C = ('C', k) + if ph != 'centers': bad('ORDER', f'centre step at {idx} outside centre phase') + if lam.get(C) != a: bad('G3', f'centre step at {idx}: copy {k} at {lam.get(C)} not {a}') + if not back: + if not (Fr.sub(b, a) and Fr.dim[a] > Fr.dim[b]): bad('G3', f'centre step at {idx} {a}->{b} not a strict nested descent') + else: + if not (Fr.sub(a, b) and Fr.dim[b] > Fr.dim[a]): bad('G3', f'centre step at {idx} {a}->{b} not a strict nested ascent') + if rk != abs(Fr.dim[a] - Fr.dim[b]): bad('ACC', f'centre step at {idx} charged {rk}') + if k not in live: bad('G3', f'centre step at {idx} on a dead copy {k}') + lam[C] = b; paid[rk] += 1; centre_steps[k].append((a, b)) + elif tag == 'adapter': + _, way, r, f = e; touch(r, idx) + if way == 'old_to_new' and r in entering: bad('G1', f'entry adapter on entering helper {r} at {idx} (a physical T_E)') + if way == 'new_to_old' and r in entering and final[r] != 1: bad('G1', f'exit adapter of entering helper {r} not at FULL') + if way == 'old_to_new': + if ph != 'entry_adapters' or f != start[r] or lam[('L', r)] != f: bad('G4', f'entry adapter {r} frame {f}') + elif way == 'new_to_old': + if ph != 'exit_adapters' or f != final[r] or lam[('L', r)] != f: bad('G4', f'exit adapter {r} frame {f}') + else: bad('G4', f'unknown adapter {way}') + elif tag == 'residual_adapter': + _, side, r, f = e + if r not in entering: bad('G1', f'wrapper on non-entering register {r}') + if f != start[r]: bad('G1', f'wrapper {side} of {r} at frame {f} but start {start[r]}') + if side == 'pre': + if r in pre or r in first_touch: bad('G1', f'pre wrapper of {r} not the first event touching it') + if ph != 'entry_adapters': bad('G1', f'pre wrapper of {r} outside entry adapters') + pre[r] = idx; first_touch.setdefault(r, idx) + elif side == 'post': + if r in post: bad('G1', f'second post wrapper on {r}') + if ph != 'full_frame_cleanup' or lam[('L', r)] != final[r]: bad('G1', f'post wrapper of {r} not after the full-frame cleanup') + post[r] = idx + else: bad('G1', f'unknown wrapper side {side}') + else: bad('ORDER', f'unknown event {tag}') + if phase != len(PHASES) - 1: bad('ORDER', 'stream does not end with done') + for r in entering: + if r not in pre: bad('G1', f'entering helper {r} without pre wrapper') + if r not in post: bad('G1', f'entering helper {r} without post wrapper') + if touched_after_post: bad('G1', f'registers touched after their post wrapper: {sorted(touched_after_post)[:5]}') + for r in range(n): + if lam[('L', r)] != final[r]: bad('G4', f'register {r} ends at {lam[("L", r)]} not {final[r]}') + if climb_mass[r] != Fr.dim[final[r]] - Fr.dim[start[r]]: bad('ACC', f'climb mass of {r} does not telescope') + if live: bad('G3', f'copies live at the end {sorted(live)}') + cmass = {} + for k, cf in enumerate(c['center_frames']): + st = centre_steps.get(k, []) + cmass[k] = sum(abs(Fr.dim[a] - Fr.dim[b]) for a, b in st) + bottom = (st[-1][1] if st else cf) if not back else (st[0][0] if st else cf) + if Fr.dim[bottom] != 0: bad('ACC', f'centre {k} bottom level {bottom} is not 0 (lowering mass {cmass[k]} < dim c_k)') + if cmass[k] != Fr.dim[cf]: bad('ACC', f'centre {k} lowering mass {cmass[k]} != dim c_k {Fr.dim[cf]}') + if dict(paid) != {int(r): z for r, z in c['local_profile'].items()}: bad('ACC', f'paid profile {dict(paid)} != word {c["local_profile"]}') + info = dict(entering=len(entering), entrance_rank=sum(Fr.dim[start[r]] for r in entering), paid_profile=dict(sorted(paid.items())), + local_mass=sum(k * z for k, z in paid.items()), nonzero_frame_gates=len(gates_at_nonzero), + centre_paths={k: [s for s in st] for k, st in centre_steps.items()}) + return viol, info, gates_at_nonzero + + +def scalar_replay(c, events, back): + """exact rational replay of the stream with frames stripped; returns list of violations ('S', msg)""" + v, R = c['v'], c['R']; n = 2 * v + R + st = {('L', r): {r: Q(1)} for r in range(n)} + for e in events: + if e[0] != 'scalar': continue + op = e[1]; t = tuple(op[1]); k = op[0] + if k == 'clear': st[t] = {} + elif k == 'copy': st[t] = dict(st.get(tuple(op[2]), {})) + elif k == 'scale': + q = Q(op[2], op[3]); st[t] = {j: q * x for j, x in st[t].items()} + else: + s = tuple(op[2]); q = Q(op[3], op[4]); row = st.setdefault(t, {}) + for j, x in list(st.get(s, {}).items()): + z = row.get(j, Q(0)) + q * x + if z: row[j] = z + else: row.pop(j, None) + viol = [] + for r in range(n): + exp = {r: Q(1)} + if back and r < v: exp[v + r] = Q(-1) + if not back and v <= r < 2 * v: exp[r - v] = Q(1) + if st[('L', r)] != exp: viol.append(('S', f'column mismatch at register {r}')) + if len(viol) > 20: break + for t, row in st.items(): + if t[0] == 'C' and row: viol.append(('S', f'private copy {t} not cleared')) + return viol + + +def classify(c, gates): + """lemma instances among the nonzero-frame gates: gauge compensations (target <- entering helper) and kernel updates (helper <- helper)""" + v = c['v']; start = c['start'] + comp = [g for g in gates if g[1] == 'A' and v <= g[2] < 2 * v and start[g[3]] != 0 and g[4] == start[g[3]]] + kern = [g for g in gates if g[1] == 'A' and g[2] >= 2 * v and g[3] >= 2 * v and start[g[3]] != 0 and g[4] == start[g[3]]] + return comp, kern diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py new file mode 100644 index 0000000000..839319cbf6 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_mutants.py @@ -0,0 +1,185 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +"""Necessity controls for Lemma G on the headline word: each mutant edits the EMITTED stream (and, where stated, the start label) so +that exactly one clause is violated. For each mutant we report + checker : the clauses lg_lib flags (label checker + exact scalar replay) -- must be non-empty (mutant rejected) + physics : whether the exact physical identity still holds (targeted + random columns; transitions without a recipe are executed + as T_b T_a^-1). FAIL => the clause is needed for the operator identity; PASS => the clause is an accounting clause + (paid children / rank mass / lifetimes), needed for the cost certificate, not for exactness.""" +import copy, json, random, sys, time +from lg_lib import load, check_labels, scalar_replay, Frames, rank2 +from lg_phys import Model, run, expected, compare +from gd import GD +import os +SP = os.environ['LG_BASE'] # the output directory of verify.py: //{split-centres,hosted} +d = load(f'{SP}/gauge80-kernel42'); c0 = d['c']; m = Model(d); v = c0['v']; start = c0['start']; Fr = Frames(c0['frames']) +FW, BW = d['progs']['forward'], d['progs']['backward'] +iA = FW.index(['phase', 'A']); iC = FW.index(['phase', 'centers']); iB = FW.index(['phase', 'B']) + + +def comp_gates(ev): + out = [] + for i in range(iA + 1, iC): + e = ev[i] + if e[0] == 'scalar' and e[1][0] == 'add': + t, s = e[1][1][1], e[1][2][1] + if v <= t < 2 * v and start[s] != 0 and e[2] == start[s]: out.append(i) + return out + + +def climbs_of(ev, r, lo=0, hi=None): + return [i for i in range(lo, hi or len(ev)) if ev[i][0] == 'climb' and ev[i][2] == r] + + +def both(fn): + """apply an index-based edit to forward and backward alike (outside the centre phase the streams are aligned)""" + return fn(copy.deepcopy(FW), 'forward'), fn(copy.deepcopy(BW), 'backward') + + +def physics(fw, bw, regs, orients=('forward', 'backward')): + rng = random.Random(7); cols = [(r, b) for r in regs for b in (0, rng.randrange(1, 512))] + [(rng.randrange(m.n), rng.randrange(512)) for _ in range(8)] + init = {} + for ci, (r, b) in enumerate(cols): init.setdefault(('L', r), GD.zeros(len(cols))).re[b, ci] = 1 + res = {} + for o, ev in (('forward', fw), ('backward', bw)): + if o not in orients or ev is None: continue + try: + got = run(m, ev, init, mode='fallback'); bad, left = compare(m, got, expected(m, init, o == 'backward')) + res[o] = 'PASS' if not bad and not left else f'FAIL (registers {bad[:4]})' + except Exception as ex: res[o] = f'FAIL ({type(ex).__name__}: {ex})' + return res + + +def checker(fw, bw, c=None): + c = c or c0; out = set(); msgs = [] + for o, ev in (('forward', fw), ('backward', bw)): + if ev is None: continue + viol, info, _ = check_labels(c, ev, o == 'backward'); sv = scalar_replay(c, ev, o == 'backward') + out |= {x[0] for x in viol + sv}; msgs += [f'{o}: {x[0]} {x[1]}' for x in (viol + sv)[:2]] + return sorted(out), msgs[:3] + + +R = [] +def record(name, clause, fw, bw, regs, c=None, orients=('forward', 'backward')): + t = time.time(); flags, msgs = checker(fw, bw, c); ph = physics(fw, bw, regs, orients) + R.append(dict(mutant=name, violates=clause, checker_flags=flags, rejected=bool(flags), first_messages=msgs, physics=ph, seconds=round(time.time() - t, 1))) + print(json.dumps(R[-1]), flush=True) + + +# ---------- choose instances --------------------------------------------------------------------------------------- +CG = comp_gates(FW) +# a target whose comps span two levels E1 < E2 with the climb E1 -> E2 in between +tgt2 = None +for i in CG: + t = FW[i][1][1][1]; cl = climbs_of(FW, t, iA, iC) + if len(cl) == 2: tgt2 = t; break +g0 = CG[0]; t0_, s0_ = FW[g0][1][1][1], FW[g0][1][2][1]; E0 = FW[g0][2] + +# M1 G0 at a compensation gate: the target is NOT at E_j (its climb 0->E removed; next climb starts at 0) +def m1(ev, o): + cl = climbs_of(ev, t0_, iA, None); a = cl[0]; assert ev[a][3] == 0 and ev[a][4] == E0 and a < g0 + nxt = cl[1]; ev[nxt] = ['climb', ev[nxt][1], t0_, 0, ev[nxt][4], Fr.dim[ev[nxt][4]]]; del ev[a]; return ev +fw, bw = both(m1); record('M1 compensation gate with the target still at label 0', 'G0 (common label at a nonzero-frame compensation)', fw, bw, [t0_, s0_]) + +# M2 G1 virtual entrance violated: a physical T_E (climb 0 -> E) is executed on the helper; its start is declared 0 +def m2(ev, o): + i = ev.index(['phase', 'A']); ev.insert(i + 1, ['climb', 'A', s0_, 0, start[s0_], Fr.dim[start[s0_]]]); return ev +c2 = copy.deepcopy(c0); c2['start'][s0_] = 0 +fw, bw = both(m2); record('M2 physical T_E on an entering helper (no virtual entrance)', 'G1 (virtual entrance)', fw, bw, [s0_], c=c2) + +# M3 G2 (target chain monotone; the (b) condition): the target visits its levels out of nesting order (E2 first, descends to E1) +def m3(ev, o): + t = tgt2; cl = climbs_of(ev, t, iA, iC); a, b = cl[0], cl[1] # 0->E1 at a, E1->E2 at b + E1, E2 = ev[a][4], ev[b][4]; assert Fr.sub(E1, E2) + g1 = [i for i in range(a + 1, b) if ev[i][0] == 'scalar' and ev[i][1][0] == 'add' and t in (ev[i][1][1][1], ev[i][1][2][1])] + E1g = [ev[i] for i in g1] + for i in reversed(g1): del ev[i] + b -= len(g1); ev[a] = ['climb', 'A', t, 0, E2, Fr.dim[E2]]; del ev[b] + iCm = ev.index(['phase', 'centers']) + last = max(i for i in range(a, iCm) if ev[i][0] == 'scalar' and ev[i][1][0] == 'add' and t in (ev[i][1][1][1], ev[i][1][2][1])) + ins = [['climb', 'A', t, E2, E1, Fr.dim[E1] - Fr.dim[E2]]] + E1g + [['climb', 'A', t, E1, E2, Fr.dim[E2] - Fr.dim[E1]]] + ev[last + 1:last + 1] = ins; return ev +fw, bw = both(m3); record('M3 target visits its entrance levels out of nesting order (descends E2 -> E1)', 'G2 (monotone nested chain; selection condition (b))', fw, bw, [tgt2]) + +# M3b G2 for a helper (selection condition (a)): the entering helper's first climb detours through a frame that does not contain E_j +def m3b(ev, o): + cl = climbs_of(ev, s0_); i = cl[0]; a, b = ev[i][3], ev[i][4] + X = next(f for f in range(len(Fr.F)) if Fr.dim[f] == Fr.dim[a] and not Fr.sub(a, f) and Fr.sub(f, b)) + ev[i:i + 1] = [['climb', ev[i][1], s0_, a, X, 0], ['climb', ev[i][1], s0_, X, b, Fr.dim[b] - Fr.dim[X]]]; return ev +fw, bw = both(m3b); record('M3b entering helper leaves the nested chain (E_j -> X -> F, X not containing E_j)', 'G2 (monotone nested chain; selection condition (a))', fw, bw, [s0_]) + +# centre mutants (forward stream; the centre phase is orientation specific) +cents = {} +for i in range(iC + 1, iB): + e = FW[i] + if e[0] == 'center': cents.setdefault(e[1], []).append(i) +kdeep = next(k for k, L in cents.items() if len(L) >= 3) # a centre with a chain c_k -> L1 -> L2 -> ... -> 0 +st = cents[kdeep]; rk = c0['centers'][kdeep] +scat_after = lambda i: [j for j in range(i + 1, iB) if FW[j][0] == 'scalar' and FW[j][1][0] == 'add' and FW[j][1][2] == ['C', kdeep] and all(FW[q][0] != 'center' for q in range(i + 1, j))] +lev1 = scat_after(st[0]) # scatters at the first served level L1 != 0 +tl = FW[lev1[0]][1][1][1] + +def m4(ev, o): # scatter into a level-L1 target after the copy has descended further + e = ev[lev1[0]]; del ev[lev1[0]]; j = st[1] # st[1] index shifts by one + ev.insert(j, e); return ev +record('M4 scatter into a level-L1 target after the copy descended below L1', 'G3 (scatter meets the target at its level)', m4(copy.deepcopy(FW), 'f'), None, [rk, tl], orients=('forward',)) + +def m5(ev, o): # the last descent L_last -> 0 skipped; level-0 targets scattered at L_last + j = st[-1]; del ev[j]; return ev +r5 = [FW[j][1][1][1] for j in scat_after(st[-1])][:2] +record('M5 last centre descent step skipped (level-0 targets scattered at L_last)', 'G3 (chain reaches every served level; bottom 0)', m5(copy.deepcopy(FW), 'f'), None, [rk] + r5, orients=('forward',)) + +def m6(ev, o): # copy made after the first descent: the copy is declared at L1 while the centre register is at c_k + cp = next(j for j in range(iC, st[0]) if ev[j][0] == 'scalar' and ev[j][1][0] == 'copy' and ev[j][1][1] == ['C', kdeep]) + e = ev[cp]; del ev[cp]; ev.insert(st[0], ['scalar', e[1], FW[st[0]][3]]); return ev +record('M6 centre copy taken at the wrong label (after the first descent)', 'G3 (copy at the centre label c_k)', m6(copy.deepcopy(FW), 'f'), None, [rk, tl], orients=('forward',)) + +def m7(ev, o): # a climb of an unrelated register moved inside a live centre phase + touched = {x[1] for e in ev[iC:iB] if e[0] == 'scalar' for x in e[1][1:] if isinstance(x, list) and x[0] == 'L'} + def free(i): # no event touches the register between the centre phase and this climb + r = ev[i][2] + for q in range(iC, i): + e = ev[q] + if e[0] in ('climb',) and e[2] == r: return False + if e[0] == 'scalar' and any(isinstance(x, list) and x == ['L', r] for x in e[1][1:]): return False + return True + j = next(i for i in range(iB, len(ev)) if ev[i][0] == 'climb' and ev[i][2] not in touched and free(i)); e = ev[j]; del ev[j] + ev.insert(st[0] + 1, ['climb', 'centers', e[2], e[3], e[4], e[5]]); return ev +fw7 = m7(copy.deepcopy(FW), 'f'); r7 = fw7[st[0] + 1][2] +record('M7 a child of another register runs while a centre copy is live', 'G3 (copy lifetime)', fw7, None, [r7, rk], orients=('forward',)) + +def m8(ev, o): # a centre step detours through a frame outside the centre frame (chain not inside c_k) + j = st[0]; a, b = ev[j][2], ev[j][3] + X = next(f for f in range(len(Fr.F)) if Fr.dim[f] == Fr.dim[b] + 1 and Fr.sub(b, f) and not Fr.sub(f, a)) + ev[j:j + 1] = [['center', kdeep, a, X, Fr.dim[a] - Fr.dim[X]], ['center', kdeep, X, b, 1]]; return ev +record('M8 centre chain leaves the centre frame (c_k -> X -> L1, X not inside c_k)', 'G3 (nested chain inside c_k; selection condition (c))', m8(copy.deepcopy(FW), 'f'), None, [rk, tl], orients=('forward',)) + +# M9 coefficient of one compensation doubled (labels intact) +def m9(ev, o): + e = ev[g0]; e[1][3] *= 2; return ev +fw, bw = both(m9); record('M9 compensation coefficient doubled', 'S (scalar identity)', fw, bw, [t0_, s0_]) + +# M10 compensation executed after the helper's first climb (not as the first gate on j) +def m10(ev, o): + e = ev[g0]; j = climbs_of(ev, s0_)[0]; del ev[g0]; ev.insert(j, e); return ev +fw, bw = both(m10); record('M10 compensation moved after the helper started climbing', 'G0 + S (compensation reads the entrance value)', fw, bw, [t0_, s0_]) + +# M11 kernel update with the donor still at label 0 +kg = next(i for i in range(iA + 1, iC) if FW[i][0] == 'scalar' and FW[i][1][0] == 'add' and FW[i][1][1][1] >= 2 * v and start[FW[i][1][2][1]] != 0 and FW[i][2] != 0) +dn = FW[kg][1][1][1] +def m11(ev, o): + cl = climbs_of(ev, dn); a = cl[0]; assert ev[a][3] == 0 and a < kg + ev[cl[1]] = ['climb', ev[cl[1]][1], dn, 0, ev[cl[1]][4], Fr.dim[ev[cl[1]][4]]]; del ev[a]; return ev +fw, bw = both(m11); record('M11 kernel donor update with the donor still at label 0', 'G0 (common label at a nonzero-frame kernel update; inherited #471)', fw, bw, [dn, FW[kg][1][2][1]]) + +# M12 pre wrapper after the helper's first gate +def m12(ev, o): + p = ev.index(['residual_adapter', 'pre', s0_, start[s0_]]); e = ev[p]; del ev[p]; ev.insert(g0, e); return ev +fw, bw = both(m12); record('M12 R_E^-1 wrapper after the first gate on the helper', 'G1 (wrapper surrounds the whole invocation)', fw, bw, [s0_, t0_]) + +# M13 post wrapper dropped +def m13(ev, o): + ev.remove(['residual_adapter', 'post', s0_, start[s0_]]); return ev +fw, bw = both(m13); record('M13 L_E^-1 wrapper dropped', 'G1 (wrapper surrounds the whole invocation)', fw, bw, [s0_]) + +json.dump(R, open('MUTANTS.json', 'w'), indent=1) +print('rejected by the checker:', sum(r['rejected'] for r in R), '/', len(R)) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py new file mode 100644 index 0000000000..4b92387237 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/lg_phys.py @@ -0,0 +1,137 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +"""Exact physical simulation of an emitted local program on C^(2^9) registers (Gaussian-dyadic, int64 with overflow guard). + +Transitions are executed with the SERIALIZED child recipes (CLIFFORD-RECIPES.json, decoded here), data adapters with the serialized +endpoint monomials, entering-helper wrappers with the serialized RESIDUAL-ADAPTERS monomials. Expected values are computed from +DEFINITIONS only (canonical frames, the port gate C_q, the Fourier gate), never from recipes. +""" +import sys +import numpy as np +from gd import GD, circ_of, monomial_circ, recipe_circ, fourier_circ, basis_batch, N +from pathlib import Path +VENDOR = str(Path(__file__).resolve().parents[3] / 'split-centres-global/vendor') # the vendored clifford_exact of PR #433/#442 (definitions of T_F and C_q only) +sys.path.insert(0, VENDOR) +import clifford_exact as ce # used ONLY for the definitions canonical_frame / cgate (label family and port gate) + +n9 = 9 + + +class Model: + def __init__(self, d): + self.c = c = d['c']; self.v = c['v']; self.R = c['R']; self.n = 2 * c['v'] + c['R'] + self.frames = [tuple(f) for f in c['frames']] + self.children = {(r['old'], r['new']): recipe_circ(r) for r in d['rec']['children']} + self.src_ad = {}; self.tgt_ad = {} + for a in d['rec']['endpoint_adapters']: + (self.src_ad if a['role'] == 'source' else self.tgt_ad)[a['port']] = (a['frame'], monomial_circ(a['left']) if a['rank'] == 0 else None) + self.wraps = {int(f): (monomial_circ(w['right']), monomial_circ(w['left']), w['rank']) for f, w in d['wraps'].items()} + self._T = {} + # ---- definitions --------------------------------------------------------------------------------------------- + def T(self, f): + if f not in self._T: self._T[f] = circ_of(ce.canonical_frame(n9, self.frames[f])) + return self._T[f] + def def_transition(self, g, a, b): # T_b T_a^-1 + return g.apply_circ(self.T(a), inverse=True).apply_circ(self.T(b)) + def Cq(self, i): return circ_of(ce.cgate(n9, self.c['ports'][i])) + # ---- serialized operators ------------------------------------------------------------------------------------ + def rec_transition(self, g, a, b): + return g.apply_circ(self.children[(a, b)]) + + +def run(model, events, init, mode='recipe', regs=None, stop=None): + """apply `events` physically to state `init` (dict reg -> GD, missing = 0). regs: optional set of registers to simulate + (events touching other registers are an error unless their operands are all zero). Returns the state.""" + st = {x: y.copy() for x, y in init.items()}; k = next(iter(st.values())).k() + if mode == 'recipe': trans = model.rec_transition + elif mode == 'def': trans = model.def_transition + else: # mutants only: a transition without a serialized recipe is executed as T_b T_a^-1 + trans = lambda g, a, b: model.rec_transition(g, a, b) if (a, b) in model.children else model.def_transition(g, a, b) + def get(x): return st.get(x) + for idx, e in enumerate(events): + if stop is not None and idx >= stop: break + tag = e[0] + if tag == 'phase': continue + if tag == 'scalar': + op = e[1]; t = tuple(op[1]); kind = op[0] + if kind == 'clear': st.pop(t, None) + elif kind == 'copy': + s = get(tuple(op[2])); st.pop(t, None) + if s is not None: st[t] = s.copy() + elif kind == 'scale': + if t in st: st[t].scale(op[2], op[3]) if op[3] > 0 else st[t].scale(-op[2], -op[3]) + else: + s = get(tuple(op[2])) + if s is None: continue + num, den = op[3], op[4] + if den < 0: num, den = -num, -den + if t not in st: st[t] = GD.zeros(k) + st[t].add_scaled(s, num, den) + elif tag == 'climb': + _, part, r, a, b, rk = e + if ('L', r) in st: trans(st[('L', r)], a, b) + elif tag == 'center': + _, kk, a, b, rk = e + if ('C', kk) in st: trans(st[('C', kk)], a, b) + elif tag == 'adapter': + _, way, r, f = e; x = st.get(('L', r)) + if way == 'old_to_new': + if r < model.v: + fr, circ = model.src_ad[r]; assert fr == f + if x is not None: x.apply_circ(circ) + else: assert f == 0, ('unexpected non-identity entry adapter', r, f) + else: + if model.v <= r < 2 * model.v: + fr, circ = model.tgt_ad[r - model.v]; assert fr == f + if x is not None: x.apply_circ(circ, inverse=True) + else: assert f == 1, ('unexpected non-identity exit adapter', r, f) + elif tag == 'residual_adapter': + _, side, r, f = e; x = st.get(('L', r)) + Rc, Lc, w = model.wraps[f] + if x is not None: x.apply_circ(Rc if side == 'pre' else Lc, inverse=True) + else: raise ValueError(e) + return st + + +def expected(model, init, back): + """intended transform from DEFINITIONS: data shear in the old representation, helpers C_[w] (x) I""" + v, n, c = model.v, model.n, model.c + F = fourier_circ(range(9)); k = next(iter(init.values())).k() + out = {} + def g(r): return init.get(('L', r)) + def add(r, x): + if x is None: return + if r in out: out[r].add_scaled(x, 1, 1) + else: out[r] = x + for i in range(v): + Cq = model.Cq(i); hs, ht = g(i), g(v + i) + xs = hs.copy().apply_circ(Cq, inverse=True) if hs is not None else None # logical source C_q^-1 h_s + if not back: + add(i, xs.copy().apply_circ(F) if xs is not None else None) + yt = ht.copy() if ht is not None else None + if xs is not None: + yt = yt if yt is not None else GD.zeros(k); yt.add_scaled(xs, 1, 1) + if yt is not None: add(v + i, yt.apply_circ(Cq, inverse=True).apply_circ(F)) + else: + z = xs.copy() if xs is not None else None + if ht is not None: + z = z if z is not None else GD.zeros(k); z.add_scaled(ht, -1, 1) + if z is not None: add(i, z.apply_circ(F)) + if ht is not None: add(v + i, ht.copy().apply_circ(Cq, inverse=True).apply_circ(F)) + for r in range(2 * v, n): + h = g(r) + if h is None: continue + w = 9 - len(model.frames[c['start'][r]]) + add(r, h.copy().apply_circ(fourier_circ(range(w)))) + return out + + +def compare(model, got, exp): + bad = [] + for r in range(model.n): + a = got.get(('L', r)); b = exp.get(r) + if a is None and b is None: continue + if a is None: a = GD.zeros(b.k()) + if b is None: b = GD.zeros(a.k()) + if not a.equals(b): bad.append(r) + leftovers = [x for x, y in got.items() if x[0] == 'C' and not y.is_zero()] + return bad, leftovers diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py new file mode 100644 index 0000000000..5d10da278a --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/lemmaG/run_labels.py @@ -0,0 +1,23 @@ +# Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. Independent Lemma G checker: imports no package script. +import sys, time, json +from lg_lib import * +import os +SP=os.environ['LG_BASE'] # the output directory of verify.py: //{split-centres,hosted} +out={} +for name in sys.argv[1:]: + t=time.time(); d=load(f'{SP}/{name}') + c=d['c']; res={'inputs':d['shas']} + for o in ('forward','backward'): + ev=d['progs'][o]; back=o=='backward' + viol,info,gates=check_labels(c,ev,back); sv=scalar_replay(c,ev,back) + comp,kern=classify(c,gates) + res[o]=dict(label_violations=viol[:10],n_label_violations=len(viol),scalar_violations=sv[:5],events=len(ev),sha256=digest(ev), + compensation_gates=len(comp),kernel_updates=len(kern),**{k:v for k,v in info.items() if k!='centre_paths'}) + calls=d['tpl']['calls'] if d['tpl'] else [] + res['calls']=dict(n=len(calls),ok=all(cl['local_program_sha256']==res[cl['orientation']]['sha256'] for cl in calls), + orient=dict(__import__('collections').Counter(cl['orientation'] for cl in calls))) + res['seconds']=round(time.time()-t,1); out[name]=res + print(name, json.dumps({o:{k:res[o][k] for k in ('n_label_violations','scalar_violations','compensation_gates','kernel_updates','entering','entrance_rank','local_mass','paid_profile')} for o in ('forward','backward')}), res['calls'], res['seconds'],flush=True) + for o in ('forward','backward'): + for x in res[o]['label_violations'][:5]: print(' ',o,x) +json.dump(out,open('LABELS-'+'-'.join(sys.argv[1:])+'.json','w'),indent=1) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/make_meta.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/make_meta.py new file mode 100644 index 0000000000..af22530f71 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/make_meta.py @@ -0,0 +1,12 @@ +"""Write SOURCE.json (inventories of the upstream packages this package runs) and MANIFEST.json (this package's files). Apache-2.0. +usage: python -B research/e8-complex-gauge-kernel/code/make_meta.py""" +import hashlib, json +from pathlib import Path +ROOT = Path(__file__).resolve().parent.parent; R = ROOT.parent +sha = lambda p: hashlib.sha256(Path(p).read_bytes()).hexdigest() +def inventory(p): return {f.relative_to(p).as_posix(): sha(f) for f in sorted(Path(p).rglob('*')) if f.is_file() and '__pycache__' not in f.parts} +packages = ['idle-axis-hosting', 'split-centres-global', 'e8-early-reset-kernel', 'e8-early-reset-reuse'] +(ROOT / 'SOURCE.json').write_text(json.dumps(dict(note='inventories of the packages of PR #442 and its parents that verify.py runs unchanged', packages={p: dict(files=inventory(R / p)) for p in packages}), indent=1, sort_keys=True) + '\n') +inv = inventory(ROOT); inv.pop('MANIFEST.json', None) +(ROOT / 'MANIFEST.json').write_text(json.dumps(dict(files=inv), indent=1, sort_keys=True) + '\n') +print('SOURCE.json and MANIFEST.json written;', len(inv), 'files') diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py new file mode 100644 index 0000000000..220cc7a2f5 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py @@ -0,0 +1,111 @@ +"""Whole-residual idle-axis hosting with at most ONE helper per physical family per invocation (the rule of PR #458), plus the exact +host chart with explicit spectator coordinates. Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +A copy (port) of an idle child hosts a PATTERN: residuals of pairwise distinct stages inside the child's window, offsets 0, w1, w1+w2, ... +(a residual is whole: one slot in one family). The children of one (pair, side) have pairwise disjoint windows (checked), so the +families they share never host two helpers of one invocation, and the integer programme needs only the distinct-stage condition. +Chart: for the host's port q the parent's idle basis is B_q = U_q (+) I (PR #433 geometry; the construction is that of PR #458). A hosted +residual of width w occupies the pending vectors b_off..b_(off+w-1) of its child; the other e = 9 - w coordinates of the local nine are +SPECTATORS: the first e basis indices of B_q not occupied by the residual, in increasing order. The paid wrappers (adapters_gk.py) act on +these nine coordinates and restore the spectators identically.""" +import math +from collections import Counter + +H, M = 9, 73 + + +def cost(r, m): return r * math.log(m / r) if r else 0.0 + + +def patterns(rank, stages, widths): + out = [()] + ws = sorted(widths, reverse=True) + def rec(i, cur, tot): + for j in range(i, len(stages)): + for w in ws: + if tot + w <= rank: + c = cur + [(stages[j], w)]; out.append(tuple(c)); rec(j + 1, c, tot + w) + rec(0, [], 0) + return out + + +def solve(win, copies, avail, m, pad_value, time_limit=600): + """win {idx: (pair, rank, stages)}, avail {(stage, width): helpers per replica}. Maximise saved idle cost (+ pad_value per hosted residual).""" + import numpy as np + from scipy.optimize import milp, LinearConstraint, Bounds + widths = sorted({w for (_, w) in avail}); var = [] + for idx, (p, r, st) in sorted(win.items()): + for pat in patterns(r, sorted(st), widths): var.append((idx, pat)) + n = len(var); c = np.zeros(n) + for j, (idx, pat) in enumerate(var): + r = win[idx][1]; c[j] = -(cost(r, m) - cost(r - sum(w for _, w in pat), m) + pad_value * len(pat)) + rows, lo, hi = [], [], [] + by = {} + for j, (idx, pat) in enumerate(var): by.setdefault(idx, []).append(j) + for idx, js in by.items(): + row = np.zeros(n); row[js] = 1; rows.append(row); lo.append(copies); hi.append(copies) + for (s, w), a in sorted(avail.items()): + row = np.zeros(n) + for j, (idx, pat) in enumerate(var): row[j] = sum(1 for sw in pat if sw == (s, w)) + rows.append(row); lo.append(0); hi.append(a) + res = milp(c, constraints=LinearConstraint(np.array(rows), lo, hi), integrality=np.ones(n), bounds=Bounds(np.zeros(n), np.full(n, np.inf)), + options=dict(time_limit=time_limit, disp=False)) + assert res.x is not None, res.message + x = [int(round(t)) for t in res.x] + return [[idx, [list(sw) for sw in pat], x[j]] for j, (idx, pat) in enumerate(var) if x[j]], -res.fun + + +def save(path, key, sel, val): + import json + from pathlib import Path + p = Path(path); d = json.loads(p.read_text()) if p.exists() else {} + d[key] = dict(rule='one-helper-per-family', patterns=sorted(sel), proxy_saving=val) + p.write_text(json.dumps(d, indent=1, sort_keys=True) + '\n') + + +def load(path, key): + import json + from pathlib import Path + d = json.loads(Path(path).read_text())[key]; assert d['rule'] == 'one-helper-per-family' + return d['patterns'], d['proxy_saving'] + + +def check_disjoint_groups(win, pair_of, side_of): + """children of one (pair, side) share their physical families; their windows must be disjoint""" + seen = {} + for idx, (p, r, st) in win.items(): + for s in st: + k = (pair_of[idx], side_of[idx], s); assert k not in seen, ('windows of two children of one family group overlap', idx, seen[k], k); seen[k] = idx + + +def expand(win, sel, widths, V): + """-> slots [idx, port, off, w, s, h] (one replica), rem {(idx, port): remaining pending rank}""" + R = len(widths); pool = {} + for h in sorted(range(R)): pool.setdefault(widths[h], []).append(h) + pool = {(s, w): list(hs) for s in range(9) for w, hs in pool.items()} + slots = []; rem = {}; used = Counter() + for idx, pat, copies in sorted(sel, key=lambda e: (e[0], e[1])): + r = win[idx][1] + for _ in range(copies): + cp = used[idx]; used[idx] += 1; assert cp < V; off = 0 + assert len({s for s, w in pat}) == len(pat) + for s, w in pat: + assert s in win[idx][2] and off + w <= r + slots.append([idx, cp, off, w, s, pool[s, w].pop(0)]); off += w + rem[idx, cp] = r - off + assert all(n == V for n in used.values()) and len(used) == len(win) + return slots, rem + + +def idle_basis(q): + """PR #433 / #458: the parent's orthonormal idle basis U_q (+) I for port q (H = 9 local coordinates, M = 73)""" + z = next(i for i in range(H) if not (q >> i & 1)); a = q ^ (1 << z); order = list(range(H)); order[0], order[z] = order[z], order[0] + return [(1 << i) ^ (a if a >> i & 1 else 0) for i in order] + [1 << i for i in range(H, M)] + + +def spectators(q, pending, off, w): + """indices (into B_q) of the e = 9 - w spectator coordinates of a residual at pending[off:off+w]""" + B = idle_basis(q); occ = [B.index(x) for x in pending[off:off + w]] + assert len(set(occ)) == w + sp = [j for j in range(M) if j not in occ][:H - w] + assert len(sp) == H - w + return sp diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py new file mode 100644 index 0000000000..b2e08a30c9 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py @@ -0,0 +1,271 @@ +# GK: modified copy of PR #433's complex_replay.py (icekylinx with Codex assistance; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:". On a word without start_extra / target_levels the behaviour +# and every written file equal PR #433's (regression anchor in verify.py). +import sys as _sys, os as _os; _sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) +# Adapted for heterogeneous centres by icekylinx with Codex assistance. +"""Independent read-back of the serialized local/global instruction stream.""" +import copy,gzip,hashlib,importlib.util,json,math +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +OUT=Path('split-centres');P=OUT/'GLOBAL-TEMPLATE.json.gz' +ir=json.load(gzip.open(P));c=json.load(gzip.open(OUT/'CANONICAL-WORD.json.gz')) +integration=json.loads((OUT/'INTEGRATION.json').read_text()) +assert hashlib.sha256(gzip.decompress(P.read_bytes())).hexdigest()==integration['global_template_sha256'] +assert c['ports']==json.load(gzip.open('work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz'))['ports'] +v,R,h=c['v'],c['R'],c['h'];n=2*v+R;frames=c['frames'] +from gk_common import tile # GK +widths=[h-len(frames[c['start'][2*v+i]]) for i in range(R)] +assign,nb,pads=tile([(rep,i,widths[i]) for rep in range(8) for i in range(R)]);W=7680+9*nb +levels={int(t):f for t,f in c.get('target_levels',{}).items()} +entering=[r for r,f in enumerate(c['start']) if r>=2*v and f!=0];plain={r for r in range(n) if r not in set(entering)} # GK +def contains(a,b): + for x in a: + for y in b: + if x>>(y.bit_length()-1)&1:x^=y + if x:return False + return True +def local(events,back): + rows={('L',r):{r:Q(1)} for r in range(n)} + norm={('L',r):Q(1) for r in range(n)};prefix=Q(1);cur=c['start'].copy();private={} + hist=Counter();phases=[];entry=[];exit=[];centers=[];matrix_hash=hashlib.sha256();chain={};wrappers=[] + allowed=['zero_frame_precondition','entry_adapters','A','centers','B','final','exit_adapters','full_frame_cleanup','done'] + for event in events: + tag=event[0] + if tag=='phase': + phases.append(event[1]);assert phases==allowed[:len(phases)] + if event[1]=='A':assert entry==[(r,f) for r,f in enumerate(c['start']) if r in plain] and sorted(r for k_,r,f_ in wrappers if k_=='pre')==entering # GK + if event[1]=='centers':assert all(cur[r]==levels.get(r-v,0) for r in range(v,2*v)) # GK + if event[1]=='full_frame_cleanup':assert cur==c['final'] and exit==list(enumerate(c['final'])) + assert not private + elif tag=='residual_adapter': # GK: paid wrappers of entering helpers: R_E^-1 before the invocation, L_E^-1 after the full-frame cleanup + _,kind,r,f=event;assert r in entering and f==c['start'][r] and kind in ('pre','post') + assert (kind=='pre' and phases[-1]=='entry_adapters') or (kind=='post' and phases[-1]=='full_frame_cleanup') + assert (kind,r) not in {(k,x) for k,x,_ in wrappers};wrappers.append((kind,r,f)) + elif tag=='adapter': + assert event[3]==(c['start'] if event[1]=='old_to_new' else c['final'])[event[2]] + (entry if event[1]=='old_to_new' else exit).append((event[2],event[3])) + elif tag=='climb': + _,part,r,a,b,rank=event + assert not private and phases[-1]==part and cur[r]==a + assert contains(frames[a],frames[b]) and rank==len(frames[b])-len(frames[a])>0 + hist[rank]+=1;cur[r]=b + elif tag=='center': + _,k,a,b,rank=event + assert phases[-1]=='centers' and private=={('C',k):a} + cf=c['center_frames'][k];cr=len(frames[cf]) + # GK: stepwise descent cf -> served levels -> lowest (forward), reversed ascent (backward); each step is a nested child + assert contains(frames[a],frames[b]) if back else contains(frames[b],frames[a]) + assert rank==abs(len(frames[a])-len(frames[b]))>0 + chain.setdefault(k,[]).append((a,b)) + private['C',k]=b;hist[rank]+=1;centers.append(k) + elif tag=='scalar': + _,e,f=event;op=e[0];target=tuple(e[1]);source=tuple(e[2]) if op in ('copy','add') else None + if target[0]=='C' and op=='clear': + assert private.get(target,f)==f + private.pop(target,None) + else: + for r in (target,source): + if r is None:continue + if r[0]=='L':assert cur[r[1]]==f,('common frame',r,cur[r[1]],f) + else: + if r==target and r not in private:private[r]=f + assert private[r]==f + if op=='clear':rows[target]={};norm[target]=Q(0) + elif op=='copy':rows[target]=dict(rows[source]);norm[target]=norm[source] + elif op=='scale': + q=Q(e[2],e[3]);a,b=abs(q.numerator),q.denominator + assert a&(a-1)==0 and b&(b-1)==0 + rows[target]={j:q*x for j,x in rows[target].items()};norm[target]*=abs(q) + else: + q=Q(e[3],e[4]);a,b=abs(q.numerator),q.denominator + assert source!=target and b&(b-1)==0 + # Independent symbolic replay of the cleared coefficient work. + w=0 + for bit in bin(a)[2:]:w=2*w+int(bit) + assert Q(w,b)*(1 if q>0 else -1)==q + prefix=max(prefix,Q(a)*norm[source]) + norm[target]=norm.get(target,Q(0))+abs(q)*norm[source] + row=rows.setdefault(target,{}) + for j,x in list(rows[source].items()): + z=row.get(j,Q(0))+q*x + if z:row[j]=z + else:row.pop(j,None) + prefix=max(prefix,norm[target]) + else:raise AssertionError(tag) + assert phases==allowed and set(centers)==set(range(len(c['centers']))) and not private + assert sorted(r for k,r,_ in wrappers if k=='pre')==entering and sorted(r for k,r,_ in wrappers if k=='post')==entering # GK + for k,st in chain.items(): # GK: the steps of each centre chain link up and end at the centre frame + cf=c['center_frames'][k] + if back:assert st[-1][1]==cf and all(st[i][1]==st[i+1][0] for i in range(len(st)-1)) + else:assert st[0][0]==cf and all(st[i][1]==st[i+1][0] for i in range(len(st)-1)) + assert all(not row for reg,row in rows.items() if reg[0]=='C') + for r in range(n): + expected={r:Q(1)} + if back and r= W). sole=False skips only the + sole-owner assertion (used by a control to show that the footprints themselves are fine).""" + fam=Counter(f for f,_ in owners);foot={} + for i,(f,route) in enumerate(owners): + assert f=240 and route[0]==2,('bank class: helpers only',i,f);w=widths[i-240] + if w==9: assert len(route)==2,('width-9 helper in a pure bank',i) + else: + if sole: assert fam[f]==1,('entering helper shares its bank family in one invocation',i,f) + assert len(route)==4 and route[2]==w and len(set(route[3]))==9-w==len(route[3]),('entering helper without a spectator record',i) + assert route[3]==list(range(len(occ[f]),len(occ[f])+9-w)) and len(occ[f])+9-w<=73,('spectators are not the first cells beyond the residuals',i,f) + cells=residual_cells(route)|(set(route[3]) if len(route)==4 else set()) + assert len(cells)==9 and not cells&foot.setdefault(f,set()),('footprints overlap on a bank family',i,f);foot[f]|=cells +def global_check(t): + assert t['live']==W and t['physical']==W+R+len(c['centers'])+2 # GK + occ={} + for call in t['calls']: + for fam,route in call['owners'][240:]:occ.setdefault(fam,set()).update(residual_cells(route)) + assert all(cs==set(range(len(cs))) for cs in occ.values()),'bank residuals are packed from cell 0' + # Eight data-wire scalar columns, independently recomposed. + matrix=[[int(i==j) for j in range(8)] for i in range(8)] + for e in t['recipe']: + if e['kind']=='local': + a=2*e['pair'];b=a+1;dst,src,q=(a,b,-1) if e['reverse'] else (b,a,1) + matrix[dst]=[x+q*y for x,y in zip(matrix[dst],matrix[src])] + elif e['kind']=='bridge': + i,j,q=e['dst'],e['src'],e['coefficient'] + matrix[2*i]=[x+q*y for x,y in zip(matrix[2*i],matrix[2*j])] + matrix[2*j+1]=[x-q*y for x,y in zip(matrix[2*j+1],matrix[2*i+1])] + else: + assert e['kind']=='terminal';old=copy.deepcopy(matrix) + for i in range(4):matrix[2*i]=old[2*i+1];matrix[2*i+1]=[-x for x in old[2*i]] + assert matrix==[[int(i==j) for j in range(8)] for i in range(8)] + seen=set();hist=Counter();pairs={e['stage']:e for e in t['recipe'] if e['kind']=='local'} + for call in t['calls']: + stage,rep,pair=call['stage'],call['replica'],call['pair'] + assert (stage,rep) not in seen;seen.add((stage,rep)) + assert pair==pairs[stage]['pair'] + assert call['orientation']==('backward' if pairs[stage]['reverse'] else 'forward') + assert len(call['owners'])==800 + for r,(fam,route) in enumerate(call['owners']): + if r<240:assert fam==rep*960+(2*pair+r//120)*120+r%120 and route==[1,stage,r%120] + else: + bk,off_,w_,pure_,sp_=assign[rep,r-240];assert fam==7680+stage*nb+bk and route==([2,off_//9] if (w_==9 and pure_) else [2,off_,w_,list(sp_)]) # GK + assert len(set((f,json.dumps(r)) for f,r in call['owners']))==800 + bank_rule(call['owners'],occ) # GK: the rule on every register class, stated independently of tile() + for r,z in profiles[call['orientation']].items():hist[r]+=z + assert seen=={(s,r) for s in range(9) for r in range(8)} + for child in t['idle_children']:hist[child['rank']]+=child['replicas'] + assert t['bank_padding']=={'families':list(range(7680,W)),'axis':72,'child_rank':1} + for r_,z_ in pads.items():hist[r_]+=z_*9 # GK + assert t['cover_final_correction']['families']==[0,W] + assert t['cover_final_correction']['charged_calls_per_cover']==W + assert t['execution_schedule'][-1]=={'kind':'translate_every_live_family',**{k:v for k,v in t['cover_final_correction'].items() if k!='kind'}} + assert 73*W-sum(r*z for r,z in hist.items())==2496 + return hist +H=global_check(ir) +for name,mut in [('missing_padding',lambda t:t['bank_padding']['families'].pop()), + ('aliased_owner',lambda t:t['calls'][0]['owners'][241].__setitem__(1,[2,0])), + ('missing_cover_phase',lambda t:t['cover_final_correction'].__setitem__('charged_calls_per_cover',0))]: + t=copy.deepcopy(ir);mut(t) + try:global_check(t) + except (AssertionError,KeyError):controls.append(name) + else:raise AssertionError('global mutation accepted: '+name) +# GK: controls of the rule itself, one per register class, run on bank_rule (not on the equality with tile()); only for words with entering +# helpers (the anchor's INDEPENDENT-REPLAY.json must stay byte-identical to PR #433's) +occ_all={} +for call in ir['calls']: + for fam_,route_ in call['owners'][240:]:occ_all.setdefault(fam_,set()).update(residual_cells(route_)) +def rule_control(name,mut,must): + o=copy.deepcopy(ir['calls'][0]['owners']);mut(o) + try:bank_rule(o,occ_all) + except AssertionError as e: + assert must in str(e),(name,str(e));controls.append(name) + else:raise AssertionError('rule mutation accepted: '+name) +bank_rule(ir['calls'][0]['owners'],occ_all) +ent=[r for r in range(240,800) if widths[r-240]<9] +if entering: + a_,b_=ent[0],ent[1] + def to_one_bank(o): # bank class: b joins a's bank family at the next free cells, with a spectator of its own + fa=o[a_][0];free=len(occ_all[fa]);o[b_]=[fa,[2,free,widths[b_-240],[free+widths[b_-240]]]] + rule_control('two_entering_helpers_on_one_bank_family',to_one_bank,'shares its bank family') + rule_control('bank_spectator_is_a_residual_cell',lambda o:o[a_][1].__setitem__(3,[o[a_][1][1]]+o[a_][1][3][1:]),'first cells beyond') + rule_control('bank_spectator_shifted',lambda o:o[a_][1].__setitem__(3,[x+1 for x in o[a_][1][3]]),'first cells beyond') + rule_control('bank_spectator_record_dropped',lambda o:o[a_].__setitem__(1,o[a_][1][:3]),'without a spectator record') + rule_control('bank_spectator_count_wrong',lambda o:o[a_][1].__setitem__(3,o[a_][1][3]*2),'without a spectator record') + rule_control('second_owner_on_an_active_data_family',lambda o:o.__setitem__(241,[o[0][0],[1,0,0]]),'data class') + rule_control('helper_owner_on_an_active_data_family',lambda o:o.__setitem__(250,[o[3][0],[2,0]]),'data class') + rule_control('active_wire_on_a_bank_family',lambda o:o.__setitem__(5,[7680,[1,0,5]]),'bank class') + C_=len(c['centers']) + rule_control('owner_in_the_private_namespace_centres',lambda o:o.__setitem__(300,[W+3,[2,0]]),'private namespace') + rule_control('owner_in_the_private_namespace_reserved_tableau',lambda o:o.__setitem__(300,[W+C_+5,[2,0]]),'private namespace') + rule_control('owner_in_the_private_namespace_coefficient',lambda o:o.__setitem__(300,[W+C_+R+1,[2,0]]),'private namespace') + t=copy.deepcopy(ir);t['calls'][0]['owners'][0][0]+=960 # copies: an active owner of replica 0's invocation on a family of replica 1 + try:global_check(t) + except (AssertionError,KeyError):controls.append('active_owner_on_the_family_of_another_replica') + else:raise AssertionError('global mutation accepted: active_owner_on_the_family_of_another_replica') +assert dict(H)=={int(r):z for r,z in integration['global_profile'].items()} + +def load(name): + sp=importlib.util.spec_from_file_location('replay_hamming_'+name,Path('work/pr361/code/engines')/(name+'.py')) + m=importlib.util.module_from_spec(sp);sp.loader.exec_module(m);return m +M,B=load('moment'),load('base_two_moment');b=Q(integration['complex_b']);grid=Q(1,10**18) +assert M.moment(H,73,W,b,True)[1]<1 audit_gk (exact arbitrary-dirt + inverse-transpose + frame chains) -> emit_gk (emitted program replay, both orientations) + -> exact Gaussian phase recipes (PR #433's complex_phases_full.py, unmodified, for every used transition) -> integrate_gk (parent template) + -> replay_gk (independent read-back) -> hosted_gk (whole-residual idle-axis hosting; frozen selection) -> audit_hosted_gk +At --anchor (empty selection) the unmodified inputs must reproduce PR #433's and #442's files byte for byte.""" +import gzip, hashlib, json, os, shutil, subprocess, sys, time +from pathlib import Path +ROOT = Path(__file__).resolve().parent.parent; CODE = ROOT / 'code'; R = ROOT.parent +name, selp, key, changed, work = sys.argv[1], Path(sys.argv[2]), sys.argv[3], Path(sys.argv[4]), Path(sys.argv[5]) +flags = set(a for a in sys.argv[6:]) +assert not work.exists(); work.mkdir(parents=True) +env = dict(os.environ, PYTHONDONTWRITEBYTECODE='1', PYTHONINTMAXSTRDIGITS='0'); env.pop('PYTHONOPTIMIZE', None) +sha = lambda p: hashlib.sha256(Path(p).read_bytes()).hexdigest() +log = open(work / 'run.log', 'w'); steps = [] +def run(step, script, *args, cwd=None): + t = time.monotonic() + q = subprocess.run([sys.executable, '-B', str(script), *map(str, args)], cwd=cwd or work, env=env, stdout=log, stderr=subprocess.STDOUT, text=True) + if q.returncode: raise RuntimeError((name, step, 'see ' + str(work / 'run.log'))) + steps.append(dict(step=step, seconds=round(time.monotonic() - t, 1))); print(name, 'PASS', step, flush=True) +shutil.copytree(changed / 'work', work / 'work', symlinks=False) +shutil.copy(changed / 'BIT-PRICE.json', work / 'BIT-PRICE.json') +base = work / 'sc_base'; shutil.copytree(changed / 'split-centres', base, symlinks=False) +sc = work / 'split-centres'; shutil.copytree(base, sc) +run('gk_word', CODE / 'gk_word.py', base / 'FULL-WORD.json.gz', selp, sc / 'GK-WORD.json.gz') +os.replace(sc / 'GK-WORD.json.gz', sc / 'FULL-WORD.json.gz') +if '--controls' in flags: + run('mutation controls (word)', CODE / 'controls_gk.py', sc / 'FULL-WORD.json.gz', work / 'CONTROLS-WORD.json') + run('mutation controls (selection)', CODE / 'controls_sel.py', base / 'FULL-WORD.json.gz', selp, work / 'CONTROLS-SELECTION.json') + run('mutation controls (through the certifying scripts)', CODE / 'controls_pipeline.py', work, selp, work / 'CONTROLS-PIPELINE.json') +run('audit_gk', CODE / 'audit_gk.py'); run('emit_gk', CODE / 'emit_gk.py') +if '--anchor' in flags: + for f in ('CANONICAL-WORD.json.gz', 'LOCAL-PROGRAMS.json.gz', 'LOCAL-CHECKS.json'): + assert (sc / f).read_bytes() == (base / f).read_bytes(), ('anchor: ' + f + ' differs from PR #433') + print(name, 'ANCHOR canonical word, local programs and local checks identical to PR #433', flush=True) + # canonical word identical => PR #433's phase recipes apply unchanged (they are bound to the canonical hash) +else: + run('phases (exact Gaussian recipes, all used transitions)', R / 'split-centres-global/code/complex_phases_full.py') + run('adapters_gk (paid residual wrappers: L^-1 S_E R^-1 = C_[w] x I, exactly)', CODE / 'adapters_gk.py', sc / 'CANONICAL-WORD.json.gz', sc / 'RESIDUAL-ADAPTERS.json', work / 'LEMMA-A.json') +run('integrate_gk', CODE / 'integrate_gk.py'); run('replay_gk', CODE / 'replay_gk.py') +if '--anchor' in flags: + for f in ('GLOBAL-TEMPLATE.json.gz', 'INDEPENDENT-REPLAY.json'): + assert (sc / f).read_bytes() == (base / f).read_bytes(), ('anchor: ' + f + ' differs from PR #433') + print(name, 'ANCHOR parent global template and independent replay identical to PR #433', flush=True) +host = work / 'hosted' +ONE = [] if '--anchor' in flags else ['--one-helper-per-family'] # the anchor uses PR #442's rule; every other word PR #458's +if '--anchor' in flags: sel_args = [] +elif '--discover' in flags: sel_args = [*ONE, '--key', key, '--discover-to', work / 'SELECTION-new.json'] # development only: freeze a new selection +else: sel_args = [*ONE, '--selection', ROOT / 'data/SELECTION.json', '--key', key] +run('hosted_gk', CODE / 'hosted_gk.py', sc, host, *sel_args) +if '--discover-check' in flags and '--anchor' not in flags: + run('hosted_gk --discover (selection recomputed with HiGHS)', CODE / 'hosted_gk.py', sc, work / 'hosted-rediscovered', *ONE, '--key', key, '--discover-to', work / 'SELECTION-rediscovered.json') + a = json.loads((ROOT / 'data/SELECTION.json').read_text())[key]; b = json.loads((work / 'SELECTION-rediscovered.json').read_text())[key] + assert a['patterns'] == b['patterns'], 'rediscovered selection differs' + assert (host / 'GLOBAL-TEMPLATE.json.gz').read_bytes() == (work / 'hosted-rediscovered' / 'GLOBAL-TEMPLATE.json.gz').read_bytes() +run('audit_hosted_gk', CODE / 'audit_hosted_gk.py', sc, host, work / 'HOSTING-AUDIT.json', *ONE) +if '--controls' in flags and '--anchor' not in flags: + run('mutation controls (one-owner rule on every register class, through the generators)', CODE / 'controls_hosting.py', work, ROOT / 'data/SELECTION.json', key, work / 'CONTROLS-HOSTING.json') +(work / 'STEPS.json').write_text(json.dumps(dict(name=name, steps=steps, canonical_word_sha256=sha(sc / 'CANONICAL-WORD.json.gz'), + hosted_template_sha256=json.loads((host / 'HOSTED.json').read_text())['template_sha256']), indent=1) + '\n') +print(name, 'DONE', flush=True) diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json new file mode 100644 index 0000000000..cf624433f0 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json @@ -0,0 +1,470 @@ +{ + "gauge": { + "134": [ + 510 + ], + "135": [ + 510 + ], + "136": [ + 510 + ], + "137": [ + 510 + ], + "138": [ + 510 + ], + "139": [ + 510 + ], + "164": [ + 510 + ], + "165": [ + 510 + ], + "166": [ + 510 + ], + "167": [ + 510 + ], + "190": [ + 408, + 102 + ], + "191": [ + 408, + 102 + ], + "192": [ + 510 + ], + "193": [ + 510 + ], + "194": [ + 510 + ], + "195": [ + 510 + ], + "220": [ + 510 + ], + "221": [ + 510 + ], + "222": [ + 510 + ], + "223": [ + 510 + ], + "246": [ + 408, + 102 + ], + "247": [ + 408, + 102 + ], + "248": [ + 510 + ], + "249": [ + 510 + ], + "250": [ + 510 + ], + "251": [ + 510 + ], + "274": [ + 408, + 102 + ], + "275": [ + 408, + 102 + ], + "276": [ + 510 + ], + "277": [ + 510 + ], + "278": [ + 510 + ], + "279": [ + 510 + ], + "304": [ + 510 + ], + "305": [ + 510 + ], + "306": [ + 510 + ], + "307": [ + 510 + ], + "326": [ + 408 + ], + "327": [ + 408 + ], + "330": [ + 408 + ], + "331": [ + 408 + ], + "408": [ + 408 + ], + "409": [ + 408 + ], + "414": [ + 408 + ], + "415": [ + 408 + ], + "464": [ + 408 + ], + "465": [ + 408 + ], + "470": [ + 408 + ], + "471": [ + 408 + ], + "492": [ + 408 + ], + "493": [ + 408 + ], + "494": [ + 408 + ], + "495": [ + 408 + ], + "532": [ + 510 + ], + "533": [ + 510 + ], + "534": [ + 510 + ], + "535": [ + 510 + ], + "536": [ + 408, + 102 + ], + "537": [ + 408, + 102 + ], + "538": [ + 408, + 102 + ], + "539": [ + 408, + 102 + ], + "540": [ + 291, + 163, + 102, + 24 + ], + "541": [ + 291, + 163, + 102, + 24 + ], + "542": [ + 291, + 163, + 102, + 24 + ], + "543": [ + 291, + 163, + 102, + 24 + ], + "544": [ + 510 + ], + "545": [ + 510 + ], + "546": [ + 510 + ], + "547": [ + 510 + ], + "548": [ + 408, + 102 + ], + "549": [ + 408, + 102 + ], + "550": [ + 408, + 102 + ], + "551": [ + 408, + 102 + ], + "552": [ + 510 + ], + "553": [ + 510 + ], + "554": [ + 510 + ], + "555": [ + 510 + ], + "556": [ + 510 + ], + "557": [ + 510 + ], + "558": [ + 510 + ], + "559": [ + 510 + ] + }, + "kernel": [ + { + "E": [ + 504 + ], + "donors": [ + 334, + 335, + 362, + 363 + ], + "pivots": [ + 390, + 391, + 418, + 419 + ] + }, + { + "E": [ + 390 + ], + "donors": [ + 324, + 325, + 328, + 329, + 380, + 384, + 440, + 444 + ], + "pivots": [ + 381, + 385, + 441, + 445, + 498, + 499, + 500, + 501 + ] + }, + { + "E": [ + 6 + ], + "donors": [ + 128, + 129 + ], + "pivots": [ + 156, + 157 + ] + }, + { + "E": [ + 414 + ], + "donors": [ + 218, + 219, + 302, + 303 + ], + "pivots": [ + 358, + 359, + 386, + 387 + ] + }, + { + "E": [ + 384 + ], + "donors": [ + 162, + 163, + 240, + 241, + 300, + 352, + 353, + 356, + 360, + 361, + 412, + 416, + 417, + 438, + 442 + ], + "pivots": [ + 301, + 357, + 413, + 436, + 437, + 439, + 443, + 496, + 497, + 502, + 503 + ] + }, + { + "E": [ + 126 + ], + "donors": [ + 160, + 161 + ], + "pivots": [ + 242, + 243 + ] + }, + { + "E": [ + 102 + ], + "donors": [ + 188, + 189 + ], + "pivots": [ + 244, + 245 + ] + }, + { + "E": [ + 30 + ], + "donors": [ + 132, + 133 + ], + "pivots": [ + 268, + 269 + ] + }, + { + "E": [ + 96 + ], + "donors": [ + 186, + 187 + ], + "pivots": [ + 216, + 217 + ] + }, + { + "E": [ + 120 + ], + "donors": [ + 158, + 159 + ], + "pivots": [ + 214, + 215 + ] + }, + { + "E": [ + 480 + ], + "donors": [ + 272, + 273, + 298 + ], + "pivots": [ + 299 + ] + }, + { + "E": [ + 24 + ], + "donors": [ + 130, + 131 + ], + "pivots": [ + 212, + 213 + ] + } + ] +} \ No newline at end of file diff --git a/research/retimed-asynchronous-whole-owners/vendor/complex/split-centres-global/vendor/clifford_exact.py b/research/retimed-asynchronous-whole-owners/vendor/complex/split-centres-global/vendor/clifford_exact.py new file mode 100644 index 0000000000..166841a037 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/complex/split-centres-global/vendor/clifford_exact.py @@ -0,0 +1,149 @@ +"""Small exact Gaussian-dyadic Clifford compiler, independent of gx internals. +Paulis use i^p X^x Z^z. State vectors use integer Gaussian numerators / 2^d. +The tableau is supplemented by a literal circuit, so global phases are kept. +""" +from dataclasses import dataclass + +def parity(x):return x.bit_count()&1 +def rank(rows): + p={} + for x in rows: + while x: + b=x.bit_length()-1 + if b not in p:p[b]=x;break + x^=p[b] + return len(p) +def transpose(rows,n):return tuple(sum(((rows[j]>>i)&1)<>j&1);a[j],a[k]=a[k],a[j] + for i in range(n): + if i!=j and a[i]>>j&1:a[i]^=a[j] + assert [r&((1<>n for r in a) +def basis_extend(cols,n): + out=[] + for x in list(cols)+[1<len(out):out.append(x) + assert len(out)==n + return tuple(out) +def nullspace(rows,n): + a=list(rows);p=[];k=0 + for j in range(n): + t=next((i for i in range(k,len(a)) if a[i]>>j&1),None) + if t is None:continue + a[t],a[k]=a[k],a[t] + for i in range(len(a)): + if i!=k and a[i]>>j&1:a[i]^=a[k] + p.append(j);k+=1 + return tuple((1<>j)&1)<>i&1:out=pmul(out,T[i]) + for i in range(n): + if z>>i&1:out=pmul(out,T[n+i]) + return out +def compose(A,B):return tuple(apply(A,p) for p in B) +def inverse(T): + n=len(T)//2;cols=[x|(z<>n;u,v,p=apply(T,(x,z,0));assert (u,v)==identity(n)[j][:2];out.append((x,z,(-p)%4)) + return tuple(out) +def qvalue(Q,alpha,x,n): + return (sum(alpha[i] for i in range(n) if x>>i&1)+2*sum(parity((Q[i]>>(i+1))&(x>>(i+1))) for i in range(n) if x>>i&1))%4 +def mul_i(a,p): + x,y=a;p%=4 + return [(x,y),(-y,x),(-x,-y),(y,-x)][p] +@dataclass +class Op: + n:int + tab:tuple + circuit:list + def then(self,b): + assert self.n==b.n + return Op(self.n,compose(b.tab,self.tab),self.circuit+b.circuit) + def adjoint(self): + circ=[] + for e in reversed(self.circuit): + if e[0]=='P':circ.append(('P',inv(e[1],self.n))) + elif e[0]=='D':circ.append(('D',e[1],tuple((-x)%4 for x in e[2]))) + elif e[0]=='C':circ.append(('C',e[1],-e[2])) + elif e[0]=='phase':circ.append(('phase',(-e[1])%4)) + else:circ.append(e) + return Op(self.n,inverse(self.tab),circ) + def zero_state(self,basis=0): + N=1<>i)&1 for i in range(n)) + assert all(alpha[i]%2==(Q[i]>>i)&1 for i in range(n)) + return Op(n,tuple([(1<>i&1 else 0,1<>i&1 else 0) for i in range(n)]),[('C',q,sgn)]) +def xgate(n,b):return Op(n,tuple([(1<>i)&1)) for i in range(n)]),[('X',b)]) +def fourier(n,axes=None): + out=ident(n) + for i in range(n) if axes is None else axes:out=out.then(cgate(n,1<len(selected):picks.append(j);selected.append(x) + assert len(picks)==r and all(x>>r==0 for x in Bcols) + Br=transpose(selected,r);Bi=inv(Br,r);Dr=transpose([Dcols[j]&((1<2*48^2. + +No additional mathematical admission gap was found in the reviewed finite scheduling change. Final success still requires the parent's independently regenerated coefficient invoice and exact outer assembly. The positive statement is the sufficient endpoint-preserving asynchronous construction, not a claim that a packing relaxation alone proves an improved kappa. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/EXPECTED.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/EXPECTED.json new file mode 100644 index 0000000000..0696052f0c --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/EXPECTED.json @@ -0,0 +1,8 @@ +{ + "kappa": "67885087881447/50000000000000000", + "kappa_decimal": "0.001357701757628940", + "complex_lower": "679773808909616785409/500000000000000000000000", + "bit_lower": "391360506745414227149/250000000000000000000000", + "template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "scope": "Conditional whole-owner finite derivative; unchanged PR493 bit supplier is cited, not reverified." +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/LICENSE b/research/retimed-asynchronous-whole-owners/vendor/pr505/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/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/retimed-asynchronous-whole-owners/vendor/pr505/MANIFEST.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/MANIFEST.json new file mode 100644 index 0000000000..1146a94a9b --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/MANIFEST.json @@ -0,0 +1,66 @@ +{ + ".gitattributes": "4ce4b6e6b8435f8c3a8387387732964a2ebf0183e8d77b8247ae8061b033e462", + "ADVERSARIAL-REVIEW.md": "6c8f69452df88c2082568d83ff3692176d391fd1e1db6533d071049ec873163c", + "code/assemble.py": "9db68cad2738d76052b25c8bdf6485edd6f14025bf47107d2425b10a2bdf69e0", + "code/audit_async.py": "d01ad6a70c4d3132bcd631f175d23bbee44fecc15f2a80a0f14d0d1d2b0a7206", + "code/audit_async_invoice.py": "6a6e4ea681b34db6d0642e1fddc76d9ffd0cdbaf32119f33ca1232db78a148d2", + "code/emit_async.py": "3dca3efbce0e1b775801d072e64995472749553f6f7f3250bb6a898cfe117fbc", + "evidence/ASYNC-AUDIT.json": "e3f3c8dd3d9ead17031574f86fe7c7887f5f08ead36877b0baa93def9db58431", + "evidence/EXACT-ASSEMBLY.json": "b50c77f8089f9697844dbfb3ad2fb6d954e2bb71bfd544fa970da35cf21b25d0", + "evidence/GLOBAL-PREFIX.json": "098cdaa38a9bca8a4aca4aa5be03d6a36e40fe2f81948ab901a23d7cf65922de", + "evidence/OWNERS-AND-PROFILE.json": "c091ef330ae4566838b3a6c214d57847ce7c9962d5fc161f4ad155cd6bc69b21", + "evidence/PREFIX-AND-INVOICE.json": "3d38891f6db3fd70728f1bcba7d1f1356250903a15f3916ca91ae1ad98a24c73", + "evidence/RESULT.json": "a8459c77267a3d0c0aba8e1ff31144b32442f6ead3635697a578140f7ccb1720", + "evidence/STEPS.json": "8d73f35dff32e272525d584b62a984dda8faa5c4dbebcc58016b40cbced905b6", + "EXPECTED.json": "10d4b326f1d1836995a2722e0901c0f62ceb98b345b51095d84765df3776b6c2", + "inputs/ASYNC-3.json": "8d16c05f4b3239fb5f9ec93958c9436c0cc0c76f6d4899a12bce5b84007d0893", + "inputs/ASYNC-OWNERS.json.gz": "52cb8c2b5869b429e3fe3b7a8b061792f020f6fad9f402dc4e4656110b9af068", + "inputs/BASE-WORD.json.gz": "da4c5007092fd9456403179ef2a4391aef9fc5310e3eec5f2ab6c49b24147387", + "inputs/PR493-EXPECTED.json": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb", + "inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9", + "inputs/work/complex-network/hamming/PROTOTYPE.json": "b155f101a2b7ec8cfc4e7b6e7147b2d51f0dc31d3ea3499bdfa79d399a76be47", + "inputs/work/complex-nine-native/DATA-PHASES.json": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a", + "inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz": "1b84904a31a733aab9bfdda3f528c06719f590d2133a43687a8bded955dc991e", + "inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz": "77b0c0fa19ef3da1c7316010e13493aa5eea1a50c3506eddc08f7480e659878b", + "inputs/work/odd-stages/clifford_exact.py": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "inputs/work/pr361/code/engines/base_two_moment.py": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "inputs/work/pr361/code/engines/moment.py": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "inputs/work/pr361/code/engines/outer.py": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c", + "inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz": "1fb726ea3818fe0837cceb0dd22a71a0814f064e5e781628104610d6468e0e55", + "LICENSE": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "NOTICE.md": "b4bf5b4520f22256c18e6378a51cd8270335aed268a84b42d9284273a51eedc3", + "PROOF.md": "1fd10bedaf12f5221c1f22f4e508279ca1a16af7d0733dfdaac6a2a02a8a668a", + "README.md": "e7d793bbc8fa7355f7ab6f4c001965eff3b22ea0e3c029191ec92ee801f9607c", + "references/PR493-NOTICE.md": "08415e4ce4b9f81afdb4ee9b9ca01a055b81dec36dbc1fbc5ecafcdc8bfe94ed", + "references/PR496-PROOF.md": "144f1bf6952b3e31e99cf372a2cae9a13f96c9988808fe8a57ec70b09ee2007c", + "research-notes/kernel/APPENDIX-MANIFEST.json": "19565a7d405d86d6432f44221f040702d38822b351b52969f308567112ef9424", + "research-notes/kernel/APPENDIX-SOURCES.json": "2ed72f0c9d97317ac7627614601a3fb41633bf5536d70ec6b24733a63dccfb37", + "research-notes/kernel/audit_component_scalar.py": "feab9aa6dbcd8f9fffa6dbdb981d15ffc850402ae91cf45f946ff069cac54037", + "research-notes/kernel/BASE-WORD.json.gz": "8b91151043fd61afe379314e4fb1e647cf9cd3cfe98462920d3faba5b1f268f2", + "research-notes/kernel/COMPONENT-SELECTION.json": "b682f7cff6de4f40bdadfc64a9ecb9b03a8d77dbf29be3748fa9d742dc894071", + "research-notes/kernel/JOINT-47-SELECTION.json": "89ca715918bfbb04fad2eaee8a95a40324859cd0955512eb13077502e7d950e3", + "research-notes/kernel/JOINT-51-SELECTION.json": "7094bb647cc9951a5385660a9ec5f012a427fd118baacaf3d5e9f28cb436acc7", + "research-notes/kernel/LOCAL-CANDIDATE-AUDITS.json": "68a6adf3bcfbe8e8e4ffb7b4a672da5649c85f84c42813940e6dbb3cf20c2b99", + "research-notes/kernel/REBUILD.json": "e18727e4191e18838382948ced1c7506d74b3d43caa3853ce751684eef52d8d6", + "research-notes/kernel/rebuild_candidate.py": "f8063d539f772fb63712bed787a1c472da28c9baf38b88e3ae14806632d4afb7", + "research-notes/kernel/RESEARCH-APPENDIX.md": "24ec2b2ff1174fcec7342307cff723e01c90513415f348665c43d0220ba04e3a", + "RESEARCH.md": "00287d17523ce726545bb10171afcb77b0d0cf3bfd8fd835e21b38bad57b0be7", + "SCHEDULING-LEMMA.md": "73effa4a41524fb800e0213bd61f470a0cc61f4110af13dcf4037daf24300511", + "SNAPSHOT.md": "8f09e56f76399e3b749f7a284be09a6fbfd1ec2cfaf39c8769a7e99ca69fec7d", + "SOURCE-FILES.json": "5e174966d33cc1bee5d3421c553954dd5ee764630eb3e2e4395fe04ef2595136", + "SOURCES.json": "f344c729873c4aac9e5081acfa2f7043334eba1d5af9e5914a3acdfea42f99f1", + "vendor/audit_scalar_invoice.py": "652eed65fe8f72ab486dcdbe761f401f8a2d43530f2fb0c5c7777be488cd4648", + "vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c", + "vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc", + "vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23", + "vendor/complex/e8-complex-gauge-kernel/code/gk_common.py": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "vendor/complex/e8-complex-gauge-kernel/code/gk_word.py": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b", + "vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209", + "vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590", + "vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3", + "vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb", + "vendor/complex/split-centres-global/code/complex_phases_full.py": "0f2795aaffafe0c64d77f3748ef2109a3c42c58da867e4cf269a0a8cb6109466", + "vendor/complex/split-centres-global/vendor/clifford_exact.py": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "verify.py": "5f36c115ba65135b95117229cba7ca78ad2bc47032036d88d8ee25bbcde1a084", + "verify.sh": "2b1b51f757d8ddf81941c8c96007a2256336856c2e017bcf6c3a37576c82bc8b" +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/NOTICE.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/NOTICE.md new file mode 100644 index 0000000000..a810ab684e --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/NOTICE.md @@ -0,0 +1,18 @@ +# Attribution + +New asynchronous scheduler, independent audits, mathematical composition proof, +and package integration: OpenAI Codex assistance. Apache-2.0; see LICENSE. +Original authorship notices in every vendored source are preserved. + +Direct dependencies: CrocSwap/integer-mult-bounds PR496 whole-owner pooling and +independent invoice/assembly; PR484 gauge80-kernel42 complex local circuit and +wrappers; PR493 unchanged R489 bit supplier. The PR493 relevant attribution excerpt is saved +in references/PR493-NOTICE.md and describes that upstream package, not new files here. +PR433/425/370 supply the retained geometry and scalar/phase compiler ancestry; +PR458 supplies whole-owner entrance/spectator wrappers; PR361/315 supply the +exact moment and outer arithmetic ancestry. PR434/417/435/440 and +PR401/408-416 supply kernel and gauge ancestry through PR484. + +OpenAI math source inspection informed the new scheduling argument and the +separate matroid/sparse-shear searches. No Lean source is vendored or claimed +freshly kernel-checked in this package. See RESEARCH.md and SOURCES.json. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/PROOF.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/PROOF.md new file mode 100644 index 0000000000..6eeb5171ae --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/PROOF.md @@ -0,0 +1,42 @@ +# Asynchronous whole-owner replica scheduling + +## Sufficient construction + +Start with any admitted complete-invocation supplier with the following literal properties. Each invocation is an arbitrary-dirt-valid shear on its two active data banks; each helper belongs to a distinct full physical family, distinct from every active data family; its paid entry/exit wrappers restore all borrowed spectator coordinates and leave exactly its prescribed residual transform on its assigned pending coordinate block. The retained PR484/496 complex supplier provides these properties. No split residual or interleaved incomplete invocation is used here. + +Take T independent copies of the complete nine-stage controller. Their data banks are disjoint. A schedule is any shuffle of the T per-replica controller event lists that preserves each list's order and keeps every complete cover invocation indivisible. A pending idle child of replica r becomes available after its previous data/bridge touch and must be completed before its own next touch. A helper may use a disjoint block of that child whenever its complete invocation falls in this actual open interval. It does not matter whether the helper invocation and owner replica currently have the same stage number. + +The correctness proof is induction over the shuffled event list. At a local invocation its active data action is exactly the retained shear. Arbitrary dirty state in each borrowed family is allowed by the full local theorem. Its only persistent helper action is the specified residual transform on a previously unconsumed pending block; borrowed spectators are restored. These residual blocks are disjoint within each idle child, so their product with the paid leftover transform is exactly the retained full idle transform. Complete that product by the child's deadline. At a bridge or terminal event, its own replica is therefore in exactly its retained controller state. Different replicas have disjoint active data banks. After every replica completes, apply the retained full-stock correction. Thus the resulting global operator is unchanged. + +This is a sufficient finite scheduling theorem under the SAME retained complete-invocation/compiler/analytic contracts. It is not an unconditional integer-multiplication theorem, a split-owner lift, or permission to commute scalar gates through unfinished invocations. The new scheduler requires a fresh global prefix bound because intermediate dirty states may pass between replicas. + +## Constructive packing and exact ownership + +ASYNC-3.json freezes the order sorted by (stage + 3*replica/7, stage, replica). It also freezes an integer pattern nomination for each (owner replica, pending child):120 actual port families, each with a list of consecutive residual block widths. The local widths remain {5:4,7:14,8:104,9:438}. There are 72 calls and 40320 helper occurrences. + +The initial aggregate time assignment is only a nomination. It is replaced by a joint integer flow assigning each pattern's width slots to legal call times. For a pattern used on n families, at most n slots may be assigned to one time. For each pattern, form a bipartite multigraph between call times and its width-slot positions. Each slot position has degree n and each call time has degree at most n. Pad with dummy vertices and edges to an n-regular bipartite graph, then remove n perfect matchings. Each matching is one physical port family: it receives exactly the selected width pattern and at most one helper at any call time. This produces literal family, port, child, offset, width and call records. Existing arbitrary dirty helpers can then be assigned by matching width. + +The actual ASYNC-OWNERS.json.gz passes all 40320 occurrences, all 72 calls,560 distinct helper families per call, and no active-data overlap. This is an exact finite witness; floating MILP pricing is not its correctness evidence. The replay consumes the frozen witness and needs no optimizer. + +## Changed paid profile + +Ambient73, live7680, deficit 2496, physical8258 remain. The exact integer paid profile is: + + 1:148240, 2:66816, 3:7032, 4:19728, 5:26109, + 6:144, 7:2209, 8:1224, 16:1, 48:408. + +Its exact admitted moment lower bound, including the inherited bad-cover allowance, is0.001359547617819233570818. The exact composed kappa is0.001357701757628940. Independent literal chronology, chart, scalar/prefix invoice and 47-inequality checks pass. The maximum child increases to48, but73^2=5329>2*48^2=4608, so depth2 remains sufficient. + +## Research provenance and scope + +PR496 supplies whole-owner pooling, exact normalization and the original matching-based owner construction. PR484 supplies the gauge/kernel local word; PR493 supplies the nonbinding stronger bit side. The new contribution is removing replica lockstep while retaining complete invocation boundaries and owner-relative pending windows. Generic bipartite matching is inherited mathematics, not a claimed new theorem. + +The downloaded OpenAI common-integer-polymatroid work (problem114), especially the tight-set augmentation/base calculus in its preprint, motivated looking for exchanges of capacity across previously fixed stage partitions. The actual finite feasible family is not asserted to be a matroid or M-convex set; no FPRAS theorem is imported as a packing certificate. The sufficient construction above is direct and the final ownership witness is exact. + +## Other bounded screens preserved + +Uniform stage counts K3,K6,K7, stage-selective local kernel component portfolios, optional paid whole banks, and the siblings' joint gauge/kernel variants did not beat PR496 under the tested lockstep packing. The component words remain valid local constructions but are not kappa gains. Their failures are restricted screens, not universal impossibility theorems. No Lean certification or publication was performed. + +## Finite prefix and explicit retained conditions + +The completed invocation/bridge L2 argument gives 20+37+72+72+4=205bits; charge512bits. The two-level row coefficient includes another2*512 and is16467<20161. The new schedule is sufficient under the unchanged PR493 bit supplier and PR484/496 all-size compiler, mutable-basis/common-label, Lemma A realization, restored-row, precision/tape and analytic-transfer contracts. This is not a proof of those inherited contracts. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/README.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/README.md new file mode 100644 index 0000000000..635bc7d961 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/README.md @@ -0,0 +1,81 @@ +# Asynchronous whole-owner replicas + +Conditional kappa = **0.001357701757628940**, or `67885087881447/50000000000000000`, +from complex saving b = `679773808909616785409/500000000000000000000000` and the unchanged PR493 bit +saving c = `391360506745414227149/250000000000000000000000`. This is **1.923642% above PR496** +under the same whole-owner supplier assumptions. + +The new mechanism removes replica lockstep. Eight replicas retain their own +nine-stage order, but run in an order sorted by `(stage + 3*replica/7, stage, replica)`. +Each complete cover invocation is indivisible. This exposes additional legal +pending-child intervals on other replicas, including 4,539 uses of the same +pair number on a different physical replica. No helper is split between owners. +The frozen map names all 40,320 whole helper uses. No optimizer runs in verification. + +## What changes + +The gauge80-kernel42 local word, both scalar orientations, Gaussian phases, +wrappers and data routes are unchanged. Only the order of complete replica +blocks, whole-helper placement, and exact idle remainders change. The source +controller has 30 replica-local events and two final global events. Every +replica's projection is exactly those 30 events in order; the two final events +run once. New `replica` fields restrict bridges, idle completion, and terminal +events to the named replica. Old decoders that ignore those fields are invalid +for this new template version. + +The paid profile is: + +``` +rank 1 2 3 4 5 6 7 8 16 48 +count 148240 66816 7032 19728 26109 144 2209 1224 1 408 +``` + +Ambient dimension 73, live families 7680, physical families 8258, rank mass 558144, +and deficit 2496 are unchanged. There are 3,194 actual orthogonal73-column maps, +9,615 explicit remainder children, and 33,114 cross-replica helper uses. +The maximum child rises to48, still satisfying `73^2 > 2*48^2`. + +The old192-bit prefix allowance is replaced. Count 72 full local sweeps and 72 +individual bridge sweeps: `20+37+72+72+4=205` bits suffice;512 are charged. +The two-level row invoice charges an additional `2*512` and remains16467<20161. +Both exact rational moment engines agree on the adjacent10^-24 endpoints. +Six bootstrap steps and all 47 strict outer inequalities pass on the 10^-18 +kappa grid; the next grid point and three degenerate-parameter controls fail. + +## Reproduce offline + +Python3.11 or later, standard library only. No C++ compiler, optimizer, network, +Lean, shell extension, or external package is needed. From this directory: + +``` +python -B verify.py --work /absolute/path/to/a-new-output-directory +``` + +On Windows use an available drive path for `--work`. The output directory must +not already exist; prior outputs are preserved. POSIX users may run +`bash verify.sh`; its temporary output directory is printed through the result. +The verifier reconstructs the required parent local word and phase data, emits +the new asynchronous program, independently checks its literal chronology and +charts, recounts the scalar/prefix invoice, and performs exact composition. +It rejects19 corrupt controller variants. See RESULT.json in the work directory. +No external absolute data paths occur in the verifier. + +The unchanged bit operator is reused from the pinned PR493 publication. Its +published profile is independently repriced here, but its C++ operator replay +is deliberately not rerun. That distinction is explicit in every result. + +## Scope and comparison + +This is a conditional finite witness under the inherited all-size compiler, +mutable-basis/common-label, PR484 Lemma A realization, restored-row, +precision/tape and analytic-transfer contracts. Finite replay does not prove +those contracts, and this is not a new unconditional multiplication theorem. +The positive mathematical statement is the sufficient endpoint-preserving +asynchronous construction in PROOF.md, with independently checked hypotheses. + +PR conversations were downloaded through 497, then the public snapshot was +frozen for packaging. PR496 is the comparable whole-owner frontier. PR494's +larger0.001435468764627892 computation was explicitly under review because its +split-residual operator interface was disputed; that interface is not used. +This package does not claim to surpass that number or reach0.0014. +No submission, fork change, or publication is performed by this package. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/RESEARCH.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/RESEARCH.md new file mode 100644 index 0000000000..65f689de17 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/RESEARCH.md @@ -0,0 +1,62 @@ +# Research appendix: corpus reuse, the achieved mechanism, and preserved candidates + +The delivered conditional bound is **kappa = 0.001357701757628940**. Its new contribution is asynchronous scheduling of complete replica invocations. The local gauge/kernel word is unchanged from PR484/496; the stronger bit supplier comes from PR493. The package's final receipts, physical audit and exact assembly are the evidence for the numerical claim. The inherited complete-invocation, compiler and analytic contracts remain explicit conditions; this is not a new Lean certification of integer multiplication. + +## The mechanism that improved the bound + +Earlier packing advanced all eight replicas in lockstep. The new schedule preserves each replica's nine-stage controller order while allowing replicas to occupy different stages. A helper may then use an idle block whenever its entire invocation lies between consecutive touches on the **owner's** timeline. The selected order sorts calls by `(stage + 3*replica/7, stage, replica)`. + +Correctness uses completed invocation endpoints. Each invocation restores arbitrary dirty workspace and borrowed spectators, and leaves only its specified residual on its assigned pending block. Different residual blocks of an idle child are disjoint; their product with the paid remainder is the original child. Completing that product before the owner's next touch preserves each replica's original controller. No scalar gate is commuted through an unfinished invocation, and no residual is split between owners. + +A flow nomination is converted to literal owners using bipartite edge coloring. There are 72 calls and 40,320 helper occurrences, with 560 distinct helper families per call. Ambient dimension 73, live stock7680 and deficit 2496 stay fixed. The changed paid profile is: + + 1:148240, 2:66816, 3:7032, 4:19728, 5:26109, + 6:144, 7:2209, 8:1224, 16:1, 48:408. + +The complete schedule needs its own physical chart checks and prefix invoice. Its gain does not follow from the floating packing objective alone. + +## What was actually reused from the OpenAI corpus + +The inspected snapshot is `adc7f1241b42e322a6451854ab7e4b4c146bf78a` of [openai/math](https://github.com/openai/math). `APPENDIX-SOURCES.json` records repository-relative source paths and hashes. Direct source inspection and Git consistency checks are distinct from compiling these modules in this round; no claim is made that every paper in the collection is formalized. + +- [FourierCircuit/WordScheduling.lean](https://github.com/openai/math/blob/adc7f1241b42e322a6451854ab7e4b4c146bf78a/lean/OAI/Computability/FourierCircuit/WordScheduling.lean): `scheduledStep_product` and `scheduledLayer_product` preserve products under order-preserving schedules on fixed disjoint supports. `Word.matrix_substitute` and `Word.weight_substitute` preserve semantics and account for substituted calls. These supplied the structural template for scheduling complete normalized invocations. The new owner-relative interval argument is stated and checked separately; the fixed-support theorem is not silently applied to aliased unfinished programs. +- [MatroidCounting/CommonBases.lean](https://github.com/openai/math/blob/adc7f1241b42e322a6451854ab7e4b4c146bf78a/lean/OAI/Combinatorics/MatroidCounting/CommonBases.lean): `greedyOracle_correct`, `greedyOracle_rank`, and the parallel/nonparallel pair-rank lemmas motivated response-matroid basis and circuit-component selection. The common-integer-polymatroid preprint, problem114, also suggested moving capacity across fixed stage partitions. The actual packing family is not asserted to be a matroid, and no counting FPRAS is used as a packing certificate. +- `FourierCircuit/TensorTools.lean`, `RowCompression.sparse_row_compression`, and `SparseShear.lean`, `cancellation_identity`, provide explicit row-basis changes and cancellation of a shared exterior block. Independent dirty replica coordinates cannot be deleted merely by compressing a displayed response matrix. No additional gain was obtained from this route. +- `FourierCircuit/PivotJoin.lean`, `PivotJoin.of_join`, and `MonomialFeedback.lean`, `Dense2x2.price`, suggested alternative local compositions. The latter's abstract normalized price bound is not a literal bounded-coefficient routine in this model. The exact-Fourier documentation also limits its theorem to a subsequence; it does not supply the missing all-length bit-complexity implementation. +- `Topology/ArtinGroups/Cancellation/BlockPivot.lean`, `homotopy_square`, `homotopy_retract`, `remainder_retained`, and `NumberTheory/TwoPoint/Walks/ColumnRankRelations.lean`, `columnDifference_disjoint_minor`, were inspected for simultaneous elimination and donor/pivot separation. They did not produce another priced gain in this round. + +## Three checked local constructions, not added to the achieved gain + +For a common entrance frame, choose a basis of a response-matroid component as donors. Each remaining column is an exact rational donor combination. Prepending its cancelling donor shears makes that pivot's dirty response zero; reverse cleanup restores the helper state. All required frame nesting and source spans must still hold. + +The following concrete words passed exact rational reconstruction, all 800 arbitrary-dirt columns in both forward and inverse-transpose orientations, and every individual pivot-correction omission control: + +| Candidate | Local profile change from PR484/496 | Residual counts (width:count) | Omission controls | +|---|---|---|---:| +| COMPONENT | -10 rank 1, -14 rank 2, +14 rank 3 | 5:4, 7:14, 8:100, 9:442 | 38 | +| JOINT-47 | -14 rank 1, -2 rank 2, -4 rank 3, +4 rank 4, +4 rank 5 | 5:4, 7:12, 8:102, 9:442 | 48 | +| JOINT-51 | -14 rank 1, -4 rank 2, +8 rank 3, -2 rank 4, +2 rank 5 | 5:4, 7:14, 8:100, 9:442 | 40 | + +These improve selected local objectives but lose scarce narrow residual inventory. Their tested lockstep allocations, including stage-selective portfolios and paid banks, did not improve the full bound. None is counted in the delivered kappa. They remain useful sufficient constructions for future schedules. + +The companion base, three selections and `REBUILD.json` permit source-bound reconstruction through `rebuild_candidate.py`; `audit_component_scalar.py` checks each reconstructed word independently. `LOCAL-CANDIDATE-AUDITS.json` preserves the three exact scalar receipts. The constructor reuses the retained, hash-pinned `gk_word.py` and `gk_common.py` with their attribution. + +## Other bounded lessons + +All14,851 subspaces contained in first-touch frames were screened. Under the fixed80 gauge exclusions, only 14 classes had positive response nullity, all dimension 1. Allowing excluded gauge helpers exposed63 additional components, still dimension 1. A catalogue of 646 components from deletion minors up to depth two did not beat the inherited42-pivot width budget. These are finite-search results, not global impossibility theorems. + +The proposed gauged-donor ordering is algebraically sufficient when original dirt compensation precedes the kernel update. Adding individual donors while retaining the current palette failed exact target/centre nesting in all 86 tested cases; geometric admissibility alone was insufficient. Whole-palette replacements remain a separate route. + +Native frame-retiming searches on the full joint gauge word and its cleanup extension found no better profile. A direct lift of PR493's bit skeleton to the complex side also failed a specific structural test: all 14,400 port pairs obey complemented adjacency. An even-parity-frame repair and the identity `G Hadamard G + A_orth - J = 3 I` are constructive leads, but require extra paid copies and a different decoder; they are not achieved improvements. + +The productive change was therefore at the scheduling level: reuse the already checked local engine, remove replica lockstep, and reconstruct the complete physical ownership and prefix bill. + + +Portable companion files are under `research-notes/kernel/`. From the package root, rebuild a local candidate with: + +``` +python -B research-notes/kernel/rebuild_candidate.py vendor/complex/e8-complex-gauge-kernel/code research-notes/kernel JOINT-47 /new/output-word.json.gz +python -B research-notes/kernel/audit_component_scalar.py /new/output-word.json.gz research-notes/kernel/JOINT-47-SELECTION.json /new/scalar-receipt.json +``` + +These separate local identities are not added to the achieved kappa. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/SCHEDULING-LEMMA.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/SCHEDULING-LEMMA.md new file mode 100644 index 0000000000..9328fb1ee5 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/SCHEDULING-LEMMA.md @@ -0,0 +1,25 @@ +# Sufficient asynchronous whole-owner scheduling lemma + +This is a mathematical composition proof, not Lean certification. It applies to the complete-call interfaces already retained by PR496. It does not permit splitting a residual across physical owners or stopping before dirty workspace restoration. + +Let physical families be mutually independent vector spaces. A local invocation is an explicitly implemented finite word whose COMPLETE endpoint factors as its intended data operation on one replica and one prescribed residual operator on each distinct helper owner; all private workspace and borrowed spectator coordinates are restored. A pending idle child on a family factors into commuting coordinate residuals on disjoint coordinate blocks and its complementary remainder. + +A finite schedule is sufficient if: + +1. For each data replica it preserves the order of all of that replica's data operations, including bridges and recipe phases. +2. Every helper use occurs inside the pending child's interval on the OWNER replica's timeline, and that owner is not an active data family in the invocation. +3. Pending coordinate blocks allocated to different uses are disjoint; all blocks and the one complementary remainder cover the original pending child exactly. +4. Every complete invocation has distinct physical helper owners and finishes its entry wrappers, scalar body, cleanup, exit wrappers and full cover sweep before the next invocation. It restores spectators even when later calls will use those coordinates actively. +5. All allocated residuals and the remainder finish before the owner replica's next operation that depends on completion of that pending child. + +Then the schedule has exactly the same complete endpoint as the original controller. Proof: replace each completed local invocation by its established block-diagonal endpoint. This is valid on arbitrary dirty input, hence remains valid after any preceding invocation. On each family, data operations occur in their original order. Between two consecutive such operations, the only newly ordered factors are residuals on disjoint coordinate blocks; they commute, and their product with the remainder is the original pending child. Regroup these factors inside each family interval. Their product is unchanged, so the overall controller endpoint is unchanged. No operation is commuted through an unfinished scalar body, and no independent-dirt claim is inferred merely from a logical alias. The full-cover right-translation bijection and actual owner maps remain premises of each complete invocation. + +Replica lockstep is therefore unnecessary for this sufficient composition argument. The construction still needs an explicit schedule, owner injection, full maps, interval checks, and paid profile. + +## Prefix bill + +The old synchronized prefix bound cannot be copied without checking its batching premise. If nine bridge rounds become as many as seventy-two ordered bridge sweeps, a safe logarithmic envelope should count those sweeps individually, alongside the seventy-two complete local sweeps, exact local transient norm, and conversion from entry sup norm to full-family L2. Enlarging the finite coefficient allowance is allowed if the outer assembly pays it. Alternatively an independent argument can retain a tighter norm bound by tracking disjoint active replicas. This is an invoice issue, not an extra recursive child count. + +## Structural source + +OpenAI FourierCircuit/WordScheduling.lean gives fixed-support scheduling and substitution identities. The proof above uses the same support-sensitive mechanism, with completed normalized invocations as its indivisible units. SparseShear's whole-call-index constructions reinforce why physical supports, not just abstract row dimensions, must remain explicit. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/SNAPSHOT.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/SNAPSHOT.md new file mode 100644 index 0000000000..a48fecee1f --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/SNAPSHOT.md @@ -0,0 +1,17 @@ +# Frozen public comparison + +Downloaded all 497 PR conversation pages (all-state pagination), then froze the +snapshot before packaging. Changed relevant source heads were pinned locally. +This is a retrieval snapshot, not an independent certification of every PR. + +| PR | Reported kappa | Treatment | +|---|---:|---| +| 493 | bit supplier c=0.001565442026981656908596 | Unchanged cited bit dependency; no duplicate operator replay | +| 494 | 0.001435468764627892 | Retitled under review: disputed split-residual interface; not adopted | +| 495 | 0.001307044366925301 | Below comparable frontier | +| 496 | 0.001332077359286333 | Comparable whole-owner parent; changed complex dependency reconstructed | +| 497 | 0.001325117552367841 | Moment-directed placement inspiration; no arithmetic addition of its gain | + +The new 0.001357701757628940 improves496 by 1.9236419089 percent. It neither +claims to surpass494's disputed number nor to reach0.0014. See SOURCES.json +for direct dependency heads. The withdrawn491 GL sampling argument is unused. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCE-FILES.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCE-FILES.json new file mode 100644 index 0000000000..0d1b538113 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCE-FILES.json @@ -0,0 +1,148 @@ +[ + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/gk_word.py", + "sha256": "f027a9273bcf4e0971258c160b7d3b3c196366b32a529cff6e6a0e666b03826b", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/gk_common.py", + "sha256": "e68d190fd436b2f3955decb590adb53344d5d4ea0a19d62d86df1e4b55ecd198", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py", + "sha256": "cb79c6b788333a031e14c7f134823f5f6147d7f1dcc6e5e3b1420743c32f8ebc", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/emit_gk.py", + "sha256": "4e415bff1d9f154496ed38e6889929b600aa0f3d583a375e8ca257ad8f51fa23", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py", + "sha256": "a8d6d9ccf20c261cb0b216baa9906f2f7689e1bb1dca070313a60b2cb6d3043c", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py", + "sha256": "2e807893180a3716b36a81f1a7d933bd55f2299489b6f236ba5c644d87739209", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py", + "sha256": "2422b44fc2fb4742bb575572337158a15fb6831630f8746a1c7ee3133e0ee2e3", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py", + "sha256": "416b318c1b6b8c7b72e24713b1b18d8772ec368e042a321b4418c63a74711590", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/split-centres-global/code/complex_phases_full.py", + "sha256": "0f2795aaffafe0c64d77f3748ef2109a3c42c58da867e4cf269a0a8cb6109466", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/split-centres-global/vendor/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "vendor/complex/e8-complex-gauge-kernel/data/selections/gauge80-kernel42.json", + "sha256": "436e4acadee227dbfcb66386c9ccaa38e68054e8ed4870bb174eeb41363375bb", + "origin": "PR496 pinned vendor of PR484; unchanged" + }, + { + "path": "inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz", + "sha256": "d833ae0390d165d7da0c639a3c7aeb77156c2ddb52447087cb49b9d03b19e9b9", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/complex-network/hamming/PROTOTYPE.json", + "sha256": "b155f101a2b7ec8cfc4e7b6e7147b2d51f0dc31d3ea3499bdfa79d399a76be47", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/complex-nine-native/DATA-PHASES.json", + "sha256": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/complex-nine-native/GLOBAL-TEMPLATE.json.gz", + "sha256": "1b84904a31a733aab9bfdda3f528c06719f590d2133a43687a8bded955dc991e", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz", + "sha256": "77b0c0fa19ef3da1c7316010e13493aa5eea1a50c3506eddc08f7480e659878b", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/odd-stages/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/pr361/code/engines/base_two_moment.py", + "sha256": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/pr361/code/engines/moment.py", + "sha256": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/pr361/code/engines/outer.py", + "sha256": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz", + "sha256": "1fb726ea3818fe0837cceb0dd22a71a0814f064e5e781628104610d6468e0e55", + "origin": "Pinned parent reconstruction input, inherited PR433/425/370/361" + }, + { + "path": "inputs/BASE-WORD.json.gz", + "sha256": "da4c5007092fd9456403179ef2a4391aef9fc5310e3eec5f2ab6c49b24147387", + "origin": "PR433 base before gauge80-kernel42; preserved cached input" + }, + { + "path": "inputs/ASYNC-3.json", + "sha256": "8d16c05f4b3239fb5f9ec93958c9436c0cc0c76f6d4899a12bce5b84007d0893", + "origin": "New frozen asynchronous witness; optimizer not trusted" + }, + { + "path": "inputs/ASYNC-OWNERS.json.gz", + "sha256": "52cb8c2b5869b429e3fe3b7a8b061792f020f6fad9f402dc4e4656110b9af068", + "origin": "New frozen asynchronous witness; optimizer not trusted" + }, + { + "path": "code/emit_async.py", + "sha256": "3dca3efbce0e1b775801d072e64995472749553f6f7f3250bb6a898cfe117fbc", + "origin": "New emitter" + }, + { + "path": "inputs/PR493-EXPECTED.json", + "sha256": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb", + "origin": "PR493 c3a9a436b84fe44fdc223a5784d84736d1c2d3c7 published unchanged bit supplier" + }, + { + "path": "vendor/audit_scalar_invoice.py", + "sha256": "652eed65fe8f72ab486dcdbe761f401f8a2d43530f2fb0c5c7777be488cd4648", + "origin": "PR496 independent scalar invoice; unchanged" + }, + { + "path": "references/PR496-PROOF.md", + "sha256": "144f1bf6952b3e31e99cf372a2cae9a13f96c9988808fe8a57ec70b09ee2007c", + "origin": "PR496 original conditional scope" + }, + { + "path": "PROOF.md", + "sha256": "1fd10bedaf12f5221c1f22f4e508279ca1a16af7d0733dfdaac6a2a02a8a668a", + "origin": "New asynchronous sufficient composition argument; adapted in final package", + "source_snapshot_sha256": "a892161a798f2dd482cf77c9c6d7e8e405aeebf9f075fe1fc26101ab73a14937" + } +] diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCES.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCES.json new file mode 100644 index 0000000000..48abd471c4 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/SOURCES.json @@ -0,0 +1,46 @@ +{ + "snapshot": "PR conversations through497; no live refresh during packaging", + "direct": [ + { + "pr": 496, + "head": "00cf70efd6a8637531deafef698157ca83e249ee", + "role": "whole-owner parent, invoice and assembly ancestry" + }, + { + "pr": 484, + "head": "035845ce95f31d0a2dcfb42b8c8e13411271fa5f", + "role": "PR496 pinned gauge80-kernel42 parent, not newer moving head" + }, + { + "pr": 493, + "head": "c3a9a436b84fe44fdc223a5784d84736d1c2d3c7", + "role": "unchanged cited R489 bit supplier" + } + ], + "openai_math": { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "status": "source inspection and mathematical adaptation; no new Lean audit" + }, + "other_inspirations": [ + 497, + 458, + 442, + 434, + 433, + 425, + 417, + 435, + 440, + 401, + 408, + 416, + 370, + 361, + 315 + ], + "excluded": { + "494": "under-review split-residual interface not used", + "491": "withdrawn GL sampling argument not used" + } +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/code/assemble.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/code/assemble.py new file mode 100644 index 0000000000..de2a375d13 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/code/assemble.py @@ -0,0 +1,42 @@ +"""Two exact moment engines and strict outer composition of a new PR484 rehosting +with the unchanged published PR493 bit supplier. Prepared by OpenAI Codex; arithmetic +engines are pinned inherited PR361/Mercator and independent base-two code. +Usage: assemble_candidate.py AUDIT_OUT PARENT_VARIANT HOSTED BIT_RESULT +""" +from pathlib import Path +from fractions import Fraction as Q +import json,gzip,sys,hashlib,importlib.util +O,V,H,B=map(Path,sys.argv[1:5]);sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() +def load(n): + p=V/'work/pr361/code/engines'/(n+'.py');s=importlib.util.spec_from_file_location('candidate_'+n,p);m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m +M,Other,Outer=[load(n)for n in ['moment','base_two_moment','outer']] +owner=json.loads((O/'OWNERS-AND-PROFILE.json').read_text());inv=json.loads((O/'PREFIX-AND-INVOICE.json').read_text());host=json.loads((H/'HOSTED.json').read_text());bit=json.loads(B.read_text())["eleven"];P={int(r):n for r,n in owner['paid_profile'].items()};m,W=73,owner['live'];assert m*W-sum(r*n for r,n in P.items())==2496 +rc=M.certify(P,m,W,True);b=Q(rc['lower']);bp=Q(rc['upper']);assert bp-b==Q(1,10**24) +fallback=32*m*m*sum(P.values());receipts=[] +for z,accept in[(b,True),(bp,False)]: + ml,mh=M.moment(P,m,W,z,True);a,c=Other.moment(m,W,list(P.items()),z);d,e=Other.moment(m,W,[(1,fallback)],z);a+=d/10**16;c+=e/10**16 + assert (mh<1 and c<1)if accept else(ml>1 and a>1) + receipts.append(dict(endpoint=str(z),mercator=[str(ml-1),str(mh-1)],base_two=[str(a-1),str(c-1)],accept=accept)) +# Reprice the cited unchanged bit histogram, clearly separate from bit operator verification. +bitP={int(r):n for r,n in bit['profile'].items()};bitc=Q(bit['bit_lower']);bitnext=bitc+Q(1,10**24) +for zz,accepted in [(bitc,True),(bitnext,False)]: + bl,bh=M.moment(bitP,78,9600,zz,True) + ol,oh=Other.moment(78,9600,list(bitP.items()),zz) + fl,fh=Other.moment(78,9600,[(1,32*78*78*sum(bitP.values()))],zz) + assert (bh<1 and oh+fh/10**16<1) if accepted else (bl>1 and ol+fl/10**16>1) +c=Q(bit['bit_lower']);eta=beta=Q(1,10**18);grid=Q(1,10**18);s=min(c,(1-beta)*b)-Q(1,10**24) +assert 00 + cut=max(ceil(36/gap**2),ceil(2*(4+coeff)/gap));assert cut*gap**2>=36 and cut*gap>=2*(4+coeff);cuts.append(dict(gap=str(gap),cutoff_log2=str(cut)));chain.append(a) +q=chain[-1]*(1-2*eta);margin=(1-eta)*q/(1+q);ticks=margin/grid;kap=grid*((ticks.numerator-1)//ticks.denominator) +bridge={'semantic':{'C0':{'base':2,'exponent':210000},'strict_literal_gap':1},'rows':{'degree_gap':Q(10**6)-Q(51*row,25)}} +a=Outer.assembly(chain[-1],b,bridge,kap,eta=eta,beta=beta);assert len(a['strict_constraints'])==47 and all(x>0 for x in a['strict_constraints'].values());controls=[] +for name,k,e,be in [('next_grid',kap+grid,eta,beta),('zero_eta',kap,Q(0),beta),('zero_beta',kap,eta,Q(0)),('unit_beta',kap,eta,Q(1))]: + try:Outer.assembly(chain[-1],b,bridge,k,eta=e,beta=be) + except AssertionError:controls.append(name) + else:raise AssertionError(name) +res=dict(status='PASS_ASYNC_COMPLEX_AND_CITED_BIT_EXACT_ASSEMBLY',complex_lower=str(b),complex_decimal=rc['lower'],next_b_rejected=str(bp),exact_moment_receipts=receipts,bit_lower=str(c),bit_result_sha256=sha(B),bit_template_sha256=bit['emitted_program_sha256'],bit_prefix_bits=bit['bit']['charged_prefix_bits'],bit_charged_three_level_coefficient_bits=coeff,external_row_allowance=row,kappa=str(kap),kappa_decimal=f'{float(kap):.18f}',binding_component='bit'if c<(1-beta)*b else'complex',strict_outer_constraints={k:str(v)for k,v in a['strict_constraints'].items()},outer_controls=controls,bootstrap=cuts,complex_template_sha256=host['template_sha256'],owner_audit_sha256=sha(O/'OWNERS-AND-PROFILE.json'),invoice_sha256=sha(O/'PREFIX-AND-INVOICE.json'),bit_scope='PR493 published profile and operator reused as a pinned dependency; this verifier reprices its published profile but does not reconstruct that unchanged bit operator.',scope='Conditional finite witness. Inherited compiler, precision/tape and analytic-transfer contracts remain assumed; changed-host operator admission recorded separately.') +(O/'EXACT-ASSEMBLY.json').write_text(json.dumps(res,indent=2)+'\n');print(res['status'],'b',res['complex_decimal'],'kappa',res['kappa_decimal'],flush=True) diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async.py new file mode 100644 index 0000000000..f3a6693920 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async.py @@ -0,0 +1,137 @@ +"""OpenAI Codex independent serialized ASYNCHRONOUS controller/spectator audit. +Imports no emitter, optimizer, expander, edge-coloring, or source hosting code. +CLI: VERIFIED_VARIANT POOLED_HOSTED OUT.json +""" +import sys,json,gzip,hashlib,copy +from pathlib import Path +from collections import Counter,defaultdict +BASE,OUT,REPORT=map(lambda p:Path(p).resolve(),sys.argv[1:4]);read=lambda p:json.loads(gzip.decompress(p.read_bytes())if p.suffix=='.gz'else p.read_bytes()) +parent=read(BASE/'split-centres/GLOBAL-TEMPLATE.json.gz');canon=read(BASE/'split-centres/CANONICAL-WORD.json.gz');checks=read(BASE/'split-centres/LOCAL-CHECKS.json');ph=read(BASE/'work/complex-nine-native/DATA-PHASES.json');ct=read(OUT/'GLOBAL-TEMPLATE.json.gz');summary=read(OUT/'HOSTED.json');width=[9-len(canon['frames'][canon['start'][240+h]])for h in range(560)];prank={e['child']:e['rank']for e in parent['idle_children']};M=73;T=8;DATA=7680 + +def orthobasis(port): + q=canon['ports'][port];z=next(i for i in range(9)if(q>>i)&1==0);a=q^(1<>i&1 else 0)for i in order]+[1<2*max(paid)**2 + return dict(profile=dict(sorted(paid.items())),mass=mass,hosted=40320,entering=entering,cross_replica=cross,sigma_digest=digest.hexdigest(),sigmas=sigmas,idle_remainders=len(wanted),busy_family_checks=len(roles),invocations=72) + +r=audit(ct);raw=gzip.decompress((OUT/'GLOBAL-TEMPLATE.json.gz').read_bytes());assert hashlib.sha256(raw).hexdigest()==summary['template_sha256'];assert r['profile']=={int(k):v for k,v in summary['global_profile'].items()};assert r['sigmas']==read(OUT/'ACTUAL-SIGMAS.json.gz');assert r['sigma_digest']==summary['sigma_stream_sha256'] +assert all(hashlib.sha256((BASE/name).read_bytes()).hexdigest()==value for name,value in summary['source_artifacts'].items()) +controls=[] +def reject(name,mut): + q=copy.deepcopy(ct);mut(q) + try:audit(q) + except(AssertionError,KeyError,IndexError,ValueError,TypeError):controls.append(name) + else:raise AssertionError('ACCEPTED '+name) +reject('wrong call time',lambda q:q['calls'][0].__setitem__('time',71)) +enter=lambda q:next(o for c in q['calls']for o in c['owners'][240:]if o[1][0]==4) +reject('alias two whole owners',lambda q:q['calls'][0]['owners'].__setitem__(241,q['calls'][0]['owners'][240])) +reject('helper on active data family',lambda q:q['calls'][0]['owners'][240].__setitem__(0,q['calls'][0]['owners'][0][0])) +reject('owner in private namespace',lambda q:q['calls'][0]['owners'][240].__setitem__(0,7680)) +reject('unbound change of owner replica',lambda q:q['calls'][0]['owners'][240].__setitem__(0,(q['calls'][0]['owners'][240][0]+960)%7680)) +reject('omit complete invocation',lambda q:q['calls'].pop()) +reject('reorder invocation replicas',lambda q:q['calls'].__setitem__(0,q['calls'][1])) +reject('interleave local invocations',lambda q:q.__setitem__('loop_order','interleaved local instructions')) +reject('change local instruction stream',lambda q:q['local_programs']['forward'].pop()) +reject('wrong residual width',lambda q:enter(q)[1].__setitem__(3,enter(q)[1][3]-1)) +reject('wrong spectator coordinate',lambda q:enter(q)[1][4].__setitem__(0,72)) +reject('omit spectator route',lambda q:enter(q).__setitem__(1,enter(q)[1][:3])) +reject('overlap residual footprint',lambda q:q['calls'][0]['owners'][240][1].__setitem__(2,100)) +reject('omit idle remainder',lambda q:q['idle_children'].pop()) +reject('underpay idle remainder',lambda q:q['idle_children'][0].__setitem__('rank',0)) +reject('omit bridge touch',lambda q:q['execution_schedule'].pop(next(i for i,e in enumerate(q['execution_schedule'])if e['kind']=='bridge'))) +reject('remove one-owner rule',lambda q:q['hosting'].pop('max_helpers_per_physical_family_per_call')) +reject('duplicate frozen role',lambda q:q['hosting']['pooled_slots'].__setitem__(1,q['hosting']['pooled_slots'][0])) +reject('understate physical reserve',lambda q:q.__setitem__('physical',8257)) +report=dict(status='PASS_INDEPENDENT_ASYNC_WHOLE_OWNER_CONTROLLER_PHASES_AND_SPECTATORS',template_sha256=summary['template_sha256'],complex_template_sha256=summary['template_sha256'],complex_live=7680,complex_profile=r['profile'],complex_hosted_residuals=40320,physical=8258,rank_mass=r['mass'],deficit=2496,entering_helper_roles=r['entering'],cross_replica_helper_roles=r['cross_replica'],one_owner_per_complete_invocation=True,helper_busy_family_window_checks=r['busy_family_checks'],complete_invocations=r['invocations'],actual_orthogonal_73column_maps=len(r['sigmas']),actual_sigma_stream_sha256=r['sigma_digest'],all_actual_residual_and_spectator_charts=True,idle_remainders=r['idle_remainders'],mutations_rejected=controls,widths=dict(sorted(Counter(width).items())),scope='Independent exact asynchronous chronology, per-replica phase projection, owner/chart/paid-profile audit. Uses unchanged source local program and normalized residual-wrapper identities; all-size compilation and complete coefficient invoice are separate inherited obligations.') +REPORT.write_text(json.dumps(report,indent=2)+'\n');print(json.dumps(report,indent=2)) + +owners=dict(status='PASS_INDEPENDENT_ASYNC_OWNERS_AND_PROFILE',template_sha256=summary['template_sha256'],paid_profile=r['profile'],live=7680,physical=8258,rank_mass=r['mass'],deficit=2496,hosted_residuals=40320,banked_residuals=0,all_800_owners_per_call_distinct=True,actual_helper_owner_charts=40320,actual_73column_sigmas=len(r['sigmas']),cross_replica_helper_roles=r['cross_replica'],explicit_idle_remainder_children=r['idle_remainders'],source_idle_children_charged=sum(x['replicas']for x in parent['idle_children']),source_artifacts=summary['source_artifacts'],controller_audit_sha256=hashlib.sha256(REPORT.read_bytes()).hexdigest()) +(REPORT.parent/'OWNERS-AND-PROFILE.json').write_text(json.dumps(owners,indent=2)+'\n') + diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async_invoice.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async_invoice.py new file mode 100644 index 0000000000..d6b5d21e2b --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/code/audit_async_invoice.py @@ -0,0 +1,99 @@ +"""Async PR484 scalar/prefix lowering and finite overcharge recount. OpenAI Codex. +Reads emitted programs, canonical word and raw routes, importing no supplier code. +Inherited all-size compiler admissibility is a condition, not inferred here. +""" +from pathlib import Path +from fractions import Fraction as F +from collections import Counter +import gzip,json,math,hashlib +import sys +O=Path(sys.argv[1]);V=Path(sys.argv[2]);HOSTED=Path(sys.argv[3]) +def read(p):return json.loads(gzip.decompress(p.read_bytes())if p.suffix=='.gz'else p.read_bytes()) +w=read(V/'split-centres/CANONICAL-WORD.json.gz');p=read(V/'split-centres/LOCAL-PROGRAMS.json.gz');old=read(V/'split-centres/GLOBAL-TEMPLATE.json.gz');new=read(HOSTED/'GLOBAL-TEMPLATE.json.gz');integ=read(V/'split-centres/INTEGRATION.json');checks=read(V/'split-centres/LOCAL-CHECKS.json');prior=read(V/'split-centres/INDEPENDENT-REPLAY.json');owners=read(O/'OWNERS-AND-PROFILE.json') +N=800;M=73;R=560;L=9;T=8;VV=120;K=4 +PAYLOAD=512 +control=read(O/'ASYNC-AUDIT.json') +raw=gzip.decompress((HOSTED/'GLOBAL-TEMPLATE.json.gz').read_bytes());th=hashlib.sha256(raw).hexdigest() +assert th==control['complex_template_sha256']==owners['template_sha256'] +assert control['one_owner_per_complete_invocation'] and control['complete_invocations']==72 +assert new['local_programs']==old['local_programs'] and new['recipe']==old['recipe'] +assert Counter(c['orientation']for c in new['calls'])==Counter(c['orientation']for c in old['calls']) +local={} +for ori,evs in p.items(): + rows={('L',i):{i:F(1)}for i in range(N)};env={('L',i):F(1)for i in range(N)};peak=F(1);real=macros=0;paid=Counter();workops=0 + for e in evs: + if e[0]=='climb':paid[e[5]]+=1 + elif e[0]=='center':paid[e[4]]+=1 + elif e[0]=='scalar': + macros+=1;x=e[1];op=x[0];a=tuple(x[1]);count=0 + if op=='clear':rows[a]={};env[a]=F(0);count=1 + elif op=='copy':rows[a]=dict(rows[tuple(x[2])]);env[a]=env[tuple(x[2])];count=1 + elif op=='scale': + q=F(x[2],x[3]);num,den=abs(q.numerator),q.denominator + assert num and num&(num-1)==0 and den&(den-1)==0 + rows[a]={j:q*v for j,v in rows[a].items()};env[a]*=abs(q) + count=abs(num.bit_length()-den.bit_length())+int(q<0) + elif op=='add': + b=tuple(x[2]);q=F(x[3],x[4]);num,den=abs(q.numerator),q.denominator + assert a!=b and num>0 and den&(den-1)==0 + # Lower actual coefficient to cleared Horner work. Every intermediate + # magnitude envelope is explicitly included, before denominator halvings. + acc=0;count=1 + for i,ch in enumerate(bin(num)[2:]): + if i:acc*=2;count+=1;peak=max(peak,acc*env[b]) + if ch=='1':acc+=1;count+=1;peak=max(peak,acc*env[b]) + v=F(acc) + for i in range(den.bit_length()-1):v/=2;count+=1;peak=max(peak,v*env[b]) + assert v==abs(q);count+=2 # signed accumulation and private work clear + env[a]=env.get(a,F(0))+abs(q)*env[b];rr=rows.setdefault(a,{}) + for j,z in list(rows[b].items()): + value=rr.get(j,F(0))+q*z + if value:rr[j]=value + else:rr.pop(j,None) + workops+=count + else:raise AssertionError(op) + real+=2*count;peak=max(peak,env[a]) + assert all(not row for reg,row in rows.items()if reg[0]=='C') + for i in range(N): + expected={i:F(1)} + if ori=='forward'and 120<=i<240:expected[i-120]=F(1) + if ori=='backward'and i<120:expected[i+120]=F(-1) + assert rows['L',i]==expected + assert peak==F(prior['local'][ori]['prefix_l1_upper']) and peak<2**192 + assert real==checks[ori]['real_component_primitive_bound']and macros==checks[ori]['scalar_macros'] + assert dict(paid)=={int(r):z for r,z in checks[ori]['paid_profile'].items()} + local[ori]=dict(events=len(evs),macros=macros,real_component_primitives=real,prefix_l1=str(peak),prefix_bits=peak.numerator.bit_length()-peak.denominator.bit_length()+1,coefficient_work_primitive_count=workops,all_exact_columns=N,all_560_dirty_helper_columns_restored=True,private_centres_and_coefficient_work_cleared=True) +centres=len(w['centers']);widths=[9-len(w['frames'][f])for f in w['start'][240:]];enter=sum(x<9 for x in widths) +children=sum(checks['forward']['paid_profile'].values());macros=max(x['macros']for x in local.values());compiler=64*(M+1)**3 +adapters=16*(macros+children+N+centres)+64*M +primitive_bound=max(x['real_component_primitives']for x in local.values())+adapters*compiler +bridges=sum(e['kind']=='bridge'for e in old['recipe']);bridgeadd=2*VV*T*bridges;assert sum(e['kind']=='bridge'for e in new['execution_schedule'])==T*bridges +shifts=K*VV*T;moves=2*K*VV*T +oldW=old['live'];oldP=old['physical'];oldNB=(oldW-2*VV*K*T)//L +scalar=sum(local[c['orientation']]['real_component_primitives']for c in old['calls']) +nonlocal_items=4*VV*T*L+2*VV*T*L+2*L*T*R+sum(e['replicas']for e in old['idle_children'])+L*oldNB+bridgeadd+shifts+moves+oldW+oldP+2*L*T*enter*144 +outside=8*nonlocal_items+64*M +pervertex=scalar+bridgeadd+shifts+moves+oldW+(72*adapters+outside)*compiler+64*oldP +invoice=integ['finite_invoice'];assert (primitive_bound,adapters,pervertex,compiler)==(invoice['local_primitive_bound'],invoice['local_adapters'],invoice['pervertex'],invoice['compiler']) +# Independent hosted stock rebase, retaining the larger unhosted operation +# overcharge; only the stock and mass in the common router/literal change. +W=new['live'];P=new['physical'];mass=owners['rank_mass'];profile=owners['paid_profile'] +assert M*W-mass==2496 and P==W+R+centres+2 +rebase=pervertex-oldP*65+P*65-oldW+W;used=max(rebase,pervertex) +r=M//2;group=2**(r*r) +for i in range(1,r+1):group*=2**(2*i)-1 +stock=group*P;smass=group*mass;logical=group*used+64;router=compiler*(logical+1)*(stock+1)**2 +G,E,C0=2**30000,2**100000,2**210000;B=smass+E;literal=2*G*stock**2+8*smass+4*stock+4+32*M;row=2*stock.bit_length()+9909+252+2*PAYLOAD;maxchild=max(map(int,profile)) +ineq=dict(local_primitive_bound=primitive_bound<2**48,logical=logical<2**6050,router=router2*maxchild*maxchild) +assert all(ineq.values()) +localbits=max(x['prefix_bits']for x in local.values());input_l2_bits=(M+1)//2 +bridge_sweeps=sum(e['kind']=='bridge'for e in new['execution_schedule']) +required_prefix=localbits+input_l2_bits+len(new['calls'])+bridge_sweeps+4 +assert localbits==20 and bridge_sweeps==72 and required_prefix==205 and required_prefix=0 and off+w<=rank[i] + assert z['time']==at[s,rep] and z['time'] in plan['windows'][f'{orp},{i}'][1] + B=OH.idle_basis(canon['ports'][port]);pending=list(map(int,ph['recipes'][port]['idle_children'][i]['orthogonal_axes']));assert len(pending)==rank[i] + occ=[B.index(v)for v in pending[off:off+w]];sp=OH.spectators(canon['ports'][port],pending,off,w)if w<9 else[] + order=occ+sp+[j for j in range(M)if j not in occ and j not in sp];assert len(order)==len(set(order))==M + sigma=[B[j]for j in order];sigmahash=hashlib.sha256(json.dumps(sigma,separators=(',',':')).encode()).hexdigest();sigmas[sigmahash]=sigma + route=[4,i,off,w,sp]if w<9 else[3,i,off];bycall[s,rep][h]=[f,route];entering+=w<9 + cells=set(range(off,off+w));assert not used[i,orp,port]&cells;used[i,orp,port]|=cells + digest.update(json.dumps([s,rep,h,f,sigmahash],separators=(',',':')).encode()+b'\n') +for c in t['calls']: + k=(c['stage'],c['replica']);assert set(bycall[k])==set(range(R)) + c['owners']=c['owners'][:240]+[bycall[k][h]for h in range(R)];assert len({f for f,r in c['owners']})==800 and all(f2*max(paid)**2 + +assert t['local_programs']==parent['local_programs'] +raw=json.dumps(t,sort_keys=True,separators=(',',':')).encode();(OUT/'GLOBAL-TEMPLATE.json.gz').write_bytes(gzip.compress(raw,mtime=0)) +res=dict(status='EMITTED_ASYNCHRONOUS_WHOLE_OWNER_COMPLEX_TEMPLATE',template_sha256=hashlib.sha256(raw).hexdigest(),parent_template_sha256=hashlib.sha256(gzip.decompress((BASE/'split-centres/GLOBAL-TEMPLATE.json.gz').read_bytes())).hexdigest(),live=DATA,physical=physical,global_profile=dict(sorted(paid.items())),rank_mass=sum(r*n for r,n in paid.items()),deficit=2496,maxchild=max(paid),hosted_residuals=len(roles),banks_per_stage=[0]*9,entering_helper_roles=entering,unique_actual_73column_sigmas=len(sigmas),sigma_stream_sha256=digest.hexdigest(),cross_replica_helper_roles=sum(z['replica']!=z['owner_replica']for z in roles),asynchronous_order_sha256=hashlib.sha256(json.dumps(call_order,separators=(',',':')).encode()).hexdigest(),source_artifacts={p.relative_to(BASE).as_posix():hashlib.sha256(p.read_bytes()).hexdigest()for p in [BASE/'split-centres/CANONICAL-WORD.json.gz',BASE/'split-centres/LOCAL-PROGRAMS.json.gz',BASE/'split-centres/LOCAL-CHECKS.json',BASE/'split-centres/RESIDUAL-ADAPTERS.json',BASE/'work/complex-nine-native/DATA-PHASES.json']},scope='New emitted complete-invocation placement; independent controller/spectator/normalization and complete finite invoice admission required.') +(OUT/'HOSTED.json').write_text(json.dumps(res,indent=2)+'\n');(OUT/'ACTUAL-SIGMAS.json.gz').write_bytes(gzip.compress(json.dumps(sigmas,separators=(',',':')).encode(),mtime=0));print(json.dumps(res,indent=2)) diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/ASYNC-AUDIT.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/ASYNC-AUDIT.json new file mode 100644 index 0000000000..0e22d24cf6 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/ASYNC-AUDIT.json @@ -0,0 +1,59 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_WHOLE_OWNER_CONTROLLER_PHASES_AND_SPECTATORS", + "template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "complex_template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "complex_live": 7680, + "complex_profile": { + "1": 148240, + "2": 66816, + "3": 7032, + "4": 19728, + "5": 26109, + "6": 144, + "7": 2209, + "8": 1224, + "16": 1, + "48": 408 + }, + "complex_hosted_residuals": 40320, + "physical": 8258, + "rank_mass": 558144, + "deficit": 2496, + "entering_helper_roles": 8784, + "cross_replica_helper_roles": 33114, + "one_owner_per_complete_invocation": true, + "helper_busy_family_window_checks": 40320, + "complete_invocations": 72, + "actual_orthogonal_73column_maps": 3194, + "actual_sigma_stream_sha256": "f2e2f8346abac2d6eb8f51877644f271791cf0385823f2c0be72628063a2c1ee", + "all_actual_residual_and_spectator_charts": true, + "idle_remainders": 9615, + "mutations_rejected": [ + "wrong call time", + "alias two whole owners", + "helper on active data family", + "owner in private namespace", + "unbound change of owner replica", + "omit complete invocation", + "reorder invocation replicas", + "interleave local invocations", + "change local instruction stream", + "wrong residual width", + "wrong spectator coordinate", + "omit spectator route", + "overlap residual footprint", + "omit idle remainder", + "underpay idle remainder", + "omit bridge touch", + "remove one-owner rule", + "duplicate frozen role", + "understate physical reserve" + ], + "widths": { + "5": 4, + "7": 14, + "8": 104, + "9": 438 + }, + "scope": "Independent exact asynchronous chronology, per-replica phase projection, owner/chart/paid-profile audit. Uses unchanged source local program and normalized residual-wrapper identities; all-size compilation and complete coefficient invoice are separate inherited obligations." +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/EXACT-ASSEMBLY.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/EXACT-ASSEMBLY.json new file mode 100644 index 0000000000..584df13533 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/EXACT-ASSEMBLY.json @@ -0,0 +1,127 @@ +{ + "status": "PASS_ASYNC_COMPLEX_AND_CITED_BIT_EXACT_ASSEMBLY", + "complex_lower": "679773808909616785409/500000000000000000000000", + "complex_decimal": "0.001359547617819233570818", + "next_b_rejected": "1359547617819233570819/1000000000000000000000000", + "exact_moment_receipts": [ + { + "endpoint": "679773808909616785409/500000000000000000000000", + "mercator": [ + "-24701029572391194233163396454784816194406099/13479973333575319897333507543509815336818572211270286240551805124608", + "-12350514786195597116581698227392408097203049/6739986666787659948666753771754907668409286105635143120275902562304" + ], + "base_two": [ + "-4581062751698854583809/2500000000000000000000000000000000000000000000", + "-18324241006795418335121/10000000000000000000000000000000000000000000000" + ], + "accept": true + }, + { + "endpoint": "1359547617819233570819/1000000000000000000000000", + "mercator": [ + "39093084283798609982256402899859243863127849/26959946667150639794667015087019630673637144422540572481103610249216", + "39093084283798609982256402899859243863127851/26959946667150639794667015087019630673637144422540572481103610249216" + ], + "base_two": [ + "7250214496780752717751/5000000000000000000000000000000000000000000000", + "453138718548797044863/312500000000000000000000000000000000000000000" + ], + "accept": false + } + ], + "bit_lower": "391360506745414227149/250000000000000000000000", + "bit_result_sha256": "3494ba83280cc86548fe0cc6695c50d23e6b6ffca85aeb1a33337c1196e280cb", + "bit_template_sha256": "e37b52e4861c39154b5891460fb45df8651c92cd68961078f8f06596f057c822", + "bit_prefix_bits": 2176, + "bit_charged_three_level_coefficient_bits": 6464, + "external_row_allowance": 20161, + "kappa": "67885087881447/50000000000000000", + "kappa_decimal": "0.001357701757628940", + "binding_component": "complex", + "strict_outer_constraints": { + "bit_positive": "10621465764212762196210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "complex_above_bit": "75805356522229723538276500338261082745908696235059517215374758941009559806883314548290988565178987146145948271353077645931235889759548211917698574898493190015462540009646906551694945841891075873209231175792953018183748038541446077888520395080705415321382436936929665247231/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "complex_below_one_over32": "14945226191090383214591/500000000000000000000000", + "beta_positive": "1/1000000000000000000", + "beta_below_one": "999999999999999999/1000000000000000000", + "leaf_saving_above_bit": "65183890758016961266260875338261082745908696235059517215374758941009559806883314548290988565178987146145948271353077645931235889759548211917698574898493190015462540009646906551694945841891075873209231175792953018183748038541446077888520395080705415321382436936929665247231/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_positive": "5310732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_internal": "10621465764212762196210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_leaf": "43213411143221242829340706146900817834677847779268675861778683235445262688066898333135934475706179024781985570497551676819669673526696460027613397689698383090032695106330263260384932911298631384909669746005400635882642843477770020760512158998906629772170823387759417302233063063070334752769/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_positive": "5310732882106382064046168474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c_below_one": "3900939267117893617935953831525327623965348518646900817834677847779268675861778683235445262688066898333135934475706179024781985570497551676819669673526696460027613397689698383090032695106330263260384932911298631384909669746005400635882642843477770020760512158998906629772170823387759417302233063063070334752769/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "q_below_reservations": "1/4000000000000000000", + "lambda_above_tau": "10621465764212762196210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_sigma": "86426822286442485734486768816031359207632195896798434469466062705950042591508555607281428758295672597854959706174090499785287618406470565986462685138944978097763965111153716536232405832244169321514285333901877144974516862748493059704772356539259337432862041856224249925848563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_above_internal": "10621465764212762196210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "lambda_prime_above_lambda": "10621465764212762196210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_leaf": "43213411143221242829340706146900817834677847779268675861778683235445262688066898333135934475706179024781985570497551676819669673526696460027613397689698383090032695106330263260384932911298631384909669746005400635882642843477770020760512158998906629772170823387759417302233063063070334752769/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_reservations": "1/4000000000000000000", + "lambda_prime_below_one": "5310732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "epsilon_positive": "3906249999999999996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231", + "epsilon_below_one": "5310732882106384993733668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231", + "guard_width": "5310732882106384993733668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231", + "K_geometry": "2934998232882106382064046168474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231000000000000000000", + "K_dominates_log": "5310732882106382058735435592565993970605312878426806130670670867632141972899164543823413173711784902309328212360719308353948905208627347962315896970855216792056275836998076937580702583368119829647762195031631875475263165293230749027026902527630615122130684478863390988341335611147212469937760324689082549464063063070334752769/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231000000000000000000", + "record_suffix": "5310732882106384993733668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231", + "phase_local": "42485863056851076038308614915272627189728182350121081287925736412751410940448381895706574357243496570357786882417466134880049911725765610224628182283979996598762492009109395307351836839056277006953231815941212181107574943255426297848526998183240469798545571486516982583145571896831291354306318883196739280081063063070334752769/31292485863056851048699869347797379008277211850824793457322577217765850593105770534116437898495464813334912524194350567801744115436019586585442642611786428319779092818482412935279738439149357893916920536709610948920722642031956794912938857252177839833915902728008746961822633412897924661582135495495437321977848000000000000000000", + "phase_boundary": "8497172611370212078413136677369420567958701690286315429863962200070936455831954602556255560871645902427767526937011893484757562910096341870514092854837340775488237223179047083561085519569961873416802448252453044529461317689990367497441196440968602665823389079519413125038841578491562088597922486846881697802663063070334752769/6258497172611370209739973869559475801655442370164958691464515443553170118621154106823287579699092962666982504838870113560348823087203917317088528522357285663955818563696482587055947687829871578783384107341922189784144528406391358982587771450435567966783180545601749392364526682579584932316427099099087464395569600000000000000000", + "gamma_sublinear": "1/2000000000000000000", + "cell_above_band": "7812499999999999988275939267117893618912516331525327623965348518646900817834677847779268675861778683235445262688066898333135934475706179024781985570497551676819669673526696460027613397689698383090032695106330263260384932911298631384909669746005400635882642843477770020760512158998906629772170823387759417302233063063070334752769/15646242931528425524349934673898689504138605925412396728661288608882925296552885267058218949247732406667456262097175283900872057718009793292721321305893214159889546409241206467639869219574678946958460268354805474460361321015978397456469428626088919916957951364004373480911316706448962330791067747747718660988924000000000000000000", + "prime_interval_packing": "5310732882106384993733668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231", + "alpha_positive": "10621465764212766075906604067238370981819294231525988295992823088363466111120481308378150485644886569173393736654540283571963334711075671142646223444158756764442878147299693847548007477037856569262829283733000490565593419287830113144384059049860594361618525479956761216170512223387795167704697261618747796695063063070334752769/7823121465764212762174967336949344752069302962706198364330644304441462648276442633529109474623866203333728131048587641950436028859004896646360660652946607079944773204620603233819934609787339473479230134177402737230180660507989198728234714313044459958478975682002186740455658353224481165395533873873859330494462000000000000000000", + "alpha_below_one": "7812499999999999996099060732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231/7823121465764212762174967336949344752069302962706198364330644304441462648276442633529109474623866203333728131048587641950436028859004896646360660652946607079944773204620603233819934609787339473479230134177402737230180660507989198728234714313044459958478975682002186740455658353224481165395533873873859330494462000000000000000000", + "alpha_below_one_fourth": "1945158900676840424467835230170097817035506446445023602786668253022002195957990177073899218170321664264258639025492370204037043880040148490447518939792493013221750423007851114607435644969797011800544704260617683816979571707709469568914294519211254395258125395020589923897744076082732496181178771206846084826920436936929665247231/7823121465764212762174967336949344752069302962706198364330644304441462648276442633529109474623866203333728131048587641950436028859004896646360660652946607079944773204620603233819934609787339473479230134177402737230180660507989198728234714313044459958478975682002186740455658353224481165395533873873859330494462000000000000000000", + "delta_positive": "1/8000000000000000000", + "delta_below_one_eighth": "999999999999999999/8000000000000000000", + "short_record_fallback": "30476031616591053695255357385842632247872968353052736940659301202546558071844420941874415019799990306881851694007585023748914834561925272519659012604115336560346985833987306908599429267589667720613354057175159740739462461017164561832658234823067683932538671551231726452195819750713175860162272232719841030499367555945443232151048287970371001552470785741262353628373969381080863072756023920550731729441573697988771321949155828755862865531169857431279591033081586433162952721140626750363256381335593028113127210908131834130180228956565244237744769778758781555044827398327113607029896009220341076353167361/30559068225641456102245966159958377937770714698071087360666579314224463469829854037223083885249477356772375511908545476368890737730487877524846330675572683906034270330549231382109119569481794818278242711630479442305393205109332807532166852785329921712808498757821041954904915442283129552326304194819763009743992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "small_field_exposure": "1/1000000000000000000", + "artificial_boundary": "219089886904454808432583636981025351209480145812022364786684572186186102291342130729593697160378382456972964405490603847414545120061038155609195184182798771527773733527279214102155067320125768002065266208357896801584626337521758465148781848779406516763679293293636665632299530826186677403340571493800220323916084810810788995741693/31292485863056851048699869347797379008277211850824793457322577217765850593105770534116437898495464813334912524194350567801744115436019586585442642611786428319779092818482412935279738439149357893916920536709610948920722642031956794912938857252177839833915902728008746961822633412897924661582135495495437321977848000000000000000000", + "literal_scalar_guard": "1", + "row_product_gap": "23971789/25", + "balanced_prefix_above_kappa": "223946570416997717293062970494990009648280940653527957902659810520646257743739805879058976867444448332146243406104465393923042770915641465759351982688021571365791583013703184590156306980819317619588927480855913286399111828731627762648854661175622158281871528689229359473429648618729597705261115004412726976743/195578036644105319054374183423733618801732574067654959108266107611036566206911065838227736865596655083343203276214691048760900721475122416159016516323665176998619330115515080845498365244683486836980753354435068430754516512699729968205867857826111498961974392050054668511391458830612029134888346846846483262361550000000000000000", + "coordinate_movement_above_kappa": "14420782736668446210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "compact_phase_layer_above_kappa": "567370675457847964773775741425127816930967331717459975887874058192193830736574800816624800036955864976060802597795486903242840988810380992006709327287127887343445057963762074893158834722716615652163482528416897112891906320637955888859736066990213186397942732783493819240763795762351371407455363151324874287629/3911560732882106381087483668474672376034651481353099182165322152220731324138221316764554737311933101666864065524293820975218014429502448323180330326473303539972386602310301616909967304893669736739615067088701368615090330253994599364117357156522229979239487841001093370227829176612240582697766936936929665247231000000000000000000", + "bulk_exposure_above_kappa": "14420782736668446210268477770276461723499661738917254091303764940482784625241058990440193116685451709011434821012853854051728646922354068764110240451788082301425101506809984537459990353093448305054158108924126790768824207046981816251961458553922111479604919294584678617563063070334752769/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "Gaussian_arithmetic_above_kappa": "650945904092364114458106277473001586542067723911959094143958356887989784732290494273066504489257848992363144694209814326063870847959615716223786623908677348746588810825640057995006903698509685417446122459737571309936249653083497808129198400219535817156080215410849226584383915837421308774117748640855519601709/1251699434522274041947994773911895160331088474032991738292903088710634023724230821364657515939818592533396500967774022712069764617440783463417705704471457132791163712739296517411189537565974315756676821468384437956828905681278271796517554290087113593356636109120349878472905336515916986463285419819817492879113920000000000000000", + "scalar_work_above_kappa": "31919890533837528385802591610723729167690299023211374082260247531082669914860147623884881561479178631476534879452420642052468828917000186198315986903610147878554266679882207917515041812037421082394613329848244757208767562343065842659699388631577315345859956749275604145520914602384495050144011463769106651031649/31292485863056851048699869347797379008277211850824793457322577217765850593105770534116437898495464813334912524194350567801744115436019586585442642611786428319779092818482412935279738439149357893916920536709610948920722642031956794912938857252177839833915902728008746961822633412897924661582135495495437321977848000000000000000000", + "dimension_above_kappa": "195046963355894680778947386993264098491330396427335050540014833042491391695748744682418520878143150795715773591229757283385342684629342977764026254591976288760732652572506490520293217769019697753175553626384249188834410968156183318193243970905516263686880269125567489770480069858617330338541301771883114442899565004412726976743/195578036644105319054374183423733618801732574067654959108266107611036566206911065838227736865596655083343203276214691048760900721475122416159016516323665176998619330115515080845498365244683486836980753354435068430754516512699729968205867857826111498961974392050054668511391458830612029134888346846846483262361550000000000000000" + }, + "outer_controls": [ + "next_grid", + "zero_eta", + "zero_beta", + "unit_beta" + ], + "bootstrap": [ + { + "gap": "449020414922846710689433426655558230469635792154792303094639231241802755297281/250000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "11159644099234" + }, + { + "gap": "305232317730280040825308835590987929903916022046304981461323310497994616857940652573544720024451785628400210621827071/125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "6037560531089891199" + }, + { + "gap": "207488935225822819707329944397914542017357247747950207874090506920289069740932634230320647467086765522447186084241700065543015944786272931178754706685992961/62500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "3266424703371836125114550" + }, + { + "gap": "141045543805058336212649010292305025939820708534171267604518810486058306439990756026263446106135360755810503860317998166184340480573013333355654103297932838083993074527887268756892915247978493951/31250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "1767192277055604162917945126478" + }, + { + "gap": "95879066542092708925688584119303870977398057083360511006259925303938427875169627138804769682491484367184212664343124194508853936496116207677240233614616406658790651905415671420236414749865832511242765726328404100094386838726228439041/15625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "956081596144316677228711405955568612" + }, + { + "gap": "65176078258016961266260875338261082745908696235059517215374758941009559806883314548290988565178987146145948271353077645931235889759548211917698574898493190015462540009646906551694945841891075873209231175792953018183748038541446077888520395080705415321382436936929665247231/7812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cutoff_log2": "517256684716205688376238722884845576914065" + } + ], + "complex_template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "owner_audit_sha256": "c091ef330ae4566838b3a6c214d57847ce7c9962d5fc161f4ad155cd6bc69b21", + "invoice_sha256": "3d38891f6db3fd70728f1bcba7d1f1356250903a15f3916ca91ae1ad98a24c73", + "bit_scope": "PR493 published profile and operator reused as a pinned dependency; this verifier reprices its published profile but does not reconstruct that unchanged bit operator.", + "scope": "Conditional finite witness. Inherited compiler, precision/tape and analytic-transfer contracts remain assumed; changed-host operator admission recorded separately." +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/GLOBAL-PREFIX.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/GLOBAL-PREFIX.json new file mode 100644 index 0000000000..a957679ed7 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/GLOBAL-PREFIX.json @@ -0,0 +1,13 @@ +{ + "status": "PASS_ASYNC_GLOBAL_PREFIX", + "template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "global_prefix_bits": 205, + "retained_payload_bits": 512, + "complete_invocation_cover_sweeps": 72, + "bridge_factor_two_sweeps": 72, + "local_scalar_coefficient_work_prefix_bits": 20, + "stream_input_sup_to_l2_bits": 37, + "primitive_arithmetic_margin_bits": 4, + "controller_audit_sha256": "e3f3c8dd3d9ead17031574f86fe7c7887f5f08ead36877b0baa93def9db58431", + "proof": "Each complete normalized invocation has unitary helper endpoints and a data shear with at most two unitary summands. Distinct full orthogonal owner charts act by right-translation bijections on the retained cover group. Thus the maximum full-stream L2 norm grows by at most2per complete local cover sweep and individual bridge. All72local sweeps and72individual bridge sweeps are counted. Unit-modulus phases, idle children, terminal translations and normalized spectator endpoints are unitary. The independently replayed scalar/Horner envelope costs20bits, initial sup-to-L2 conversion37bits, primitive margin4bits: total205<512. All-size child/compiler and precision/tape interfaces remain inherited." +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/OWNERS-AND-PROFILE.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/OWNERS-AND-PROFILE.json new file mode 100644 index 0000000000..f7283dfdb8 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/OWNERS-AND-PROFILE.json @@ -0,0 +1,36 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_OWNERS_AND_PROFILE", + "template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "paid_profile": { + "1": 148240, + "2": 66816, + "3": 7032, + "4": 19728, + "5": 26109, + "6": 144, + "7": 2209, + "8": 1224, + "16": 1, + "48": 408 + }, + "live": 7680, + "physical": 8258, + "rank_mass": 558144, + "deficit": 2496, + "hosted_residuals": 40320, + "banked_residuals": 0, + "all_800_owners_per_call_distinct": true, + "actual_helper_owner_charts": 40320, + "actual_73column_sigmas": 3194, + "cross_replica_helper_roles": 33114, + "explicit_idle_remainder_children": 9615, + "source_idle_children_charged": 17280, + "source_artifacts": { + "split-centres/CANONICAL-WORD.json.gz": "aff71d7ca599f34a695f96d3b6ad4ba8038b0a5719653e2a6076f9477775261a", + "split-centres/LOCAL-PROGRAMS.json.gz": "6cb91d27f03650b67dd72cc441c6a49ae429abee6fb8ea3ec814078ba629e563", + "split-centres/LOCAL-CHECKS.json": "d36cce576a03faec3005f15cc0b8f5e7f3890e50c5d85bdd12794f3979e33462", + "split-centres/RESIDUAL-ADAPTERS.json": "a4cec4b3ccaebb33cf169b50230c4033eb956f9e75fad64cf6647a3f794c5cca", + "work/complex-nine-native/DATA-PHASES.json": "f621f6d4296cb215f334830356c5f79fe10d6d04d15b3ccda76ba0885ab67d0a" + }, + "controller_audit_sha256": "e3f3c8dd3d9ead17031574f86fe7c7887f5f08ead36877b0baa93def9db58431" +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/PREFIX-AND-INVOICE.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/PREFIX-AND-INVOICE.json new file mode 100644 index 0000000000..c1caf19da3 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/PREFIX-AND-INVOICE.json @@ -0,0 +1,69 @@ +{ + "status": "PASS_INDEPENDENT_ASYNC_SCALAR_PREFIX_AND_FINITE_INVOICE", + "template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "global_prefix_bits": 205, + "charged_prefix_bits": 512, + "complete_invocation_sweeps": 72, + "bridge_sweeps": 72, + "row_prefix_extra": 1024, + "local": { + "backward": { + "events": 25082, + "macros": 19708, + "real_component_primitives": 221516, + "prefix_l1": "1039266", + "prefix_bits": 20, + "coefficient_work_primitive_count": 109970, + "all_exact_columns": 800, + "all_560_dirty_helper_columns_restored": true, + "private_centres_and_coefficient_work_cleared": true + }, + "forward": { + "events": 25082, + "macros": 19708, + "real_component_primitives": 221420, + "prefix_l1": "32209", + "prefix_bits": 15, + "coefficient_work_primitive_count": 109906, + "all_exact_columns": 800, + "all_560_dirty_helper_columns_restored": true, + "private_centres_and_coefficient_work_cleared": true + } + }, + "entering_helpers": 122, + "entrance_rank": 148, + "local_adapters": 391344, + "local_primitive_bound": 10149247009100, + "wrapper_elementary_factors_charged": 2529792, + "compiler": 25934336, + "unhosted_pervertex": 1299225185815824, + "hosted_rebased_pervertex": 1299225185483184, + "conservative_pervertex_used": 1299225185815824, + "finite": { + "physical_stock_bits": 2641, + "router_bits": 7984, + "literal_bits": 35282, + "physical_row_coefficient": 16467, + "retained_row_coefficient": 20161, + "required_C0_bits": 200012, + "halving_integer_inequality": [ + 5329, + 4608 + ], + "G_exponent": 30000, + "E_exponent": 100000, + "C0_exponent": 210000 + }, + "strict_checks": { + "local_primitive_bound": true, + "logical": true, + "router": true, + "literal": true, + "mass": true, + "precision": true, + "tape": true, + "row": true, + "halving": true + }, + "scope": "Exact finite recount conditional on inherited all-size compiler/precision/tape and analytic-transfer contracts. Signed accumulation uses the supplier scalar primitive convention. Async prefix counts all72individual bridges and72complete invocations;512bits are charged, and an additional2*512 enters the two-level physical row bound." +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/RESULT.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/RESULT.json new file mode 100644 index 0000000000..4eea6e65cc --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/RESULT.json @@ -0,0 +1,68 @@ +{ + "status": "PASS_CONDITIONAL_ASYNCHRONOUS_COMPLEX_DERIVATIVE", + "kappa": "67885087881447/50000000000000000", + "kappa_decimal": "0.001357701757628940", + "complex_lower": "679773808909616785409/500000000000000000000000", + "bit_lower": "391360506745414227149/250000000000000000000000", + "template_sha256": "276b69e3fc79a211daaf39776d91b3a6f9c262c415cbd199ab02d5e0ccb9bf4b", + "strict_constraints": 47, + "scope": "New complex program independently replayed. The unchanged PR493 bit operator and inherited all-size compiler, common-label, Lemma A realization, restored-row, precision/tape and analytic-transfer contracts remain dependencies. No unconditional multiplication bound or fresh Lean certification is claimed.", + "stages": [ + { + "stage": "construct", + "exit": 0, + "seconds": 0.7339999999967404 + }, + { + "stage": "scalar", + "exit": 0, + "seconds": 5.046999999991385 + }, + { + "stage": "emit-local", + "exit": 0, + "seconds": 3.9679999999934807 + }, + { + "stage": "phases", + "exit": 0, + "seconds": 208.375 + }, + { + "stage": "adapters", + "exit": 0, + "seconds": 1.3910000000032596 + }, + { + "stage": "parent-integration", + "exit": 0, + "seconds": 1.7339999999967404 + }, + { + "stage": "parent-replay", + "exit": 0, + "seconds": 9.594000000011874 + }, + { + "stage": "emit-async", + "exit": 0, + "seconds": 4.953000000008615 + }, + { + "stage": "independent-async", + "exit": 0, + "seconds": 26.062000000005355 + }, + { + "stage": "invoice", + "exit": 0, + "seconds": 2.437999999994645 + }, + { + "stage": "two-moments-assembly", + "exit": 0, + "seconds": 0.5940000000118744 + } + ], + "package_manifest_sha256": null +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/STEPS.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/STEPS.json new file mode 100644 index 0000000000..70df4595dd --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/evidence/STEPS.json @@ -0,0 +1,57 @@ +[ + { + "stage": "construct", + "exit": 0, + "seconds": 0.7339999999967404 + }, + { + "stage": "scalar", + "exit": 0, + "seconds": 5.046999999991385 + }, + { + "stage": "emit-local", + "exit": 0, + "seconds": 3.9679999999934807 + }, + { + "stage": "phases", + "exit": 0, + "seconds": 208.375 + }, + { + "stage": "adapters", + "exit": 0, + "seconds": 1.3910000000032596 + }, + { + "stage": "parent-integration", + "exit": 0, + "seconds": 1.7339999999967404 + }, + { + "stage": "parent-replay", + "exit": 0, + "seconds": 9.594000000011874 + }, + { + "stage": "emit-async", + "exit": 0, + "seconds": 4.953000000008615 + }, + { + "stage": "independent-async", + "exit": 0, + "seconds": 26.062000000005355 + }, + { + "stage": "invoice", + "exit": 0, + "seconds": 2.437999999994645 + }, + { + "stage": "two-moments-assembly", + "exit": 0, + "seconds": 0.5940000000118744 + } +] diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-3.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-3.json new file mode 100644 index 0000000000..930a44dfcd --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-3.json @@ -0,0 +1,13195 @@ +{ + "status": "EXACT_INTEGER_ASYNC_NOMINATION_PHYSICAL_SLOT_MATCHING_PENDING", + "mode": "offset3", + "T": 8, + "M": 73, + "L": 9, + "live": 7680, + "deficit": 2496, + "profile": { + "1": 148240, + "2": 66816, + "3": 7032, + "4": 19728, + "5": 26109, + "6": 144, + "7": 2209, + "8": 1224, + "48": 408, + "16": 1 + }, + "patterns": [ + [ + [ + 0, + 0 + ], + [ + 9 + ], + 54 + ], + [ + [ + 0, + 0 + ], + [ + 8, + 8 + ], + 52 + ], + [ + [ + 0, + 0 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 0, + 2 + ], + [ + 9 + ], + 16 + ], + [ + [ + 0, + 2 + ], + [ + 8, + 8 + ], + 104 + ], + [ + [ + 0, + 1 + ], + [ + 8 + ], + 120 + ], + [ + [ + 0, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 0, + 4 + ], + [ + 9, + 9, + 9 + ], + 100 + ], + [ + [ + 0, + 4 + ], + [ + 5, + 9, + 9, + 9 + ], + 20 + ], + [ + [ + 0, + 6 + ], + [ + 9, + 9, + 9 + ], + 116 + ], + [ + [ + 0, + 6 + ], + [ + 5, + 9, + 9, + 9 + ], + 4 + ], + [ + [ + 0, + 5 + ], + [ + 8 + ], + 120 + ], + [ + [ + 0, + 7 + ], + [ + 8 + ], + 120 + ], + [ + [ + 0, + 8 + ], + [], + 48 + ], + [ + [ + 0, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 72 + ], + [ + [ + 0, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 0, + 9 + ], + [ + 8 + ], + 105 + ], + [ + [ + 0, + 9 + ], + [ + 7 + ], + 15 + ], + [ + [ + 0, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 0, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 0, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 0, + 14 + ], + [ + 9, + 9, + 9 + ], + 64 + ], + [ + [ + 0, + 14 + ], + [ + 5, + 9, + 9, + 9 + ], + 56 + ], + [ + [ + 0, + 15 + ], + [ + 9, + 9, + 9 + ], + 108 + ], + [ + [ + 0, + 15 + ], + [ + 5, + 9, + 9, + 9 + ], + 12 + ], + [ + [ + 0, + 16 + ], + [ + 9 + ], + 64 + ], + [ + [ + 0, + 16 + ], + [ + 7, + 9 + ], + 56 + ], + [ + [ + 0, + 17 + ], + [ + 9 + ], + 105 + ], + [ + [ + 0, + 17 + ], + [ + 8, + 8 + ], + 1 + ], + [ + [ + 0, + 17 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 1, + 0 + ], + [ + 9 + ], + 106 + ], + [ + [ + 1, + 0 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 1, + 2 + ], + [ + 9 + ], + 68 + ], + [ + [ + 1, + 2 + ], + [ + 8, + 8 + ], + 52 + ], + [ + [ + 1, + 1 + ], + [ + 8 + ], + 120 + ], + [ + [ + 1, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 1, + 4 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 1, + 6 + ], + [ + 9, + 9, + 9 + ], + 108 + ], + [ + [ + 1, + 6 + ], + [ + 5, + 9, + 9, + 9 + ], + 12 + ], + [ + [ + 1, + 5 + ], + [ + 8 + ], + 120 + ], + [ + [ + 1, + 7 + ], + [ + 8 + ], + 120 + ], + [ + [ + 1, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 1, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 1, + 9 + ], + [ + 8 + ], + 120 + ], + [ + [ + 1, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 1, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 1, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 1, + 14 + ], + [ + 9, + 9, + 9 + ], + 112 + ], + [ + [ + 1, + 14 + ], + [ + 5, + 9, + 9, + 9 + ], + 8 + ], + [ + [ + 1, + 15 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 1, + 16 + ], + [ + 9 + ], + 109 + ], + [ + [ + 1, + 16 + ], + [ + 8, + 8 + ], + 11 + ], + [ + [ + 1, + 17 + ], + [ + 9 + ], + 24 + ], + [ + [ + 1, + 17 + ], + [ + 7, + 9 + ], + 96 + ], + [ + [ + 2, + 0 + ], + [ + 9 + ], + 78 + ], + [ + [ + 2, + 0 + ], + [ + 7, + 9 + ], + 42 + ], + [ + [ + 2, + 2 + ], + [ + 9 + ], + 106 + ], + [ + [ + 2, + 2 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 2, + 1 + ], + [ + 8 + ], + 120 + ], + [ + [ + 2, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 2, + 4 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 2, + 6 + ], + [ + 9, + 9, + 9 + ], + 108 + ], + [ + [ + 2, + 6 + ], + [ + 5, + 9, + 9, + 9 + ], + 12 + ], + [ + [ + 2, + 5 + ], + [ + 8 + ], + 92 + ], + [ + [ + 2, + 5 + ], + [ + 7 + ], + 28 + ], + [ + [ + 2, + 7 + ], + [ + 8 + ], + 120 + ], + [ + [ + 2, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 2, + 10 + ], + [], + 81 + ], + [ + [ + 2, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 39 + ], + [ + [ + 2, + 9 + ], + [ + 8 + ], + 115 + ], + [ + [ + 2, + 9 + ], + [ + 7 + ], + 5 + ], + [ + [ + 2, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 2, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 2, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 2, + 14 + ], + [ + 9, + 9, + 9 + ], + 98 + ], + [ + [ + 2, + 14 + ], + [ + 7, + 7, + 9, + 9 + ], + 6 + ], + [ + [ + 2, + 14 + ], + [ + 5, + 9, + 9, + 9 + ], + 16 + ], + [ + [ + 2, + 15 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 2, + 16 + ], + [ + 9 + ], + 102 + ], + [ + [ + 2, + 16 + ], + [ + 8, + 8 + ], + 4 + ], + [ + [ + 2, + 16 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 2, + 17 + ], + [ + 9 + ], + 92 + ], + [ + [ + 2, + 17 + ], + [ + 7, + 9 + ], + 28 + ], + [ + [ + 3, + 0 + ], + [ + 9 + ], + 120 + ], + [ + [ + 3, + 2 + ], + [ + 9 + ], + 106 + ], + [ + [ + 3, + 2 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 3, + 1 + ], + [ + 8 + ], + 120 + ], + [ + [ + 3, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 3, + 4 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 3, + 6 + ], + [ + 9, + 9, + 9 + ], + 114 + ], + [ + [ + 3, + 6 + ], + [ + 7, + 7, + 9, + 9 + ], + 6 + ], + [ + [ + 3, + 5 + ], + [ + 8 + ], + 120 + ], + [ + [ + 3, + 7 + ], + [ + 8 + ], + 106 + ], + [ + [ + 3, + 7 + ], + [ + 7 + ], + 14 + ], + [ + [ + 3, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 3, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 3, + 9 + ], + [ + 8 + ], + 120 + ], + [ + [ + 3, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 3, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 3, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 3, + 14 + ], + [ + 9, + 9, + 9 + ], + 116 + ], + [ + [ + 3, + 14 + ], + [ + 5, + 9, + 9, + 9 + ], + 4 + ], + [ + [ + 3, + 15 + ], + [ + 9, + 9, + 9 + ], + 119 + ], + [ + [ + 3, + 15 + ], + [ + 7, + 7, + 9, + 9 + ], + 1 + ], + [ + [ + 3, + 16 + ], + [ + 9 + ], + 120 + ], + [ + [ + 3, + 17 + ], + [ + 9 + ], + 26 + ], + [ + [ + 3, + 17 + ], + [ + 7, + 9 + ], + 94 + ], + [ + [ + 4, + 0 + ], + [ + 9 + ], + 92 + ], + [ + [ + 4, + 0 + ], + [ + 7, + 9 + ], + 28 + ], + [ + [ + 4, + 2 + ], + [ + 9 + ], + 44 + ], + [ + [ + 4, + 2 + ], + [ + 8, + 8 + ], + 76 + ], + [ + [ + 4, + 1 + ], + [ + 8 + ], + 120 + ], + [ + [ + 4, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 4, + 4 + ], + [ + 9, + 9, + 9 + ], + 119 + ], + [ + [ + 4, + 4 + ], + [ + 7, + 7, + 9, + 9 + ], + 1 + ], + [ + [ + 4, + 6 + ], + [ + 9, + 9, + 9 + ], + 92 + ], + [ + [ + 4, + 6 + ], + [ + 5, + 9, + 9, + 9 + ], + 28 + ], + [ + [ + 4, + 5 + ], + [ + 8 + ], + 106 + ], + [ + [ + 4, + 5 + ], + [ + 7 + ], + 14 + ], + [ + [ + 4, + 7 + ], + [ + 8 + ], + 106 + ], + [ + [ + 4, + 7 + ], + [ + 7 + ], + 14 + ], + [ + [ + 4, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 4, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 4, + 9 + ], + [ + 8 + ], + 120 + ], + [ + [ + 4, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 4, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 4, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 4, + 14 + ], + [ + 9, + 9, + 9 + ], + 97 + ], + [ + [ + 4, + 14 + ], + [ + 7, + 7, + 9, + 9 + ], + 7 + ], + [ + [ + 4, + 14 + ], + [ + 5, + 9, + 9, + 9 + ], + 16 + ], + [ + [ + 4, + 15 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 4, + 16 + ], + [ + 8, + 8 + ], + 120 + ], + [ + [ + 4, + 17 + ], + [ + 9 + ], + 22 + ], + [ + [ + 4, + 17 + ], + [ + 8, + 8 + ], + 84 + ], + [ + [ + 4, + 17 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 5, + 0 + ], + [ + 9 + ], + 92 + ], + [ + [ + 5, + 0 + ], + [ + 7, + 9 + ], + 28 + ], + [ + [ + 5, + 2 + ], + [ + 9 + ], + 120 + ], + [ + [ + 5, + 1 + ], + [ + 8 + ], + 120 + ], + [ + [ + 5, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 5, + 4 + ], + [ + 9, + 9, + 9 + ], + 100 + ], + [ + [ + 5, + 4 + ], + [ + 7, + 7, + 9, + 9 + ], + 20 + ], + [ + [ + 5, + 6 + ], + [ + 9, + 9, + 9 + ], + 104 + ], + [ + [ + 5, + 6 + ], + [ + 5, + 9, + 9, + 9 + ], + 16 + ], + [ + [ + 5, + 5 + ], + [ + 8 + ], + 120 + ], + [ + [ + 5, + 7 + ], + [ + 8 + ], + 120 + ], + [ + [ + 5, + 8 + ], + [], + 61 + ], + [ + [ + 5, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 59 + ], + [ + [ + 5, + 10 + ], + [], + 96 + ], + [ + [ + 5, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 24 + ], + [ + [ + 5, + 9 + ], + [ + 8 + ], + 120 + ], + [ + [ + 5, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 5, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 5, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 5, + 14 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 5, + 15 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 5, + 16 + ], + [ + 8, + 8 + ], + 104 + ], + [ + [ + 5, + 16 + ], + [ + 7, + 9 + ], + 16 + ], + [ + [ + 5, + 17 + ], + [ + 8, + 8 + ], + 116 + ], + [ + [ + 5, + 17 + ], + [ + 7, + 9 + ], + 4 + ], + [ + [ + 6, + 0 + ], + [ + 9 + ], + 120 + ], + [ + [ + 6, + 2 + ], + [ + 9 + ], + 50 + ], + [ + [ + 6, + 2 + ], + [ + 7, + 9 + ], + 70 + ], + [ + [ + 6, + 1 + ], + [ + 8 + ], + 104 + ], + [ + [ + 6, + 1 + ], + [ + 7 + ], + 16 + ], + [ + [ + 6, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 6, + 4 + ], + [ + 9, + 9, + 9 + ], + 119 + ], + [ + [ + 6, + 4 + ], + [ + 7, + 7, + 9, + 9 + ], + 1 + ], + [ + [ + 6, + 6 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 6, + 5 + ], + [ + 8 + ], + 120 + ], + [ + [ + 6, + 7 + ], + [ + 8 + ], + 104 + ], + [ + [ + 6, + 7 + ], + [ + 7 + ], + 16 + ], + [ + [ + 6, + 8 + ], + [], + 62 + ], + [ + [ + 6, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 58 + ], + [ + [ + 6, + 10 + ], + [], + 48 + ], + [ + [ + 6, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 72 + ], + [ + [ + 6, + 9 + ], + [ + 8 + ], + 120 + ], + [ + [ + 6, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 6, + 12 + ], + [], + 12 + ], + [ + [ + 6, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 108 + ], + [ + [ + 6, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 6, + 14 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 6, + 15 + ], + [ + 9, + 9, + 9 + ], + 72 + ], + [ + [ + 6, + 15 + ], + [ + 5, + 9, + 9, + 9 + ], + 48 + ], + [ + [ + 6, + 16 + ], + [ + 9 + ], + 50 + ], + [ + [ + 6, + 16 + ], + [ + 7, + 9 + ], + 70 + ], + [ + [ + 6, + 17 + ], + [ + 9 + ], + 68 + ], + [ + [ + 6, + 17 + ], + [ + 8, + 8 + ], + 52 + ], + [ + [ + 7, + 0 + ], + [], + 1 + ], + [ + [ + 7, + 0 + ], + [ + 9 + ], + 49 + ], + [ + [ + 7, + 0 + ], + [ + 7, + 9 + ], + 70 + ], + [ + [ + 7, + 2 + ], + [ + 9 + ], + 78 + ], + [ + [ + 7, + 2 + ], + [ + 7, + 9 + ], + 42 + ], + [ + [ + 7, + 1 + ], + [ + 8 + ], + 106 + ], + [ + [ + 7, + 1 + ], + [ + 7 + ], + 14 + ], + [ + [ + 7, + 3 + ], + [ + 8 + ], + 120 + ], + [ + [ + 7, + 4 + ], + [ + 9, + 9, + 9 + ], + 104 + ], + [ + [ + 7, + 4 + ], + [ + 5, + 9, + 9, + 9 + ], + 16 + ], + [ + [ + 7, + 6 + ], + [ + 9, + 9, + 9 + ], + 111 + ], + [ + [ + 7, + 6 + ], + [ + 7, + 7, + 9, + 9 + ], + 9 + ], + [ + [ + 7, + 5 + ], + [ + 8 + ], + 120 + ], + [ + [ + 7, + 7 + ], + [ + 8 + ], + 120 + ], + [ + [ + 7, + 8 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 7, + 10 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 7, + 9 + ], + [ + 8 + ], + 120 + ], + [ + [ + 7, + 11 + ], + [ + 8 + ], + 120 + ], + [ + [ + 7, + 12 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 7, + 13 + ], + [ + 9, + 9, + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 7, + 14 + ], + [ + 9, + 9, + 9 + ], + 120 + ], + [ + [ + 7, + 15 + ], + [ + 9, + 9, + 9 + ], + 100 + ], + [ + [ + 7, + 15 + ], + [ + 5, + 9, + 9, + 9 + ], + 20 + ], + [ + [ + 7, + 16 + ], + [ + 9 + ], + 2 + ], + [ + [ + 7, + 16 + ], + [ + 8, + 8 + ], + 104 + ], + [ + [ + 7, + 16 + ], + [ + 7, + 9 + ], + 14 + ], + [ + [ + 7, + 17 + ], + [ + 9 + ], + 54 + ], + [ + [ + 7, + 17 + ], + [ + 8, + 8 + ], + 52 + ], + [ + [ + 7, + 17 + ], + [ + 7, + 9 + ], + 14 + ] + ], + "stage_assignments": [ + [ + [ + 0, + 0 + ], + 7, + 0, + 14 + ], + [ + [ + 0, + 0 + ], + 8, + 1, + 104 + ], + [ + [ + 0, + 0 + ], + 9, + 3, + 68 + ], + [ + [ + 0, + 2 + ], + 9, + 1, + 16 + ], + [ + [ + 0, + 2 + ], + 8, + 2, + 104 + ], + [ + [ + 0, + 2 + ], + 8, + 3, + 104 + ], + [ + [ + 0, + 1 + ], + 8, + 4, + 16 + ], + [ + [ + 0, + 1 + ], + 8, + 5, + 104 + ], + [ + [ + 0, + 3 + ], + 8, + 4, + 88 + ], + [ + [ + 0, + 3 + ], + 8, + 6, + 32 + ], + [ + [ + 0, + 4 + ], + 9, + 0, + 120 + ], + [ + [ + 0, + 4 + ], + 5, + 1, + 4 + ], + [ + [ + 0, + 4 + ], + 9, + 4, + 120 + ], + [ + [ + 0, + 4 + ], + 5, + 6, + 4 + ], + [ + [ + 0, + 4 + ], + 5, + 8, + 4 + ], + [ + [ + 0, + 4 + ], + 5, + 9, + 4 + ], + [ + [ + 0, + 4 + ], + 5, + 14, + 4 + ], + [ + [ + 0, + 4 + ], + 9, + 15, + 120 + ], + [ + [ + 0, + 6 + ], + 5, + 4, + 4 + ], + [ + [ + 0, + 6 + ], + 9, + 5, + 120 + ], + [ + [ + 0, + 6 + ], + 9, + 6, + 58 + ], + [ + [ + 0, + 6 + ], + 9, + 8, + 62 + ], + [ + [ + 0, + 6 + ], + 9, + 16, + 120 + ], + [ + [ + 0, + 5 + ], + 8, + 17, + 16 + ], + [ + [ + 0, + 5 + ], + 8, + 21, + 104 + ], + [ + [ + 0, + 7 + ], + 8, + 17, + 88 + ], + [ + [ + 0, + 7 + ], + 8, + 20, + 32 + ], + [ + [ + 0, + 8 + ], + 9, + 4, + 1 + ], + [ + [ + 0, + 8 + ], + 9, + 13, + 63 + ], + [ + [ + 0, + 8 + ], + 9, + 27, + 120 + ], + [ + [ + 0, + 8 + ], + 9, + 29, + 56 + ], + [ + [ + 0, + 8 + ], + 9, + 31, + 120 + ], + [ + [ + 0, + 10 + ], + 9, + 0, + 120 + ], + [ + [ + 0, + 10 + ], + 9, + 2, + 57 + ], + [ + [ + 0, + 10 + ], + 9, + 17, + 120 + ], + [ + [ + 0, + 10 + ], + 9, + 18, + 42 + ], + [ + [ + 0, + 10 + ], + 9, + 22, + 120 + ], + [ + [ + 0, + 10 + ], + 9, + 23, + 120 + ], + [ + [ + 0, + 10 + ], + 9, + 29, + 21 + ], + [ + [ + 0, + 9 + ], + 8, + 34, + 104 + ], + [ + [ + 0, + 9 + ], + 7, + 35, + 14 + ], + [ + [ + 0, + 9 + ], + 8, + 37, + 1 + ], + [ + [ + 0, + 9 + ], + 7, + 38, + 1 + ], + [ + [ + 0, + 11 + ], + 8, + 35, + 104 + ], + [ + [ + 0, + 11 + ], + 8, + 36, + 16 + ], + [ + [ + 0, + 12 + ], + 9, + 14, + 78 + ], + [ + [ + 0, + 12 + ], + 9, + 17, + 40 + ], + [ + [ + 0, + 12 + ], + 9, + 26, + 120 + ], + [ + [ + 0, + 12 + ], + 9, + 29, + 120 + ], + [ + [ + 0, + 12 + ], + 9, + 35, + 120 + ], + [ + [ + 0, + 12 + ], + 9, + 39, + 2 + ], + [ + [ + 0, + 12 + ], + 9, + 47, + 120 + ], + [ + [ + 0, + 13 + ], + 9, + 11, + 25 + ], + [ + [ + 0, + 13 + ], + 9, + 14, + 116 + ], + [ + [ + 0, + 13 + ], + 9, + 27, + 51 + ], + [ + [ + 0, + 13 + ], + 9, + 28, + 117 + ], + [ + [ + 0, + 13 + ], + 9, + 37, + 120 + ], + [ + [ + 0, + 13 + ], + 9, + 41, + 5 + ], + [ + [ + 0, + 13 + ], + 9, + 43, + 46 + ], + [ + [ + 0, + 13 + ], + 9, + 51, + 120 + ], + [ + [ + 0, + 14 + ], + 5, + 25, + 4 + ], + [ + [ + 0, + 14 + ], + 9, + 27, + 42 + ], + [ + [ + 0, + 14 + ], + 5, + 28, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 29, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 31, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 32, + 4 + ], + [ + [ + 0, + 14 + ], + 9, + 33, + 120 + ], + [ + [ + 0, + 14 + ], + 5, + 38, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 39, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 41, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 43, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 47, + 4 + ], + [ + [ + 0, + 14 + ], + 9, + 48, + 120 + ], + [ + [ + 0, + 14 + ], + 5, + 49, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 50, + 4 + ], + [ + [ + 0, + 14 + ], + 9, + 52, + 78 + ], + [ + [ + 0, + 14 + ], + 5, + 54, + 4 + ], + [ + [ + 0, + 14 + ], + 5, + 55, + 4 + ], + [ + [ + 0, + 15 + ], + 5, + 26, + 4 + ], + [ + [ + 0, + 15 + ], + 5, + 33, + 4 + ], + [ + [ + 0, + 15 + ], + 5, + 37, + 4 + ], + [ + [ + 0, + 15 + ], + 9, + 44, + 91 + ], + [ + [ + 0, + 15 + ], + 9, + 45, + 120 + ], + [ + [ + 0, + 15 + ], + 9, + 51, + 29 + ], + [ + [ + 0, + 15 + ], + 9, + 54, + 120 + ], + [ + [ + 0, + 16 + ], + 7, + 42, + 14 + ], + [ + [ + 0, + 16 + ], + 7, + 43, + 14 + ], + [ + [ + 0, + 16 + ], + 7, + 45, + 14 + ], + [ + [ + 0, + 16 + ], + 7, + 46, + 14 + ], + [ + [ + 0, + 16 + ], + 9, + 53, + 120 + ], + [ + [ + 0, + 17 + ], + 7, + 41, + 14 + ], + [ + [ + 0, + 17 + ], + 9, + 43, + 119 + ], + [ + [ + 0, + 17 + ], + 8, + 54, + 2 + ], + [ + [ + 1, + 0 + ], + 9, + 1, + 120 + ], + [ + [ + 1, + 0 + ], + 7, + 4, + 14 + ], + [ + [ + 1, + 2 + ], + 8, + 0, + 104 + ], + [ + [ + 1, + 2 + ], + 9, + 5, + 68 + ], + [ + [ + 1, + 1 + ], + 8, + 6, + 72 + ], + [ + [ + 1, + 1 + ], + 8, + 8, + 8 + ], + [ + [ + 1, + 1 + ], + 8, + 10, + 40 + ], + [ + [ + 1, + 3 + ], + 8, + 7, + 104 + ], + [ + [ + 1, + 3 + ], + 8, + 10, + 16 + ], + [ + [ + 1, + 4 + ], + 9, + 4, + 84 + ], + [ + [ + 1, + 4 + ], + 9, + 6, + 120 + ], + [ + [ + 1, + 4 + ], + 9, + 13, + 120 + ], + [ + [ + 1, + 4 + ], + 9, + 18, + 36 + ], + [ + [ + 1, + 6 + ], + 5, + 7, + 4 + ], + [ + [ + 1, + 6 + ], + 9, + 8, + 73 + ], + [ + [ + 1, + 6 + ], + 9, + 10, + 47 + ], + [ + [ + 1, + 6 + ], + 9, + 12, + 120 + ], + [ + [ + 1, + 6 + ], + 5, + 13, + 4 + ], + [ + [ + 1, + 6 + ], + 9, + 16, + 120 + ], + [ + [ + 1, + 6 + ], + 5, + 19, + 4 + ], + [ + [ + 1, + 5 + ], + 8, + 20, + 16 + ], + [ + [ + 1, + 5 + ], + 8, + 22, + 32 + ], + [ + [ + 1, + 5 + ], + 8, + 23, + 32 + ], + [ + [ + 1, + 5 + ], + 8, + 27, + 40 + ], + [ + [ + 1, + 7 + ], + 8, + 20, + 40 + ], + [ + [ + 1, + 7 + ], + 8, + 24, + 80 + ], + [ + [ + 1, + 8 + ], + 9, + 3, + 120 + ], + [ + [ + 1, + 8 + ], + 9, + 7, + 120 + ], + [ + [ + 1, + 8 + ], + 9, + 11, + 78 + ], + [ + [ + 1, + 8 + ], + 9, + 21, + 42 + ], + [ + [ + 1, + 8 + ], + 9, + 34, + 120 + ], + [ + [ + 1, + 8 + ], + 9, + 35, + 120 + ], + [ + [ + 1, + 10 + ], + 9, + 6, + 15 + ], + [ + [ + 1, + 10 + ], + 9, + 10, + 120 + ], + [ + [ + 1, + 10 + ], + 9, + 24, + 120 + ], + [ + [ + 1, + 10 + ], + 9, + 25, + 120 + ], + [ + [ + 1, + 10 + ], + 9, + 28, + 120 + ], + [ + [ + 1, + 10 + ], + 9, + 30, + 93 + ], + [ + [ + 1, + 10 + ], + 9, + 35, + 12 + ], + [ + [ + 1, + 9 + ], + 8, + 37, + 49 + ], + [ + [ + 1, + 9 + ], + 8, + 40, + 71 + ], + [ + [ + 1, + 11 + ], + 8, + 36, + 72 + ], + [ + [ + 1, + 11 + ], + 8, + 37, + 2 + ], + [ + [ + 1, + 11 + ], + 8, + 42, + 46 + ], + [ + [ + 1, + 12 + ], + 9, + 20, + 61 + ], + [ + [ + 1, + 12 + ], + 9, + 34, + 120 + ], + [ + [ + 1, + 12 + ], + 9, + 36, + 120 + ], + [ + [ + 1, + 12 + ], + 9, + 38, + 51 + ], + [ + [ + 1, + 12 + ], + 9, + 40, + 78 + ], + [ + [ + 1, + 12 + ], + 9, + 49, + 120 + ], + [ + [ + 1, + 12 + ], + 9, + 59, + 50 + ], + [ + [ + 1, + 13 + ], + 9, + 17, + 38 + ], + [ + [ + 1, + 13 + ], + 9, + 28, + 21 + ], + [ + [ + 1, + 13 + ], + 9, + 31, + 67 + ], + [ + [ + 1, + 13 + ], + 9, + 38, + 74 + ], + [ + [ + 1, + 13 + ], + 9, + 42, + 108 + ], + [ + [ + 1, + 13 + ], + 9, + 47, + 52 + ], + [ + [ + 1, + 13 + ], + 9, + 56, + 120 + ], + [ + [ + 1, + 13 + ], + 9, + 59, + 120 + ], + [ + [ + 1, + 14 + ], + 9, + 29, + 120 + ], + [ + [ + 1, + 14 + ], + 5, + 34, + 4 + ], + [ + [ + 1, + 14 + ], + 9, + 49, + 120 + ], + [ + [ + 1, + 14 + ], + 5, + 53, + 4 + ], + [ + [ + 1, + 14 + ], + 9, + 57, + 120 + ], + [ + [ + 1, + 15 + ], + 9, + 29, + 120 + ], + [ + [ + 1, + 15 + ], + 9, + 44, + 84 + ], + [ + [ + 1, + 15 + ], + 9, + 46, + 78 + ], + [ + [ + 1, + 15 + ], + 9, + 58, + 78 + ], + [ + [ + 1, + 16 + ], + 8, + 54, + 22 + ], + [ + [ + 1, + 16 + ], + 9, + 54, + 48 + ], + [ + [ + 1, + 16 + ], + 9, + 59, + 61 + ], + [ + [ + 1, + 17 + ], + 7, + 44, + 14 + ], + [ + [ + 1, + 17 + ], + 7, + 47, + 14 + ], + [ + [ + 1, + 17 + ], + 9, + 47, + 106 + ], + [ + [ + 1, + 17 + ], + 7, + 49, + 14 + ], + [ + [ + 1, + 17 + ], + 7, + 50, + 14 + ], + [ + [ + 1, + 17 + ], + 9, + 50, + 14 + ], + [ + [ + 1, + 17 + ], + 7, + 53, + 12 + ], + [ + [ + 1, + 17 + ], + 7, + 56, + 14 + ], + [ + [ + 1, + 17 + ], + 7, + 57, + 14 + ], + [ + [ + 2, + 0 + ], + 9, + 0, + 120 + ], + [ + [ + 2, + 0 + ], + 7, + 2, + 14 + ], + [ + [ + 2, + 0 + ], + 7, + 3, + 14 + ], + [ + [ + 2, + 0 + ], + 7, + 6, + 14 + ], + [ + [ + 2, + 2 + ], + 9, + 1, + 75 + ], + [ + [ + 2, + 2 + ], + 7, + 5, + 14 + ], + [ + [ + 2, + 2 + ], + 9, + 6, + 41 + ], + [ + [ + 2, + 2 + ], + 9, + 7, + 4 + ], + [ + [ + 2, + 1 + ], + 8, + 8, + 16 + ], + [ + [ + 2, + 1 + ], + 8, + 11, + 104 + ], + [ + [ + 2, + 3 + ], + 8, + 8, + 80 + ], + [ + [ + 2, + 3 + ], + 8, + 13, + 40 + ], + [ + [ + 2, + 4 + ], + 9, + 6, + 84 + ], + [ + [ + 2, + 4 + ], + 9, + 7, + 120 + ], + [ + [ + 2, + 4 + ], + 9, + 21, + 78 + ], + [ + [ + 2, + 4 + ], + 9, + 22, + 78 + ], + [ + [ + 2, + 6 + ], + 5, + 0, + 4 + ], + [ + [ + 2, + 6 + ], + 9, + 2, + 68 + ], + [ + [ + 2, + 6 + ], + 9, + 5, + 120 + ], + [ + [ + 2, + 6 + ], + 9, + 10, + 120 + ], + [ + [ + 2, + 6 + ], + 5, + 12, + 4 + ], + [ + [ + 2, + 6 + ], + 9, + 21, + 52 + ], + [ + [ + 2, + 6 + ], + 5, + 22, + 4 + ], + [ + [ + 2, + 5 + ], + 8, + 23, + 56 + ], + [ + [ + 2, + 5 + ], + 8, + 25, + 36 + ], + [ + [ + 2, + 5 + ], + 7, + 27, + 14 + ], + [ + [ + 2, + 5 + ], + 7, + 30, + 14 + ], + [ + [ + 2, + 7 + ], + 8, + 27, + 64 + ], + [ + [ + 2, + 7 + ], + 8, + 28, + 56 + ], + [ + [ + 2, + 8 + ], + 9, + 1, + 120 + ], + [ + [ + 2, + 8 + ], + 9, + 2, + 73 + ], + [ + [ + 2, + 8 + ], + 9, + 18, + 120 + ], + [ + [ + 2, + 8 + ], + 9, + 20, + 78 + ], + [ + [ + 2, + 8 + ], + 9, + 30, + 105 + ], + [ + [ + 2, + 8 + ], + 9, + 35, + 64 + ], + [ + [ + 2, + 8 + ], + 9, + 36, + 40 + ], + [ + [ + 2, + 10 + ], + 9, + 14, + 120 + ], + [ + [ + 2, + 10 + ], + 9, + 33, + 75 + ], + [ + [ + 2, + 9 + ], + 7, + 40, + 5 + ], + [ + [ + 2, + 9 + ], + 8, + 41, + 1 + ], + [ + [ + 2, + 9 + ], + 8, + 42, + 42 + ], + [ + [ + 2, + 9 + ], + 8, + 43, + 72 + ], + [ + [ + 2, + 11 + ], + 8, + 43, + 32 + ], + [ + [ + 2, + 11 + ], + 8, + 45, + 88 + ], + [ + [ + 2, + 12 + ], + 9, + 20, + 59 + ], + [ + [ + 2, + 12 + ], + 9, + 29, + 1 + ], + [ + [ + 2, + 12 + ], + 9, + 30, + 120 + ], + [ + [ + 2, + 12 + ], + 9, + 33, + 120 + ], + [ + [ + 2, + 12 + ], + 9, + 35, + 120 + ], + [ + [ + 2, + 12 + ], + 9, + 36, + 60 + ], + [ + [ + 2, + 12 + ], + 9, + 37, + 120 + ], + [ + [ + 2, + 13 + ], + 9, + 21, + 120 + ], + [ + [ + 2, + 13 + ], + 9, + 34, + 120 + ], + [ + [ + 2, + 13 + ], + 9, + 42, + 120 + ], + [ + [ + 2, + 13 + ], + 9, + 47, + 38 + ], + [ + [ + 2, + 13 + ], + 9, + 48, + 120 + ], + [ + [ + 2, + 13 + ], + 9, + 53, + 82 + ], + [ + [ + 2, + 14 + ], + 9, + 31, + 120 + ], + [ + [ + 2, + 14 + ], + 5, + 35, + 4 + ], + [ + [ + 2, + 14 + ], + 5, + 36, + 4 + ], + [ + [ + 2, + 14 + ], + 7, + 38, + 12 + ], + [ + [ + 2, + 14 + ], + 5, + 42, + 4 + ], + [ + [ + 2, + 14 + ], + 9, + 45, + 78 + ], + [ + [ + 2, + 14 + ], + 9, + 50, + 40 + ], + [ + [ + 2, + 14 + ], + 5, + 60, + 4 + ], + [ + [ + 2, + 14 + ], + 9, + 62, + 116 + ], + [ + [ + 2, + 15 + ], + 9, + 41, + 120 + ], + [ + [ + 2, + 15 + ], + 9, + 44, + 23 + ], + [ + [ + 2, + 15 + ], + 9, + 54, + 58 + ], + [ + [ + 2, + 15 + ], + 9, + 55, + 39 + ], + [ + [ + 2, + 15 + ], + 9, + 62, + 120 + ], + [ + [ + 2, + 16 + ], + 7, + 53, + 2 + ], + [ + [ + 2, + 16 + ], + 9, + 53, + 116 + ], + [ + [ + 2, + 16 + ], + 7, + 55, + 12 + ], + [ + [ + 2, + 16 + ], + 8, + 60, + 8 + ], + [ + [ + 2, + 17 + ], + 7, + 48, + 14 + ], + [ + [ + 2, + 17 + ], + 9, + 56, + 28 + ], + [ + [ + 2, + 17 + ], + 7, + 59, + 14 + ], + [ + [ + 2, + 17 + ], + 9, + 60, + 92 + ], + [ + [ + 3, + 0 + ], + 9, + 3, + 78 + ], + [ + [ + 3, + 0 + ], + 9, + 4, + 42 + ], + [ + [ + 3, + 2 + ], + 9, + 2, + 120 + ], + [ + [ + 3, + 2 + ], + 7, + 10, + 14 + ], + [ + [ + 3, + 1 + ], + 8, + 12, + 48 + ], + [ + [ + 3, + 1 + ], + 8, + 15, + 72 + ], + [ + [ + 3, + 3 + ], + 8, + 12, + 56 + ], + [ + [ + 3, + 3 + ], + 8, + 13, + 64 + ], + [ + [ + 3, + 4 + ], + 9, + 11, + 120 + ], + [ + [ + 3, + 4 + ], + 9, + 14, + 50 + ], + [ + [ + 3, + 4 + ], + 9, + 15, + 5 + ], + [ + [ + 3, + 4 + ], + 9, + 24, + 88 + ], + [ + [ + 3, + 4 + ], + 9, + 25, + 97 + ], + [ + [ + 3, + 6 + ], + 9, + 15, + 50 + ], + [ + [ + 3, + 6 + ], + 9, + 16, + 70 + ], + [ + [ + 3, + 6 + ], + 9, + 19, + 6 + ], + [ + [ + 3, + 6 + ], + 9, + 23, + 120 + ], + [ + [ + 3, + 6 + ], + 7, + 24, + 12 + ], + [ + [ + 3, + 6 + ], + 9, + 24, + 108 + ], + [ + [ + 3, + 5 + ], + 8, + 29, + 74 + ], + [ + [ + 3, + 5 + ], + 8, + 32, + 46 + ], + [ + [ + 3, + 7 + ], + 8, + 31, + 2 + ], + [ + [ + 3, + 7 + ], + 8, + 33, + 104 + ], + [ + [ + 3, + 7 + ], + 7, + 34, + 14 + ], + [ + [ + 3, + 8 + ], + 9, + 7, + 88 + ], + [ + [ + 3, + 8 + ], + 9, + 17, + 120 + ], + [ + [ + 3, + 8 + ], + 9, + 18, + 120 + ], + [ + [ + 3, + 8 + ], + 9, + 21, + 30 + ], + [ + [ + 3, + 8 + ], + 9, + 24, + 2 + ], + [ + [ + 3, + 8 + ], + 9, + 26, + 120 + ], + [ + [ + 3, + 8 + ], + 9, + 32, + 120 + ], + [ + [ + 3, + 10 + ], + 9, + 1, + 29 + ], + [ + [ + 3, + 10 + ], + 9, + 6, + 120 + ], + [ + [ + 3, + 10 + ], + 9, + 25, + 101 + ], + [ + [ + 3, + 10 + ], + 9, + 30, + 120 + ], + [ + [ + 3, + 10 + ], + 9, + 31, + 1 + ], + [ + [ + 3, + 10 + ], + 9, + 35, + 2 + ], + [ + [ + 3, + 10 + ], + 9, + 37, + 107 + ], + [ + [ + 3, + 10 + ], + 9, + 39, + 120 + ], + [ + [ + 3, + 9 + ], + 8, + 49, + 32 + ], + [ + [ + 3, + 9 + ], + 8, + 50, + 88 + ], + [ + [ + 3, + 11 + ], + 8, + 48, + 48 + ], + [ + [ + 3, + 11 + ], + 8, + 49, + 72 + ], + [ + [ + 3, + 12 + ], + 9, + 19, + 41 + ], + [ + [ + 3, + 12 + ], + 9, + 27, + 120 + ], + [ + [ + 3, + 12 + ], + 9, + 39, + 120 + ], + [ + [ + 3, + 12 + ], + 9, + 43, + 15 + ], + [ + [ + 3, + 12 + ], + 9, + 52, + 120 + ], + [ + [ + 3, + 12 + ], + 9, + 63, + 64 + ], + [ + [ + 3, + 12 + ], + 9, + 65, + 120 + ], + [ + [ + 3, + 13 + ], + 9, + 40, + 120 + ], + [ + [ + 3, + 13 + ], + 9, + 46, + 110 + ], + [ + [ + 3, + 13 + ], + 9, + 49, + 120 + ], + [ + [ + 3, + 13 + ], + 9, + 56, + 120 + ], + [ + [ + 3, + 13 + ], + 9, + 58, + 88 + ], + [ + [ + 3, + 13 + ], + 9, + 61, + 42 + ], + [ + [ + 3, + 14 + ], + 5, + 40, + 4 + ], + [ + [ + 3, + 14 + ], + 9, + 42, + 93 + ], + [ + [ + 3, + 14 + ], + 9, + 43, + 120 + ], + [ + [ + 3, + 14 + ], + 9, + 49, + 27 + ], + [ + [ + 3, + 14 + ], + 9, + 53, + 120 + ], + [ + [ + 3, + 15 + ], + 7, + 38, + 1 + ], + [ + [ + 3, + 15 + ], + 7, + 40, + 1 + ], + [ + [ + 3, + 15 + ], + 9, + 55, + 119 + ], + [ + [ + 3, + 15 + ], + 9, + 59, + 83 + ], + [ + [ + 3, + 15 + ], + 9, + 60, + 22 + ], + [ + [ + 3, + 15 + ], + 9, + 63, + 120 + ], + [ + [ + 3, + 15 + ], + 9, + 64, + 15 + ], + [ + [ + 3, + 16 + ], + 9, + 56, + 120 + ], + [ + [ + 3, + 17 + ], + 7, + 51, + 14 + ], + [ + [ + 3, + 17 + ], + 7, + 52, + 14 + ], + [ + [ + 3, + 17 + ], + 7, + 54, + 14 + ], + [ + [ + 3, + 17 + ], + 7, + 55, + 2 + ], + [ + [ + 3, + 17 + ], + 7, + 58, + 10 + ], + [ + [ + 3, + 17 + ], + 9, + 58, + 110 + ], + [ + [ + 3, + 17 + ], + 7, + 60, + 14 + ], + [ + [ + 3, + 17 + ], + 7, + 62, + 14 + ], + [ + [ + 3, + 17 + ], + 7, + 63, + 12 + ], + [ + [ + 3, + 17 + ], + 9, + 63, + 10 + ], + [ + [ + 4, + 0 + ], + 9, + 1, + 14 + ], + [ + [ + 4, + 0 + ], + 7, + 7, + 14 + ], + [ + [ + 4, + 0 + ], + 9, + 7, + 106 + ], + [ + [ + 4, + 0 + ], + 7, + 9, + 14 + ], + [ + [ + 4, + 2 + ], + 9, + 8, + 44 + ], + [ + [ + 4, + 2 + ], + 8, + 9, + 104 + ], + [ + [ + 4, + 2 + ], + 8, + 10, + 48 + ], + [ + [ + 4, + 1 + ], + 8, + 14, + 104 + ], + [ + [ + 4, + 1 + ], + 8, + 15, + 16 + ], + [ + [ + 4, + 3 + ], + 8, + 15, + 16 + ], + [ + [ + 4, + 3 + ], + 8, + 16, + 104 + ], + [ + [ + 4, + 4 + ], + 9, + 3, + 52 + ], + [ + [ + 4, + 4 + ], + 9, + 5, + 120 + ], + [ + [ + 4, + 4 + ], + 9, + 16, + 67 + ], + [ + [ + 4, + 4 + ], + 9, + 22, + 120 + ], + [ + [ + 4, + 4 + ], + 7, + 24, + 2 + ], + [ + [ + 4, + 6 + ], + 5, + 2, + 4 + ], + [ + [ + 4, + 6 + ], + 9, + 9, + 95 + ], + [ + [ + 4, + 6 + ], + 5, + 10, + 4 + ], + [ + [ + 4, + 6 + ], + 9, + 12, + 120 + ], + [ + [ + 4, + 6 + ], + 5, + 16, + 4 + ], + [ + [ + 4, + 6 + ], + 9, + 16, + 25 + ], + [ + [ + 4, + 6 + ], + 9, + 18, + 120 + ], + [ + [ + 4, + 6 + ], + 5, + 20, + 4 + ], + [ + [ + 4, + 6 + ], + 5, + 21, + 4 + ], + [ + [ + 4, + 6 + ], + 5, + 23, + 4 + ], + [ + [ + 4, + 6 + ], + 5, + 27, + 4 + ], + [ + [ + 4, + 5 + ], + 8, + 31, + 48 + ], + [ + [ + 4, + 5 + ], + 8, + 32, + 58 + ], + [ + [ + 4, + 5 + ], + 7, + 33, + 14 + ], + [ + [ + 4, + 7 + ], + 8, + 31, + 54 + ], + [ + [ + 4, + 7 + ], + 7, + 32, + 14 + ], + [ + [ + 4, + 7 + ], + 8, + 37, + 52 + ], + [ + [ + 4, + 8 + ], + 9, + 4, + 85 + ], + [ + [ + 4, + 8 + ], + 9, + 9, + 109 + ], + [ + [ + 4, + 8 + ], + 9, + 10, + 120 + ], + [ + [ + 4, + 8 + ], + 9, + 19, + 1 + ], + [ + [ + 4, + 8 + ], + 9, + 27, + 105 + ], + [ + [ + 4, + 8 + ], + 9, + 28, + 60 + ], + [ + [ + 4, + 8 + ], + 9, + 33, + 119 + ], + [ + [ + 4, + 8 + ], + 9, + 41, + 1 + ], + [ + [ + 4, + 10 + ], + 9, + 13, + 120 + ], + [ + [ + 4, + 10 + ], + 9, + 17, + 120 + ], + [ + [ + 4, + 10 + ], + 9, + 22, + 120 + ], + [ + [ + 4, + 10 + ], + 9, + 32, + 120 + ], + [ + [ + 4, + 10 + ], + 9, + 40, + 120 + ], + [ + [ + 4, + 9 + ], + 8, + 48, + 56 + ], + [ + [ + 4, + 9 + ], + 8, + 53, + 64 + ], + [ + [ + 4, + 11 + ], + 8, + 50, + 16 + ], + [ + [ + 4, + 11 + ], + 8, + 52, + 104 + ], + [ + [ + 4, + 12 + ], + 9, + 38, + 80 + ], + [ + [ + 4, + 12 + ], + 9, + 42, + 117 + ], + [ + [ + 4, + 12 + ], + 9, + 46, + 10 + ], + [ + [ + 4, + 12 + ], + 9, + 50, + 40 + ], + [ + [ + 4, + 12 + ], + 9, + 61, + 120 + ], + [ + [ + 4, + 12 + ], + 9, + 63, + 120 + ], + [ + [ + 4, + 12 + ], + 9, + 65, + 35 + ], + [ + [ + 4, + 12 + ], + 9, + 67, + 78 + ], + [ + [ + 4, + 13 + ], + 9, + 33, + 1 + ], + [ + [ + 4, + 13 + ], + 9, + 44, + 119 + ], + [ + [ + 4, + 13 + ], + 9, + 61, + 120 + ], + [ + [ + 4, + 13 + ], + 9, + 62, + 120 + ], + [ + [ + 4, + 13 + ], + 9, + 65, + 120 + ], + [ + [ + 4, + 13 + ], + 9, + 66, + 120 + ], + [ + [ + 4, + 14 + ], + 9, + 38, + 113 + ], + [ + [ + 4, + 14 + ], + 7, + 39, + 14 + ], + [ + [ + 4, + 14 + ], + 5, + 44, + 4 + ], + [ + [ + 4, + 14 + ], + 5, + 45, + 4 + ], + [ + [ + 4, + 14 + ], + 5, + 46, + 4 + ], + [ + [ + 4, + 14 + ], + 9, + 55, + 120 + ], + [ + [ + 4, + 14 + ], + 9, + 58, + 120 + ], + [ + [ + 4, + 14 + ], + 5, + 63, + 4 + ], + [ + [ + 4, + 15 + ], + 9, + 41, + 78 + ], + [ + [ + 4, + 15 + ], + 9, + 50, + 120 + ], + [ + [ + 4, + 15 + ], + 9, + 60, + 84 + ], + [ + [ + 4, + 15 + ], + 9, + 64, + 78 + ], + [ + [ + 4, + 16 + ], + 8, + 55, + 80 + ], + [ + [ + 4, + 16 + ], + 8, + 60, + 96 + ], + [ + [ + 4, + 16 + ], + 8, + 62, + 64 + ], + [ + [ + 4, + 17 + ], + 8, + 57, + 24 + ], + [ + [ + 4, + 17 + ], + 7, + 61, + 14 + ], + [ + [ + 4, + 17 + ], + 9, + 61, + 36 + ], + [ + [ + 4, + 17 + ], + 8, + 62, + 40 + ], + [ + [ + 4, + 17 + ], + 8, + 64, + 104 + ], + [ + [ + 5, + 0 + ], + 9, + 5, + 10 + ], + [ + [ + 5, + 0 + ], + 7, + 13, + 14 + ], + [ + [ + 5, + 0 + ], + 9, + 14, + 74 + ], + [ + [ + 5, + 0 + ], + 9, + 16, + 36 + ], + [ + [ + 5, + 0 + ], + 7, + 17, + 14 + ], + [ + [ + 5, + 2 + ], + 9, + 2, + 120 + ], + [ + [ + 5, + 1 + ], + 8, + 19, + 104 + ], + [ + [ + 5, + 1 + ], + 8, + 20, + 16 + ], + [ + [ + 5, + 3 + ], + 8, + 18, + 104 + ], + [ + [ + 5, + 3 + ], + 8, + 23, + 16 + ], + [ + [ + 5, + 4 + ], + 9, + 8, + 92 + ], + [ + [ + 5, + 4 + ], + 9, + 15, + 92 + ], + [ + [ + 5, + 4 + ], + 9, + 19, + 78 + ], + [ + [ + 5, + 4 + ], + 9, + 23, + 78 + ], + [ + [ + 5, + 4 + ], + 7, + 25, + 14 + ], + [ + [ + 5, + 4 + ], + 7, + 28, + 12 + ], + [ + [ + 5, + 4 + ], + 7, + 29, + 14 + ], + [ + [ + 5, + 6 + ], + 5, + 3, + 4 + ], + [ + [ + 5, + 6 + ], + 5, + 11, + 4 + ], + [ + [ + 5, + 6 + ], + 5, + 15, + 4 + ], + [ + [ + 5, + 6 + ], + 5, + 17, + 4 + ], + [ + [ + 5, + 6 + ], + 9, + 20, + 120 + ], + [ + [ + 5, + 6 + ], + 9, + 24, + 120 + ], + [ + [ + 5, + 6 + ], + 9, + 25, + 120 + ], + [ + [ + 5, + 5 + ], + 8, + 36, + 16 + ], + [ + [ + 5, + 5 + ], + 8, + 39, + 104 + ], + [ + [ + 5, + 7 + ], + 8, + 38, + 104 + ], + [ + [ + 5, + 7 + ], + 8, + 40, + 16 + ], + [ + [ + 5, + 8 + ], + 9, + 11, + 57 + ], + [ + [ + 5, + 8 + ], + 9, + 19, + 120 + ], + [ + [ + 5, + 8 + ], + 9, + 21, + 116 + ], + [ + [ + 5, + 8 + ], + 9, + 47, + 2 + ], + [ + [ + 5, + 10 + ], + 9, + 38, + 120 + ], + [ + [ + 5, + 9 + ], + 8, + 51, + 104 + ], + [ + [ + 5, + 9 + ], + 8, + 57, + 16 + ], + [ + [ + 5, + 11 + ], + 8, + 53, + 16 + ], + [ + [ + 5, + 11 + ], + 8, + 54, + 80 + ], + [ + [ + 5, + 11 + ], + 8, + 55, + 24 + ], + [ + [ + 5, + 12 + ], + 9, + 39, + 96 + ], + [ + [ + 5, + 12 + ], + 9, + 45, + 112 + ], + [ + [ + 5, + 12 + ], + 9, + 64, + 120 + ], + [ + [ + 5, + 12 + ], + 9, + 65, + 120 + ], + [ + [ + 5, + 12 + ], + 9, + 67, + 120 + ], + [ + [ + 5, + 12 + ], + 9, + 68, + 32 + ], + [ + [ + 5, + 13 + ], + 9, + 44, + 120 + ], + [ + [ + 5, + 13 + ], + 9, + 45, + 120 + ], + [ + [ + 5, + 13 + ], + 9, + 52, + 120 + ], + [ + [ + 5, + 13 + ], + 9, + 55, + 15 + ], + [ + [ + 5, + 13 + ], + 9, + 57, + 120 + ], + [ + [ + 5, + 13 + ], + 9, + 64, + 105 + ], + [ + [ + 5, + 14 + ], + 9, + 51, + 120 + ], + [ + [ + 5, + 14 + ], + 9, + 54, + 120 + ], + [ + [ + 5, + 14 + ], + 9, + 57, + 78 + ], + [ + [ + 5, + 14 + ], + 9, + 58, + 42 + ], + [ + [ + 5, + 15 + ], + 9, + 45, + 8 + ], + [ + [ + 5, + 15 + ], + 9, + 48, + 78 + ], + [ + [ + 5, + 15 + ], + 9, + 52, + 120 + ], + [ + [ + 5, + 15 + ], + 9, + 60, + 120 + ], + [ + [ + 5, + 15 + ], + 9, + 68, + 34 + ], + [ + [ + 5, + 16 + ], + 7, + 63, + 2 + ], + [ + [ + 5, + 16 + ], + 7, + 65, + 14 + ], + [ + [ + 5, + 16 + ], + 8, + 65, + 104 + ], + [ + [ + 5, + 16 + ], + 8, + 68, + 104 + ], + [ + [ + 5, + 16 + ], + 9, + 68, + 16 + ], + [ + [ + 5, + 17 + ], + 7, + 58, + 4 + ], + [ + [ + 5, + 17 + ], + 8, + 59, + 24 + ], + [ + [ + 5, + 17 + ], + 9, + 59, + 4 + ], + [ + [ + 5, + 17 + ], + 8, + 61, + 104 + ], + [ + [ + 5, + 17 + ], + 8, + 67, + 104 + ], + [ + [ + 6, + 0 + ], + 9, + 15, + 98 + ], + [ + [ + 6, + 0 + ], + 9, + 19, + 22 + ], + [ + [ + 6, + 2 + ], + 7, + 1, + 14 + ], + [ + [ + 6, + 2 + ], + 7, + 8, + 14 + ], + [ + [ + 6, + 2 + ], + 9, + 9, + 114 + ], + [ + [ + 6, + 2 + ], + 7, + 12, + 14 + ], + [ + [ + 6, + 2 + ], + 9, + 12, + 6 + ], + [ + [ + 6, + 2 + ], + 7, + 19, + 14 + ], + [ + [ + 6, + 2 + ], + 7, + 20, + 14 + ], + [ + [ + 6, + 1 + ], + 8, + 22, + 2 + ], + [ + [ + 6, + 1 + ], + 7, + 26, + 14 + ], + [ + [ + 6, + 1 + ], + 8, + 26, + 54 + ], + [ + [ + 6, + 1 + ], + 7, + 28, + 2 + ], + [ + [ + 6, + 1 + ], + 8, + 28, + 48 + ], + [ + [ + 6, + 3 + ], + 8, + 22, + 70 + ], + [ + [ + 6, + 3 + ], + 8, + 26, + 50 + ], + [ + [ + 6, + 4 + ], + 9, + 3, + 41 + ], + [ + [ + 6, + 4 + ], + 9, + 23, + 120 + ], + [ + [ + 6, + 4 + ], + 9, + 26, + 120 + ], + [ + [ + 6, + 4 + ], + 9, + 32, + 78 + ], + [ + [ + 6, + 4 + ], + 7, + 36, + 2 + ], + [ + [ + 6, + 6 + ], + 9, + 1, + 64 + ], + [ + [ + 6, + 6 + ], + 9, + 3, + 79 + ], + [ + [ + 6, + 6 + ], + 9, + 26, + 28 + ], + [ + [ + 6, + 6 + ], + 9, + 31, + 69 + ], + [ + [ + 6, + 6 + ], + 9, + 32, + 120 + ], + [ + [ + 6, + 5 + ], + 8, + 40, + 16 + ], + [ + [ + 6, + 5 + ], + 8, + 44, + 104 + ], + [ + [ + 6, + 7 + ], + 7, + 37, + 8 + ], + [ + [ + 6, + 7 + ], + 7, + 40, + 8 + ], + [ + [ + 6, + 7 + ], + 8, + 40, + 1 + ], + [ + [ + 6, + 7 + ], + 8, + 41, + 103 + ], + [ + [ + 6, + 8 + ], + 9, + 13, + 120 + ], + [ + [ + 6, + 8 + ], + 9, + 19, + 120 + ], + [ + [ + 6, + 8 + ], + 9, + 26, + 50 + ], + [ + [ + 6, + 10 + ], + 9, + 40, + 120 + ], + [ + [ + 6, + 10 + ], + 9, + 46, + 120 + ], + [ + [ + 6, + 10 + ], + 9, + 47, + 120 + ], + [ + [ + 6, + 9 + ], + 8, + 53, + 24 + ], + [ + [ + 6, + 9 + ], + 8, + 58, + 16 + ], + [ + [ + 6, + 9 + ], + 8, + 59, + 80 + ], + [ + [ + 6, + 11 + ], + 8, + 57, + 32 + ], + [ + [ + 6, + 11 + ], + 8, + 58, + 88 + ], + [ + [ + 6, + 12 + ], + 9, + 33, + 3 + ], + [ + [ + 6, + 12 + ], + 9, + 41, + 114 + ], + [ + [ + 6, + 12 + ], + 9, + 44, + 1 + ], + [ + [ + 6, + 12 + ], + 9, + 48, + 120 + ], + [ + [ + 6, + 12 + ], + 9, + 51, + 49 + ], + [ + [ + 6, + 12 + ], + 9, + 56, + 50 + ], + [ + [ + 6, + 12 + ], + 9, + 61, + 120 + ], + [ + [ + 6, + 12 + ], + 9, + 66, + 15 + ], + [ + [ + 6, + 12 + ], + 9, + 70, + 68 + ], + [ + [ + 6, + 13 + ], + 9, + 36, + 100 + ], + [ + [ + 6, + 13 + ], + 9, + 46, + 120 + ], + [ + [ + 6, + 13 + ], + 9, + 55, + 20 + ], + [ + [ + 6, + 13 + ], + 9, + 60, + 120 + ], + [ + [ + 6, + 13 + ], + 9, + 66, + 120 + ], + [ + [ + 6, + 13 + ], + 9, + 69, + 120 + ], + [ + [ + 6, + 14 + ], + 9, + 50, + 100 + ], + [ + [ + 6, + 14 + ], + 9, + 67, + 120 + ], + [ + [ + 6, + 14 + ], + 9, + 69, + 78 + ], + [ + [ + 6, + 14 + ], + 9, + 70, + 62 + ], + [ + [ + 6, + 15 + ], + 5, + 48, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 51, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 56, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 57, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 58, + 4 + ], + [ + [ + 6, + 15 + ], + 9, + 59, + 120 + ], + [ + [ + 6, + 15 + ], + 5, + 61, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 62, + 4 + ], + [ + [ + 6, + 15 + ], + 9, + 63, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 65, + 4 + ], + [ + [ + 6, + 15 + ], + 9, + 65, + 43 + ], + [ + [ + 6, + 15 + ], + 9, + 66, + 77 + ], + [ + [ + 6, + 15 + ], + 5, + 67, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 68, + 4 + ], + [ + [ + 6, + 15 + ], + 9, + 68, + 116 + ], + [ + [ + 6, + 15 + ], + 5, + 69, + 4 + ], + [ + [ + 6, + 15 + ], + 5, + 70, + 4 + ], + [ + [ + 6, + 16 + ], + 9, + 63, + 120 + ], + [ + [ + 6, + 16 + ], + 7, + 66, + 14 + ], + [ + [ + 6, + 16 + ], + 7, + 67, + 14 + ], + [ + [ + 6, + 16 + ], + 7, + 68, + 14 + ], + [ + [ + 6, + 16 + ], + 7, + 69, + 14 + ], + [ + [ + 6, + 16 + ], + 7, + 70, + 14 + ], + [ + [ + 6, + 17 + ], + 8, + 69, + 104 + ], + [ + [ + 6, + 17 + ], + 9, + 70, + 68 + ], + [ + [ + 7, + 0 + ], + 9, + 10, + 31 + ], + [ + [ + 7, + 0 + ], + 9, + 11, + 38 + ], + [ + [ + 7, + 0 + ], + 7, + 14, + 14 + ], + [ + [ + 7, + 0 + ], + 7, + 16, + 14 + ], + [ + [ + 7, + 0 + ], + 9, + 19, + 50 + ], + [ + [ + 7, + 0 + ], + 7, + 21, + 14 + ], + [ + [ + 7, + 0 + ], + 7, + 22, + 14 + ], + [ + [ + 7, + 0 + ], + 7, + 23, + 14 + ], + [ + [ + 7, + 2 + ], + 7, + 11, + 14 + ], + [ + [ + 7, + 2 + ], + 7, + 15, + 14 + ], + [ + [ + 7, + 2 + ], + 7, + 18, + 14 + ], + [ + [ + 7, + 2 + ], + 9, + 20, + 120 + ], + [ + [ + 7, + 1 + ], + 8, + 24, + 24 + ], + [ + [ + 7, + 1 + ], + 8, + 29, + 30 + ], + [ + [ + 7, + 1 + ], + 8, + 30, + 52 + ], + [ + [ + 7, + 1 + ], + 7, + 31, + 14 + ], + [ + [ + 7, + 3 + ], + 8, + 25, + 68 + ], + [ + [ + 7, + 3 + ], + 8, + 30, + 52 + ], + [ + [ + 7, + 4 + ], + 5, + 5, + 4 + ], + [ + [ + 7, + 4 + ], + 9, + 8, + 120 + ], + [ + [ + 7, + 4 + ], + 9, + 9, + 120 + ], + [ + [ + 7, + 4 + ], + 5, + 18, + 4 + ], + [ + [ + 7, + 4 + ], + 5, + 24, + 4 + ], + [ + [ + 7, + 4 + ], + 9, + 28, + 120 + ], + [ + [ + 7, + 4 + ], + 5, + 30, + 4 + ], + [ + [ + 7, + 6 + ], + 9, + 4, + 92 + ], + [ + [ + 7, + 6 + ], + 9, + 12, + 120 + ], + [ + [ + 7, + 6 + ], + 9, + 31, + 61 + ], + [ + [ + 7, + 6 + ], + 9, + 34, + 78 + ], + [ + [ + 7, + 6 + ], + 7, + 36, + 12 + ], + [ + [ + 7, + 6 + ], + 7, + 37, + 6 + ], + [ + [ + 7, + 5 + ], + 8, + 45, + 16 + ], + [ + [ + 7, + 5 + ], + 8, + 47, + 104 + ], + [ + [ + 7, + 7 + ], + 8, + 42, + 16 + ], + [ + [ + 7, + 7 + ], + 8, + 46, + 104 + ], + [ + [ + 7, + 8 + ], + 9, + 4, + 14 + ], + [ + [ + 7, + 8 + ], + 9, + 8, + 47 + ], + [ + [ + 7, + 8 + ], + 9, + 11, + 120 + ], + [ + [ + 7, + 8 + ], + 9, + 12, + 72 + ], + [ + [ + 7, + 8 + ], + 9, + 13, + 15 + ], + [ + [ + 7, + 8 + ], + 9, + 41, + 120 + ], + [ + [ + 7, + 8 + ], + 9, + 54, + 92 + ], + [ + [ + 7, + 8 + ], + 9, + 55, + 120 + ], + [ + [ + 7, + 10 + ], + 9, + 0, + 78 + ], + [ + [ + 7, + 10 + ], + 9, + 15, + 73 + ], + [ + [ + 7, + 10 + ], + 9, + 36, + 118 + ], + [ + [ + 7, + 10 + ], + 9, + 37, + 91 + ], + [ + [ + 7, + 10 + ], + 9, + 43, + 120 + ], + [ + [ + 7, + 10 + ], + 9, + 51, + 120 + ], + [ + [ + 7, + 9 + ], + 8, + 57, + 16 + ], + [ + [ + 7, + 9 + ], + 8, + 63, + 104 + ], + [ + [ + 7, + 11 + ], + 8, + 56, + 104 + ], + [ + [ + 7, + 11 + ], + 8, + 57, + 16 + ], + [ + [ + 7, + 12 + ], + 9, + 43, + 18 + ], + [ + [ + 7, + 12 + ], + 9, + 49, + 51 + ], + [ + [ + 7, + 12 + ], + 9, + 62, + 51 + ], + [ + [ + 7, + 12 + ], + 9, + 64, + 120 + ], + [ + [ + 7, + 12 + ], + 9, + 67, + 120 + ], + [ + [ + 7, + 12 + ], + 9, + 68, + 120 + ], + [ + [ + 7, + 12 + ], + 9, + 70, + 120 + ], + [ + [ + 7, + 13 + ], + 9, + 39, + 100 + ], + [ + [ + 7, + 13 + ], + 9, + 55, + 5 + ], + [ + [ + 7, + 13 + ], + 9, + 57, + 120 + ], + [ + [ + 7, + 13 + ], + 9, + 62, + 17 + ], + [ + [ + 7, + 13 + ], + 9, + 68, + 120 + ], + [ + [ + 7, + 13 + ], + 9, + 70, + 120 + ], + [ + [ + 7, + 13 + ], + 9, + 71, + 118 + ], + [ + [ + 7, + 14 + ], + 9, + 50, + 120 + ], + [ + [ + 7, + 14 + ], + 9, + 69, + 120 + ], + [ + [ + 7, + 14 + ], + 9, + 71, + 120 + ], + [ + [ + 7, + 15 + ], + 9, + 50, + 4 + ], + [ + [ + 7, + 15 + ], + 5, + 52, + 4 + ], + [ + [ + 7, + 15 + ], + 5, + 59, + 4 + ], + [ + [ + 7, + 15 + ], + 9, + 62, + 14 + ], + [ + [ + 7, + 15 + ], + 5, + 64, + 4 + ], + [ + [ + 7, + 15 + ], + 5, + 66, + 4 + ], + [ + [ + 7, + 15 + ], + 9, + 66, + 106 + ], + [ + [ + 7, + 15 + ], + 9, + 69, + 120 + ], + [ + [ + 7, + 15 + ], + 5, + 71, + 4 + ], + [ + [ + 7, + 15 + ], + 9, + 71, + 116 + ], + [ + [ + 7, + 16 + ], + 7, + 64, + 14 + ], + [ + [ + 7, + 16 + ], + 8, + 66, + 104 + ], + [ + [ + 7, + 16 + ], + 8, + 70, + 38 + ], + [ + [ + 7, + 16 + ], + 8, + 71, + 66 + ], + [ + [ + 7, + 16 + ], + 9, + 71, + 16 + ], + [ + [ + 7, + 17 + ], + 8, + 70, + 66 + ], + [ + [ + 7, + 17 + ], + 7, + 71, + 14 + ], + [ + [ + 7, + 17 + ], + 8, + 71, + 38 + ], + [ + [ + 7, + 17 + ], + 9, + 71, + 68 + ] + ], + "order": [ + [ + 0, + 0 + ], + [ + 0, + 1 + ], + [ + 0, + 2 + ], + [ + 1, + 0 + ], + [ + 0, + 3 + ], + [ + 1, + 1 + ], + [ + 0, + 4 + ], + [ + 1, + 2 + ], + [ + 2, + 0 + ], + [ + 0, + 5 + ], + [ + 1, + 3 + ], + [ + 2, + 1 + ], + [ + 0, + 6 + ], + [ + 1, + 4 + ], + [ + 2, + 2 + ], + [ + 0, + 7 + ], + [ + 3, + 0 + ], + [ + 1, + 5 + ], + [ + 2, + 3 + ], + [ + 3, + 1 + ], + [ + 1, + 6 + ], + [ + 2, + 4 + ], + [ + 3, + 2 + ], + [ + 1, + 7 + ], + [ + 4, + 0 + ], + [ + 2, + 5 + ], + [ + 3, + 3 + ], + [ + 4, + 1 + ], + [ + 2, + 6 + ], + [ + 3, + 4 + ], + [ + 4, + 2 + ], + [ + 2, + 7 + ], + [ + 5, + 0 + ], + [ + 3, + 5 + ], + [ + 4, + 3 + ], + [ + 5, + 1 + ], + [ + 3, + 6 + ], + [ + 4, + 4 + ], + [ + 5, + 2 + ], + [ + 3, + 7 + ], + [ + 6, + 0 + ], + [ + 4, + 5 + ], + [ + 5, + 3 + ], + [ + 6, + 1 + ], + [ + 4, + 6 + ], + [ + 5, + 4 + ], + [ + 6, + 2 + ], + [ + 4, + 7 + ], + [ + 7, + 0 + ], + [ + 5, + 5 + ], + [ + 6, + 3 + ], + [ + 7, + 1 + ], + [ + 5, + 6 + ], + [ + 6, + 4 + ], + [ + 7, + 2 + ], + [ + 5, + 7 + ], + [ + 8, + 0 + ], + [ + 6, + 5 + ], + [ + 7, + 3 + ], + [ + 8, + 1 + ], + [ + 6, + 6 + ], + [ + 7, + 4 + ], + [ + 8, + 2 + ], + [ + 6, + 7 + ], + [ + 7, + 5 + ], + [ + 8, + 3 + ], + [ + 7, + 6 + ], + [ + 8, + 4 + ], + [ + 7, + 7 + ], + [ + 8, + 5 + ], + [ + 8, + 6 + ], + [ + 8, + 7 + ] + ], + "windows": { + "0,0": [ + 16, + [ + 0, + 1, + 2, + 3 + ] + ], + "0,2": [ + 16, + [ + 0, + 1, + 2, + 3 + ] + ], + "0,1": [ + 8, + [ + 4, + 5, + 6, + 7, + 8 + ] + ], + "0,3": [ + 8, + [ + 4, + 5, + 6, + 7, + 8 + ] + ], + "0,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ] + ], + "0,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ] + ], + "0,5": [ + 8, + [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + ], + "0,7": [ + 8, + [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + ], + "0,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 + ] + ], + "0,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 + ] + ], + "0,9": [ + 8, + [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ] + ], + "0,11": [ + 8, + [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ] + ], + "0,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, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "0,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, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "0,14": [ + 32, + [ + 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 + ] + ], + "0,15": [ + 32, + [ + 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 + ] + ], + "0,16": [ + 16, + [ + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "0,17": [ + 16, + [ + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56 + ] + ], + "1,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + ], + "1,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + ], + "1,1": [ + 8, + [ + 6, + 7, + 8, + 9, + 10, + 11 + ] + ], + "1,3": [ + 8, + [ + 6, + 7, + 8, + 9, + 10, + 11 + ] + ], + "1,4": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19 + ] + ], + "1,6": [ + 32, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19 + ] + ], + "1,5": [ + 8, + [ + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ] + ], + "1,7": [ + 8, + [ + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ] + ], + "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, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ] + ], + "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, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ] + ], + "1,9": [ + 8, + [ + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43 + ] + ], + "1,11": [ + 8, + [ + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43 + ] + ], + "1,12": [ + 48, + [ + 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 + ] + ], + "1,13": [ + 48, + [ + 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 + ] + ], + "1,14": [ + 32, + [ + 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 + ] + ], + "1,15": [ + 32, + [ + 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 + ] + ], + "1,16": [ + 16, + [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59 + ] + ], + "1,17": [ + 16, + [ + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59 + ] + ], + "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, + 13, + 14 + ] + ], + "2,3": [ + 8, + [ + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ] + ], + "2,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 + ] + ], + "2,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 + ] + ], + "2,5": [ + 8, + [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30 + ] + ], + "2,7": [ + 8, + [ + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30 + ] + ], + "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, + 34, + 35, + 36, + 37, + 38 + ] + ], + "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, + 34, + 35, + 36, + 37, + 38 + ] + ], + "2,9": [ + 8, + [ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46 + ] + ], + "2,11": [ + 8, + [ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46 + ] + ], + "2,12": [ + 48, + [ + 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 + ] + ], + "2,13": [ + 48, + [ + 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 + ] + ], + "2,14": [ + 32, + [ + 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 + ] + ], + "2,15": [ + 32, + [ + 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 + ] + ], + "2,16": [ + 16, + [ + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62 + ] + ], + "2,17": [ + 16, + [ + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62 + ] + ], + "3,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + ], + "3,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + ], + "3,1": [ + 8, + [ + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18 + ] + ], + "3,3": [ + 8, + [ + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18 + ] + ], + "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, + 25, + 26 + ] + ], + "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, + 25, + 26 + ] + ], + "3,5": [ + 8, + [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + ], + "3,7": [ + 8, + [ + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ] + ], + "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, + 41, + 42 + ] + ], + "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, + 41, + 42 + ] + ], + "3,9": [ + 8, + [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "3,11": [ + 8, + [ + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50 + ] + ], + "3,12": [ + 48, + [ + 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, + 63, + 64, + 65 + ] + ], + "3,13": [ + 48, + [ + 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, + 63, + 64, + 65 + ] + ], + "3,14": [ + 32, + [ + 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 + ] + ], + "3,15": [ + 32, + [ + 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 + ] + ], + "3,16": [ + 16, + [ + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "3,17": [ + 16, + [ + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65 + ] + ], + "4,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + ], + "4,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + ], + "4,1": [ + 8, + [ + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21 + ] + ], + "4,3": [ + 8, + [ + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21 + ] + ], + "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 + ] + ], + "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 + ] + ], + "4,5": [ + 8, + [ + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ] + ], + "4,7": [ + 8, + [ + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ] + ], + "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 + ] + ], + "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 + ] + ], + "4,9": [ + 8, + [ + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53 + ] + ], + "4,11": [ + 8, + [ + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53 + ] + ], + "4,12": [ + 48, + [ + 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, + 63, + 64, + 65, + 66, + 67 + ] + ], + "4,13": [ + 48, + [ + 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, + 63, + 64, + 65, + 66, + 67 + ] + ], + "4,14": [ + 32, + [ + 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 + ] + ], + "4,15": [ + 32, + [ + 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 + ] + ], + "4,16": [ + 16, + [ + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ] + ], + "4,17": [ + 16, + [ + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67 + ] + ], + "5,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + ], + "5,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + ], + "5,1": [ + 8, + [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ] + ], + "5,3": [ + 8, + [ + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ] + ], + "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 + ] + ], + "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 + ] + ], + "5,5": [ + 8, + [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41 + ] + ], + "5,7": [ + 8, + [ + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41 + ] + ], + "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 + ] + ], + "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 + ] + ], + "5,9": [ + 8, + [ + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ] + ], + "5,11": [ + 8, + [ + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ] + ], + "5,12": [ + 48, + [ + 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, + 66, + 67, + 68, + 69 + ] + ], + "5,13": [ + 48, + [ + 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, + 66, + 67, + 68, + 69 + ] + ], + "5,14": [ + 32, + [ + 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 + ] + ], + "5,15": [ + 32, + [ + 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 + ] + ], + "5,16": [ + 16, + [ + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69 + ] + ], + "5,17": [ + 16, + [ + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69 + ] + ], + "6,0": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ] + ], + "6,2": [ + 16, + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ] + ], + "6,1": [ + 8, + [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + ], + "6,3": [ + 8, + [ + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28 + ] + ], + "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 + ] + ], + "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 + ] + ], + "6,5": [ + 8, + [ + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "6,7": [ + 8, + [ + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 + ] + ], + "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 + ] + ], + "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 + ] + ], + "6,9": [ + 8, + [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60 + ] + ], + "6,11": [ + 8, + [ + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60 + ] + ], + "6,12": [ + 48, + [ + 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, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,13": [ + 48, + [ + 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, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,14": [ + 32, + [ + 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,15": [ + 32, + [ + 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,16": [ + 16, + [ + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70 + ] + ], + "6,17": [ + 16, + [ + 61, + 62, + 63, + 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 + ] + ], + "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 + ] + ], + "7,1": [ + 8, + [ + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31 + ] + ], + "7,3": [ + 8, + [ + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31 + ] + ], + "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 + ] + ], + "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 + ] + ], + "7,5": [ + 8, + [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47 + ] + ], + "7,7": [ + 8, + [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47 + ] + ], + "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 + ] + ], + "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 + ] + ], + "7,9": [ + 8, + [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ] + ], + "7,11": [ + 8, + [ + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ] + ], + "7,12": [ + 48, + [ + 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, + 69, + 70, + 71 + ] + ], + "7,13": [ + 48, + [ + 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, + 69, + 70, + 71 + ] + ], + "7,14": [ + 32, + [ + 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,15": [ + 32, + [ + 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,16": [ + 16, + [ + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71 + ] + ], + "7,17": [ + 16, + [ + 64, + 65, + 66, + 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 + }, + "baseline_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, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 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, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 7, + 7, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 9, + 8, + 9, + 9, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 8, + 8, + 8, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 8, + 9, + 8, + 9, + 8, + 9, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 5, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ], + "numeric_saving": 0.0013595476203535626, + "solver_status": 0, + "gap": 0.0 +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-OWNERS.json.gz b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/ASYNC-OWNERS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..037f6948897cab5cd00aec7c9d93a1beadb932f1 GIT binary patch literal 458396 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%0Ax-vvH|)QYhx&f1(CoNpH-WGH$>W=d%-ds) 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

6{kFd(ya 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

n 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
cZhQ=9Kzfkn{S-bv1PPle^@pc^!w)o=S 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 iE}Cg;kCmb+@Hm{7aM~2@D?$J7|M`D7g* literal 0 HcmV?d00001 diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/BASE-WORD.json.gz b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/BASE-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..2b406b9409e033fdf50b2a1e6f3f505287ea698e GIT binary patch literal 35646 zcmaHyV{m1`o5o|?nApYy6Wg|J+qN~algY&9jcwa@a${qX+04JTcK6fX4}I#~x~HqV z-{<}HbKdGp6axeD?*j(coq_+)1PWW$ChUR3I5jU0>newYrB48vF# zGuQZ)7&V^XT|oWwm;2q{kK3Kk7eLRSqlBK1_nyDE)MSJfgqff3G3o&yK$U>>gvM77 z6JebK!jo+8Ax(p+`IFcTQ7IqV43`QPkXe%b-6ydO4fF?p2V<{TP}ZRh~Ua}FKF*OF@zJ(tVB zDmN+8cA((quwEXhuwB1;>f(Lu9F}+$E_kpq8(NQ7ow^RY`R{p>E*) zWT(-?Tfr|B0_pT8u_aN~xU@UOF(t_nH-fpGIr+M>`Ztsl&($E+!AACVEG{ZF@+6J<>?|Lzz zjNAzg43a%(^CosWiMvB+ViL4{c1ltbv|2uAjU{xF%ldCsvvxr~Rn-2?bT^0yCPf{%d9WC)B70$V+cnkJ|Ar&|Pt} z+Jk>z_NzR11PBx8cVrEqOGlhPWL430il1ty^#O%qgVK8*FLn#gE?qEuzEs zBBJCgRf>$0DXQdMih`3RI@fNk16!n0zs=UvLQx)X+}(b{&0Al0+#dWgIIg85gI8dD zrkqQ^0D=i`&|OVn4*%<>xI>}fBdk__n%MxQBE|Jl_wlX6rryw;8#`ezeEwn}RcC zWmJuPx9LZRmO@~1^A+5tw|P}^1_z`Om)WwE^u$hbVw%dCX?X`&bB+m+yy)@Toa=eH zdZb^6{HyO*6P6<}uqHE7d=I{w=MT^T#!a=G)!mq(I@8`rVRF?! z=9e^>vSwQM0uoJjH#Xk_x5KH#TG!!s+Ii?a@|*U6N)?}0sXs;$+anivGJ&dgGTtvZ zJT9B?1RY6h@LLv*TX1{~DNSxZg{6=xJE$Yq0xNAl+dT|MG^4hVbKQ&uTtBT*aufWn zaZS_BdnR(xbIp6Q!J4;~=d3D*Pa7X3@DXZM;_<8aD%5$5*(7$#B@n`iE?3MsGYlf-Vzvzb znjL}gw)M>y+2Rli&{yJN94OXQN`O{o#I6<*3$V;EC|iybd}yr;ak7~w;WeEl4BI~J zEv#xx%rfkcmf~X^4AY8d-;$;Ox)!{3DNZI9@{2QL*P$C%hNE4#utWmH$ zf-HVHO|c#xQ@Y_8(eHschh6x#|EvZ$BC3CRudz{5b};%jZpt|hPye?&<%33XN!LR9 zOhOGRYkT<6qXIm8;u47q>)7Fqw62u4)b!<2RKoZSc=*m*$Eo5z=EO7kPy!ZsJuycv z#~1G8m#M6&&qZLjoTBG`nvmOC0D&TwrBW|;UqO`M4jp*Cv8~JZb$=s&EN$XtWo?jg zv6+%gy?|VM!;{jZh7@*V#77Y_wVcPCF?{kpuMdtsy3Xp9SS;viebu>EGep}VjF(1# zaQYYa_;vFl=+7mawE!Y-wX#_!BJcOpcOwaIw>bH2BUQDHdn!4+ly~`Ks8D+k;fSo_ zEqFdP+uy5jdS)A2a0I@xe3M$R1iDgZ@pOgw3=#s1YKi8iBG;!e*^C{D9a3Z_w`z@> z%^&SE(la6nZpY5S#XnDNDs2k z1}*rIHZpSi%YfajrVe-{nIj*sF*1O9QdT35FvD&2(~G#O$DprRx1+s)@{1eVN#6=g zqMydOXTgUy0qq^JH=tE=dtAsPqeHp%+rXykU_UYkk(_zNfgO#%m_YxospnRXsovoho_oH&nw)3EK1vaMdz-)!r^C0C1FuIbs zQFV9MqjhBa*#7N0|F%NSRXRer7+|-|nHbynwW{4&ra3#9p^v!~2m2+xF^^`H2S+u6 z)ec;^ty0a5%s`+5l)Z8_{N|f}N>H{cFu1Op+031@Tz2Kg=(iU?fIqFRhGpO>bm*=D zo--}@m%wp^THL@LV7^>c{ZWef++O%?(aDt7Wh<^Jh#=(XI$eckb(IPbM38V~w%|w) zNk^Z)nCSSoT3A%Y;jfdZnLnn7?p|2i>hdNwd{c`8kKYs&YMl3*aa8#8St->e${e+1 z+^_*-2dIHxdKAn{>y-?{x|^AH9MrYl!2O?c`*oiAw0xT&w_{79*+Xw6WVp1|{F<_TJNBoj0@l(K{_ z#^5S_pYqrOMG|N;h&VVdYBE!F0ctW$)lnhbKEExG>eyW$2@Vak@EW%7>#q0B{PPLo z1P`c3D+g(CQPzHH%c5O$%o99KlbkFRbS~Qry|p`_J+5%f?daDjzSYo%v#RclIQ8&@)#3otO=xIeOu7Ja zH{kUz`)#V6SwJtbjnRBWF-uOf5NyiPDGel<9lq^ugeltP8SYFm`s#eGIh|Yv4FW#} zH2;XZ@eVLwJZf@e(jcGP!xfdDRZyErW-Ar=3-uSbJ;}1cy13v zXqV^g5Ax?<3`w6*6)6;luW5b?!vZxZzAwGgp+xxoal%*N+7K2QT$P=WOplml&yXKW zT5wMH5%wgysp>fK_Cd9hV zsg>zJzKjS{iEx9ptz69g9=Y|myOowC1w106$fiwU}aUxOaCH&7Cv94 zZGgF|(D=pMYk-NaozPjY?-3= z0hGz4iTi9IcFWg30=TtJF6a5ZNa0PA9Qzu!I%*=nT9f~Kle)dX2Jj>T%l&f&()^Wi zuD|Q)=-U26f39Eb%}q#Cz_iH`-d77`rBQ?F8-wnH0e0Erf&`GmfmCFny%f{yt?kO- z>5JpxJD+rML)RW6B-DU9#N^2*o{-`lv8)pM7CfLIwdN48J%Y3@;~FlQU^A-!&N;xG z8nWn(QDSv_LyP{i`@%a-ZH*DG)~`_HAH^#g@5W2{B;-l<-`x#YO@Xw*aa~JmZ?P7% zO>3k2BIocbLDkouCG)1oE!}>BJWam<9PfO?xH8FI8*jWw4mpn{cEF;nat!|FseM}r z)$5?JkS$>wAo}J@_h)R^lqNb}5iTMQBtu7XS6<+__;wm_4ocXDc{>GSn_tlt> z^dxs=6iJm+iZMG+CbM27tFTZyoM)YR;V4gu@5ds`F+ubXS}?y)zjbksvxM&4ks z@2-Xm*6i^F2wlM~zR`3d{)3Cdq1`{Y`13l1{9}EkH~yDjjDB?S!RNfb*;|`m={BO< zFCW-dJ?7tyXQOF1@?S0ba?AXW2Utg?{H;OTcHDe!7rEoU*fWNP5=LHL z6D(uK#HMe39g6V2v`jxPdLBdaU6zf?3w)MZ|^`!XDrNawxe@@=Hm< zpla@h|Ks5|I4K_F;}Diyb;DLUsBInpYNm7{cIXSs7PdHqFYiqLdPx_!UF!x0KUw|- zcs6}Dr2-lx{9Uyul?Z6&`|3UOhR9aRkaije%QCAwGSAJL$_ss$I*V33Ve19woezU- z0~iGdl8JhQu%E4)QBlo5m|OmXxoFHkn45pW96VlgJf@_Xb(g+)7+H&!YY%Mz|QmcELlTC3EG_EzrAX z&)jISW@X(82mW&@a0Q*;st}9Ib`u`AIaEMX(l?q+%5B+J?kn=RZxH_B-3o!pE4vmU ztsB1e3-9AAUwHTW!h2iadCs4V#gMMnH$h8!4AfK&{)<%Xx=#O9Y`CT>1#CSF1&W&P z7cC4Kwgv_K+zREWO5^~nA-sQJ*FR@9e&u0{55r<;U0%obhVV_D&gYP+4`R!ZY)r(l z1I^OesggwCowu1OJX^k-qZVBL)%DRn+g+#kkqjxhu(X5wyYdU{+cxd61gT$OkN5|6 zo=UZ@$*rooW%O8D6)>}&yI;fFU)TH2DC0~?rY&E`Iz%I^@f!@pd{U%iED+LC{x5-`7(t$I&i|swZbiGLlo4d zF06+JHv7d8$$q3(W> z;Xu=4O7aTF!mLfy3=HaL>6%ru6klmro99W@<51mE;w(SN~%wnMP z%}1h#7WLghqTf)6R9tVQN4@deNDFprcP7BxS8xwQX>Q^Fo+aHp6U~tS#9NG}L4-dw zG}f=z#gB-3sOykc)BP<=S_Rwj5vn=Oqzejl2Ov^E$??3dQwwo`dJ|u(Qa(-j=^j-$ zOS)@!rCQ;_RMm_WXvqTFoV^gn<{`UiMQld_RC#WBNOOO!{j(}|%~ z0dAQbnpk&!n^E?>6Eove#2O_Cex}=G!b)JTq(TuJNtI^TkIvbM5VOiUXg@(yUIK-; zUKFq6-^kfhzO~3OS*2S-L@3DBmtUNpreJyi4T_EBIva@p;=BaT<~Fq)Op}HDo1-y7 z+&otsog$Dqb^1&%NNc3l)e)(V(Gl32#wf@BRRuu5o$rhLbc5AJG#Ku8t?TQdQOc&y zWOR_F{|bhG$$iIYRy`_6sHu&#Ax=4`yDd>qtrbejqsVX3-e)t5IC=j~6MCS#9wbH0 zaA9^dNs|L#%rimbUet~s{?7M}LF%xEJguOwH=;bPk0?270oF>?FI!%VN&=VjUS&^@ z7)hPpT4J2Nq{V-=dI$BjL-Q>#>TKF{fEzKPDAkC@4dLj^`w=}q(n9#|JUtHETGW0# zlh81vrDsct6i$kNxCeL3ns~J#Qj{VCdGI1Tx6z?ooZ^b(-1n5C^K&SLDs0aff~4k; zToGuh>Iz{qJ`yc(N-7BPGMLHij5#$_79RO33z$F%ECX zZHEv@SOJLRj}N5@(*qZL*$rxdYrHcU?ow7v9rQ(+P4sm;yY2l9Nbp z_wB^=B5XW3{a8IdFunCKTNf(WT7PSnNpibZ2ff2B#*3}GWPU0>@jqv%YGj0I#9iW4 z*EjhuHM3Zi-yoEJAa2YVT76V8gw%?vIgF5Ki+X)qM1HT2N!n6CE$Y9!Yc_$$dLTrg} zjJP`gMVyqO*T*apMM0!A3iQ>o8NrOSgMRv|qySALEaLJAPj^m}~F2S9-=3{tA+cn!EA|V9iy0 zi{D>%IW7o9J>06mX2xX=eiO47Uu{6zui|k1{xVh9rT5dcUTiU)Xmf% z`5HG3Qo2gy$%n!N(wbmmhwjVq1Bw32(EY0!G=UJdT%<#4SKUK;c1e+g zXds)UdRNkP#%qaSt|~<#jtpoaV5L8Q`jJq#8FdP%X=v*5KMeR4DL552a>gtxwFp3~ z{6S+8R0?Q_{#X6Vu9t=%=jLGlDt@_NlcfqyP-Agm;6bE#LYb6{J}xQngf|KHK3i#2 zU}$SBNhqw4?5ao_RLo6Qhu1T9v=0>R1(1W+QlN^4O2!p>RYG=g3vFRzm*Jgj9JKX&e}BFiA5|N3fUbZYuEJ^$ zWcOS%cw2)#1gs@HOxV4U8{jdQRqG!?z9OM5!nxHY_e7K`_}7BiDZ=_dTEesB%`y}pMZ z<$N4Paw5Go2>81p@b^|?Or*XV{2p4L_zfz^m1;C%9rO=m;F`^(i@mjf6>&h&AYE)D zTi4`{13qfYk=W|%$B0xRCk%{_^w1o-5|c1NlM>M{+a;&tfiRYliHhd8ZEe5i?yMiC z8)-7^PsL8Q)!pmYa;IJcj~bGTHJ*TYcnBY0lF~&L6@MA0K$oX6Tz#St&rb}t(by*sf7{75f4L~T480nd`y8;UMa$S^isl#4VB zYew;=(aA`+!jSXpn?gT9?wACuk?TDqU(hmg@M;{s<&R?QZIXZc9tRG%3M`{V;nXLC zBv1F!%A;9``{A-_PRm_>Hk@GN3`(%hNMo0dfuB0F^k(nM9G23VUDm1NOxB9ccGeHc+Yp~Hk4X_qw1lPEATws?_(n)qY3a~TqyCUuM4^ct+;IcQ-!E`oJ< zwZoD6YJL9CdL|qt^Q~WelEtV=(fJ=Y&>twCejnNA<{F?mQ2Hph!HN|3aqB7XE?mbW ztTSzKcZ2(Ry>y{P2#@cN@gH?`jA+wLLrAop#G*M1?+@ht@QOZ&2(MMq}e)z z`GF5pBF%$ndwy~M9n{YaYHvK$7v}R&a!-Avjp`+aVH3(TfF-=r;yJzB@iFuB+&&&H z@X(q4c_w?@O!CHL$5xGJFiO;^V>pjmu<4v`aEDmB+qaCM=oYM3RP>6Avw0eCja=U- zrx><${;HSk8;!$wOxUlxjTcTrS{CA=Zd3t-x#pO32n~$Zp zVGI=)9mb`>^x^vEPwO7eLb}&Va%+uFoe{|3uE$Yo_hl1_Xn-~`PYu5dtwUsv!F{aYlrg`PRz zsaC9~(ULfW7ERM6;O_R}A5sUEa6C@lxO2#Mjq#1;?;vIZ-Y!HbEY@IMDOLY8t#EQD zg2x3mV5p8679-)v^$K>g-s)~#|4F?hD{Kckk=-kE)!WJ^Dl74o@>hJuJG)CBHj|s_ zCvw|VDL4a^)^e#9ekbun_5Kt!q%j9xxHL-$`+XL>q6Zac2#C@BB`sVBNG-cc6hgP& zUQ)-AsX@mB$CZBv@`9Sed@gTx#l1QM30RH`AAa%-Z?ohnrUzIey$7R)`eVW3i1d02 zpA@)@fko~UT!C{KbqaH$OHGd^Dt?l@HQU@vKI%~v!v_D7wPowekRF~J$Njpa;!7mwgT+01}As^va%N;mwTj@>M_iVucOv%j0h9+{fVnRf;BSE~`iaJQNTof4BM0o(nN>So39Fgzu16Ax|kT-L0m zANwd5>h|U@9l57sXZxmZ{71FV?Z4bf>oV8N&I5;ezK0whhc3vCE78Qa7M*qb*C;+A zf|DtqXM;q5k%AZA<$HB2INwgJO7}w1@$z;XU4l!q2|%gOJYk2{~8y ztdZN|DHqhdeVNo?!~Ep=u2%D1B|0;0a3$uasS?kp`S`(tgZfdYJ~sC9KvGmm9u1cT zKdsU53zz!eI-4Pkq0s`h0O=MtSUAaTA+9--Hk6)$RXWO24b_>h+qdDzBt@>qPI&Ha zQ~670Dp|GgR;O9Q6hnqbE}TR7B%YGh zKBc{3c6@)gmzSGjw$`30Gz9Ef2;pF2VUzzD9 zLq3F}A{Pg2vfRbb1<%&J%FCdyLiFk~xa6&7fO;Au!9Sw=&MVnfpsRv>$Im2vjdzzyTKFwQ}rDBhoy#kKfK zYFzXxfuDhs(H^p$#=rf&lypKnNrEC#u z$nE>rxclLisB(Q@uUe$rZi20}j^d^5T*=wEx8vfr9VVbfYpYrM*Q z07b3;l50*NhWNcqGPv)NLA;+#?MV9Usqc{7K?%k1v=0NY^Jq@-`!}sd>Eb+#ohpmv z;#?f7s6<!7o$)zWtcj+0S-X;8LD;W}f9Ar*zk&^D8!t9R z7D%4uWHN#gJxrDCL~nboj1lZ*h?ip9OHo07XQw=LX(kr1*O& zL&uUE`X)<1%zipN->tx;-UG6$s{PKZ%%PR2Bb zu5w>>w!~u3i1$E0qFPoGDQEHc&}ihjTD>;XC6Ck;au{heC><$g%K1ogSYgsvHz^lC zPFNw16pj@-%FA!0X6fWZI-^OFQS$3{VDuG1iq9IcUB<#v`jss(ej^wA+>?MZMmrdd&=_s-F6QXJ^mmy1{keQROeepBJ+(-l>$9Zm*%vzRFHy{~j)rG< z4aG%)m#5=eIo6{(9oOPf)IBcn2VT^giQ-?R`CcchTREsV>4FE(0sJ`EC;=f5F84{r zM0wR5`l!ckI-iI}4lrJo6fY6`h6<4}Y!_;H8WABd0qmaIBkh9rl%Z#fOd+RsqGR!- zXgN_NhJQrvq|zz3Y}y~c`8B7$9|{}9g)v*7+U$^c8p%0oV@C;U?_|9{Puy|;&Q7Js zeI#@xQ8nqG_>Mb@DhqPP1A}gr?Tl|3ajPLaookMZXgUe zwu#=`!6dEp_{%QbETd9&3fJ!+V1(Dv)gHONLpM-E@|D{vf=@`oKAkVCwIkaX>*&nq zg%1fl;yWzI`WpGpABW{L86Cc)Li|a@`JT_mzxnmNXE9wl*=~?loZk4A&6o~oY9y5e zp9)`_bS7X@QQtDDR+CC6&3O9~CCQSg9@u^=Jd>|@q@t4NxjM;8{6T1|E2{L^RZk>K zVx{-3P2^mH0Tb6};WG2_3#>Ec+(t=+^^pa1SvGV#`VikqACYQ~rV?yLsbn7PSEH&u z?Dt!e8y?aIdFD$AccQqdPd}3yRT4O%##lBiU1u}EPNhLqrpzquGMW)+W;Q-$P`#84so!c-Sd-YCsSOZgLk<7(QSo%Q5j|kFI%{l0G4!A{S!olH9@F zu0;QyMIHkZl5p0Kc4!{z(chhC(fGBvCgUGltF1oIh*b3;a%M(SsFK6rd?flV;qG6v zZ;7fv@1yT?JV$b7lORyT%xRF`Ngtk%+mpf;Dj3I06}{`~6AB9We1YxuYA&C;HGL2j z%^|VOfPWE*m&vK4Jkn>!A&QRcw^c8Qs{s}@W!G?F9VFMQV?#?m>z-{;qt8g|W!)IR8T~tcUqD5QD zSd$x-_(G^JJhgNB3AZ4I2EwRbdt+)V_AmLYq@&@#`s~>H%E<;}MEIAmaZes0^yNZG z4DCx82DB&Q?;T18M}MoUUj9#(Gq`{4;4v%FKhFYqF!0@vFi8&(!6-eR{-wIqD88`1 z)nX*3PiW8G7u0L^W{{pjTO~#Gi%Dwd6E%=!PxBn|TLo*>v9AA<>!Rd+nLofN|83!W z$NCFmtWUH!__fI~p5L+h%ZzG;Nj&#fC~{Fb4bbv_LWu+kQUACY*(^#-E0^I+ETEk& z3`SrNM|gDAFaB+OaGwjNp!j}@qZSGZR zZVpTCWq2r~+Q_MpKjA)<+~pKy0MoJ**RmT^+uzB}NicF`Efpl^aj*lwg>l_z(lz<9 zSN=>$jdnQr)%+D*&ymbNk;t{I{BGy=s~V|k>i9t1^q81cq)aDooq}obC=(#!l*Q|- z)wQTvH8TVjQ#!xSm@a2@TRh=Lbh-|%_kM0IqDce`1UKrUvR%pN2yXBZTJ!0;n&>JdYtK5XiyrA50!8<=4tC>gO+ASCa4dx>u>>_eZN~5PM$K6+BW^_ z}=9SgN)JWXu zp}y(H%trfBx!#rVCV>|Z#sF4f{?GXq5D#!o2>NjupmO<|-=*2{p6FH>x|@dgWm;!P zqKCxYl_22{gMd%inXu#=uws8N+q|wh05+7u(U`aI!A5w~*mQmjB9=n&60;})emGOt zsN3~fT4gm|JEMQRuh=RP>^rzo4+X+z4gUv(+RpN@5{(2hj9ILbgq*R6iDKrnlB!?{{J<}nvVA} z(;M`LQY{bZCk7*01=1XJ&42vnlm7Zc!*B*OrMs(EXvcc?1n;39s^i}P2!|~HGk~FH zIH#`xM2_VcXXBbn5`ZzDAi$u4#@x-1Yr6Al9NHc4N$L@luMo@-csY?U#UBnub*}qu z!zkqbuB3jPP`MZGoJGE!+^y$bQ>aq;#nl)aeFr8vK>|WQZUa9Ne-hm}#`~=tNcPx% z&_>3@ba<51$(yv&F@wK%mh8&@6-I0QF3O%FgFMO$9NrWglKFh5jIvzVQ2bspL#59a z6zQpB8)|UE#iaHh%1m26B81wGq_xIB5+mlpz3Trddlmj#u%Oz2F#E*e;UlR}g$rVG zi9GWYkb_OvL) z3fDG{0KCmMD31!z!&Z`;D5cOM9PlV;FZ<#ybt4B|LeR0rV#^Q*1(*OaoUgDf>2F^y z96c)&6P;@YMUKFUo?X7<{i%iusOihM2H~=Y@ioS{r5={t7s}JIs!_|pPp1lmxK_$y zi9lSM*Bxh1n;BYC-ey={0-yplsOGOk+aF#C>|9Fhp>T`f) zGk%a@@kT?w+mv>z7T#**1;yATatJ{{ityAf#}_0uRMOWj-_Bh;S|RjOlsG?@?0UFo z@Ny%mjXzw9>RkI$#!ODA#g{Tn?hoU-JDELc6`oY`Z5e_wtcx8$f&#_7>P`zD4KmW3A09_}P{s`(0QdpVsPs~B`Ur-Et@B2H2j=pZIG*i--arLGTj%!tLZ@wlnl+<1(VPvKs zQYZqrXH%iui|J}%fu5vQ2YGezKK;%gR%Fy|n2T2jE&5)Ti99OqR4q@%l(-Rg2WSt- z%1ut`&M`+WPF87t9wOK~+EI^{;AhSoep2fx_8mo+(@k4ZEgK6^nG6D-qUyD;F8mI_ zv{LsqcqgCZOT`@9;%>*x0es5?rX#4YC9y{QrHhu+-3$iQfS#u$l+4y-x~{f*|85uX z>+-ot$b2F}ASu%mMT>lqLE(}Wd;fTHqx(lm4c*3yB;&~jj^RyjVW)*mdxC>xD3tLo zsI^DJR5?{V6OkF%SY9IQhm8^4gUKTZ>j542>O`#*+OD=c9_YttOV}!T;Wn}CROrTa z9qM-9zRLYt`moS(6n`iJFZBwa^hOYhZYG+DIymR@F>k0ZJ}q03F>(7P3MvjG;7L0O znx}%YJy?_ld9wcPWxz_V^y0aUxVOSsl>h-ZtY}v-kvScBnn7-;a-}Iq+%7sAxu@o7 zomJhT;s~pbtt&%QK2dSp9w$p^Bdi7QaCzi$l??$K2Q=By8ok!amo4-9I^ zTB$rhVyDRYTeN%_?bzbu2j~;BHvuJ-?beQul^7>23yU_=A3B|=KLw)95kX#c_)9VT zAC2GQmf$GF*Q}HZh6=@3?EqahB-t4oE5~ek;_Wf*ZaQ>Hpg&xPp40~Bw?mZ0Ow_Vcz}w5i+#XwM+LwgVc6x~+xH&)895~E z-c2o@Gfmj&)O99N46WHx$d6455d}xaC{M*R3p-9`=@?Z&_f4N$u_5ygL*1n5xN4RW zPx@_Dy)kS~&7uHT)f$byMP7;CkTPl|jSOm1H!@LQO+47^6qT)POE_Lhqll}2wCv-T z^r`!_>$GgGA&NVryH&_{n=UU+=zVo`TV`Y$VlbnXHH}nm@B!my$4rS$t=96!jdKh^ zXkuOP+$NsQ<^oy)Sz5==3&Sz4th;W!T5$@5NmpHqZ&rfrTV#G;hjG+K`4go{)xlM} z7ASc+m2;&rTQj8*OAMfl9CtU?JkV+@Yvjz$_WI1y<#-L|FH5jzVQnLvcW=5gl-3S} zu~Wh6&(4b|l{98W-nl6t7*$196>Q7D(UbdCTPH;5^x!m0$$9wkB1rFjzhAlRzYoKL zoJ(8p{JjQzqRzn0EYN;6uVwEihV8O%HdAM2h6M6oCw0;2f>{Y!39ICNra}8z`7cAR zfbl$50Iu8kX+X{2wpj&ZK1;87=Nq@>x#trZ zRSZ%%lC`5XdbstyY_*>wc!)+0IuGLXfXEDf)R9n=O$f9AmP8JrPeTN3JigJ7kJ;S2 zKHwYb$*>10x1Y5hCwajP0e5HkT0FR@Ia+A+`E)ZG3DFpC1t zvUr|{z>xm=)BTj(`_g#38 zkMhDKyxG-oOUI*N7tJ!y|53(AQ=9f#Ep6lh)C7GvAfwZ1&cra`*Yu84y7Y8vU*}qj zkJqpq@o6#pcg}5mx9=3I9e3J*tr;fCpuaaYTUz~pY7guaBg$imD4|GVH-zeND!+TI z@&z9j8*L&5_pY+sGYr9gB{X(eSLM+1_oudzIqRUBbWb@yYg5XBcsbZit%OpB(ZmuA z&aq8k_l3zrtB(z_o84AU_$lShtd($|w-#sDY_%lU>R#0z)IrQCV2Pq^&iB21doq;X zw39mfg{jbrX)~Bnv@xJ^H*8UqHcqXEza8xOCf57#8>MQC-ibt`FvS;&SvAT|al=AN z&N7J7vNnx67u7=q z2lw{%3jTeIiR~L*3J!c%0eR2-d$y18)UHe5ds_}y$<<2WnFHKNMw~eSfl+%qZ_g}m@9Ay*X(F!}b zZrh5tiP>wB8{yH={>80!WuCQ;0fy4_+cF5|zSgTm*&a~5H8d4j9Qfdb!fs_WZ6$cx zXO3PQb`Ps@Y(5MglWt*fI3LHKZ;w`TeXwCvRc5g33sF8xv9wa zepvzjO)PVMH?pGawm-&UdkfLMmRm+8kl_)pHE`))mmq`i39x~P!26Sf&9#Wg|6B&5 zGzjolTr7}lTKEe!XL9*sLrFF%LkRcxR_=k9rn9Ae+y0b2nFw!|PQspf2ycs~bOT=g z2Sp=X(@y>e3!-ay9+^8YY#AHQe;!{CzW%`F5Ks<$h~#9*TDrN*3LDhdTv_hu z0A)2?@Lv3}kTgcV->R5VgCZGOZ`>`HxYZmN2^{t3v}j)=HX6Es?jH6k3%%5`f?jk@ z6)p+VT3LMRm_TGjoZL}*JZ97HPr3oD>gfjsvIpI71@F{Q<95=|T}&|8OH1lvM5t@K zOUWJ-M>EA-?2Ctml9k^u5OSttlV><@5wC4iB+ljz9c|+KFS-$#`5XxL&*{j8ck>WN z)L2gfaC_P^h@C3R!?{aMd=#TujKd#Uzk@Qt%kn%qTb2$kyziNMakr;OeQ?uk5z@=F zI=`v4^X-j@gnRE<`+UYulgE}`-phgD+}VC(LXa&zXazw$DF5SY0wPYLv-SR@s4tua z&Xna}$4!`CV7F&)(aNe;Bv1{Ql`a55FxFaSdbQv57>bv^;eW+{55rDhjcx z_VA)*a>^H%Re9Sphk$^qFFdmILSX1CiZY@z=BJvnUqIBe;jc+!_FWEjd_Pdt^%@!9 zzS7kZ_I`G7-OPI`!3~Ue!n+&3cYwXdiEYbep<_0z4gdb@tWKjizkBtn!$b-a?aup0 zy7KqQec0op7v(-4+}m7@>*;vRr$3Hdnrc#6;-mJ095U8OGcGe0Z3Xyx_fNJ8>czuL zo(Wm;AH+RTM3z${wFLq?$)D^fy{^_Ypd?e5x`lj1RPlCVl zrS*H=ui~2@cOCfcKcZAo><2TqsU{C}Nt|H<30mHvg6-=Y5d;4nAP2wjc3@n_TX25NhLgR4Ffg;8}=iB!T?< z&|TQ{BSppWU~pst^e5OB+=8yIcJ3z4#qpJIRdLD?SvOP8@VTo(d7y;VhzT2{mtl5e z{!n>Z@W~Rp`^X!!xKJnbN)9puQa8q6Y^2@v#E@59a0UX$H-(XudCz!PUJ+$SiqDuI zJ>0@7(z}IAx4qJR9H9;?!j<=AkSzS0M;RhQngjxy{Q1)v7=wb!D+4Hy*{)aa7{$94 z6`h3hk&zMVC*X8pD?|<>!f5o8n@CpVzNIr3aE659n@G-vz~R%0v5?S9j?(E;K2}R! zRIdE+(L+Sp%qP3)P;z?mqSl=5-m9=bii8q67TE7-AaFay2^4pJcceXu=~U5mZF)1K z{JYkTBL3))6m_cK{^;Jy&g|uly!Lz~O05&KPTh7R z+T#Jie%V)B-KnF9?42MCSIZ{8It_rqes$UTDNpLy_?N85CQQb#`o(9uwG^5u_re*T zI-W;tJ~msBuWnh#=Prnl{&w;XQ|6mT>Ti~bsnYuGH^XbmnZ0A>6G2D$@AeF!qpf`* z2&3!9T&;-|Vyg`tMrw~udK7Vb%e)nI}mb8W>I&&Rx(OS3_Jpo^_yF6*XS2(->mGY^5V^$9f&vinJcIEm zGd)q8eJc$CZ&>DQPiGg4(@FJPddcwGo=MrE3uA9kzZ|Z>#xMe^oXu`*xIe2{39N3w zFtB*L;au2>sO*VbI$U;KDi@b_a|qg8x;H(s%Z0p`4|B;e!x?q`GS@XwY_j1SL!Z&Lv z^e6kyOrK3}_;sLIf{vG`0~Vis39L`P{`9tan*~G9_Y=gXWk&36b0L-8D>u$^%`1KI z(S+n^P%U7~z;9y!5n~q~R!Gd0Jw)3NMkpWCYVEj~zNx1+H2XY`Y%7ON63;x2nZ_R! zo5t(5SRI!Y_LkVY#?z3*6ea#GIYXfCW!_Rsdo4cKMutA_&0MvEKhkjuo1F!`GuY*# zIv!%yv3*|8d6G81R=`~AT~bACbLDRuf_2Ypt*VEVk@&Jxu@376bugB7Y&_Uz4i>f9 zaD~s8zFxodB^Gf473ZK;TL$u56~Mb$GnaD37qgxxN{ty_k$!>z+9$F!!H#DbQNc-t zE!|u+<{bmUEbUeqwv`s6yd~LC2wm83b^+Y_=0SZH?wzi~2yzM3n}_$jo8y|FI*a^i zbW_Av*P?-J?<$5IY*^`TBQrE*6#cV%%Lvb@dD-5?Mo!L}R|Qu=PZlR$b$3(j{MAbV zyh^x+@lX)?PDYYz(^~Dv@Algiadw5!^igdWd~O#7rClev9t`aZCost|r%}!8ELyJV z$utZSnc#1f<}rHmz0@r76KNeKAeVIdms$Pc)@|V7KBv}xXb>5*TRS;{ZVLL%K6lnW z4dfjmt-M}Zgp6a?kE?iEC*<`@cWK7GAtl2`rJ5_iY({14R*{GM*nqPhG@FQAA&nl#=4B~pvJ!5 zFfX2X^2#{^!JW%DbToMno!`JCc4zq7XMQMs$6M?o$35xp$4lwH^Q9aR=AFk6a1{9} zoq`GUr{^EuY@wp1Z5 zfc#Rl*cC4;_;8qVU*_*ry`7-JwWvm*VbDa0{-*rMSBlcemp1 z7NAIJx#{~m=iGDe^CW-d*?Tg3t@T}>S;?N6oohz{2y3<6Qc}n5MC!kDm}fRvpz>7~X6P&E=kt-0+{j9JhGqRK(fq4M+4bl%KB| zz`7Qr%UI$|I3$*!20Olb3Uns;E!+`f2|@(+ATeCM=AIU)rfPqtUD!b_xck+a?tV7G zH|d-3I9Eh1D&bOBLM8)s=Q=0p7>#;;PFu<>d}LGw`^grKdtM#h^c}~eEF(-YPA!Kf z`j=sINrbU9O)1WwuyDmoMrj6wu&C{dDHK*)(Dc_nV=Y)SY*S3Pds8uFqN#e?B9;;$s^@AIYvaIV>!gyvJH1>FHy;|W!Vt=!#%e614_=@DIpt4x-a)tfz^~J5GSMR&U#0owg zaf?UU*Mxq@FFeUJZ$La>lv&fsHB!HC!h4!cd$AgAa++rJ12dgl3dvKUl?JQOMTZBX zCpdUAzti)__Ow(B?$?R(>t1wat~iR1NNZiE%jJU&;Yh$~EWwdYrBiay zI0wTNVI+=LJgdpJvy;WDS^0QCA#{$=yL=L|1rld^!^5#Xbb|-zB!v_fHH?K{hXc4l zHX@VjJSv*{xWwhTt(`Oj^%ezu!Md2l8N!zOR#jWyMf0RdrdyJMaa0#<;x9((?w*C3L7e61f)f2#y_1*C-LW{Jy_Rslb#n*~W!8;Mu^if-RmAsUQZlRt&NO+RB(K6nQ&J>@TNC|iaS;)I`Wo7Cc>5FtEX z*R8O{`Qx@X-##fg%u!WKZniuk2K~e3s3$gk?vqfc>>qhg*r(gH6Zmj}>E~ zihbKQ^rFQ^xFqWdbU=?4|M1WO<4dR`2|tIFBvdp}PVpCYQaG+I*eGJ4A5# zGtoqQq;2X?MM{svQ~BRyP>U%n>{28P#94VhMG(+VXxhWohw5l|Gm@*SQzH)VMRdOS zx(4T8X=J#6!!7CHP^xv_51x7-MRAzBs@N*yu>0e?Tj!7%fna5_eUNwNHo7>VlS8RS z#tzrX8$B$a(TMpabA>?>O?3;xZ>3MRu;;A^=I%NVFRD9AaZZpNQ;vw$8?&WWI^Q3C!yL;Y zfBlPFnl8JvV_fOhVfe9QoWkY3CvaEN4o4uCSh^@!!OuhF+iH2Z4h36r!d+$Ka|N@x zWo(SL6)sN3gPK}qvuqZvmaNKYQRZQXyy|J0bqy1>ENUW{lBJG-y!+6@smXS9{^sT7 zGr)d-k>Fs>5v<1B%%@FI9L~pnWKyuXGV9L@p%svdv*(mrkHV?fs48aQL}%v9g_f;gwYv$;TCO1yNGZxQzwI(vl@YjwIb6%@~a{9ws8oYYtQ)zw17It$c_qc1G>& z=D?vrW$^SzYc$uk@$}b^@@V;&)i%L%PXxae5RHlFCy!fIfuL?jKgucJKIn4@ZLg6ZUoVp>~!2u6C} z0|}D5D=LYWEn^L?Lv^iKCBe$c;ie(W0VT=R6?a?Sb%OmB%kg=Z|8VF+xRNaD0*)l|4094I2 zD((aXgHbQ5Fne(AOaAryp<0W(oaZsP3G($m1Q#n!=N`1Fgi?J^)GfHRV!L$g$s^w6 z^7Vf5-9aE3&M%U92MR1Op6|UIef4hyod^k=Nv-NjGNB8C(4zt6yUIH?mdBIRRh6&Z zjmb+4_1wO0D#Yq?UwhAOaJR|(>ts|$G=D}KsG#0)BysyBkUb$yb>>>>k)&FaKAzY- z8qIj~U?NNZEEnq7z6|k<7`_??Ik%#++7PzNsB|v<4BM2&IodR}KO_^nL2rFG>A-Aw zk$y%2^X84Ln%zd+j{kf3XS5KJ%^UQ_$o1P(!rNWK+v}&dJCV0vy?>#L=w8>2mMeW9 zRt_6JMKW84IscKW@Zey|>8T?vipez53A}ZtS@@I?be|3iluLaB8Bx8`g#VR> z@ZeV+>X7!U+eBRB!gnNGd8=#1KJwr${1f2$5sb6Oe78x*@BL^vKnb3~??16**b=be zZ1lSxoEw{X^dU>~>mie+c{8*w{%O%eBS)K8>y8uE>nU|=+k9R9xlrv$uh9*1)ZM2* z{f!N4p))1m8n7_h%TsZBu;g2jEh}uqNJnfz|F|9{o$0u`F!uYgK_tm9z)sY2__`9g zkZo8S-+b>{0UPk}3KuTlBbZ&l_{%?Dq9yzB9d@Q)K&B+^n{XMW%3lbOh2Q(Ghkyz^ zsOqW81*+Z+eCp>-xJGB_?TH4h6ich0^KQMi|{LqLE@Y6;ornA zAjQ9N$r7~R_OEB-=DP}lBBe7!vFFCtd026v-#H;k>*(S~PjpK{9(}>^hnOzr z74lxcTWr9ZJ2NzG&VIOScOi1o^@-aj!UukAjyjoYZ7!;lr<5$oC;nW9M^?=gjR@y2 zx=VTafkjlCEcLfgVaD%jX*bEBqc9FQ+SDiFmSkli8HCS^w{j^v#URU6K7Pg|zo=7r zx^G28>SMhe4r2$~H|^$-nlK0rc;+^&!txm;R+?=QU#CcWtx#u0`Ap)NWy@D6*;Be^ zfzhMX{K8|(o9lxitxWwUty-o>1G1#ki(?eqi&}Ke@o`Cap|KQJ;&faM0C;Ptqd@gb z4QF0d#qbeo`yGGc*g4oVL{`|UoqWBEiI699nwRbm`NUQ_0<|QB5BYtwMkY8u+%lby z3N7_1dk~~7R5n5(fbd!UVOH|)2$eD!pT-kA$#2?Fl1o9)m2YkmqC_i2`$@r)iSju| zKjw_(v)rB3{Sd)^@CA#RoVRpwUSo}#ZxzGocBEF++HtwoUFl?z#?08$sD_9d4m?gA z;Fy;Baa9#UjWc$v8E0NJ`Ak!B-pAue<2`m`xlWxtqbpc(usvC1zIG5>syWxCt8=>O z8lc@^>MH#O;%uhureGM_+wKiLC#BaM;uvqr_{?+1k?S|TtVsJUS#)6vU{zC^b(oEv ztt?!2OPf4%+CQfCiEP-1x=gn0<(a2aVDree$E$&9n(u0i`}zjAV`M5XG#8J0wgfw$3K#wW(g-*fPK&x1-eh{YrILk`i~_O>;0){61`v( z!GIs_PowQs$mxuHt=Bu0N5t0R>W*4p2zBsRc~@$7Tu6?|KI)hIQsKy*p||sF;XE^f zElw5ct_J&-=m*+HU_Eou?!LS`1|aC`?rt~)ePwl&)sX9MHRXH^fjRGhJI*J%V(OZ! zrFnq+LHsk@Z+YT0j-AnWTCO=zXQK^_5#ncC_Td~Y$u$5WA`&EJl-eYAAVI)@c&<1~ zh$PI?zm<$8Cv?COi`rDjHGO(!13IOa$eB(PvXR@Y<{??xxgXFS;Z04JNxp5cW0gM} zuH5yqY^xXzM&7U~*!N$f122+t4iH9GSyb1X(1kTxgEn#Z36_oTi1He*nyTEt8?yu% zliHD3DPcJ!4e3fqE{A}C1w$Xvt-8&frYF7Y_6UcO5=;b(8vEceMyy%8MxD6p3jBiv)o1E7j@G00$u@Y)`%8~i(ME%2i4duLjw0#k+bc~%e;}<)~ z-Aifzv~_p4=l#Bmz(y4p_>TSu@aVS_%eKN)N7gkVP*bO@(^wZ1Uw=nXLJ8LeUl)^< zAcFtKiQ>z$1j4ZU+JQq3IERil-uVt2gO4-QGjg?LM7Y+}sp(^GzB%*WrmHL5D_rsbzUds!hKi-ozTJ@f_teUEYl@>L4dgTs^1W)RfJ zc04pKr@pP9gd^CsadYn4p^rPiXnRODcbZ|UUE%5^9kSa3D+C84jFsQJ z9~83`Uk{KclOP<1PHCh>&U>+OLyJgn8r1pq++03(tR*OgIM$u0 z>$@3R^|N7s`OdCeXgxZdr^aa``Dmahk8j)VIiWADlf?=UFY^W?S3+2+iPTI4$D;?` ztN~qMo7QO$Ml_mZqOa^50jg5lrbDyU&Vsm-0I0(_zpxUOmDG2-(R#JP^hs>BFrN({ zOipU1iUDKQg%;*!jMf@t6Hnj(>wp71O7-H(;HV7~*c-M*5^m?3IE}U;RK_GgV4FM* z1?uy-tId8!HK{&f5@1K@P@@eqV>SebHs@TvYwMa={noeM78_1$SZl$|xtrB&q8}F= zvjB2MNL>!et3OBAW`TpwZ8hT+Z3{i+JRT>uD@0l@(HcnKtZ4=u z#e1ow*1NvLPvhFJA=DRJj{WsxNlD=<2CGInY0l|k&Kd3l0&nlGejxn1bJawFvJ3aq zt`;U;evG2m@E{S{qjdbGC>BqL-%Tl;87m^k9zkhN71%i(&B3f=w9}8C`CPofEGKtp zg#B9Ar6ya9o^*PP5&@FGPJ*BNu4Nwq6{DCZW4f<4q9?@Fur1!wBW!vTv1FU7&92!n80N0 z!1pLh`qX=}h*~#*ID32t)JST%b%2BBz}X%11da(Q(4LxSf{!QE z!&(x=NZVCej)D|>tnw^V7}+y<2vvCG?HD77rw*hW+c*wbLnaAI4bfF<(c0*3LLrCvi)$*lGXTTBjt9bxnDJ)EH@bqQ~M)oy|@SsMFBY(Yn9n8J;@H zuJ(BumGz>TN_I&IZjRsR+(h)F4Lq2b5jIdHUuV)0l^6rwEX|6DX}D7d;w)UubT@c? z@Udz5NF-|G%e0a7Q_TYWOGZ_${5v8;RY!^YBPr&P?j&}hxkb0t4# z+@ck^DLRlO6E8EMmm+eySyF1$CY5RPll-^>LKa22?eWM$hLK)V8F?LRp$jofo>b9!YMytMn*FRS*K)gf2Zi6Q^pAn=)jnCx*`uXEP<*GLz|;i zgoG(su}fTVZ9Is=2R|wD&4d%L$D}#cwc{^9#g{pw_=kzG0{E~s+}ybc`VRF%;yGA& zn2a?&`|Nx_9>j!FKGB}Wf`D6#JyQqxcLBHrg=kOcmDRyZQg8$GLNU+Ga%tOmAwzLT zgF(TOdm--fR8Y}*h27nM=ku}X`$*06o`h*Zu}ci9*^{#KQ8X$(05>u5&@97;OAspfF%6_?eJPGxJgEP1V_6Ha-Ue*!%wy}! zAwqYOMX`!U_QSwfb&hs5MTZYD#L(bk?+X5>xf_@wI0?0Wz%9nD8x!h1)S~|@>i-Gu z8j$CZ(hq2_S9D;GA(pwOgo8Ha&od-+BKQb(yZN2z?*G;s`QM18|JUbZ=37>R1N7+0 z!~+Mzb#1rztd!W(3zf%Ee@7%<#A5M{`_c-N=Q&v91$5+PnzRYqF-vg&yI{^DMfF{d zPyhPe0=C~OIta!PLr#4xY1to$yr8aHz>GcV7#E-wrpz<30L@8}>;>w?l_b=;{b%f= z;*lBD*m;h2XQ#e_BGJiSu~~DbdCde4rm8xH8z;?UsawiKHk7VeqYvNa2&o z>3?Lg`5&^ZBhvB&k0}|uW6NDr;_Whb`;0-Ug7GewWn`Qhw-!sK6+ldAAW8W*VnJu* ze~>msPf-Gl@J^wga14N(%`ibo z?jQd0zsl2ZqooB*>-pJu`C`CTMwL{MR@#U3e?6NuB!U)UpW-J-g@d!l zwpt4 znKxO^g266xM8RT{pp_s*(Pga*htOGkIU?~ zlg}6Rbx&g3U&**ur%6a?1HF(cq0P*hm2Z$GfxDY&;3AUMMby`4lp_o%=rAlpn>P{< zCgI&5<sBji?Y(hOV;M9RgUB4fXZ{8xL@Rm=8CmfYHJlzRQ>K7sL6gwUgy8lg~xYy;} zN(fl|c73KQR|PwUGlowi_hK=-f|!^r;{xhfQP5ZrWzyb=p?pM#t~DO3cR%GdZE{=A zr7bj4X3oV{r5%X-GD7IlK6tJ#d5fgp@%I!qvhiyZiMC8&h8d}A&sV-=8?syaPcKDZ zM&qYZ3Se)rbO&h?yo|9|NcI$eq9L>JQX)6S1S4A6DOf_l5txD=C%Y^#(~$>B6$>=q z2uxNxjz&pm(KJ@*-7qfuY-lDH9|mZq6We?Uuwe`L+VO_~?!~O$i{6t?#WiHC&coty zhl`|@dek**`-tA#EDiV9(BEoS$;-HF-Xm@!k#P?lsQhfZ1;3?eowwT7(Fo6GJl)Hw zl{<`7ap>+9k=~s2VVVoN2tfgJ(cj-zy6IiEQ55x#5!%OhKIPpNM$O^OvC*MP>zhyE z&l=4>qInJW>gMmE7rXtDnK^UMVGkmFmB25u%B1Wj=7^GrRrIlL5A%qnOMof6=Aig; z7m14JJV8N58pC}IqvvXl;Up7?6758%yWupLcdO{Zj698Eon5gYg}H)5P>9ScagS2A z?hCrhFxgNW^P2bpl>9d4D#@mLPa-(7LY`;xNH}va;{06CEU54ra_mMjbGq~S<4fC4 zfXN4nMoL`}jQrki#YIZN)`C&;2TXBKYf6EN2`Oi3Mw!DN`f)i> z;oy1f(l?Q3`kHKh?T4i$dKXM*#TZYL7|#%z(GvphqNtnn^if_Km#Q(z5CF)G^%i;; zZ*nfx1TJaifj1i=zFux8g9`U+4Rm!YM%&xiO_|NojMsCJSGDdzvjtdN5RyknV&e6~ z49&1?M8GwBowRjXr~s}77DeIcBcs2$BwJaFxUG!1RD*zkyRj9*BGdRLHwAX^5+Wa4 z5AZ31Ret$G2SU3o2oV#xr{9D%q$9$xr(=%b-KXIAfga;!E+=nO^1%k z${YjDRAAni@^zOiQxvGUSvbpQJ@8NJEHVes*>QtY1F{^6v&@gC zI;HVWWWbOyMe}#kHwXjXxq}e)D0}Hvtk>I+$w-USPm2RT6c`08bgYUKFcr6Oxphj} zUWE1?fac{Q+e-yt9eAA7=R#_+K+KyC7+VQ%AlmQ3kDuS->q+{0C^A~6$KbCCDkILi ztWEDF-P+S=31)nC?!pl)&^q<^-0{l2;28|w)Ej+r5A5E{zLdg5CUI?BD3y8-R{Ndw z-@{DGzDIKMNh6b#A#)zt(|3u??kiOCoW+WXpl}gg0G3eXVC&HAQ{m2-(aB=uVE6NA zSjif?BGl@-tT6wV-#_c2Xmg*!X+M(F7fOpbYQrA_x(_wF4JCK%$r;oa*LbNv3Stfr z!r`o3Kn-p=J{75m2**qtRrby!Ing#Y{2#12ZRSYdCm=o!J)JhDZgn+dj$~zCrI| z!oO?I)EL%Z;Zdg}(=x{t$hK})O=9OU2B-IPoik-znGIYAF|0uaUsL!ZJa(GE7AG$z z^Oh+3La{e}>bHI|riA?J>4Im1mb~KHn91A&-8yN$^*PGePZEf!n7Fz>Tic>dcajlo zE>d=LlBUidKDrtHkl2>7z&S>5pK>br>n9Q+zlSEBPp#aLgZ6iq7Y4FPw|pSpYb~|Z zd#LzU;7Cwf?K)Tl*gT9U#Eq(^q@cva>FPj7Iy-1tIFXJLZ$ zmKc7b%PpG#-^p{3wP#l1aMfCanC0sC)it*ArbbHiXA=~YrY0|5*3jk=`mhjOQ=$8#3t@(OX)cb z1)3Gc^i&WOXt{oGdrKs6v%l}`7m$U^wp+z9(bZRWIik$eH=MTHI{?8 zTS}@)Gxl^PCq+AJ7H8Icc9ymje&#pRoJ>kHd6%?;$ft)CU2hRo7|UE~uGHgw(CvR> z<@nAnd~cRJcC|aGMQ|@#YNN5ZP)FT_*RCI%FJJ5kt<5AXY07J25V&?r(x%O9$qRmj ziYt%mG3+R#L#DuWHhMumt-?2cRE-fWsxtz5t3`Q)?`o)Ck#si=*$S|)8=@xI&+cL^ z9UlSPLbxe@JAw+J$|?y|#YD!WEUwo8xr=>M>%Iz^j`2BZZO$0<{@uQ6Jhe|oQ^)P5t4kXmps#uI#$iOrktNRV_>3KQ>ze9*l^tmPeGP4~); zq2Chye$t~R%)BzX_5tf&3AQ%l&R{H4@h&oZk!953LqA9=o2(swE>C8oE>Z^1xgY$V z>KhL)f5#}cy^fRg>}u?zqF{3FXb5U4H6gf_q+c&>g9Xa3_qn0mRa!2Jn+=i<-Z(tu z&UioTc1SdM1QmD$D~R(J(G|`>bnYYnD2DXq=AXG~Wq~72_$n45qP8&@id3D18 z|2an@&t3|NKSCfP6krL({bFz|vn-sU{s?0mXzP*y|= zkQd3CGdmMDJIAq6Zj9ck_R^QPHVwMlu(LI> zkEr4QftUiB{WNDZm5XTTB%jlzF0{_byZu+Bz`{<;I^{r%lv-+un|G6m0{N$<@h79= z0?JH$r5K(Z8H0p4_?Y|r+Tzg1vh)#_#@~#F-eo{HIjAdU^&*qL6GSW1E8bq+N6fUJ znHMRK2#;V0H4*fm-uV>YnSZxO_7cbZ|0z-a7sfdMH2e#&r=O0*=6OlQg4%wxui8OR zL1s%0UrPiolSRfPkhU(#>^$keAxj84WHrH;r7~+IkR(w#g9hPcbAm0~)BB*+*|eGT4b*O- zx?(b@-3@|@rrC2WXn|eij$Kk|f5n8DyNVk$hTY@>y{j_1=&GU>jqZJiH!Vk11A8hZ zXq=I#hs&1iC^*|~1c5e8g-4Ug<8a2K;rVqQQ@DquRoMdkf{V+!& zv^K*@;rM6v|0>NCprskO@f|r~HVlZ5sQ#bPKZWlR8A1?axP^YO7IG!D8DqCHLo+)2 zD&Kt(YQdMfomk^q!rDwPT7fh~ZAD80@FPjTZ`y{?#G(*X)Oc^b9gUaO)I2peMuZzP zo65;{;LW?KdY&NI5u_ZYoIV|tpSqVmSeMrMb5DrDZ@y|Z z--@&|eS#lkRC)p1ySWZ;GSd%XxRGW@Ub2AO#AF;7dnu9()vvL@-1!<(#h95-25z=e zxp9a#4^%Wm4lfV!_=@N*b#d~f$q)zwf68_9Zf7dKUqO{n3F&jB1?O7Q-;C^JpHlDW zFarm;?>^7nua=xJcrT=x7QgmCg3zL=XB{mBBTnIyIRh6HO?+mUfy_fVpwogNd>P&0 zQ+(>tqlPu~z;1GSCrHzWULsllP~!$vlm{8hL6#*LwDPFCo(mW_u2xqap>w*EMsgH$L-F9h%t!U+y!fuV z>d5XXvpf zUYg|Oy?dHdd*$tx3DKWijcXLxJ1AkB;N@G$w)hER*-9j59EBThM?|C;KQa;rD)wMc zwLB9Z<8k4_eqay^ZS0b$w~_LBFRgY3O%{Th4cz|yFu1kxonSA}0b>7VSjexC9rkh} zyndF{$pfKIC8h$N!>NO%cIfJ`>suD;B;LkM9lH5I1-{wJKvW1r@QP|0T!H712WL{M z+EEjNgGmN6EXM?FRImC6RR$%{KHfa>ZzkDHb6yN{CqPb0Fzaf8WZHJdE;R%}&GF-? z0!noc_werpY{FV@nse0YhR1Xk}qPoHHF)qEwK zQ}aO=#%_I}ryaN_Zk*!!s7Fv5q0XvJ$kwYXXhB2l*15+paF5N`At^b{rHJWnB`32@ zROS0+gPlS*`2y`xIG>(TO4;NUN%m57@S`d<|3GMCA%UhT-ux@VEjyjsr1%qzSz&}% zgq^No%#FGtzz8fFHp48FDof#K&i8o^DFl=G2=9^7OGCM?jVIjVr>M@{7fzWp)Sqf~ z9=y+j_6Rjg*2TZS#7lQL^1<91Ix?Wub34kxsC~LFjq7XvPD)Tlh(S+O)XHGI*?wV3 zm0LgTJit@ACTp|^-S=;tATpat8drCr8rRvCMppFKl(nc3`kEr#p_~Qc%arxF>Io1q zaWITa7E1Y!`8;yunu_yYa(+Wi0(6RRnQ3A3^khE{ho~P9Ff4C)dWU7+9cVawt&a9S zN8d3y{nj@n{50-ci%E9UZ*NKqo7Z1rs#t&r`2fK`cpt1=5EE{{i-I=bVwBid&5Mnx zuT{;&eWEG1p(z4Q7gw_+BqiMJ&&gEafUGWZFX>b8hoC;H_upM;;8t4Ei+O&^5cfUs z(e$66gV6o#8&#YUZ>CP(85*$!vlad__rkn!j?UD-vVDbxVj`qgx4Baw5lE;^P255( za2mJU-<-7;WQ$_Sl@E!DrG;Zin;S%vo{y!qWarl1K23z;6Mk;)NUe{Vr~Mt_6cnHL zOzq;mz{ZU|UVlj(9W?u{yB>7d*DFP5sz=l+TC>L&2Y|#sc!qJV%UMbzTS)XvQ(|T6i6ZJ{npY{R zz-yqvC5$>9&gDrFjlg{h7C0aT*!)h-^7M|Z^sE)uL^PRuCEe?cgohP0|{DY zYpW}W#>@mon71=U`p6~0xQS#A;3Oy=)ep{t+nMKxtA*jMX<89#JzIA+zyE=Is#>mr z8(551t}|SmB#13yWDS}*wg4tQd9_!=m=*a_?j6bp1ub9W?xrOK`KBF=J4$PWsuK=S z6vgKE$W~krOftvg|7C(#xo0LrG|vdI@URj7xc?+18+K-}Vg5=cX$ZHtIksEgh>&Z~`vCTK#ai$CD#zzF zv8X>f!ks4M#Lq2)CmPAqr^7m5r9lx|CE+)oj5PI!$=)q`RYeqx{7X z2)keL{kw@E4XzO2n@$H%-chv})Sr$`S~{b+@k31!bc)+JRfqS#IB~o0Njao3y29pr zn_}`3L}EaRGolcIM?atYaH1DFF&IN!BfGrkWib!uZhqmamJ5YvR2y8hq?MPGV6@ms zM)Lr{ASe1EHI1dcteLK&`G64u?rK9<+Ac7gO^*DBOj?nAF_v&$&Ub70egQn!7+=_~ z6kO)5IL1VDkjx$oUX%>OrTEjnWLgdVK7x^}Oj!w2@$aphVv*^a1D6Ll{PLLwm3*+Q zKC?PA!Z$iqIqI)B!RJ|q2;`IHn%6@ppK>(TDnpd^DnA~Wrlr?BfyLe3u z037emH`b60YL~KnpO#@xU0RmJfE0{u-UhKIuz^GMgJI=^Fr(rAe@NM?8&}NpOFRF3 ztdt9Uwb~Uj)cb%i#4wOcC>);k)a8^S~GRbSnY z{4RM7U8k3_5q3gt(zeeOpKwaPxJ{B2EU`Ko3ReQi;!6B0+tvSw;qCIT&J>U8X*L+S zs~7L3YSi=uol+(DxijtaDSpZ*uKs8J<0RnWGp#IxHvP_!+Hf-P89HFNuDN%)l;`)2 z{ZW6l%^*3A)B26B*Of?|)ZpGlUXf33?xP)MnIVWhwM^SLupth>CjUP*X8jnIkW>;I zhZi-7=~40~s8mi~W(T9>n>r;-dXxEwFzg(}&)%fLdLO9pNUDNovmrRREx%GTl$nNU-@eq zOb=1wT$LnF)37atN*@=bSj2J^^)#WKPiKy<6V~$LfL0V5|F&B{#rshw@zZH`e@mS5 zFvqSoOF|z?o2zn)fqSM##S;Jh^EN~&I71SPS8mAwI0U}7Jz6LydA+f(Z+)>M?uQ2* zUndaTjVRSy;_*p7eh5>P>brF*3W1wy+2Q!x9Zum79W8X~#GKMRGv099-jPN5IY2py zrhRp)TTHQVuv(Qxl61cSEiy^v(~DtX9O7j{zC#n??!)Nb28~kitV|J|mw@E*U)H0V zzHvO)mAIWLBc6GGR~=O*)(hJ2`8gJ=JOfrit!wBo4#}wRAI6;ew8O+)6@1JhMxpyb zgcP(UZNPrHLEO2-qDN*ZdY6Ay9!qNn^#)3QP%)trxg`S+Y>|yt{x+KQjd%hYUD{Rb zJaLMwF-OzwUY5m)Cm`dW8dN3$hoASG1rTZexk7K`RGWI#gv|jkNtT#g_CKTMvW;IY zUHf))v0c|rIaCWEeW(`v#Ii`sZb`paWg-wq^-XWUF|H!fgr3@1M#JvRcMb~j*URGS z?oi!~3YuBm1kKYhzyu3?&^(lf$>XZ*d*9&khy)!o!&%^u1LgkH}%1>v_azj zfGn6Zv2km-askGocS-jn8-n2Oe7e1GOCUwkTK&I9-T-1s5!ev@dzV+%L1;FV1nifHAu5^EJ=^$^c5bj? zGobEs$v}T=05AXXKxocxDB*UheEFTXjV0VSf}BHA50rlR7{9!JQV#ugy5Q`MBpbl9 z_)YA*iUhfrUZM6dF9D!b=uP5!K@rn!}KUq9~uov z=E2njP|gf#@g&J)oCA`qKqlWtU4Pdp9VD5I;(B)wS7A@uu2m4CDXmpx#>SoPg8S9P z^a1?bjplB4mi;GQ*}BGe9v>Fn-sfF5kjaMw*tx%S!Yl(3yO)hdPY{~Uy;Q>+!ebL8 zIzx~@)5AYF!L6eKt$~USXEe!w=-}7O`Jf+mT7E)dR?R(t0IHZ`4>sU$@>H7zkr{Yy z_r#1V2TFTl9Po}fm}kmQ=&8RTw72=I(L7Nz<_Dw|fPV)`k!E^o9!pLTf~+87omQzv zT|G6(R7JJtW1|QVwYHU&2hj<@3&Hp?qCaJt2jowZ%7ui%$19kg@9HGxT#nS+H(o*- z@OYWCKR?$VFPNK?d@0Ia<+t+xf+;tYkjdQs0j{dx9-D>h#^+E%nl`cZw{W2a zgD^kj@1`E(JHv8c1)6?h7sm=}uft32d-K)owot3qtwB=3*as$`m>s2!{(W`FJ&e3S zA6(BH(S__bOu>RzTmG(RFHf&O5fO2HX>v@V8~0cH4-a&|L)*uiv%0O%EP>ZrjfhQJ zt~sWad`cBdc1ZKKTczsyw$s{$gc6Y}{lL8rEN$S-~uPXu-Rdp?>Di~^3D zmpu!*0#2IqXQC%=XS>yQ?&g>7wwJk7zkEIlq$ia^AKx~&MKPZH>A=vabsDqfO5d&Q z;Ymu@-`Ie^`}0t+S&KTU^QA*|4G(cC?4?5my~Htf!Ak9HC%Ac`y4hY(eXM$Oi%-nz z$I4=N^AUfhG)}6OD^=?Ew|s1x+<#^Z z7KCDw7DeSo#ebb)kW_nx`aI8E!y_r}Yo;2lJwdr~J;bHR!qbumwG0Rru)8wdH&3bA7Pqdv@Pkwg)}yx}E2{Q0ta&#afT&%c6&E zZ<9q=6VGi;==D>Fk>4?L4-hlpozQn>oU8Qag|)oM-!vXRAJ>7q>5J!@XL(efKB>Ox zb5T?Lvz9-7MNX_cJxNEFgQqQcSN3ho_O_Z0bS{;$A6W1CKk_&3E*pMZ-r_SY)2MgF zu2?Bsq!{o1Aam_ZsXqv(1&wZa8 zV?A;-zjbiR+nPZ7cd@^03-JI$O@Q#RXTP_nXs_oErn-qI5bI}q=FfF2l*_gYfrJ@9 z>yh*Mt-%P49^i<{<<819N!YYGNEz=+V#HZOyH6ltTHe=JwN?3B%N4^f<+5pn*UHnI zzem5W26i7lZD<-!TQ{mu*tIl;r)x!r{eHn#t36o${Tb$qN~wK-AHzaHE$(M>#cw3p zfobRiE$R^_3-j2il};8ajhZbu^Lx!WY4={v4>JBsX@*4joBRyXwd)**Nu}0eSr#2% z)bl?o9@hA|)41VhYS%s-=FTI=gm!RfFjmtbTC9cl9B8gl`wtcR8lGl};JFL+AgLd^ z2+`d>W|J|02~AzmIQ-i@X{r082r@o$p%K0*A-wG4ZXr~=b^P6>b<;O(J-;EcEXCJj zBt8B+QXA;EcH{1@2H{i;*>=i`<4fI_gaY?o>Y0ScZR?YI-S#Avk%-bYeBd&1LSmOC zIy;6s;q%`hDn?kgFo+IAG&mv>TT%04k&B> z@~&o+QTn=|YzqD0=~sOz`QH(8;Apq)-{bmk718L>g5-6$RYC3qMaWD5IM#ypPqytjbbfSXJM5xkoqqVhcX} zch+!eU%D-_riLxi`fcv{|I@{_h9!OP@wF{G9ZR20motxYTu*xJ<~9|KggbG*MUdy%oqsR&mTEP!tjL1T?ShQ)++!^Rg<*f?l z(9b=xPwg%dxGr{H3ZQ7NyC`b0Mu#_zWI7MDVK5HPYmQd8wh}Nh;8Gz@5cqk*+q-uL^8kDP@zs&af1>^F;jTwOGd6P-^C1kujZhx58@KaJ$S?Kvr|@IV zEmwFyou3o5CI413y2rxuUvwSl&98;*H? zl`mArPAX==JjnpIi7AxOA#Aq1ozK%5R!REF#skLoyu^I|OeZctGoxfkr3?gyLP$}s zEwA_R^Fex265<-xw~b3860_1$vh>Rxnv*dM7jp{D9P26eNADN{(PrtQTlaM`&rDn+-fTC$8oxB5yK+;PUqlBvc-kFFTaFs|N49w8@F zGAU~tT0q(gi%sVa}?zu<(8+eubw-IUf8hKF(KW_*YYIUcQ%}1el_XO;lHP5 zIK%j^Uwue5bfo!h$mL8S#FhgtBvaH(|ChL3b!tT-yi7dH83@xY1@9A8t99cU?cU)- z_LL;FUOPpE-ONiuL}EI4ZR>`msU^h{X5R8eObZ$bWMYlZ;|az-*cF{Yz4U5NO>yV=5=&$YVYizN22S4h(ZuvE7x$J_ zv!vG0Vq1r5RGx&`3gIxn@1wUmc*E{oSrc{*ChlmgE+{x=CTBz(Hwncj7@)P^d>4en zUea|jlosL;IfUzpn|5~Uzt2Wwo0o;c-og%k5%ZFC{cdxE?Q8!Eum`KyC z1Y$(Nh7qWp5R3PaT>=or&T_bf^Q!eUyz zy@?Jg$4L{!)J!(?n1+6=kIx)Sm#YG#$3(}Z?gzm{+WA1~x%`%2cKJv{HqOnZVh^fo zkc5Jg!6*U}=KTz?nj#Mn4O8m~OX4Mydt8it$aP~lB@iy-*m{}pt6dGgmx>1&z-}+Z zW1u7f_fWi($L*Rw6$;*6JtiVgAC}bWKT2Tt0#;JlJ;nvHEs%oH&@KQyn;?)s-nQsV zS7tt=nc;6|<%+!~Wl;>LRDu|cask~`zsL9|m0TJNf7dYyZ)`;^8Y=!A=XQbD*ZhOm zYoOYI(eO&(uQ17f2$vIaLt^%b2sNhtEhbxLA;o=%p!SjPNvb^$s5jNo-pQ8D63S1G z)MO`5{JFZaHms$ewkf&%e{8}?`s-JIZRwx?fAdTpa`fIhepB$nw&Dv1sD=irjOHQ{ zh~?3`l)GoH`dfb&+jRPBiNa$C?Oa*k>IWjir-cXHtw5Ag*x@r8eRo^>(}|14<$+D9 z{4YCo9zjkByOKTW*~{;NoVe`b{M|A7EnsQT1FG@oUN%+T34``&Ukd%~N+1u*doKcX z?mx1TC_(8)0z%*^Iy+@pxxS*Se)R8^0AF=*fg_)(k2!QBVpJsUN1ej{lW$ z0Jb-;=aZg$3CIbgNKBa*60!WXxkulRy@5nsLwV8%$?U&n=zF+Y_3ViCJha?nTlV`) zA_dgbea@4f-hTQ%Xd(k!;l{1Gebx%-ApHe>02}GnDY%C6UmuAdW|Rl2JN5n0SFiI) z(_RNX`&4%XlE|`JC~EOr3UaVy(Shu*exrMXzYCh@il@)+k=glaa`76+PVFe5jJaY` z;8_kQ{V=fd%&P-!QKvI!$UvsA+9v_HeEud9(VMlT wfK)=uU15U95wg)VfS`Dc=*5!EIb;B;csytUyh#RF9qXQb?)Qcn;UB*DUt97)(EtDd literal 0 HcmV?d00001 diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/PR493-EXPECTED.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/PR493-EXPECTED.json new file mode 100644 index 0000000000..973aaf30f1 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/PR493-EXPECTED.json @@ -0,0 +1,91 @@ +{ + "note": "Exact values that verify.sh must reproduce. The bit c is on the 10^-24 grid of PR #472's assembly (largest grid point admitted by both PR #315 moment engines with the inherited 10^-16 bad-branch allowance; the next grid point is rejected); kappa values are on the 10^-18 grid of the six-level, 47-inequality outer assembly.", + "word": { + "R": 489, + "content_sha256": "88435b75b8d6e5c722eb2aa1449f3a5e8e9601a9ffe243839ce1ec932ab76547", + "local_histogram": { + "1": 1200, + "2": 1440, + "4": 180, + "6": 120, + "8": 18 + }, + "source_destination_gates_A": 577, + "sources_rewritten": 117, + "five_stage_payload_bits": 100 + }, + "eleven": { + "bit_lower": "391360506745414227149/250000000000000000000000", + "bit_lower_decimal": "0.001565442026981656908596", + "profile": { + "1": 105600, + "2": 130560, + "4": 19680, + "6": 14400, + "7": 7680, + "8": 1584, + "48": 2, + "56": 2628 + }, + "bit": { + "live": 9600, + "physical": 9609, + "maxchild": 56, + "rank_mass": 745536, + "hosted_residuals": 43032, + "prefix_bits": 2119, + "charged_prefix_bits": 2176, + "coefficient_bits": 2119, + "three_level_coefficient_bits": 6411, + "charged_three_level_coefficient_bits": 6464, + "row_coefficient": 19431, + "halving_depth": 3 + }, + "emitted_program_sha256": "e37b52e4861c39154b5891460fb45df8651c92cd68961078f8f06596f057c822", + "kappa": { + "pr484": { + "kappa": "662515748707749/500000000000000000", + "kappa_decimal": "0.001325031497415498", + "binding_component": "complex", + "complex_lower": "663394767670133/500000000000000000", + "role": "primary" + }, + "pr471": { + "kappa": "260706019542937/200000000000000000", + "kappa_decimal": "0.001303530097714685", + "binding_component": "complex", + "complex_lower": "1305231506267591/1000000000000000000", + "role": "control (complex supplier of the current whole-residual frontier)" + }, + "pr458": { + "kappa": "323880830669511/250000000000000000", + "kappa_decimal": "0.001295523322678044", + "binding_component": "complex", + "complex_lower": "1297203880559577927527/1000000000000000000000000", + "role": "control" + }, + "pr448": { + "kappa": "358867191156973/250000000000000000", + "kappa_decimal": "0.001435468764627892", + "binding_component": "complex", + "complex_lower": "718766148669433/500000000000000000", + "role": "information only" + } + } + }, + "controls": { + "pr472": { + "bit_lower": "323442810173099014031/250000000000000000000000", + "kappa": "646049779721139/500000000000000000", + "published": "research/e8-r715-whole-hosted/EXPECTED.json at 259c684: bit_lower 323442810173099014031/250000000000000000000000, kappa 646049779721139/500000000000000000" + }, + "pr445": { + "bit_lower": "316240894019344628547/250000000000000000000000", + "published": "research/r740-hosted-eleven README at 40ab91d: 1264963576077378514188/10^24" + }, + "pr451": { + "bit_lower": "158442042752174644233/125000000000000000000000", + "published": "PR #451 body at f3a3815: c = 0.001267536342017397153864" + } + } +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/complex-network/hamming/PACKET-PROGRAMS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e98ce5d879e99427347acd725efc3b0c96fe5c13 GIT binary patch literal 3400 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 e_dI=Q!m?dDq^_Qb_LO=O*!k6`PFYMSoa_QIo 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

o3;C6)`B%CkVo(5qkOpI1 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 literal 0 HcmV?d00001 diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..ccbdc0596c33ea2e02649a740bdc2273ef320a58 GIT binary patch literal 23365 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

suS-d0@srcOUscmM zXd{W*qYNM6$~aV}UU=ZgUa83^<+ugol=f_{+aSmBHRr$rKD}wN`vhI8|Li`q4eD-d z_t(c4Xee#zXuv9Xe!>w{O2BHyZeQRxW@>n-OVCX{0cy#N@0rJKC^qkjeA%0HYd1=x zxoV|!7*EhngWziEXtuo=ZR}q?8CQaAQ@;+s=2pWvSOzvQNyN`%9U@8fZAL1NNrjW=wzSu@b8;1=Sc=S!U+g#qnC=1Y|%1zQ(1>bHkc{I zT?dt!`1M)0UJ=?E9&nF+HW2DI!7uC9+OEGEpL!fY+U>VcokRq%QCY4t9N9CRfaRvg znTID&l0fJy1QR)W>AQz8;$(c#=f&sb*AQP^7fAJmR4LK-L804ezF%T?NTM(IkwzlW z5oyP+)OZh%RdEmWP2`ehpiCZ%Ll%%OLp76^?9JR3pf~@Zq7?pxZbdpHy5Yrm2R_Vz z!5np#CT-Tzed!9TDiIZ|38TYn692Z-vSj>*)w*VYsq_wmnz#xU56z(j!x>VfIjTw^ zE5VWaKblH*JD-a(xp#uuE(~z3P4BAuX~+Rt~P>@C+@=rZYJ&is(aGTP`~a}ewIGhm zoKT;$?M=YhDooS{U?=VAJhsr1Er*$Jw`Wp>qF-= zQh#q<42};fxYj(6%b)7la7&NQGm`8GZBdA|iGu{W%QH`O@jv&b=cz+>i4riG+Hn@v zOjRxQ!}5zG{xVEeFb24bTky$Z-m!*w@BT*1S<5`-K}E4mbo8*95;G&0em{YLn(`dW z-R|EhudiWIsiFka7Cdj}_jsm5iow{uVhUoLB2qbckeLSeQp#>EjvwL`atQYs)J|^ z3`~Nnb&Z7_5<%i2Lmn1p|JXG zdr!NE6nO$%V9*z@AFrH0lajPVi*904X98I#+ipneI7#WA9fXmv8fp^vr3P#CC!B>h zV#yi}xDmDca zr_!4Lq0D=tE{lt!7GYc^P0Ox`DKmEH5!^YMK4_ZYyH`mxKW}m&^TZ&V81xfQ!&>Fj3ag~o_TQ6fwTY#uPQ!mLy71rsvZ;x(BTJG(I75Y3q*(h3MP_T>D zJ?-#^ZJ#OWdKTcfU3#j*b!&pGnDo&T?7K*iWmPPu;4HJ*$%6z5D68^uf@T9+iPzN-yDt8fY|j?N?D&l0C5D04Z9zcoeKYoHQc>xDx`83GeNhEU95F zWj>{+t~p=;jG^QdDA6+)vdP<5X~E$s&6>}v=VhQ;42D@Pqi~cnWQf~jLVe0x&7M;W zUbTLSb)u=$)2tTlZA!I>62ouM!|hv%>S8ahp+Id>B1G$`4Fbn@*^*fDxZzbg0X612 zZ|YBfyqr+#GiD*TzN@d7op6x@7xmx+VDeDJhDAg`SgOMCsFVK7nsdn4H3rxih;)Z` zMJiTxGORy3z1Wakw&&K+DHelZbW&+hVkav8FcF$W*^Fu8VN8$c5I`}7(c&k#>8Lxy z#R-U|9Is4}8`Z5YPxFB$a?1sQoCn5?Xl zsa>?jje1>nma?)Ux!mj*?=u(F$olgqm@=9D_oroJic)3 z4veWPdxv|)Uqsytf3K(ol_DDEy%ot7pJ z`}!Lw7Q1@pj=EwfF;F&zOEXTmSTkz~oo3$TKGE)APZ+bwRTzvvMk&46VeMtwIRqLi zQdZ1>CoE4)A;|&b9tD6dQhupS9*eX7ii#eQGI|V%&xt5RYb*zcW(ne27bUGSFAZ7_ zWmW;LbZpS3ko8+js%BZj3($VKt_7Nfm0kA0WpGLdsE}qu0oYa1gxUiBs?117mqd({ z$APh6va+F4ku^a5z{O?dT1x8PI{DoWjwwoJt3Vi{rkZ~2uoftk{HpuU{!SNx9JN_` zdDS$aMm+BHF1;ejuf)z%d4^?HnC+}6%j{zbHStzuCQ(_x7h7^4R*?Z>53$u;FNE-o zaepsH#G0~UIlHX0R;vuO$>C7 z>whVJtU=8lSGlGlei?>emA{>S1kfi9=J~w99FT!Z%4Wh9Es>lh^6TJy zWJI!?{yXxfk|IV@94`?+U)ML^K3JQ_#Y`*6&+Ag+n(J5Kgpni{wAo?nCI!Ss&6B_&i`cqCc3;UXkU^|>O#cI* zO`0eQQ@X%W=s4l%jf)ph+zk?qmB?b^cX6;%{hMi5h%TM+5qX{@;w@EsQ+X6c>F>X( zn{cw+!j=6=iF7MGuQ|1Za7FR#$xcAi=S{7O$nBhBoD-{0NrYmv*@y9m$9{_CWOSH7 zyt+(3{-CO(=U)J?%A{qZiS=@_#9|*r_j7*DBZE~uZi*_ z3dae`#$_88qd>OHAgWYM8@N3S2n4G;#3DSylf>f(akwY&G4ncC&SX~(&;>oPA!;FiNm&vg}Eqz9C16o;+SpKC6uRY_A?0_6rN%ZK~*s}^?Fh8i@A;lp*%lir15 zn&*_bdoHlsXm}aJqjZq_ELWTdf>=&*e}v20URd=Jo3$g@Ve=W(Vu8~;d`!r%XW-@G zKrkiD+XrlQGC)l!nn09jVgdQt9+2R&4;=4P>Y6`Yg4dVGvF{Cafk7Ys#p8^qMy19HCDuE3|`#J{-I? zBpK2#JENU>{BjawFdY$LlOb#8FSK_xXO6wdgdz&^FZeu>XEBc9gN0;cJ3ZZ72%js zdz(M$aZnlnn*I;jq*R#$Siwe_e{KE28q<|WIv5R>to5>ZiqM>b8!d7nElpza$HeZq z!lv1P4uX0l1)R^Ai9K!pdHSmVHgMk1YHi&EDK37M1hWf4R4^KDdWhJ1m~fvvLW?S^ zVHXCJPh62EroY2!PbaRsp~Jsl?uGSKjT!*4MH#0rl00du9Ry}zMOYJoRqn21sA{eS zv-SE!Zd*ZJBvORUr`9O5sm%blvhu^inC4sREnY0+2-3=~bu zL9dt)l5C5p1`*!b8YJQm#>uS96jkLTN=tFZ&@9@-aL8~bpU5bn0c0=ku>0Z4)jo;a z5EU})BI~JW3poRhhYgm^`+JEIukid&QDPdQR&L2 z#6BBDV|3d-+G(cHV#pt;1m{FeK{p|CtzBz`Zn||>Cu!+V?lN)#Pyub48>%AVZCQ2? zKc3IdFCb2K)>XXs4gR& zBy|~~^=IXYbFV>6r{jC;hF1hC%I2Wt2rw=^l3=gi)PXl@^(C5)_&(b}ICNXvrJf~N z3>9fjeq7}nq2B;|jC)a&^J-CNTu|B6_EX_=b(g90m>-W<=UPW(P#s~PbjlF0DrJr_ z7C1Z*NrRRQ^=CHsEBD_gg-Q^Bqd72=I{lwoN|bmLabN%IpB;26t!E`3QB@1@2QJq^ zbThvOZ~9CrH|Vf8js$a3heT4*q=dP{*;TKE(X#Q#)HX*S%g+a;s_zL|pOMi~|FC#J z;ORni=J4e+ohe>Ub*Mb1Nzi#+v()w zL9#vc2#!%G7A;CgW)gbQ0d->!$$8ASYjhEv$t~^baH~4rehXujj5s9sk$5=No%vXF z1tC>Nc`rna|KFoA+oBN)d-hJZX@XkoSK#GXO%MLEf!hR8B0m3NyMSm6nVZxXFC|D5>cz(xj|?8Hk=3r;O5~>kH22!ax6?7e zVjF8~W>+#9yQFL$?%L}%OlM14kkNSyScU^nCbAWv2v;j_C6)J@JUbZnjxq7IbEfe8 zJNX5CEjwJP?=3cT?<0CCL3MS;oPt$v?-h&55;On+}mU3*lO6aY`n>cdIbW;UHA}>3XcB zgGy0aPuqx^w3LYSrv%>8E|p4fuf2Jc;a-4g`O1grI^!rDyer+3uc^iG2YtZ?(}dBA zb|Stf%RuBd-?|YrD+v=#(nx@rEWwDXF-vR)9S#^BbVB1|FI%2Y!FINDAadnP6B`WM zJmTM+mfbG*kes6mcV=h@VebbOQv$<<4k8~j4C0?wI9-V}ehD~+p~890w7Q;t4lNRD zaN^6~caqD|5qSeYbPixU!cfiw{__8xYv-UL?Zvx4F7hyfEsTbOTt1plH~6?pBX$MB%+AA>8ulzD z9n*ho$*=E=$g#?m`chUCzkyyBt0hk%ci6yjSQR6{6kVd|dxue5G6(usOF!|G z_8tsYVP3)DqBP_*;BsA*O#AOJca^isoo0trg-iPWURZj0c!Q}H(>H-6T3d@O!QR1s zWMW5R_D@W(%sXzBj_e5*`42=s@knx%z&VIm z&X%)b4uzzxYf9m;11U2;$qX+!`$b?X1wBe`THObwY6L*0Z3#m5z{(DP`9h`DkRgME z5?-8-@&gutcsvvy%nT^f^<0=~Z3mv0Q}hON6nw?R6L$mRG(;wjvFr>?hMo`7ZX3XM+V2Cn=$I7S?|O|Sn;zo#5i(dx{jC)T~c z99N8panGQJVFxIme!eCKS7-C4?RxXIi^V>wIDAzhyZK$~68hY3%fxdN!;uEwYoDJS zY?=2~R{WE64N^q5ZbVISp`#oGBY6`hv#b(L^^ZVu$=_lpTPk3XiP{VYvK~A_1;e&i z4@(5iw2i&b_Y}`KaGp{w@7DoLqTqf=rqYTwsK$Jqxj+47I`ZH4x1@KCVckbB@1wuM z{P@PoQa{{C&=XgMVf6PB_SwBb$;18P}#9=BLVw{#-i}tzwW~8~B8H*8Rp0 zlt3Y*h3rj+a8_JbpOiL+hMZpOgE15$rLG`Y48028c#MCj%(Sayb+}_D%1>I%e(r}0 zf7ZD4f2^r$2^bOqlJjXXaGPSgUNVLO89g2S<=pB>t;9#c6CUGC48KoI`uZ~h2a9LNHIfzo0y^EGIWglB$XcMh24Eis*hE}W5 z(~B89&fp^W;es!7tiI+n`ntBee?69Q_Po_OK4XESs}zJ8dFB;5pfH8r7=TpKF&{M9 zAC{R+`K*{SFFBQ#p!qic-h^P%NpG$FzLq1cNAHa7IS6dITb~gVEyo4*S_Pydo?~MJ z3#?5DSDAPsL=d-jCfxCTV1O$3F~O0rE^Zih9}ePVe1<>=?O7tFqFXgdIc1!NDYU6k z7r(7|p^>F#$_c~vGp66vEe~=<;>xHR2j?oV6rFm5345tJnuJyZfdEA@Zley5=PKt` zs2f~tweSn7Zz$|OXT&mJx$^Edgk>Wn9VPD8Pmw_}9>))oEj?8+Bs;`wZ1i&8UooX0 z9~=P|##S{jPg~O>>;xaBqS-?JZOt5`R*qya{?!dFoYgcPvUT{=L*6^lTpZv|htWc$ z)>yrEmr_m%_gpF!L3Jnp!>62`Az}BJZTx0?f;cQJK2`ewB`ccwha$D`1m3 zQVeCghSzJD_uVBRB4pYH5lEl4Kga;o8mG8&mx!Jn^mhT}Ur<2w`4H1vic4Q=yF42R z6vdhB(7Z-k3&)>Eb6M`(Df0KSAP&WcBZe@*E1)B(U^_8jBBa`H;mlrv{D-oy`E=1_ zO`10FTSa+1nSw~d+G~Q>;H#YPlsFUw`}^pN14j|&bf`FO{!MJM=V*?3mL}KPDpGC*n5Q8JX--2 zKRb;LqssXmL3IeCoMCqHGvU1ADKMmY*RWpyDF>88n8hC2!WtZoE)pFD0h|XaMFG@s zp^7O3IzODE%y^oWi>FwbOrpBDnwwx9O{NunF7^3EPNM{yan4Z@P%7Fplvz`Q`OU0Y@`#IQ@^Jr7sMH6KlV`I+xgZ}E z>#kNw?Hh?gbax!fVZxBw(GfnTc}U^-<~kly%%T6$Q)})O?Ii8j@QO&w?M2xECfzsk zw8zMqiueXJBwY=7)#0CK4?6aeT1O?=W~2KDp-YvtY!Oyw^E#dk5pBQWH_*3!Y+#gvK&y z=Y{P1lV}n4XlUCrsJDpEL|f-@9Y(5*!PZX|M`{*FM0I?7I<(O2TvJnz#8u8>d)jlymIEI7;HkBcfvkjk!A*q&{CU`xe4j_IVC6h*_=@J90 zPUbG;603Q;7rnBjI5wE=D@tqnADfqC3q*cVQ(-LrJucVkplnbv=5?GoJC86?$t2?# z6Srb3C|`i&E}7=cpGRZ>Y{l1Xb_m=dcK1@#R`|-cQgvVtoKV~0Lz7YpZJ|805;RI8 z2;N({z5qv!L152t;JN;Db|lwJ4Cm0&l=8CIO4NBFS-`s>W0Y#S;R1@%Occg)bcr-k zpV|akM39q3I+~v}v02C}9U3OHi!UX@Qtuj{z87#4meZSn!ax0pw}mvWR}Bu0@+gl; zhNn<<&GL8hY1Cq=)m{`QA&?fvMU`3;L0($J1y9^7R~hV+?n5)y7uPxxA42UH06NKE zp)MpV%v`r-KGNV;&2x*%t{pP1jY7~ z%DWDq^pC}n@{`Jc2~V*%J2-(;xeEKNDg8j1n+WoM`U^^$>u-i)E!R1|zF;lJF%fB< z8WmtAbb$s)`H z_r2ZC6s0>Q^-B&j>m@2Et6bm1?o#iB2d$n&62wxRz&)K+}>$PAtKJ z7Q3Oc2jgbn0f~YP^LRsLSKhGcj|BgQcrO!cz#`rd$0U6Aen5417bNpyQJ}R9{TNU} z8i(lcHWCVLGkjwZ^m;-KD1jS7r&-62TR|f(AE2@)$C?o4o>^){WeTyHl1&q-%o|G? z1~4GV?lmC}vwdhSHtc25h|3WqVmAa~%oix{JN$+q>Cpl?xLc`pHpz(!R^D9iKf}h>QF#8p$q9q#wq@r6Oc$*ijhEuVWuM-q26-o=4o9JYx; z-pvUG4;`s$riLNfCgv0NWMB!mc)cy(aMLyJjpW@tVPKg*p#q|ziG`h5CtEqOUu$5u zGcnB9IWf%FNzt=CyKF#)x(RuZj4s7?Oa2KJ2M4%6KVtERndT;zz>aHT4NOrfqNBtB z_jpa-SOw~6DObx8s|{x}s*O$BCBG9Y={gpJ{B@qAmWG5DPV}S`}Ur!Jx zn?1D_k2S_!ayFp=SrBKb-Een8EdsSe4h4SXrrl?9VBnQFA;@;Sl#0-iz@3qVsvi#+ zc+*TMfv{mIw%Zm_Y-Z1PW*HpVCsuI!2jojWLD4~}#C@R(%L%GT_D;;`PL%$-P< z*wf9&BL=|O z_WC+v8EDuW!i32aYr828g(>k~V!p%ixUmRY#kCv|=r>k({*>Y^ON49;<1jHFVV-ZS z1-L0E7J(3?bnjurdfMw8SlFc>6Nq zFMKea>n0S>P{55apcLT4(33^MC*IufP8N`=7q~U+Xu&^f~zE*FS&%x9@-X=D+>?%U}NIZ~pxA-~ay4zy0{r zfBNQ!zy0v{AAb7n`(OU`n_vIwZ$JL_&G$e3<(vQf^N&CM_P2li=I4Lu=xx^yeQwygvN!FTJbZ^@aJzAAkD(Z~ad`oBy8v zV}FvMei=zUCW<;9G%>^vPEFQ>T7@UIpe|}|+{C0eI<U@Hj)zNMd{lnlpv93Osxcc+LOMJMIVzU_g(yVx10a??~nif z`0tPZ{`l`x{v*2Q=U@K*eW!sw{HH(v@XK%ilj}5*5K^5M>U0rnf`}IA&o5B``Bh($ zvu3@%EB*f*{oz{wpOE_hWd0T$7i|1D{Yn201ZDZgAG7?b|4-!F0z-u%{z|{CTz{m0 zd;Ue^7Nl(D+8TWh(nd}Ea{@j8n<~DzV*Z#t|1Z@}f0f8k<&X3=(Qm8gN;0=ezi5@) z(N$Iid^(h}F)`6cc@w|dF{%6u@&!;MA8 z$aV4@`4ss#iT~H}F9ZLw@GlepQkI#&x5od=zbw4Qkr%Ht{tbVxT(R4#fjV%W0WFdmbYJ z3ZAb+uR4`y_X>e92I%cxtw4KDiMM-oXq@KCY#e~J%&yt^1PZQ)(T1#t(Z&w6=L#Ba z*j3$2yH~XV1vkT^#JU+CC2U~ZCEnT$ovX+%he+*35QtLO2IRYu1)yko5rDeyhC}1M zThVSEkvxYI?e-U>!tl*@D$khF%m&O>R-o=PiB-k1DtlEMQ1`jtO5|mMA0Ip1W*(K^d zlUoTBSSO|8$eGQ)NumKzZa@z}?~e{}0Z6VfM{ZU{qLpk_wE?p#yM*-0C}9J4clW9& z_-8+Wb)g0MdyL%n<2#9Ev`^OWdp(pU9DZ+pm-?UIsh++}Ek9{f&VS&m{XO$>dVCLb zfSLyy_uc|k_xQ5=>wT2tcK2<_;~t&B;});$y-*D#&So-P89S1pYXd3wlN6rM_Xa#E zfi~a6W&lbFBzVLE0(EUX!9y9$s?ze{2fJ4Y-1JGXd$kc@34n}qWi~zu$*pk!;xfBt z<4>BjSwMLb70qsA2kLVLjW+D6?xhV#xD>N0yTrN~0+LfZuKeecB8V2+Vd!D7f1pxqa<0o*EYzfEsLz+MHUK4cZ_ERg1$o(KaV?A zByeF%`j5U8IcVwjQdU=flJ8~IiIXieeqUZPP1;C_(p%C|%GjhuQge(6l6m1Y=1Yg& zm}wD9^gpVunS7MJ*Mcm73pyDuksOfpe}2)XDJJu!e`MLK@=fsA-yd0U3eL;hMvhIP z#9vt2?xK=) zZ}hW80SU+XBF%^h8T{NuBH^Gv;`&k7gjQKZCG?J6T9JHex)*s1jt$G}B8yHcm^ePm zU$jG{Yel@zWlOLIDapp6NQff0>MtzUCh{tpd4CUT+*PD#(VL5QG=FD>b`nXJ7NR2| z0*-$0le_PPbl(9Ck7$*Oa9N)fcsC`G_B3eg^sS*E{8VK)CIVki0QCBhfl;YlxOH@37& z{N(EPI%Pqdr<+Z-Gj08(xBR^9bgR3&l#2D_Y~?n~3@M+UD?W|-C?q)^eI?{{^jD&e zKlBS-#{6r_IPCNt8WKS{_mmnd-1o#d4r9C0<594q z>yF`{-Z!jvslLXh;mx>yoVW6g&q8`*jn`wc1G?S(ysPz&WvXQKs?6Iw-u)h97(ZD` z-WNXU;OBOAH#svlEx$O+eje`+ZRNR%?=8+$)U0HAt{xk_tnH}WI@}GBVm!Ro$27LN z==#`(@r2G3QT3%I0|0qrna0wS!03De+@(_>CrJNhnrw8MYs}Y8qFu|6#sk7+oqi`p zzP{~3+Kgr3gR3uOAB8^r{HTs6i?{fLt4jLT^1E0kQK@fV&;5LZMm8QGw}<}asRX4#B8|# zO%(t5xBOhG#6gegzo?^=@sf7heTz%Ebf0pm^`^^-=u*<0q$EUcyGgz9OXv09N^6bH zwn}Zr>%se8ITP~1;5AbYWxO2mK6HZ>7)L_tzh4%`Cx>vqJo?y3{darX{%o(kgew|k zY<&rHqUU@#KEzKgTUK?=v}$%L7Tb z#(l5P+vE&oHNjls4JdZE)73Whe@6;${_HQY1XCUXS5JG^w22dg|^6 zY#bjpS<{zhm0pZT^FBOHcH0nVjBg?^Np3x4B5RCoP!?QayJhbn`)4M05#~yjd5Eg? zoJ!M+T&qph)217x3DZNJ*uqW9ru)ViZOm_S_=lY8{-(e4 z=5A?~Z}*+Gh-b%@KZMb3-NY;u4THm3D((C17B$6Q*HK<~r5<_~P_NfggxSOmxZ+*Ka48*hBMUW)ijULWWrd1Q;qeG zhk9_C%jUP{MZ_?_E$3&s?b}oKJ^LB?RBmfK z@02-qGPjkV4ZTlebJ|tV%zIGSGC2D*oc5ff!C;j2onlTCLqQqA_AE-0c<@h*e&qMzZsUE?G~yuF|j{rsq;tao?0U+nn~4~_2j zBn}n#u4`E(3abWoeY_Wy^!nZ|iW#Uy6})>bs_}l*@-U_-#)|Uibt&YIkr(Z$XIC9~ z-PP6=-!=I)e3lg=4g0mLjXe=Q2U7_5xE<(wo2Cnohb9`|wVtwnzbV3pP0mdcK8AS{ zg-><&APb+?Aaa67KW;58^{*Oti$0LIDTaArUX#e&^uTF*ZWh9K3hN#U_WK3A7r$)Z z$N4N)o6kq;<|{UH0{3`L(53$!}D2OOoY~VF+QfShzpKviMxMQ9BcCP zAzZrmxc1t8W3Qa13^Gr1nRSrTy~ocNTN!>*mNiz1r&^epZ$HpDgPB~+KlEXKm?r6* z#kuTPyygD=(Y~c)BA$uudD!FN6P7)*3Vj0_6cy`xu&$T1)f30t&C+-gi>mbG*1bC5 zLgIbq=-^V>?Y_DBuLrS|Z)(BN+#7?7=ildLaEr*Jg0;}R$g~o#>T4DHsI6{#O-*B+ z!jgqojW_vSmA{4=Pm_(xBCUJw(!2ZI)?>+Ygi3EyC#xxCQeJMAb=YRV={6J#+tJ#O z@;v$1`Yg}=bQ2n^b@OG)uT_h5-Et{4Nf@$^@KP`?73)tPSD2hMZd8-1Sm*tISL@JisQRp~hi`ertmr3>w8xkk#B`=xBR{AQ6O-{i3fYi=Em+<9ra+3HGN)W?n22Gz7) z5K6p0zl%0#yECUrDSTIhQn+LF)@+X!=MC%b??jEaa#L?Z>olm5@IuLLTI5D`eO)(> z=t)wolF|pGxyY2_ErFR#`LK=NnR2xh-o;97f1LC4v$j?WNRd2Ck#@;nIr5w-JXn{T z;k0hl!RYLsDM+8*RK{Z$wlZ;$RS72HE;BRDN7kNP$-* z7j#bi#&zuK6&<>*brDXdEthg!dL5s#iR-9-A#UWdzGvoAhGs_MCEUFMWlFrv&!p&x z4=(NIjOwHBHhbDbB9_+>?P^|OSPSQcr!EjXpN z@i{NQei-!63wkyGpR}!3QMU$V!fzTf+42T`CCaU|-NdTbAQIAR)7Hu>Qa2ub@SYF1 znm@fh{FURl{L_bTul~P3|MDBT;+H|B6Fh&@0l*lLnZgO}yAfj*kMHWA!uNH@_rvCgVmTG(A(Dq(`Pe81yR+ zm_c(y5HQICnW@3T$@$-UoXbLkTi()}sAh!F2Y z1ewr~oibax5Fy_$qRv{e9d_(fM7EZRZsPtsG8qXZXi99JNtu-?o*A1+_U~jf$@XfU z!MzP5iADSH%MTQ2<~yR+PE9c}yxPz&Etlp>aL=>PZn|2b|J+enT-()c5fKZ^X(|1zr4-vs^e)z#eH z5#+0@xw|7j`RZ!!?#OSyx|+K?ROo*|HAZ(7n@j#>O9j<@*;1XW`K+b-glaxzsXnKg zH%s+J)x7Ht9IG#zqfRqdM=v&l=TNZsbq6ExxQfU%BR=bRzT^``&U)-wcU9)Jx7xL^Va$GQ*w>I;0qcumsa&tzj|(|CvjJfu1u+>WvJHN@$RMJ4QcjlmDv7j&rMyag z6}GUcj`WK)kiL+7P&4^y*7~aL)vi}_WCqm2tFhy6%j_Q8C!>i{kutSV+!acjMmjdq zu904iG-{+vBP|+Fn;LY{%+b`*+_B#Y=~&6EiqyVjMB!f7AOHRF-yi?|@!uc+{qf(w b_y7L%`tV;reA}PK|Nj32VGWScqrCwDs@O*T literal 0 HcmV?d00001 diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/odd-stages/clifford_exact.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/odd-stages/clifford_exact.py new file mode 100644 index 0000000000..166841a037 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/odd-stages/clifford_exact.py @@ -0,0 +1,149 @@ +"""Small exact Gaussian-dyadic Clifford compiler, independent of gx internals. +Paulis use i^p X^x Z^z. State vectors use integer Gaussian numerators / 2^d. +The tableau is supplemented by a literal circuit, so global phases are kept. +""" +from dataclasses import dataclass + +def parity(x):return x.bit_count()&1 +def rank(rows): + p={} + for x in rows: + while x: + b=x.bit_length()-1 + if b not in p:p[b]=x;break + x^=p[b] + return len(p) +def transpose(rows,n):return tuple(sum(((rows[j]>>i)&1)<>j&1);a[j],a[k]=a[k],a[j] + for i in range(n): + if i!=j and a[i]>>j&1:a[i]^=a[j] + assert [r&((1<>n for r in a) +def basis_extend(cols,n): + out=[] + for x in list(cols)+[1<len(out):out.append(x) + assert len(out)==n + return tuple(out) +def nullspace(rows,n): + a=list(rows);p=[];k=0 + for j in range(n): + t=next((i for i in range(k,len(a)) if a[i]>>j&1),None) + if t is None:continue + a[t],a[k]=a[k],a[t] + for i in range(len(a)): + if i!=k and a[i]>>j&1:a[i]^=a[k] + p.append(j);k+=1 + return tuple((1<>j)&1)<>i&1:out=pmul(out,T[i]) + for i in range(n): + if z>>i&1:out=pmul(out,T[n+i]) + return out +def compose(A,B):return tuple(apply(A,p) for p in B) +def inverse(T): + n=len(T)//2;cols=[x|(z<>n;u,v,p=apply(T,(x,z,0));assert (u,v)==identity(n)[j][:2];out.append((x,z,(-p)%4)) + return tuple(out) +def qvalue(Q,alpha,x,n): + return (sum(alpha[i] for i in range(n) if x>>i&1)+2*sum(parity((Q[i]>>(i+1))&(x>>(i+1))) for i in range(n) if x>>i&1))%4 +def mul_i(a,p): + x,y=a;p%=4 + return [(x,y),(-y,x),(-x,-y),(y,-x)][p] +@dataclass +class Op: + n:int + tab:tuple + circuit:list + def then(self,b): + assert self.n==b.n + return Op(self.n,compose(b.tab,self.tab),self.circuit+b.circuit) + def adjoint(self): + circ=[] + for e in reversed(self.circuit): + if e[0]=='P':circ.append(('P',inv(e[1],self.n))) + elif e[0]=='D':circ.append(('D',e[1],tuple((-x)%4 for x in e[2]))) + elif e[0]=='C':circ.append(('C',e[1],-e[2])) + elif e[0]=='phase':circ.append(('phase',(-e[1])%4)) + else:circ.append(e) + return Op(self.n,inverse(self.tab),circ) + def zero_state(self,basis=0): + N=1<>i)&1 for i in range(n)) + assert all(alpha[i]%2==(Q[i]>>i)&1 for i in range(n)) + return Op(n,tuple([(1<>i&1 else 0,1<>i&1 else 0) for i in range(n)]),[('C',q,sgn)]) +def xgate(n,b):return Op(n,tuple([(1<>i)&1)) for i in range(n)]),[('X',b)]) +def fourier(n,axes=None): + out=ident(n) + for i in range(n) if axes is None else axes:out=out.then(cgate(n,1<len(selected):picks.append(j);selected.append(x) + assert len(picks)==r and all(x>>r==0 for x in Bcols) + Br=transpose(selected,r);Bi=inv(Br,r);Dr=transpose([Dcols[j]&((1< 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/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr361/code/engines/moment.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr361/code/engines/moment.py new file mode 100644 index 0000000000..7d697cb452 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr361/code/engines/moment.py @@ -0,0 +1,113 @@ +"""Independent prospective ordinary five-stage cost, never supplier admission. + +Consumes a raw one-invocation ledger made from the actual source/internal/target +paths. No packed profile is used as an input. Missing physical/finite/compiler +obligations must remain explicit in the accompanying report. +""" +from collections import Counter +from decimal import Decimal, localcontext, ROUND_FLOOR +from fractions import Fraction as F +from functools import lru_cache +from math import factorial +import hashlib, json, sys +from pathlib import Path + +DYAD = 1 << 224 + +def floor(x): return F(x.numerator*DYAD//x.denominator, DYAD) +def ceil(x): return -floor(-x) + +@lru_cache(None) +def logarithm(x): + """Mercator bounds after binary reduction; ln(2) via two Mercator sums. + + For 1 <= y < 2, log(y) is an alternating series in z=y-1. + We instead reduce to 1 <= y < 3/2, and bound log(3/2) and + log(2) by the same alternating series at z=1/2 and z=1/3, + using log(2)=log(3/2)+log(4/3). All sums are exact rationals. + """ + assert x >= 1 + k = 0 + while x >= 2: x /= 2; k += 1 + j = int(x >= F(3, 2)) + if j: x /= F(3, 2) + def mercator(y): + z=y-1 + assert 0 <= z <= F(1,2) + # An even partial sum is below log; the next term bounds its tail. + t=z; s=F(0) + for n in range(1, 225): + s += (t if n & 1 else -t)/n + t *= z + return s, s+t/225 + a,b=mercator(x); c,d=mercator(F(3,2)); e,f=mercator(F(4,3)) + return floor(a+(k+j)*c+k*e), ceil(b+(k+j)*d+k*f) + +def exponential(l,u): + assert 0 <= l <= u < F(1,10) + def poly(x): + s=t=F(1) + for j in range(1,25): t=t*x/j; s+=t + return s,t + lo,_=poly(l);hi,last=poly(u) + return floor(lo),ceil(hi+last*u/25/(1-u/26)) + +def moment(H,m,W,a,bad=False): + lo=hi=F(0) + for r,n in H.items(): + assert 0 < r < m and n > 0 + l,u=logarithm(F(m,r)); e,f=exponential(a*l,a*u) + p=F(r*n,m*W);lo+=p*e;hi+=p*f + if bad: + # Existing envelope shape, only conditionally portable to the new cover. + l,u=logarithm(F(m));e,f=exponential(a*l,a*u) + p=F(32*m*sum(H.values()),10**16*W) + lo+=p*e;hi+=p*f + return floor(lo),ceil(hi) + +def decimal(x): + with localcontext() as c: + c.prec=70 + return str(Decimal(x.numerator)/Decimal(x.denominator)) + +def certify(H,m,W,bad=False): + with localcontext() as c: + c.prec=70 + terms=[(Decimal(r*n)/Decimal(m*W),(Decimal(m)/Decimal(r)).ln()) for r,n in H.items()] + fallback=Decimal(32*m*sum(H.values()))/Decimal(10**16*W) if bad else Decimal(0) + lm=Decimal(m).ln();lo=Decimal(0);hi=Decimal('.003') + for _ in range(210): + a=(lo+hi)/2 + if sum(p*(a*l).exp() for p,l in terms)+fallback*(a*lm).exp()<1:lo=a + else:hi=a + q=int(((lo+hi)/2*10**24).to_integral_value(rounding=ROUND_FLOOR)) + lo=F(q,10**24);hi=lo+F(1,10**24) + lv=moment(H,m,W,lo,bad);hv=moment(H,m,W,hi,bad) + assert lv[1]<10 for v in slacks.values()),{k:str(v) for k,v in slacks.items() if v<=0} + assert min(margins.values())==minimum + assert margins['balanced_prefix']-minimum==eta and 1-eps-r==eta/2 + assert 1-eps*(1+c)==eta-eps*eta/4 + return dict(parameters=dict(a_bit=a,a_complex=b,tau=tau,sigma=sigma, + eta=eta,beta=beta,q=q,c=c,epsilon=eps,lambda_=lam, + lambda_prime=lp,alpha_squared_power=r,delta=delta, + C0=bridge['semantic']['C0'],C1=1,kappa=kappa), + strict_constraints=slacks,margins=margins,minimum_margin=minimum, + absorption_gap=minimum-kappa, + recurrence=dict(internal=internal,leaf=leaf,reservations=1-c)) diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz b/research/retimed-asynchronous-whole-owners/vendor/pr505/inputs/work/pr370-source/research/e8-bit/data/bit/bitE8-r865.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8bec1751f7e33c3a1e4673ef5dbc34d6f205321e GIT binary patch literal 33865 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 F0sxs54@Cd~ literal 0 HcmV?d00001 diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR493-NOTICE.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR493-NOTICE.md new file mode 100644 index 0000000000..d9e0c531bc --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR493-NOTICE.md @@ -0,0 +1,11 @@ +# Attribution for the included PR493 material + +Apache-2.0. Prepared by eumemic with substantial Anthropic Claude assistance. +The only copied PR493 payload in this package is its published EXPECTED.json. +Its R489 bit operator is cited, not vendored or freshly reconstructed here. + +The original complete notice is available with the pinned source: +https://github.com/CrocSwap/integer-mult-bounds/blob/c3a9a436b84fe44fdc223a5784d84736d1c2d3c7/research/e8-bit-carrier-skeleton/NOTICE.md + +This attribution excerpt omits sections for code and historical receipt files +that are not included in this package. It does not modify any upstream file. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR496-PROOF.md b/research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR496-PROOF.md new file mode 100644 index 0000000000..aa8230f063 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/references/PR496-PROOF.md @@ -0,0 +1,105 @@ +# Whole-owner pooling of the complex supplier + +This construction is conditional on the all-size compiler, common-label, +restored-row, precision/tape and analytic-transfer contracts retained by the +pinned PR493 bit and PR484 complex packages. It also retains PR484's explicit +Lemma A realization contract for paid residual wrappers with borrowed spectators. +Its Lemma G schedule/conjugation identities are checked on the serialized local +programs, with independent pre-operation integer bounds. Finite verification +alone does not establish the inherited all-size contracts. + +## Placement + +Keep PR484's gauge80-kernel42 local word, its exact Gaussian phases, both +orientations, and all entry/exit wrappers. There are 560 helper roles in each of +72 complete local invocations, indexed by nine stages and eight replicas. A +helper of entrance rank e has one residual of width 9-e. No residual is split. + +Pool the idle coordinates of all eight physical replicas. A frozen allocation +places every whole residual in a single pending idle child, and a frozen +bipartite edge coloring assigns that slot to its invocation replica. Left +vertices are physical families; right vertices are actual helpers. Each helper +has degree eight and every physical family has degree at most eight at the +stage. The eight matching colors give each invocation exactly one of every +helper and at most one helper on any family. The verifier reads every actual +role, rather than trusting existence of a coloring or the optimizer status. + +Every host is an idle pair at that stage. Thus no host is an active data wire, +even if its physical replica differs from its invocation replica. The literal +loop order is retained: recipe phase, replica, cover class, complete local +invocation. Entry wrapper, local word and exit wrapper all finish before the +next replica or cover class. This is necessary when spectators are borrowed +from coordinates that another invocation later uses. + +## Actual maps and restoration + +For each physical port q, take the pinned orthogonal 73-column basis B_q. A +helper's first w columns are precisely its pending residual coordinates. Its +next 9-w columns are the canonical unused spectator coordinates. Append every +remaining B_q column in increasing basis-index order. The resulting full +matrix is an orthogonal coordinate permutation of B_q, with inverse its +transpose. Both reflected local programs use this same whole-family chart. + +The fresh PR484 local check establishes the normalized helper action +L_E^-1 S_E R_E^-1 = C_[w] tensor I on all 512 local address columns, including +spectators, with all global phases. Its emitted scalar word restores arbitrary +dirty helper inputs and its private work. Unique physical owners within a +complete invocation let the scalar/common-label identity be transported through +these full charts without aliasing. Because that invocation restores the +borrowed work before the next, reusing the physical family in a later replica +is allowed under the same whole-invocation realization contract. + +Across all calls, occupied cells of each pending idle child are disjoint. The +explicit remainder child uses that family's actual replica, starts at the +recorded pending offset, and executes once. The old `replicas=8` shorthand is +not applied to these heterogeneous remainders. The independent controller audit +checks these cells, execution windows, full charts, source-program hashes, +private-family rebase and cover correction. Deliberately corrupted programs +must fail the controller audit. + +## Paid profile and finite charge + +All 40,320 whole residuals fit on the 7,680 existing data families. There are no +bank families. The physical stock is 8,258, including unchanged private centres, +reserved tableau and two coefficient registers. The complete paid profile is + +``` +rank 1 2 3 4 5 6 7 8 +count 148440 66816 7472 19728 25664 144 1800 4120 +``` + +Its rank mass is 558,144, and 73*7680 - 558144 = 2496. Both exact moment engines +include the inherited bad-cover fallback. The complete invoice counts unchanged +local primitives, wrappers and selectors, and rebases stock, private families, +idle remainders, routing and final correction to the actual emitted program. +No new factor is hidden in a cached coefficient. For the global prefix, use +maximum stream L2 norm over every physical family and cover class. Each +completed helper endpoint is unitary; each completed data shear or bridge has +at most two unitary summands. For each actual orthogonal chart, right +multiplication permutes the cover classes, so an active stream is visited once +per complete call sweep. The bound uses all 72 ordered call sweeps and nine +bridges, without assuming replica independence. The local scalar/Horner envelope +costs 20 bits; conversion from the initial supremum norm to L2 on 2^73 entries +costs 37 bits; four bits cover primitive arithmetic. Thus 142 bits suffice, +within the retained 192-bit allowance. The verifier checks the actual matrices, +complete-call endpoints, scalar envelope and controller premises used here. Each remainder is at most +rank eight, so the degree-two halving inequality is 73^2 > 2*8^2. + +The bit side is reconstructed from PR493 with real Boost. Its physical prefix, +charged three-level coefficient and row coefficient are read from the fresh +receipt. Six bootstrap levels and all 47 strict outer inequalities use the +fresh complex exponent, common row allowance, and C0=2^210000. The next grid +point and zero-eta, zero-beta and unit-beta controls must all fail. + +## Provenance and limits + +The selection is a finite nomination, not an optimality theorem. Search used +floating-point MILP objectives and matching only to propose the frozen map; +certification uses the actual scalar words, complete emitted role map, exact +integer/rational checks and fresh source replays. The earlier unpooled padding +experiment is retained as provenance, not a separately published record. + +This does not use the cross-family split of PR448/480/494. Those submissions +carry a distinct disputed operator interface. This package makes a conditional +whole-owner claim only and does not claim the largest number among all draft +submissions under different assumptions. diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json new file mode 100644 index 0000000000..0d911fff2f --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-MANIFEST.json @@ -0,0 +1,12 @@ +{ + "RESEARCH-APPENDIX.md": "24ec2b2ff1174fcec7342307cff723e01c90513415f348665c43d0220ba04e3a", + "APPENDIX-SOURCES.json": "2ed72f0c9d97317ac7627614601a3fb41633bf5536d70ec6b24733a63dccfb37", + "LOCAL-CANDIDATE-AUDITS.json": "68a6adf3bcfbe8e8e4ffb7b4a672da5649c85f84c42813940e6dbb3cf20c2b99", + "BASE-WORD.json.gz": "8b91151043fd61afe379314e4fb1e647cf9cd3cfe98462920d3faba5b1f268f2", + "REBUILD.json": "e18727e4191e18838382948ced1c7506d74b3d43caa3853ce751684eef52d8d6", + "COMPONENT-SELECTION.json": "b682f7cff6de4f40bdadfc64a9ecb9b03a8d77dbf29be3748fa9d742dc894071", + "JOINT-47-SELECTION.json": "89ca715918bfbb04fad2eaee8a95a40324859cd0955512eb13077502e7d950e3", + "JOINT-51-SELECTION.json": "7094bb647cc9951a5385660a9ec5f012a427fd118baacaf3d5e9f28cb436acc7", + "rebuild_candidate.py": "f8063d539f772fb63712bed787a1c472da28c9baf38b88e3ae14806632d4afb7", + "audit_component_scalar.py": "feab9aa6dbcd8f9fffa6dbdb981d15ffc850402ae91cf45f946ff069cac54037" +} diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json b/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json new file mode 100644 index 0000000000..8f51ec043c --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/APPENDIX-SOURCES.json @@ -0,0 +1,112 @@ +[ + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Combinatorics/MatroidCounting/CommonBases.lean", + "working_sha256": "0f2d97183b830e8900a73c5637a6c243b03eb817cf514487b0db83db94434484", + "matches": [ + { + "name": "greedyOracle_correct", + "lines": [ + 10965 + ] + }, + { + "name": "greedyOracle_rank", + "lines": [ + 11000 + ] + }, + { + "name": "pair_rank_parallel", + "lines": [ + 549 + ] + }, + { + "name": "pair_rank_nonparallel", + "lines": [ + 556 + ] + } + ], + "status": "Direct source inspection; no fresh Lean kernel audit in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Topology/ArtinGroups/Cancellation/BlockPivot.lean", + "working_sha256": "d3a8dbe1f5b68b8ebde555a1f85be1f655c20d6195a857135347aa88c1560c39", + "matches": [ + { + "name": "homotopy_square", + "lines": [ + 108 + ] + }, + { + "name": "homotopy_retract", + "lines": [ + 118 + ] + }, + { + "name": "remainder_retained", + "lines": [ + 198 + ] + } + ], + "status": "Direct source inspection; no fresh Lean kernel audit in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/NumberTheory/TwoPoint/Walks/ColumnRankRelations.lean", + "working_sha256": "535603fcb618d881bb0dc829fed17790f697c7dd90fa06153b0efe8605fc1f46", + "matches": [ + { + "name": "columnDifference_disjoint_minor", + "lines": [ + 94 + ] + } + ], + "status": "Direct source inspection; no fresh Lean kernel audit in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Computability/FourierCircuit/TensorTools.lean", + "working_sha256": "40f36b086973e91bdbb9b94184e866375793e45ad57da5dd5c60b66d83542cf8", + "status": "Direct source inspection, not fresh Lean certification in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Computability/FourierCircuit/SparseShear.lean", + "working_sha256": "1a711340e5b75cf5b94909659e97becf1158bf4414770392d09e14de0549af8c", + "status": "Direct source inspection, not fresh Lean certification in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Computability/FourierCircuit/PivotJoin.lean", + "working_sha256": "06a9a4bdbdc3903dc021a2a8a402e5b67ee25b84a898339efbb7b747339ab389", + "status": "Direct source inspection, not fresh Lean certification in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Computability/FourierCircuit/MonomialFeedback.lean", + "working_sha256": "534b24551437a70259fd11916ec9bfd114f4353d225d965be401e3ab28defaa0", + "status": "Direct source inspection, not fresh Lean certification in this round" + }, + { + "repository": "https://github.com/openai/math", + "revision": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "relative_path": "lean/OAI/Computability/FourierCircuit/WordScheduling.lean", + "working_sha256": "0f1b0c89091f6acc5310e95c07102792749a38b0e35a760b7feae25682ef2713", + "status": "Direct source inspection, not fresh Lean certification in this round" + } +] diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/BASE-WORD.json.gz b/research/retimed-asynchronous-whole-owners/vendor/pr505/research-notes/kernel/BASE-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..dc442b2e4b4aff49949ec26a5a713ff5e676d466 GIT binary patch literal 35684 zcmaHyV{m0n)bC^46Wg|J+qP}nwkOWS=82sNC$?=nnVWfT)xGbhcYo-v+Eu-(d*Rpr zTKgP=7$~5B4+u=N-}n^;SNs-Wf$J;qsnp?#{STRn_dZ_wE`pa@nD_Qf*lL>qj|9wDkLBIZeKVqkMI`(h=O7e4A>U?y ztvNe%b>7bAwPrWX*ORtY>DHR2vp)_^Y8R5H61`LDwKW^r61|t{JtSrXpRGDEwayuu z{y3DPIy>_}b!WdVJ>D(cV-p<0=A~;;;Hzn(Tw==epP7xj*0@xx*3sLJR>@5HrxBS= z&}gb4tG>JJ_1=&Ig251mZP%89n7Vl@;!79KGRROn#Y@aF(^YlE8p$8mBy4RYmr7i% zbTta_Nus@6!QYrlqvhqdc*`;itcQ0mO`@SI({--#@2Pdd<5L4dDxHPaHMPM=k4(fxdMHEDY~jX4qNDm z;W$~qR=%d+DllOyETvZ8q9!42UlORCUY5>e*Ai;^oHhx!fnPNgy)4%D38-UWZhoJM&iWZo z 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 +for e in w['precondition']:apply(e,dirty) +comp=[] +for r in range(120,240): + for j,x in sorted(dirty[r].items()): + assert not w.get('start_extra',{}).get(str(j)),('nonzero-frame compensation',j) + comp.append(['add',r,j,-x.numerator,x.denominator,[]]) +cleanup=[inv(e)for e in reversed(w['A']+w['B'])if not 120<=e[1]<240] +assert[e[:-1]for e in cleanup]==[e[:-1]for e in w['cleanup']] +program=w['precondition']+comp+main+cleanup;expected=ident() +for t in range(120):expected[120+t][t]=Q(1) +assert replay(program)==expected +back=ident() +for t in range(120):back[t][120+t]=Q(-1) +assert replay([inv(e,True)for e in program])==back +controls={} +for cl in sel['kernel']: + for h in cl['pivots']: + aa=[e for e in w['A']if not(e[0]=='add'and e[2]==240+h and e[1]>=240 and e[-1]==cl['E'])] + assert len(aa)0 and den&(den-1)==0 + # Lower actual coefficient to cleared Horner work. Every intermediate + # magnitude envelope is explicitly included, before denominator halvings. + acc=0;count=1 + for i,ch in enumerate(bin(num)[2:]): + if i:acc*=2;count+=1;peak=max(peak,acc*env[b]) + if ch=='1':acc+=1;count+=1;peak=max(peak,acc*env[b]) + v=F(acc) + for i in range(den.bit_length()-1):v/=2;count+=1;peak=max(peak,v*env[b]) + assert v==abs(q);count+=2 # signed accumulation and private work clear + env[a]=env.get(a,F(0))+abs(q)*env[b];rr=rows.setdefault(a,{}) + for j,z in list(rows[b].items()): + value=rr.get(j,F(0))+q*z + if value:rr[j]=value + else:rr.pop(j,None) + workops+=count + else:raise AssertionError(op) + real+=2*count;peak=max(peak,env[a]) + assert all(not row for reg,row in rows.items()if reg[0]=='C') + for i in range(N): + expected={i:F(1)} + if ori=='forward'and 120<=i<240:expected[i-120]=F(1) + if ori=='backward'and i<120:expected[i+120]=F(-1) + assert rows['L',i]==expected + assert peak==F(prior['local'][ori]['prefix_l1_upper']) and peak<2**192 + assert real==checks[ori]['real_component_primitive_bound']and macros==checks[ori]['scalar_macros'] + assert dict(paid)=={int(r):z for r,z in checks[ori]['paid_profile'].items()} + local[ori]=dict(events=len(evs),macros=macros,real_component_primitives=real,prefix_l1=str(peak),prefix_bits=peak.numerator.bit_length()-peak.denominator.bit_length()+1,coefficient_work_primitive_count=workops,all_exact_columns=N,all_560_dirty_helper_columns_restored=True,private_centres_and_coefficient_work_cleared=True) +centres=len(w['centers']);widths=[9-len(w['frames'][f])for f in w['start'][240:]];enter=sum(x<9 for x in widths) +children=sum(checks['forward']['paid_profile'].values());macros=max(x['macros']for x in local.values());compiler=64*(M+1)**3 +adapters=16*(macros+children+N+centres)+64*M +primitive_bound=max(x['real_component_primitives']for x in local.values())+adapters*compiler +bridges=sum(e['kind']=='bridge'for e in old['recipe']);bridgeadd=2*VV*T*bridges;shifts=K*VV*T;moves=2*K*VV*T +oldW=old['live'];oldP=old['physical'];oldNB=(oldW-2*VV*K*T)//L +scalar=sum(local[c['orientation']]['real_component_primitives']for c in old['calls']) +nonlocal_items=4*VV*T*L+2*VV*T*L+2*L*T*R+sum(e['replicas']for e in old['idle_children'])+L*oldNB+bridgeadd+shifts+moves+oldW+oldP+2*L*T*enter*144 +outside=8*nonlocal_items+64*M +pervertex=scalar+bridgeadd+shifts+moves+oldW+(72*adapters+outside)*compiler+64*oldP +invoice=integ['finite_invoice'];assert (primitive_bound,adapters,pervertex,compiler)==(invoice['local_primitive_bound'],invoice['local_adapters'],invoice['pervertex'],invoice['compiler']) +# Independent hosted stock rebase, retaining the larger unhosted operation +# overcharge; only the stock and mass in the common router/literal change. +W=new['live'];P=new['physical'];mass=owners['rank_mass'];profile=owners['paid_profile'] +assert M*W-mass==2496 and P==W+R+centres+2 +rebase=pervertex-oldP*65+P*65-oldW+W;used=max(rebase,pervertex) +r=M//2;group=2**(r*r) +for i in range(1,r+1):group*=2**(2*i)-1 +stock=group*P;smass=group*mass;logical=group*used+64;router=compiler*(logical+1)*(stock+1)**2 +G,E,C0=2**30000,2**100000,2**210000;B=smass+E;literal=2*G*stock**2+8*smass+4*stock+4+32*M;row=2*stock.bit_length()+9909+252;maxchild=max(map(int,profile)) +ineq=dict(local_primitive_bound=primitive_bound<2**48,logical=logical<2**6050,router=router2*maxchild*maxchild) +assert all(ineq.values()) +out=dict(status='PASS_INDEPENDENT_SCALAR_PREFIX_AND_HOSTED_FINITE_INVOICE',local=local,entering_helpers=enter,entrance_rank=sum(9-x for x in widths),local_adapters=adapters,local_primitive_bound=primitive_bound,wrapper_elementary_factors_charged=2*72*enter*144,compiler=compiler,unhosted_pervertex=pervertex,hosted_rebased_pervertex=rebase,conservative_pervertex_used=used,finite=dict(physical_stock_bits=stock.bit_length(),router_bits=router.bit_length(),literal_bits=literal.bit_length(),physical_row_coefficient=row,retained_row_coefficient=20161,required_C0_bits=(32*M*B*B).bit_length(),halving_integer_inequality=[M*M,2*maxchild*maxchild],G_exponent=30000,E_exponent=100000,C0_exponent=210000),strict_checks=ineq,scope='Exact finite recount conditional on inherited all-size compiler/precision/tape and analytic-transfer contracts. Signed accumulation uses the supplier scalar primitive convention.') +(O/'PREFIX-AND-INVOICE.json').write_text(json.dumps(out,indent=2)+'\n');print(json.dumps(out,indent=2),flush=True) diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py new file mode 100644 index 0000000000..252ca9393d --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/adapters_gk.py @@ -0,0 +1,59 @@ +"""Paid residual wrappers for entering helpers (Lemma A): generation and independent decoding. Apache-2.0. +Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. The wrapper construction follows PR #458 +(chafreaky): a helper that starts at frame E and ends at FULL has the physical residual S_E = T_FULL T_E^-1 (apply T_E^-1 first); +S_E = L_E (C_[w] x I) R_E with R_E applied first; the wrappers R_E^-1 before the whole local invocation and L_E^-1 after its +full-frame cleanup turn the residual into the coordinate factor C_[w] x I and restore the other 9 - w coordinates identically. +usage: adapters_gk.py CANONICAL-WORD.json.gz RESIDUAL-ADAPTERS.json OUT-LEMMA-A.json +Writes the recipes (generation uses clifford_exact.lower_child) and then DECODES the serialized monomials with the primitive +constructors of clifford_exact (not lower_child) and checks, for every entrance frame, that L_E^-1 S_E R_E^-1 has exactly the +tableau and zero-state vector (global phase included) of fourier(9, range(w)); mutated recipes (wrong phase, swapped sides, wrong +translation, wrong width) must be rejected.""" +import copy, gzip, json, sys +from pathlib import Path +R = Path(__file__).resolve().parent.parent.parent +sys.path.insert(0, str(R / 'split-centres-global/vendor')) +from clifford_exact import canonical_frame, lower_child, fourier, diag, perm, xgate, Op, identity +n = 9; FULL = tuple(1 << i for i in range(n)) +def monomial_op(rec): + """decode a serialized monomial (matrix rows, quadratic rows, Z4 linear part, translation, phase)""" + out = diag(n, tuple(rec['quadratic_rows']), tuple(rec['linear_Z4'])).then(perm(n, tuple(rec['matrix_rows']))).then(xgate(n, rec['offset'])) + return out.then(Op(n, identity(n), [('phase', rec['phase'])])) +def S_of(U): + return canonical_frame(n, tuple(U)).adjoint().then(canonical_frame(n, FULL)) +def wrapped_ok(U, rec): + """exactly: L^-1 S R^-1 = C_[w] x I (apply order: R^-1, S, L^-1)""" + w = n - len(U); S = S_of(U); Rm = monomial_op(rec['right']); Lm = monomial_op(rec['left']) + net = Rm.adjoint().then(S).then(Lm.adjoint()); target = fourier(n, range(w)) + return rec['rank'] == w and net.tab == target.tab and net.zero_state() == target.zero_state() +def main(): + c = json.load(gzip.open(sys.argv[1])); frames = c['frames']; v = c['v'] + starts = sorted({c['start'][r] for r in range(2 * v, len(c['start'])) if c['start'][r] != 0}) + recipes = {} + for f in starts: + U = frames[f]; rec, compiled = lower_child(S_of(U)) + recipes[str(f)] = dict(frame=f, vectors=list(U), entrance_rank=len(U), rank=rec['rank'], left=rec['left'], right=rec['right']) + Path(sys.argv[2]).write_text(json.dumps(dict(status='RESIDUAL_ADAPTER_RECIPES', recipes=recipes), sort_keys=True, separators=(',', ':')) + '\n') + # ---- independent decode of the serialized file + data = json.loads(Path(sys.argv[2]).read_text())['recipes'] + dot = lambda a, b: bin(a & b).count('1') & 1 + detail = [] + for f in starts: + rec = data[str(f)]; U = frames[f] + assert wrapped_ok(U, rec), ('wrapper product is not C_[w] x I', f) + detail.append(dict(frame=f, entrance_rank=len(U), residual_width=n - len(U), vectors=list(U), all_even_weight=all(bin(x).count('1') % 2 == 0 for x in U), + totally_isotropic=all(dot(a, b) == 0 for a in U for b in U))) + controls = [] + def reject(name, fn): + f = starts[0]; rec = copy.deepcopy(data[str(f)]); fn(rec) + if wrapped_ok(frames[f], rec): raise AssertionError('mutated wrapper accepted: ' + name) + controls.append(name) + reject('wrong global phase', lambda r: r['right'].__setitem__('phase', (r['right']['phase'] + 1) % 4)) + reject('wrong translation', lambda r: r['left'].__setitem__('offset', r['left']['offset'] ^ 1)) + reject('wrong quadratic form', lambda r: r['right'].__setitem__('quadratic_rows', [x ^ 2 if i == 0 else x for i, x in enumerate(r['right']['quadratic_rows'])]) if False else r['right']['linear_Z4'].__setitem__(0, (r['right']['linear_Z4'][0] + 2) % 4)) + reject('sides swapped', lambda r: (r.__setitem__('left', r['right']), r.__setitem__('right', r['left']))) + reject('wrong width', lambda r: r.__setitem__('rank', r['rank'] + 1)) + res = dict(status='PASS_RESIDUAL_WRAPPERS_ARE_EXACT', frames=len(detail), wrappers_reject=controls, all_even_weight=all(d['all_even_weight'] for d in detail), + all_totally_isotropic=all(d['totally_isotropic'] for d in detail), detail=detail) + Path(sys.argv[3]).write_text(json.dumps(res, indent=1) + '\n') + print('Lemma A (exact): L^-1 S_E R^-1 = C_[w] x I for', len(detail), 'entrance frames, global phase included;', len(controls), 'wrapper mutations rejected; all-even-weight:', res['all_even_weight']) +if __name__ == '__main__': main() diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py new file mode 100644 index 0000000000..e80ca6b8b3 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/audit_gk.py @@ -0,0 +1,189 @@ +# GK: modified copy of PR #433's complex_audit.py (icekylinx with Codex; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:"; with a word that has no start_extra / target_levels the +# behaviour and the written files are PR #433's. +# Modified from PR425 by icekylinx with Codex assistance. +"""Read-back audit, independent of the Hamming producer and its row state.""" +import copy,gzip,hashlib,importlib.util,json,math,time +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +OUT=Path('split-centres');p=OUT/'FULL-WORD.json.gz' +word=json.load(gzip.open(p));v=120;n=240+word['report']['R'];start=time.monotonic() +def apply(e,rows): + if e[0]=='scale': + _,t,a,b,*_=e;q=Q(a,b);assert q + rows[t]={j:q*x for j,x in rows[t].items()} + else: + _,t,s,a,b,*_=e;q=Q(a,b);assert t!=s + 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 ident():return [{r:Q(1)} for r in range(n)] +def inv(e): + e=copy.deepcopy(e) + if e[0]=='add':e[3]*=-1 + else:e[2],e[3]=e[3],e[2] + return e +def dual(e): + e=inv(e) + if e[0]=='add':e[1],e[2]=e[2],e[1] + return e + +main=word['A']+word['cut']+word['B'] +assert all(not 120<=e[2]<240 for e in word['A']+word['B'] if e[0]=='add' and not 120<=e[1]<240) +matrix=ident() +for e in main:apply(e,matrix) +print('full main columns',n,'replayed',flush=True) +# Compute -A_Y^-1 B_S using only rows of the explicit main operator. +dirty=[{} for r in range(n)] +for r in range(v,2*v):dirty[r]={j:x for j,x in matrix[r].items() if j>=2*v} +for e in word['precondition']:apply(e,dirty) +comp=[] +for r in range(v,2*v): + for j,q in sorted(dirty[r].items()):comp.append(['add',r,j,-q.numerator,q.denominator,[]]) + +cleanup=[inv(e) for e in reversed(word['A']+word['B']) if not v<=e[1]<2*v] +assert [e[:-1] for e in cleanup]==[e[:-1] for e in word['cleanup']] +program=word['precondition']+comp+main+cleanup +actual=ident() +for e in program:apply(e,actual) +expected=ident() +for t in range(v):expected[v+t][t]=Q(1) +assert actual==expected +print('PASS exact arbitrary dirt and restored sources/helpers',flush=True) +back=ident() +for e in program:apply(dual(e),back) +expected_back=ident() +for t in range(v):expected_back[t][v+t]=Q(-1) +assert back==expected_back +print('PASS exact inverse-transpose on every column',flush=True) +# Independent sparse vector controls avoid repeating a dense full replay. +def vector(es,x): + x=list(map(Q,x)) + for e in es: + if e[0]=='scale':x[e[1]]*=Q(e[2],e[3]) + else:x[e[1]]+=Q(e[3],e[4])*x[e[2]] + return x +sample=[((i*137+13)%101)-50 for i in range(n)] +want=vector(program,sample) +controls={ + 'missing_dirty_compensation':word['precondition']+main+cleanup, + 'missing_Y_inverse_basis':comp+main+cleanup, + 'missing_source_cleanup':word['precondition']+comp+main, + 'wrong_dual_event_order':[dual(e) for e in reversed(program)], +} +for name,es in controls.items(): + expected_sample=vector([dual(e) for e in program],sample) if name=='wrong_dual_event_order' else want + assert vector(es,sample)!=expected_sample,name + +# Orthogonal transvection and a port permutation bring the new geometry onto +# the already fixed 120-port routing family. Every incidence is transformed. +old=json.load(gzip.open('work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz')) +def tau(x):return x^(43 if (x&43).bit_count()%2 else 0) +assert 43 .bit_count()%2==0 +assert set(map(tau,word['ports']))==set(old['ports']) +mapping={i:old['ports'].index(tau(q)) for i,q in enumerate(word['ports'])} +mapping.update({v+i:v+mapping[i] for i in range(v)}) +mapping.update({r:r for r in range(2*v,n)}) +def basis(vs): + b={} + for x in vs: + for k in sorted(b,reverse=True): + if x>>k&1:x^=b[k] + if x: + k=x.bit_length()-1 + for j in b: + if b[j]>>k&1:b[j]^=x + b[k]=x + return tuple(b[k] for k in sorted(b,reverse=True)) +def perp(x):return basis([z for z in range(1,512) if not (x&z).bit_count()%2]) +full=tuple(1<0 + edges.add((old,f));paid[delta]+=1;cur[r]=f +for part in ('A','B'): + if part=='B': + assert all(cur[r]==f for r,f in zip(can['centers'],can['center_frames'])) + assert all(cur[r]==tlev.get(r-v,0) for r in range(v,2*v)) # GK: targets sit at their level + for r_c,f in zip(can['centers'],can['center_frames']): + # GK: a centre copy descends cf -> served levels (descending chain) -> lowest served level; at the defaults the + # only served level is 0 and this is PR #433's single child of rank |cf| + served={tlev.get(e[1]-v,0) for e in can['cut'] if e[2]==r_c} + o=f + for Lv in sorted(served,key=lambda x:-len(frames[x])): + assert basis(frames[Lv]+frames[o])==tuple(frames[o]),('centre level outside the previous frame',r_c) + if Lv!=o: + paid[len(frames[o])-len(frames[Lv])]+=1 + if not(o==f and Lv==0):edges.add((o,Lv));edges.add((Lv,o)) # (cf,0),(0,cf) are added by the phase script + o=Lv + for e in can[part]: + rs=[e[1]]+([e[2]] if e[0]=='add' else []) + for r in rs:climb(r,e[-1]);incidences+=1 +for r,f in enumerate(can['final']):climb(r,f) +assert dict(paid)=={int(r):x for r,x in word['report']['local_profile'].items()} +# GK: entrances lower the helper climb by their rank; centre descents may stop above frame zero +if not word.get('start_extra') and not word.get('target_levels'):assert sum(r*x for r,x in paid.items())==9*can['R']+240*8+72 +else:assert sum(r*x for r,x in paid.items())==sum(int(r)*x for r,x in word['report']['local_profile'].items()) +can['local_profile']=dict(sorted(paid.items()));can['edges']=sorted(edges) +cp=OUT/'CANONICAL-WORD.json.gz';cp.write_bytes(gzip.compress(json.dumps(can,sort_keys=True,separators=(',',':')).encode(),mtime=0)) + +def engine(name): + p=Path('work/pr361/code/engines')/(name+'.py');s=importlib.util.spec_from_file_location('hamming_'+name,p) + m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m +M,M2=engine('moment'),engine('base_two_moment');m,W=73,word['report'].get('live',12720) # GK: unhosted stock of the word +HG={int(r):z for r,z in word['report']['global_profile'].items()} +root=M.certify(HG,m,W,True);b=Q(int(Q(root['lower'])*10**18),10**18);grid=Q(1,10**18) +assert M.moment(HG,m,W,b,True)[1]<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 dual(e): + e=list(e) + if e[0]=='add':e[1],e[2]=e[2],e[1];e[3]*=-1 + else:e[2],e[3]=e[3],e[2] + return e +def scalar(e,back): + e=dual(e) if back else list(e) + if e[0]=='add':return ['add',['L',e[1]],['L',e[2]],e[3],e[4]] + return ['scale',['L',e[1]],e[2],e[3]] +def primitive_bound(e): + if e[0] in ('clear','copy'):return 1 + q=Q(e[3],e[4]) if e[0]=='add' else Q(e[2],e[3]) + a,b=abs(q.numerator),q.denominator + assert b&(b-1)==0 + if e[0]=='scale': + assert a&(a-1)==0 + return abs(a.bit_length()-b.bit_length())+int(q<0) + # Exact binary Horner multiplication on a cleared private stream, repeated + # halving, signed accumulation into the target, then clear the private stream. + return 3+(a.bit_length()-1)+a.bit_count()+(b.bit_length()-1) + +def emit(back): + out=[];cur=c['start'].copy() + def event(e):out.append(e) + def scal(e,f):event(['scalar',e,f]) + event(['phase','zero_frame_precondition']) + for e in c['precondition']+c['compensation']: + regs=[e[1]]+([e[2]] if e[0]=='add' else []) + assert all(c['start'][r]==0 for r in regs) + scal(scalar(e,back),0) + event(['phase','entry_adapters']) + # GK: a helper that starts at a nonzero entrance frame has NO entry adapter; its paid wrapper R_E^-1 (Lemma A) precedes every gate + # that touches it and L_E^-1 follows the full-frame cleanup. Words without entrances emit PR #433's events. + entering=[r for r,f in enumerate(c['start']) if r>=2*v and f!=0] + for r,f in enumerate(c['start']): + if r in entering:event(['residual_adapter','pre',r,f]) + else:event(['adapter','old_to_new',r,f]) + def climb(r,f,part): + old=cur[r] + if old==f:return + assert basis(frames[old]+frames[f])==tuple(frames[f]) + rank=len(frames[f])-len(frames[old]);assert rank>0 + event(['climb',part,r,old,f,rank]);cur[r]=f + for part in ('A','centers','B','final'): + event(['phase',part]) + if part in ('A','B'): + for e in c[part]: + regs=[e[1]]+([e[2]] if e[0]=='add' else []) + for r in regs:climb(r,e[-1],part) + scal(scalar(e,back),e[-1]) + elif part=='centers': + # GK: targets sit at their nonzero-frame-compensation level (0 at the defaults); a centre copy descends + # cf -> served levels (descending chain) -> lowest served level and scatters into each target at its level + lv=lambda r:c.get('target_levels',{}).get(str(r-v),0) + assert all(cur[r]==lv(r) for r in range(v,2*v)) + for k,r in enumerate(c['centers']): + cf=c['center_frames'][k];assert cur[r]==cf + terms=[e for e in c['cut'] if e[2]==r] + path=[cf]+sorted({lv(e[1]) for e in terms}-{cf},key=lambda x:-len(frames[x])) + C=['C',k] + if not back: + scal(['clear',C],cf);scal(['copy',C,['L',r]],cf) + for a in range(len(path)): + if a>0:event(['center',k,path[a-1],path[a],len(frames[path[a-1]])-len(frames[path[a]])]) + for e in terms: + if lv(e[1])==path[a]:scal(['add',['L',e[1]],C,e[3],e[4]],path[a]) + scal(['clear',C],path[-1]) + else: + scal(['clear',C],path[-1]) + for a in range(len(path)-1,-1,-1): + for e in terms: + if lv(e[1])==path[a]:scal(['add',C,['L',e[1]],e[3],e[4]],path[a]) + if a>0:event(['center',k,path[a],path[a-1],len(frames[path[a-1]])-len(frames[path[a]])]) + scal(['add',['L',r],C,-1,1],cf);scal(['clear',C],cf) + else: + for r,f in enumerate(c['final']):climb(r,f,part) + event(['phase','exit_adapters']) + for r,f in enumerate(c['final']):event(['adapter','new_to_old',r,f]) + event(['phase','full_frame_cleanup']) + for e in c['cleanup']: + regs=[e[1]]+([e[2]] if e[0]=='add' else []) + assert all(c['final'][r]==1 for r in regs) + scal(scalar(e,back),1) + for r in entering:event(['residual_adapter','post',r,c['start'][r]]) # GK: L_E^-1 after the full-frame cleanup + event(['phase','done']) + return out + +def check_local(events,back): + # Literal scalar replay of the emitted stream, including center lifetimes. + state={('L',r):{r:Q(1)} for r in range(n)};live=[];paid=Counter();prims=0;macros=0 + for e in events: + if e[0]=='climb':assert not live;paid[e[5]]+=1 + elif e[0]=='center':assert live==[e[1]];paid[e[4]]+=1 + elif e[0]=='scalar': + op=e[1];tag=op[0];t=tuple(op[1]);macros+=1;prims+=2*primitive_bound(op) + if tag=='clear': + state[t]={} + if t[0]=='C' and t[1] in live:live.remove(t[1]) + elif tag=='copy':state[t]=dict(state.get(tuple(op[2]),{}));live.append(t[1]) + elif tag=='scale':state[t]={j:Q(op[2],op[3])*x for j,x in state[t].items()} + else: + s=tuple(op[2]);q=Q(op[3],op[4]);row=state.setdefault(t,{}) + if t[0]=='C' and t[1] not in live:live.append(t[1]) + for j,x in list(state.get(s,{}).items()): + z=row.get(j,Q(0))+q*x + if z:row[j]=z + else:row.pop(j,None) + assert not live and all(not row for r,row in state.items() if r[0]=='C') + for r in range(n): + expected={r:Q(1)} + if back and r> 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/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/gk_word.py new file mode 100644 index 0000000000..15782ba625 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/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/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py new file mode 100644 index 0000000000..df261063e1 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/integrate_gk.py @@ -0,0 +1,123 @@ +# GK: modified copy of PR #433's complex_integrate.py (icekylinx with Codex assistance; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:". On a word without start_extra / target_levels the behaviour +# and every written file equal PR #433's (regression anchor in verify.py). +import sys as _sys, os as _os; _sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) +# Adapted from PR425 for heterogeneous centres by icekylinx, with Codex assistance. +import copy,gzip,hashlib,importlib.util,json,math +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path +OUT=Path('split-centres');cp=OUT/'CANONICAL-WORD.json.gz' +c=json.load(gzip.open(cp));audit=json.loads((OUT/'SCALAR-FRAME-AUDIT.json').read_text()) +phase=json.loads((OUT/'CLIFFORD-REVIEW.json').read_text());sha=lambda p:hashlib.sha256(Path(p).read_bytes()).hexdigest() +assert phase['canonical_word_sha256']==audit['canonical_word_sha256']==sha(cp) +assert phase['all_child_equalities_include_global_phase'] +programs=json.load(gzip.open(OUT/'LOCAL-PROGRAMS.json.gz'));checks=json.loads((OUT/'LOCAL-CHECKS.json').read_text()) +frames=c['frames'];v,R,h=c['v'],c['R'],c['h'];n=2*v+R;private_centres=len(c['centers']) +for z in checks.values():z['paid_profile']={int(r):n for r,n in z['paid_profile'].items()} +old=Path('work/complex-nine-native');template=json.load(gzip.open(old/'GLOBAL-TEMPLATE.json.gz')) +data_phase=json.loads((old/'DATA-PHASES.json').read_text()) +assert template['exact_data_phase_recipe_sha256']==sha(old/'DATA-PHASES.json') +assert data_phase['status']=='PASS_EXACT_Z4_DATA_ROUTE_IDLE_AND_TERMINAL_PHASES' +m,T,L,k=73,8,9,4 +# GK: residual widths 9 - dim(start frame); banks tile per width class (all 9: PR #433's eight residuals + one pad) +from gk_common import tile,route +widths=[h-len(frames[c['start'][2*v+i]]) for i in range(R)] +assign,nb,pads=tile([(rep,i,widths[i]) for rep in range(T) for i in range(R)]);entering0=any(w_2*maxchild**depth +assert local_bound<1<<48 and logical<1<<6050 and router0 + bound=max(math.ceil(36/gap**2),math.ceil(2*(4+512)/gap)) + assert bound*gap**2>=36 and bound*gap>=2*(4+512) + cutoffs.append(str(bound));chain.append(z) +bridge={'semantic':{'C0':{'base':2,'exponent':210000},'strict_literal_gap':1}, + 'rows':{'degree_gap':Q(10**6)-Q(51*20161,25)}} +q=chain[-1]*(1-2*eta);ticks=(1-eta)*q/(1+q)/grid;kap=Q((ticks.numerator-1)//ticks.denominator,10**18) +assembly=Outer.assembly(chain[-1],b,bridge,kap,eta=eta,beta=beta) +try:Outer.assembly(chain[-1],b,bridge,kap+grid,eta=eta,beta=beta) +except AssertionError:pass +else:raise AssertionError('next kappa grid accepted') +result={'status':'PASS_NEW_STRUCTURAL_PROGRAM_AND_FINITE_ASSEMBLY_PENDING_REPLAY', + 'canonical_word_sha256':sha(cp),'scalar_audit_sha256':sha(OUT/'SCALAR-FRAME-AUDIT.json'), + 'exact_phase_receipt_sha256':sha(OUT/'CLIFFORD-REVIEW.json'),'global_template_sha256':hashlib.sha256(blob).hexdigest(), + 'local_program_checks':checks,'R':R,'m':m,'live':W,'physical':physical, + 'bank_assignments':len(assignments),'rank_mass':mass,'deficit':2496, + 'global_profile':dict(sorted(paid.items())),'emitted_local_events_all_calls':event_count, + 'finite_invoice':{'local_primitive_bound':local_bound,'local_adapters':adapters, + 'pervertex':pervertex,'physical_stock_bits':stock.bit_length(), + 'router_bits':router.bit_length(),'literal_bits':literal.bit_length(), + 'physical_row_coefficient':row,'retained_row_coefficient':20161, + 'compiler':compiler,'G_exponent':30000,'E_exponent':100000,'C0_exponent':210000, + 'required_C0_bits':(32*m*BB*BB).bit_length(),'halving_degree':depth, + 'halving_integer_inequality':[m**depth,2*maxchild**depth]}, + 'complex_b':str(b),'bit_c':str(bit),'prospective_kappa':str(kap),'kappa_float':float(kap), + 'log2_kappa':math.log2(float(kap)), + 'kappa_gain_percent':float(100*(kap/Q(998390813251625,10**18)-1)), + 'strict_outer_constraints':{name:str(z) for name,z in assembly['strict_constraints'].items()}, + 'next_kappa_grid_rejected':True,'bootstrap_cutoffs_log2':cutoffs, + 'scope':'New finite scalar interface with a written conjugation proof, conditional on inherited all-size compiler, precision/tape and analytic transfer. Independent emitted-program replay and fresh package replay still required before final promotion.'} +(OUT/'INTEGRATION.json').write_text(json.dumps(result,indent=2)+'\n') +print('PASS prospective kappa',float(kap),'gain',result['kappa_gain_percent'],'percent',flush=True) diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py new file mode 100644 index 0000000000..220cc7a2f5 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/onehost_gk.py @@ -0,0 +1,111 @@ +"""Whole-residual idle-axis hosting with at most ONE helper per physical family per invocation (the rule of PR #458), plus the exact +host chart with explicit spectator coordinates. Apache-2.0. Prepared by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. +A copy (port) of an idle child hosts a PATTERN: residuals of pairwise distinct stages inside the child's window, offsets 0, w1, w1+w2, ... +(a residual is whole: one slot in one family). The children of one (pair, side) have pairwise disjoint windows (checked), so the +families they share never host two helpers of one invocation, and the integer programme needs only the distinct-stage condition. +Chart: for the host's port q the parent's idle basis is B_q = U_q (+) I (PR #433 geometry; the construction is that of PR #458). A hosted +residual of width w occupies the pending vectors b_off..b_(off+w-1) of its child; the other e = 9 - w coordinates of the local nine are +SPECTATORS: the first e basis indices of B_q not occupied by the residual, in increasing order. The paid wrappers (adapters_gk.py) act on +these nine coordinates and restore the spectators identically.""" +import math +from collections import Counter + +H, M = 9, 73 + + +def cost(r, m): return r * math.log(m / r) if r else 0.0 + + +def patterns(rank, stages, widths): + out = [()] + ws = sorted(widths, reverse=True) + def rec(i, cur, tot): + for j in range(i, len(stages)): + for w in ws: + if tot + w <= rank: + c = cur + [(stages[j], w)]; out.append(tuple(c)); rec(j + 1, c, tot + w) + rec(0, [], 0) + return out + + +def solve(win, copies, avail, m, pad_value, time_limit=600): + """win {idx: (pair, rank, stages)}, avail {(stage, width): helpers per replica}. Maximise saved idle cost (+ pad_value per hosted residual).""" + import numpy as np + from scipy.optimize import milp, LinearConstraint, Bounds + widths = sorted({w for (_, w) in avail}); var = [] + for idx, (p, r, st) in sorted(win.items()): + for pat in patterns(r, sorted(st), widths): var.append((idx, pat)) + n = len(var); c = np.zeros(n) + for j, (idx, pat) in enumerate(var): + r = win[idx][1]; c[j] = -(cost(r, m) - cost(r - sum(w for _, w in pat), m) + pad_value * len(pat)) + rows, lo, hi = [], [], [] + by = {} + for j, (idx, pat) in enumerate(var): by.setdefault(idx, []).append(j) + for idx, js in by.items(): + row = np.zeros(n); row[js] = 1; rows.append(row); lo.append(copies); hi.append(copies) + for (s, w), a in sorted(avail.items()): + row = np.zeros(n) + for j, (idx, pat) in enumerate(var): row[j] = sum(1 for sw in pat if sw == (s, w)) + rows.append(row); lo.append(0); hi.append(a) + res = milp(c, constraints=LinearConstraint(np.array(rows), lo, hi), integrality=np.ones(n), bounds=Bounds(np.zeros(n), np.full(n, np.inf)), + options=dict(time_limit=time_limit, disp=False)) + assert res.x is not None, res.message + x = [int(round(t)) for t in res.x] + return [[idx, [list(sw) for sw in pat], x[j]] for j, (idx, pat) in enumerate(var) if x[j]], -res.fun + + +def save(path, key, sel, val): + import json + from pathlib import Path + p = Path(path); d = json.loads(p.read_text()) if p.exists() else {} + d[key] = dict(rule='one-helper-per-family', patterns=sorted(sel), proxy_saving=val) + p.write_text(json.dumps(d, indent=1, sort_keys=True) + '\n') + + +def load(path, key): + import json + from pathlib import Path + d = json.loads(Path(path).read_text())[key]; assert d['rule'] == 'one-helper-per-family' + return d['patterns'], d['proxy_saving'] + + +def check_disjoint_groups(win, pair_of, side_of): + """children of one (pair, side) share their physical families; their windows must be disjoint""" + seen = {} + for idx, (p, r, st) in win.items(): + for s in st: + k = (pair_of[idx], side_of[idx], s); assert k not in seen, ('windows of two children of one family group overlap', idx, seen[k], k); seen[k] = idx + + +def expand(win, sel, widths, V): + """-> slots [idx, port, off, w, s, h] (one replica), rem {(idx, port): remaining pending rank}""" + R = len(widths); pool = {} + for h in sorted(range(R)): pool.setdefault(widths[h], []).append(h) + pool = {(s, w): list(hs) for s in range(9) for w, hs in pool.items()} + slots = []; rem = {}; used = Counter() + for idx, pat, copies in sorted(sel, key=lambda e: (e[0], e[1])): + r = win[idx][1] + for _ in range(copies): + cp = used[idx]; used[idx] += 1; assert cp < V; off = 0 + assert len({s for s, w in pat}) == len(pat) + for s, w in pat: + assert s in win[idx][2] and off + w <= r + slots.append([idx, cp, off, w, s, pool[s, w].pop(0)]); off += w + rem[idx, cp] = r - off + assert all(n == V for n in used.values()) and len(used) == len(win) + return slots, rem + + +def idle_basis(q): + """PR #433 / #458: the parent's orthonormal idle basis U_q (+) I for port q (H = 9 local coordinates, M = 73)""" + z = next(i for i in range(H) if not (q >> i & 1)); a = q ^ (1 << z); order = list(range(H)); order[0], order[z] = order[z], order[0] + return [(1 << i) ^ (a if a >> i & 1 else 0) for i in order] + [1 << i for i in range(H, M)] + + +def spectators(q, pending, off, w): + """indices (into B_q) of the e = 9 - w spectator coordinates of a residual at pending[off:off+w]""" + B = idle_basis(q); occ = [B.index(x) for x in pending[off:off + w]] + assert len(set(occ)) == w + sp = [j for j in range(M) if j not in occ][:H - w] + assert len(sp) == H - w + return sp diff --git a/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py new file mode 100644 index 0000000000..b2e08a30c9 --- /dev/null +++ b/research/retimed-asynchronous-whole-owners/vendor/pr505/vendor/complex/e8-complex-gauge-kernel/code/replay_gk.py @@ -0,0 +1,271 @@ +# GK: modified copy of PR #433's complex_replay.py (icekylinx with Codex assistance; PR #425) by DreamingOfClouds with Claude Opus 5.5 +# (Anthropic), via Claude Code. Every change is marked "GK:". On a word without start_extra / target_levels the behaviour +# and every written file equal PR #433's (regression anchor in verify.py). +import sys as _sys, os as _os; _sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) +# Adapted for heterogeneous centres by icekylinx with Codex assistance. +"""Independent read-back of the serialized local/global instruction stream.""" +import copy,gzip,hashlib,importlib.util,json,math +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +OUT=Path('split-centres');P=OUT/'GLOBAL-TEMPLATE.json.gz' +ir=json.load(gzip.open(P));c=json.load(gzip.open(OUT/'CANONICAL-WORD.json.gz')) +integration=json.loads((OUT/'INTEGRATION.json').read_text()) +assert hashlib.sha256(gzip.decompress(P.read_bytes())).hexdigest()==integration['global_template_sha256'] +assert c['ports']==json.load(gzip.open('work/higher-stage-e8/verified/gcert1-e8-retimed.json.gz'))['ports'] +v,R,h=c['v'],c['R'],c['h'];n=2*v+R;frames=c['frames'] +from gk_common import tile # GK +widths=[h-len(frames[c['start'][2*v+i]]) for i in range(R)] +assign,nb,pads=tile([(rep,i,widths[i]) for rep in range(8) for i in range(R)]);W=7680+9*nb +levels={int(t):f for t,f in c.get('target_levels',{}).items()} +entering=[r for r,f in enumerate(c['start']) if r>=2*v and f!=0];plain={r for r in range(n) if r not in set(entering)} # GK +def contains(a,b): + for x in a: + for y in b: + if x>>(y.bit_length()-1)&1:x^=y + if x:return False + return True +def local(events,back): + rows={('L',r):{r:Q(1)} for r in range(n)} + norm={('L',r):Q(1) for r in range(n)};prefix=Q(1);cur=c['start'].copy();private={} + hist=Counter();phases=[];entry=[];exit=[];centers=[];matrix_hash=hashlib.sha256();chain={};wrappers=[] + allowed=['zero_frame_precondition','entry_adapters','A','centers','B','final','exit_adapters','full_frame_cleanup','done'] + for event in events: + tag=event[0] + if tag=='phase': + phases.append(event[1]);assert phases==allowed[:len(phases)] + if event[1]=='A':assert entry==[(r,f) for r,f in enumerate(c['start']) if r in plain] and sorted(r for k_,r,f_ in wrappers if k_=='pre')==entering # GK + if event[1]=='centers':assert all(cur[r]==levels.get(r-v,0) for r in range(v,2*v)) # GK + if event[1]=='full_frame_cleanup':assert cur==c['final'] and exit==list(enumerate(c['final'])) + assert not private + elif tag=='residual_adapter': # GK: paid wrappers of entering helpers: R_E^-1 before the invocation, L_E^-1 after the full-frame cleanup + _,kind,r,f=event;assert r in entering and f==c['start'][r] and kind in ('pre','post') + assert (kind=='pre' and phases[-1]=='entry_adapters') or (kind=='post' and phases[-1]=='full_frame_cleanup') + assert (kind,r) not in {(k,x) for k,x,_ in wrappers};wrappers.append((kind,r,f)) + elif tag=='adapter': + assert event[3]==(c['start'] if event[1]=='old_to_new' else c['final'])[event[2]] + (entry if event[1]=='old_to_new' else exit).append((event[2],event[3])) + elif tag=='climb': + _,part,r,a,b,rank=event + assert not private and phases[-1]==part and cur[r]==a + assert contains(frames[a],frames[b]) and rank==len(frames[b])-len(frames[a])>0 + hist[rank]+=1;cur[r]=b + elif tag=='center': + _,k,a,b,rank=event + assert phases[-1]=='centers' and private=={('C',k):a} + cf=c['center_frames'][k];cr=len(frames[cf]) + # GK: stepwise descent cf -> served levels -> lowest (forward), reversed ascent (backward); each step is a nested child + assert contains(frames[a],frames[b]) if back else contains(frames[b],frames[a]) + assert rank==abs(len(frames[a])-len(frames[b]))>0 + chain.setdefault(k,[]).append((a,b)) + private['C',k]=b;hist[rank]+=1;centers.append(k) + elif tag=='scalar': + _,e,f=event;op=e[0];target=tuple(e[1]);source=tuple(e[2]) if op in ('copy','add') else None + if target[0]=='C' and op=='clear': + assert private.get(target,f)==f + private.pop(target,None) + else: + for r in (target,source): + if r is None:continue + if r[0]=='L':assert cur[r[1]]==f,('common frame',r,cur[r[1]],f) + else: + if r==target and r not in private:private[r]=f + assert private[r]==f + if op=='clear':rows[target]={};norm[target]=Q(0) + elif op=='copy':rows[target]=dict(rows[source]);norm[target]=norm[source] + elif op=='scale': + q=Q(e[2],e[3]);a,b=abs(q.numerator),q.denominator + assert a&(a-1)==0 and b&(b-1)==0 + rows[target]={j:q*x for j,x in rows[target].items()};norm[target]*=abs(q) + else: + q=Q(e[3],e[4]);a,b=abs(q.numerator),q.denominator + assert source!=target and b&(b-1)==0 + # Independent symbolic replay of the cleared coefficient work. + w=0 + for bit in bin(a)[2:]:w=2*w+int(bit) + assert Q(w,b)*(1 if q>0 else -1)==q + prefix=max(prefix,Q(a)*norm[source]) + norm[target]=norm.get(target,Q(0))+abs(q)*norm[source] + row=rows.setdefault(target,{}) + for j,x in list(rows[source].items()): + z=row.get(j,Q(0))+q*x + if z:row[j]=z + else:row.pop(j,None) + prefix=max(prefix,norm[target]) + else:raise AssertionError(tag) + assert phases==allowed and set(centers)==set(range(len(c['centers']))) and not private + assert sorted(r for k,r,_ in wrappers if k=='pre')==entering and sorted(r for k,r,_ in wrappers if k=='post')==entering # GK + for k,st in chain.items(): # GK: the steps of each centre chain link up and end at the centre frame + cf=c['center_frames'][k] + if back:assert st[-1][1]==cf and all(st[i][1]==st[i+1][0] for i in range(len(st)-1)) + else:assert st[0][0]==cf and all(st[i][1]==st[i+1][0] for i in range(len(st)-1)) + assert all(not row for reg,row in rows.items() if reg[0]=='C') + for r in range(n): + expected={r:Q(1)} + if back and r= W). sole=False skips only the + sole-owner assertion (used by a control to show that the footprints themselves are fine).""" + fam=Counter(f for f,_ in owners);foot={} + for i,(f,route) in enumerate(owners): + assert f=240 and route[0]==2,('bank class: helpers only',i,f);w=widths[i-240] + if w==9: assert len(route)==2,('width-9 helper in a pure bank',i) + else: + if sole: assert fam[f]==1,('entering helper shares its bank family in one invocation',i,f) + assert len(route)==4 and route[2]==w and len(set(route[3]))==9-w==len(route[3]),('entering helper without a spectator record',i) + assert route[3]==list(range(len(occ[f]),len(occ[f])+9-w)) and len(occ[f])+9-w<=73,('spectators are not the first cells beyond the residuals',i,f) + cells=residual_cells(route)|(set(route[3]) if len(route)==4 else set()) + assert len(cells)==9 and not cells&foot.setdefault(f,set()),('footprints overlap on a bank family',i,f);foot[f]|=cells +def global_check(t): + assert t['live']==W and t['physical']==W+R+len(c['centers'])+2 # GK + occ={} + for call in t['calls']: + for fam,route in call['owners'][240:]:occ.setdefault(fam,set()).update(residual_cells(route)) + assert all(cs==set(range(len(cs))) for cs in occ.values()),'bank residuals are packed from cell 0' + # Eight data-wire scalar columns, independently recomposed. + matrix=[[int(i==j) for j in range(8)] for i in range(8)] + for e in t['recipe']: + if e['kind']=='local': + a=2*e['pair'];b=a+1;dst,src,q=(a,b,-1) if e['reverse'] else (b,a,1) + matrix[dst]=[x+q*y for x,y in zip(matrix[dst],matrix[src])] + elif e['kind']=='bridge': + i,j,q=e['dst'],e['src'],e['coefficient'] + matrix[2*i]=[x+q*y for x,y in zip(matrix[2*i],matrix[2*j])] + matrix[2*j+1]=[x-q*y for x,y in zip(matrix[2*j+1],matrix[2*i+1])] + else: + assert e['kind']=='terminal';old=copy.deepcopy(matrix) + for i in range(4):matrix[2*i]=old[2*i+1];matrix[2*i+1]=[-x for x in old[2*i]] + assert matrix==[[int(i==j) for j in range(8)] for i in range(8)] + seen=set();hist=Counter();pairs={e['stage']:e for e in t['recipe'] if e['kind']=='local'} + for call in t['calls']: + stage,rep,pair=call['stage'],call['replica'],call['pair'] + assert (stage,rep) not in seen;seen.add((stage,rep)) + assert pair==pairs[stage]['pair'] + assert call['orientation']==('backward' if pairs[stage]['reverse'] else 'forward') + assert len(call['owners'])==800 + for r,(fam,route) in enumerate(call['owners']): + if r<240:assert fam==rep*960+(2*pair+r//120)*120+r%120 and route==[1,stage,r%120] + else: + bk,off_,w_,pure_,sp_=assign[rep,r-240];assert fam==7680+stage*nb+bk and route==([2,off_//9] if (w_==9 and pure_) else [2,off_,w_,list(sp_)]) # GK + assert len(set((f,json.dumps(r)) for f,r in call['owners']))==800 + bank_rule(call['owners'],occ) # GK: the rule on every register class, stated independently of tile() + for r,z in profiles[call['orientation']].items():hist[r]+=z + assert seen=={(s,r) for s in range(9) for r in range(8)} + for child in t['idle_children']:hist[child['rank']]+=child['replicas'] + assert t['bank_padding']=={'families':list(range(7680,W)),'axis':72,'child_rank':1} + for r_,z_ in pads.items():hist[r_]+=z_*9 # GK + assert t['cover_final_correction']['families']==[0,W] + assert t['cover_final_correction']['charged_calls_per_cover']==W + assert t['execution_schedule'][-1]=={'kind':'translate_every_live_family',**{k:v for k,v in t['cover_final_correction'].items() if k!='kind'}} + assert 73*W-sum(r*z for r,z in hist.items())==2496 + return hist +H=global_check(ir) +for name,mut in [('missing_padding',lambda t:t['bank_padding']['families'].pop()), + ('aliased_owner',lambda t:t['calls'][0]['owners'][241].__setitem__(1,[2,0])), + ('missing_cover_phase',lambda t:t['cover_final_correction'].__setitem__('charged_calls_per_cover',0))]: + t=copy.deepcopy(ir);mut(t) + try:global_check(t) + except (AssertionError,KeyError):controls.append(name) + else:raise AssertionError('global mutation accepted: '+name) +# GK: controls of the rule itself, one per register class, run on bank_rule (not on the equality with tile()); only for words with entering +# helpers (the anchor's INDEPENDENT-REPLAY.json must stay byte-identical to PR #433's) +occ_all={} +for call in ir['calls']: + for fam_,route_ in call['owners'][240:]:occ_all.setdefault(fam_,set()).update(residual_cells(route_)) +def rule_control(name,mut,must): + o=copy.deepcopy(ir['calls'][0]['owners']);mut(o) + try:bank_rule(o,occ_all) + except AssertionError as e: + assert must in str(e),(name,str(e));controls.append(name) + else:raise AssertionError('rule mutation accepted: '+name) +bank_rule(ir['calls'][0]['owners'],occ_all) +ent=[r for r in range(240,800) if widths[r-240]<9] +if entering: + a_,b_=ent[0],ent[1] + def to_one_bank(o): # bank class: b joins a's bank family at the next free cells, with a spectator of its own + fa=o[a_][0];free=len(occ_all[fa]);o[b_]=[fa,[2,free,widths[b_-240],[free+widths[b_-240]]]] + rule_control('two_entering_helpers_on_one_bank_family',to_one_bank,'shares its bank family') + rule_control('bank_spectator_is_a_residual_cell',lambda o:o[a_][1].__setitem__(3,[o[a_][1][1]]+o[a_][1][3][1:]),'first cells beyond') + rule_control('bank_spectator_shifted',lambda o:o[a_][1].__setitem__(3,[x+1 for x in o[a_][1][3]]),'first cells beyond') + rule_control('bank_spectator_record_dropped',lambda o:o[a_].__setitem__(1,o[a_][1][:3]),'without a spectator record') + rule_control('bank_spectator_count_wrong',lambda o:o[a_][1].__setitem__(3,o[a_][1][3]*2),'without a spectator record') + rule_control('second_owner_on_an_active_data_family',lambda o:o.__setitem__(241,[o[0][0],[1,0,0]]),'data class') + rule_control('helper_owner_on_an_active_data_family',lambda o:o.__setitem__(250,[o[3][0],[2,0]]),'data class') + rule_control('active_wire_on_a_bank_family',lambda o:o.__setitem__(5,[7680,[1,0,5]]),'bank class') + C_=len(c['centers']) + rule_control('owner_in_the_private_namespace_centres',lambda o:o.__setitem__(300,[W+3,[2,0]]),'private namespace') + rule_control('owner_in_the_private_namespace_reserved_tableau',lambda o:o.__setitem__(300,[W+C_+5,[2,0]]),'private namespace') + rule_control('owner_in_the_private_namespace_coefficient',lambda o:o.__setitem__(300,[W+C_+R+1,[2,0]]),'private namespace') + t=copy.deepcopy(ir);t['calls'][0]['owners'][0][0]+=960 # copies: an active owner of replica 0's invocation on a family of replica 1 + try:global_check(t) + except (AssertionError,KeyError):controls.append('active_owner_on_the_family_of_another_replica') + else:raise AssertionError('global mutation accepted: active_owner_on_the_family_of_another_replica') +assert dict(H)=={int(r):z for r,z in integration['global_profile'].items()} + +def load(name): + sp=importlib.util.spec_from_file_location('replay_hamming_'+name,Path('work/pr361/code/engines')/(name+'.py')) + m=importlib.util.module_from_spec(sp);sp.loader.exec_module(m);return m +M,B=load('moment'),load('base_two_moment');b=Q(integration['complex_b']);grid=Q(1,10**18) +assert M.moment(H,73,W,b,True)[1]<1>i)&1)<>j&1);a[j],a[k]=a[k],a[j] + for i in range(n): + if i!=j and a[i]>>j&1:a[i]^=a[j] + assert [r&((1<>n for r in a) +def basis_extend(cols,n): + out=[] + for x in list(cols)+[1<len(out):out.append(x) + assert len(out)==n + return tuple(out) +def nullspace(rows,n): + a=list(rows);p=[];k=0 + for j in range(n): + t=next((i for i in range(k,len(a)) if a[i]>>j&1),None) + if t is None:continue + a[t],a[k]=a[k],a[t] + for i in range(len(a)): + if i!=k and a[i]>>j&1:a[i]^=a[k] + p.append(j);k+=1 + return tuple((1<>j)&1)<>i&1:out=pmul(out,T[i]) + for i in range(n): + if z>>i&1:out=pmul(out,T[n+i]) + return out +def compose(A,B):return tuple(apply(A,p) for p in B) +def inverse(T): + n=len(T)//2;cols=[x|(z<>n;u,v,p=apply(T,(x,z,0));assert (u,v)==identity(n)[j][:2];out.append((x,z,(-p)%4)) + return tuple(out) +def qvalue(Q,alpha,x,n): + return (sum(alpha[i] for i in range(n) if x>>i&1)+2*sum(parity((Q[i]>>(i+1))&(x>>(i+1))) for i in range(n) if x>>i&1))%4 +def mul_i(a,p): + x,y=a;p%=4 + return [(x,y),(-y,x),(-x,-y),(y,-x)][p] +@dataclass +class Op: + n:int + tab:tuple + circuit:list + def then(self,b): + assert self.n==b.n + return Op(self.n,compose(b.tab,self.tab),self.circuit+b.circuit) + def adjoint(self): + circ=[] + for e in reversed(self.circuit): + if e[0]=='P':circ.append(('P',inv(e[1],self.n))) + elif e[0]=='D':circ.append(('D',e[1],tuple((-x)%4 for x in e[2]))) + elif e[0]=='C':circ.append(('C',e[1],-e[2])) + elif e[0]=='phase':circ.append(('phase',(-e[1])%4)) + else:circ.append(e) + return Op(self.n,inverse(self.tab),circ) + def zero_state(self,basis=0): + N=1<>i)&1 for i in range(n)) + assert all(alpha[i]%2==(Q[i]>>i)&1 for i in range(n)) + return Op(n,tuple([(1<>i&1 else 0,1<>i&1 else 0) for i in range(n)]),[('C',q,sgn)]) +def xgate(n,b):return Op(n,tuple([(1<>i)&1)) for i in range(n)]),[('X',b)]) +def fourier(n,axes=None): + out=ident(n) + for i in range(n) if axes is None else axes:out=out.then(cgate(n,1<len(selected):picks.append(j);selected.append(x) + assert len(picks)==r and all(x>>r==0 for x in Bcols) + Br=transpose(selected,r);Bi=inv(Br,r);Dr=transpose([Dcols[j]&((1<

;~M<=FFSu)=uM#7N8}j+;;Q2ylLzDK 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