From 2d909bf9b91820585f9b0eb9575611f123a2c529 Mon Sep 17 00:00:00 2001 From: ai-nanachi <340844424+ai-nanachi@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:32:51 +0900 Subject: [PATCH 1/5] Repack mixed-width BIT owners with source-bound logical recursion --- .../.gitattributes | 2 + .../CALLER-BINDING.md | 121 + .../bit-stage-mixedwidth-packing/FILES.json | 164 + .../bit-stage-mixedwidth-packing/OVERLAP.json | 277 + .../bit-stage-mixedwidth-packing/PROOF.md | 103 + .../bit-stage-mixedwidth-packing/README.md | 104 + .../bit-stage-mixedwidth-packing/RECORD.json | 34 + .../SOURCE-ORIGINS.json | 801 + .../bit-stage-mixedwidth-packing/SOURCES.json | 19 + .../bit-stage-mixedwidth-packing/TASK.json | 91 + .../bit-stage-mixedwidth-packing/VERIFY.json | 28 + .../independent_price.py | 305 + .../independent_source.py | 463 + .../provider/CALLER-PROOF.md | 349 + .../provider/CALLER-REVIEW.md | 459 + .../provider/CALLER-SOURCE-CUTS.json | 1232 + .../provider/CALLER-SOURCES.json | 89 + .../provider/INDEPENDENT-OWNERS.json | 16 + .../provider/INPUT-SOURCES.json | 742 + .../provider/MANIFEST.json | 137 + .../provider/NATIVE-CXX.json | 289 + .../provider/NATIVE-PROOF.md | 212 + .../provider/NATIVE.json | 332 + .../provider/OWNER-PROOF.md | 328 + .../provider/OWNERS.json | 674 + .../provider/RECURSION.md | 463 + .../provider/REHOST-MANIFEST.json | 735 + .../provider/SOURCE-AUDIT-PINS.json | 149 + .../provider/SOURCES.json | 644 + .../provider/TASK.json | 74 + .../provider/UPSTREAM-CALLER.json | 481 + .../provider/UPSTREAM-PRICING.json | 404 + .../provider/UPSTREAM-README.md | 171 + .../provider/UPSTREAM-VERIFY.json | 136 + .../provider/UPSTREAM-verify.py | 194 + .../provider/VALIDATION.md | 169 + .../provider/caller.py | 914 + .../provider/caller_source_cuts.py | 228 + .../provider/independent_owner.py | 227 + .../provider/inputs/ALLOCATION.json | 726 + .../provider/inputs/CALLER-GEOMETRY.json.gz | Bin 0 -> 105560 bytes .../provider/inputs/CONTROLLER.py | 264 + .../provider/inputs/GEOMETRY.json.gz | Bin 0 -> 42305 bytes .../provider/inputs/PR4183-RESULT.json | 191 + .../provider/inputs/R438-CERTIFICATE.json | 2122 ++ .../provider/inputs/SELECTED-ASSEMBLY.json | 345 + .../provider/inputs/TERMINAL-CHARTS.json | 551 + .../provider/inputs/WORD.json.gz | Bin 0 -> 105171 bytes .../provider/inputs/caller/EVIDENCE.json | 46 + .../provider/inputs/caller/PREDECESSOR.json | 208 + .../provider/inputs/caller/PROOF.md | 320 + .../provider/inputs/caller/README.md | 76 + .../provider/inputs/caller/RESULT.json | 893 + .../provider/inputs/caller/SOURCES.json | 84 + .../provider/inputs/caller/TASK.json | 150 + .../provider/inputs/caller/VALIDATION.md | 56 + .../provider/inputs/caller/VERIFY.json | 76 + .../provider/inputs/caller/bootstrap.py | 11 + .../provider/inputs/caller/check_layout.py | 147 + .../inputs/caller/check_nested_model.py | 244 + .../provider/inputs/caller/check_recursion.py | 544 + .../provider/inputs/caller/check_runtime.py | 181 + .../provider/inputs/caller/check_sign.py | 143 + .../provider/inputs/caller/check_sources.py | 125 + .../provider/inputs/caller/consumer.py | 85 + .../provider/inputs/caller/control_checks.py | 183 + .../provider/inputs/caller/driver.py | 197 + .../provider/inputs/caller/evidence/NOTICE.md | 9 + .../inputs/caller/evidence/pr2688-NOTICE.md | 22 + .../inputs/caller/evidence/pr2688-PROOF.md | 133 + .../inputs/caller/evidence/pr2708-README.md | 114 + .../inputs/caller/evidence/pr2731-README.md | 180 + .../provider/inputs/caller/layout.py | 123 + .../provider/inputs/caller/linear_sign.py | 82 + .../provider/inputs/caller/node.py | 88 + .../provider/inputs/caller/packet_engine.py | 98 + .../provider/inputs/caller/peel.py | 46 + .../inputs/caller/predecessor/NOTICE.md | 49 + .../inputs/caller/predecessor/PROOF.md | 351 + .../inputs/caller/predecessor/README.md | 81 + .../inputs/caller/predecessor/RESULT.json | 61 + .../inputs/caller/predecessor/SOURCES.json | 58 + .../inputs/caller/predecessor/TASK.json | 48 + .../inputs/caller/predecessor/VERIFY.json | 21 + .../caller/predecessor/cardinal_counts.py | 55 + .../inputs/caller/predecessor/catalogue.py | 268 + .../caller/predecessor/check_headers.py | 89 + .../inputs/caller/predecessor/check_layout.py | 146 + .../caller/predecessor/check_runtime.py | 175 + .../caller/predecessor/check_sources.py | 123 + .../inputs/caller/predecessor/consumer.py | 80 + .../inputs/caller/predecessor/control.py | 50 + .../caller/predecessor/control_checks.py | 181 + .../inputs/caller/predecessor/driver.py | 188 + .../inputs/caller/predecessor/fresh_rows.py | 68 + .../inputs/caller/predecessor/layout.py | 63 + .../inputs/caller/predecessor/model.py | 172 + .../inputs/caller/predecessor/node.py | 68 + .../caller/predecessor/packet_engine.py | 63 + .../inputs/caller/predecessor/peel.py | 44 + .../inputs/caller/predecessor/topology.py | 91 + .../caller/predecessor/vendor/binding.py | 102 + .../caller/predecessor/vendor/bitstream.py | 160 + .../caller/predecessor/vendor/cardinality.py | 136 + .../predecessor/vendor/check_support.py | 111 + .../caller/predecessor/vendor/children.py | 84 + .../caller/predecessor/vendor/controller.py | 305 + .../caller/predecessor/vendor/counts.py | 57 + .../caller/predecessor/vendor/directory.py | 126 + .../caller/predecessor/vendor/episode.py | 124 + .../inputs/caller/predecessor/vendor/forms.py | 182 + .../caller/predecessor/vendor/low_codes.py | 109 + .../caller/predecessor/vendor/matrices.py | 217 + .../caller/predecessor/vendor/numeric.py | 189 + .../caller/predecessor/vendor/oracle.py | 94 + .../caller/predecessor/vendor/packet.py | 97 + .../inputs/caller/predecessor/vendor/plan.py | 112 + .../caller/predecessor/vendor/records.py | 271 + .../caller/predecessor/vendor/residual.py | 93 + .../caller/predecessor/vendor/routes.py | 249 + .../caller/predecessor/vendor/selection.py | 71 + .../caller/predecessor/vendor/sources.py | 148 + .../caller/predecessor/vendor/stream.py | 163 + .../predecessor/vendor/stream_runner.py | 112 + .../inputs/caller/predecessor/vendor/trace.py | 167 + .../inputs/caller/predecessor/vendor/words.py | 415 + .../inputs/caller/predecessor/verify.py | 60 + .../provider/inputs/caller/recursive_call.py | 110 + .../provider/inputs/caller/scheduler.py | 28 + .../provider/inputs/caller/stream_runner.py | 113 + .../provider/inputs/caller/trace.py | 184 + .../provider/inputs/caller/verify.py | 188 + .../provider/inputs/native/bits/stdc++.h | 38 + .../provider/inputs/native/columns_k.cpp | 62 + .../provider/inputs/native/json.hpp | 25526 ++++++++++++++++ .../provider/inputs/native/legality_h.cpp | 13 + .../provider/inputs/native/stage_cohort.py | 12 + .../provider/inputs/proofs/assemble9.py | 66 + .../inputs/proofs/batched-bit-rows.tex | 123 + .../inputs/proofs/local-ring-packets.md | 301 + .../inputs/proofs/recursive-caller.md | 320 + .../inputs/proofs/stopped-recurrence.md | 433 + .../inputs/proofs/terminal-chart-admission.py | 341 + .../inputs/proofs/whole-call-hosting.md | 215 + .../provider/native-check.py | 160 + .../provider/native.py | 485 + .../provider/new-owners/CHARTS.json.gz | Bin 0 -> 9456 bytes .../provider/new-owners/DISPATCH.json.gz | Bin 0 -> 627008 bytes .../provider/new-owners/FILL.json.gz | Bin 0 -> 575554 bytes .../provider/new-owners/ORDER.json.gz | Bin 0 -> 1351 bytes .../provider/new-owners/REMAINDERS.json.gz | Bin 0 -> 5878 bytes .../provider/new-owners/SLOTS.json.gz | Bin 0 -> 17626 bytes .../provider/new_probe.py | 75 + .../provider/nomination.py | 41 + .../provider/owner.py | 27 + .../provider/price.py | 342 + .../provider/upstream-caller.py | 914 + .../provider/upstream-owner.py | 660 + .../provider/verify_new_owners.py | 79 + .../provider/verify_rehost.py | 63 + .../bit-stage-mixedwidth-packing/verify.py | 47 + 161 files changed, 58736 insertions(+) create mode 100644 research/bit-stage-mixedwidth-packing/.gitattributes create mode 100644 research/bit-stage-mixedwidth-packing/CALLER-BINDING.md create mode 100644 research/bit-stage-mixedwidth-packing/FILES.json create mode 100644 research/bit-stage-mixedwidth-packing/OVERLAP.json create mode 100644 research/bit-stage-mixedwidth-packing/PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/README.md create mode 100644 research/bit-stage-mixedwidth-packing/RECORD.json create mode 100644 research/bit-stage-mixedwidth-packing/SOURCE-ORIGINS.json create mode 100644 research/bit-stage-mixedwidth-packing/SOURCES.json create mode 100644 research/bit-stage-mixedwidth-packing/TASK.json create mode 100644 research/bit-stage-mixedwidth-packing/VERIFY.json create mode 100644 research/bit-stage-mixedwidth-packing/independent_price.py create mode 100644 research/bit-stage-mixedwidth-packing/independent_source.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/CALLER-PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/CALLER-REVIEW.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCE-CUTS.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCES.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/INDEPENDENT-OWNERS.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/INPUT-SOURCES.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/MANIFEST.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/NATIVE-CXX.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/NATIVE-PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/NATIVE.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/OWNER-PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/OWNERS.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/RECURSION.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/REHOST-MANIFEST.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/SOURCE-AUDIT-PINS.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/SOURCES.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/TASK.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/UPSTREAM-CALLER.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/UPSTREAM-PRICING.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/UPSTREAM-README.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/UPSTREAM-VERIFY.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/UPSTREAM-verify.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/VALIDATION.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/caller.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/caller_source_cuts.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/independent_owner.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/ALLOCATION.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/CALLER-GEOMETRY.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/CONTROLLER.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/GEOMETRY.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/PR4183-RESULT.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/R438-CERTIFICATE.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/SELECTED-ASSEMBLY.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/TERMINAL-CHARTS.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/WORD.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/EVIDENCE.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/PREDECESSOR.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/README.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/RESULT.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/SOURCES.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/TASK.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/VALIDATION.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/VERIFY.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/bootstrap.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_layout.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_nested_model.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_recursion.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_runtime.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_sign.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_sources.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/consumer.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/control_checks.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/driver.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/NOTICE.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2688-NOTICE.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2688-PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2708-README.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2731-README.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/layout.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/linear_sign.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/node.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/packet_engine.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/peel.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/NOTICE.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/PROOF.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/README.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/RESULT.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/SOURCES.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/TASK.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/VERIFY.json create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/cardinal_counts.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/catalogue.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/check_headers.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/check_layout.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/check_runtime.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/check_sources.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/consumer.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/control.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/control_checks.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/driver.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/fresh_rows.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/layout.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/model.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/node.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/packet_engine.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/peel.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/topology.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/binding.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/bitstream.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/cardinality.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/check_support.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/children.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/controller.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/counts.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/directory.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/episode.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/forms.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/low_codes.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/matrices.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/numeric.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/oracle.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/packet.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/plan.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/records.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/residual.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/routes.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/selection.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/sources.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream_runner.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/trace.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/words.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/verify.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/recursive_call.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/scheduler.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/stream_runner.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/trace.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/caller/verify.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/native/bits/stdc++.h create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/native/columns_k.cpp create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/native/json.hpp create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/native/legality_h.cpp create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/native/stage_cohort.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/assemble9.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/batched-bit-rows.tex create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/local-ring-packets.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/recursive-caller.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/stopped-recurrence.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/terminal-chart-admission.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/inputs/proofs/whole-call-hosting.md create mode 100644 research/bit-stage-mixedwidth-packing/provider/native-check.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/native.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/new-owners/CHARTS.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/new-owners/DISPATCH.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/new-owners/FILL.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/new-owners/ORDER.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/new-owners/REMAINDERS.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/new-owners/SLOTS.json.gz create mode 100644 research/bit-stage-mixedwidth-packing/provider/new_probe.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/nomination.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/owner.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/price.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/upstream-caller.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/upstream-owner.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/verify_new_owners.py create mode 100644 research/bit-stage-mixedwidth-packing/provider/verify_rehost.py create mode 100644 research/bit-stage-mixedwidth-packing/verify.py diff --git a/research/bit-stage-mixedwidth-packing/.gitattributes b/research/bit-stage-mixedwidth-packing/.gitattributes new file mode 100644 index 0000000000..cf415578ce --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/.gitattributes @@ -0,0 +1,2 @@ +# Frozen source manifests authenticate bytes, including original line endings. +* -text diff --git a/research/bit-stage-mixedwidth-packing/CALLER-BINDING.md b/research/bit-stage-mixedwidth-packing/CALLER-BINDING.md new file mode 100644 index 0000000000..229da79bc5 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/CALLER-BINDING.md @@ -0,0 +1,121 @@ +# Unchanged local word, new mixed-width source-bound caller + +The candidate changes the integer owner allocation only. The 660-input local +word, all SOURCE value histories, nine rank-seven COPY windows, 636 frame +projectors and three dyadic terminal bases are exactly the latest PR4183 +inputs. Their authors retain credit. The new contribution is the stage-eligible +mixed-width allocation in `hosting-0018`, with its actual remaining idle axes. +This document is a proof transfer to the retained logical caller; it does not +claim a new physical tape compiler or multiplication/complex supplier. + +## Finite assignment and actual source matrices + +Each helper occurrence has an explicit idle child, DATA-family copy, contiguous +offset, ordered width, stage and terminal-frame chart. All 9 stages and 32 +replicas are emitted. The source windows are those derived by the unchanged +controller: an occurrence lies strictly after the last observation of its host +pair and before that pair's pending idle child. It never occupies an active +pair. Assigned axes are disjoint in every physical family, including across +stages. The unassigned axes are the exact contiguous pending suffix and are +returned by a paid idle query. No helper height disappears. + +For terminal frame F, let B_F be the authenticated 8-by-8 dyadic orthogonal +terminal basis from PR4021, with its first width(F) columns spanning F. The +actual relative chart is + + pi_axes diag(B_F^T, I_56). + +It is a full 64-dimensional matrix, including the complement coordinates. The +family chart is multiplied on the same side and in the same order as the +retained owner compiler. Thus the terminal projector is conjugated to precisely +the assigned coordinate axes, not merely another projector of the same rank. +The full chart and its transpose are inverses over every odd field. Distinct +same-family role charts have a nonzero difference numerator gcd which is a +power of two; the finite owner audit checks this condition explicitly. + +The actual new `Catalogue` builds these matrices through the latest +`caller.py::chart_matrix`. MOVE/COPY bases and the unchanged local programs are +bound to the new owner chart in each request; an integer slot label alone is +not treated as a SOURCE ticket. The inherited normal-form theorem applies to +arbitrary complete Boolean functions, including correlated ordinary DIRTY +inputs. No new SOURCE purity, free warm frame, cloned input, omitted spectator, +unframed union ADD or extra VALUE lane is assumed. + +## Generic executable caller and remaining checks + +All 84 authenticated predecessor modules are retained byte for byte at their +published source map. The new adapter loads the emitted owner ledger. In the +latest public caller source, only the complete request census changes from +902592/902880 to 901312/901600 for the matched local-word variants. The native +word builder, COPY/ERASE law and recursive child routines are unchanged. + +The finite-source interface has 28166 canonical requests, 81 guarded COPY +episodes, 540 base labels and 2710 chart labels. The full census multiplies the +canonical requests by the 32 replicas. It retains all 660 ordinary roles and +the private index 660. The actual Topology passes the new Catalogue into every +child; it must not fall back to a selected predecessor catalogue. + +Literal replay, exact split bases, actual Consumer coefficient/route probes, +complete threshold traces and controlled recursive Frame lifecycle probes are +saved separately by `run0019.py`. Their receipts distinguish a source callback +test from execution of an enormous completed GL64 payload. The latter is not +inferred from a small test fixture. A final result requires those receipts and +the manager's independent review; this document alone issues no certificate. + +## Logical time and compatible stock + +Retain the latest proof's fixed prime q>2^80, canonical atom widths and original +root coupling. At each generated descendant, use n<=e, + + w >= ceil(e^(17/10000)), + 2^(h+1) <= 8 e^2, + 17(h+1) <= 20051 w. + +The exact compatible fresh-row stock is R=t K^D(n), t>=1. Repeated physical +frozen-prefix ordinals and every prefix, gap, tail, suffix and unused-row +coordinate remain explicit. A recursive child of rank r has width +r floor(n/64), and retains its entire surrounding spectator stream. All ranks +are proper, with maximum 42<64. A source descriptor does not inspect new low +classes, unused rows or payload values. New SOURCE labels and matrices are +fixed finite data in the same encoded grammar; matrix sizes and history +branching degree have not increased. + +The latest `CALLER-PROOF.md` explicitly distinguishes its real logical route +compiler, which consumes the fixed rational matrices directly, from the +historical elementary-selector invoice G=1117. The new historical invoice is +G=1149, route bound159 rather than151, and that increase is recorded. It is +not hidden by asserting G=1117. In the logical p=1 proof it changes the finite +uniform constant C and fixed-q preparation allowance, not the input exponent, +SOURCE grammar or coefficient matrix dimensions. All route/read/clear and +descriptor operations remain charged. No free coordinate scan is inferred. + +Let P be the complete emitted profile and E its request count. With W=28416, +epsilon=10^-16 and B_bad=32*64^2 E, the unchanged stopped recurrence becomes + + T(n,w) <= Cw, 0=64. + +Both exact price engines charge the ordinary terms and the positive fallback +term. A strict mu(0)<1 and mu(b)<1 imply the usual proper-width induction with +a finite constant depending on their certified margins. No old numerical +margin constant is silently reused at a new b. + +The old source-code bound uses at most 28278 requests. The new 28166 satisfy +that same bound. Ordinary roles660 are below the retained661 threshold; its +680 packet allowance and 2^24 residue/index arena capacity still apply. +Unchanged local row arithmetic, fixed matrix sizes, dyadic terminal chart +entries and canonical SOURCE grammar retain the written logical storage +ledger, including suspended ancestors. This is the inherited + + live logical symbols < 11 V_root + F'_q, + k <= 8195 w log2(e) + +bound under its stated minimal-width/root-coupled conditions. A prescribed +stock multiplier still requires its extra log_q(t) capacity. Arbitrary q^k +row counts require the separate outer compatible padding/restoration law. +Observed Python heap or verifier working-set size is not a production-space +proof. Physical frame-bank/tape lowering, exact physical arena cleanup and +the outer multiplication transfer remain the same explicit open obligations +as the public comparator. diff --git a/research/bit-stage-mixedwidth-packing/FILES.json b/research/bit-stage-mixedwidth-packing/FILES.json new file mode 100644 index 0000000000..4e1a0c3881 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/FILES.json @@ -0,0 +1,164 @@ +{ + "files": { + ".gitattributes": "851baed08bf2ff0c97a8ab4ef6a403e4184771113108cb18610c155426d9ac7b", + "CALLER-BINDING.md": "c9217fe6f3344db3b09693dfa72283d669dd95aac752e0c2c725d256b5ca52c2", + "independent_price.py": "1fa29990999e1a884f82763dd155294e46a16a69de185258e77746552911c953", + "independent_source.py": "3d31f6a0c098a3a7bd98b0ddcd1c3cd49d3c9006017be83c3865aa8e89353e3d", + "OVERLAP.json": "a11cf15decbdde56dcfe16b252e9ace1da724561303138f6f6a046a26d0ba757", + "PROOF.md": "3e16cc31061b7ead811af9824d25b09e2fd181065ad234ea8f13479a97f01eba", + "provider/CALLER-PROOF.md": "28c5457da4d273a558c43936f9da9a49094994a2f5da9f780d5d822e7faa9d56", + "provider/CALLER-REVIEW.md": "1c65e4680f2b7ef8867fdbae698de5bf8c6c1e63200eab187eae90a9d78d4ba3", + "provider/CALLER-SOURCE-CUTS.json": "78aa2e2b33410540ae0bed856d722522cb5c43b5687e49b9fb0b435fb461ba5d", + "provider/CALLER-SOURCES.json": "ad4a6ad33e24baf471263a0e1a73db7fbaa071223ff11d1b20410185d8d5e8e3", + "provider/caller.py": "e42a04a885428cff9384c65cbda88e72bb4f452fb65ef8501dd91c71956e4ae0", + "provider/caller_source_cuts.py": "fb05ca0e7fa5ca229efd4be517c8462c4a9a30263738d3297753bc71f03a1df4", + "provider/INDEPENDENT-OWNERS.json": "53118b1f749bebf4ec0229855b7e5859966acf67a102286a8d4a5f06cfa7c00d", + "provider/independent_owner.py": "cb90fbcb2fe955f8e79c9bce6747a5c98b3ce51442c288ac0e2d2ba9476e3fae", + "provider/INPUT-SOURCES.json": "502edb186ea7dca267f7ccb3fe1f450cee5c32ba5b3eadf931282c66d9a60c15", + "provider/inputs/ALLOCATION.json": "06fa9322508aba3d8a5dc6469151cdfaa906b60559582b49c8b024428b158021", + "provider/inputs/caller/bootstrap.py": "eef1c418e8edbdf317d159683e30beaecd971c77cf41d6b09708576405e2141e", + "provider/inputs/caller/check_layout.py": "454b1587d1ed5ccaea19b621a67e2ceba999d7ede61188125faa41c4dd2ab2b1", + "provider/inputs/caller/check_nested_model.py": "b1941b882b0659722c3c41994c82f020c1f7ab320dc28c43c2758029ef8a48b7", + "provider/inputs/caller/check_recursion.py": "dde82badf043e553bc635a34295e2b5505d84d6dfbaf96e0cfccb8a8c3dbb158", + "provider/inputs/caller/check_runtime.py": "9fcf0c9a3c84a17446fafe8da50b63db296ba9465d48ddb6fdeac8742dfc98b1", + "provider/inputs/caller/check_sign.py": "ee4fd34acd49962a18d268aefeb20aa3c2673a10e7a43eee3e51a9bd3cf9106a", + "provider/inputs/caller/check_sources.py": "1c49984ae6ee7f8a44cde16b51e486f0b3ba4ee5c973389ac8d58a82d0a0aa3b", + "provider/inputs/caller/consumer.py": "2f2a8604c23fb2c81f24320c71ed0142118d98dde3be6086adad28e89954a777", + "provider/inputs/caller/control_checks.py": "c09d33327932b4ffbb8acb26c8a6bb621bcca542157d22f1edf72679a9359981", + "provider/inputs/caller/driver.py": "ceaf8f75de9810a05ebf8f65780b6f8bd7599a5768401d5e4386182afe615cdf", + "provider/inputs/caller/evidence/NOTICE.md": "fd7c42e89878cda6df86dde8720ece34625a337cf5edd795a421e2d3b42919e9", + "provider/inputs/caller/evidence/pr2688-NOTICE.md": "c899fccf7bd32397f0ddd85e4af35a166cefb3e3ae3407ec40edc3ab2051b617", + "provider/inputs/caller/evidence/pr2688-PROOF.md": "fa9bec0952468e4acb760a88d45d5be216325650e1a4080cf590e07b90c9f533", + "provider/inputs/caller/evidence/pr2708-README.md": "5906f6b7b2c8eea90e441476c4cbd60fe2ef981b690c63357bcfe67e3104aeef", + "provider/inputs/caller/evidence/pr2731-README.md": "19683df4394de299cbd7e1cce39bf9434ad260b1a37006587cf9aed84c9c0a03", + "provider/inputs/caller/EVIDENCE.json": "77b7cbefa2ca30acf2f77e23d14808ccd27848e9c76e4c5e68a045ef7891a07f", + "provider/inputs/caller/layout.py": "3beef6534b02c3b011b741f957a7d9fb05a9ac0bba1fed53b2c71834e4ea6bc1", + "provider/inputs/caller/linear_sign.py": "73e895fc701a4145cbe89d60f5775128354e7f08d0a45eacf22f423913f54e67", + "provider/inputs/caller/node.py": "0bd4f640cafb5c8f070c161d86445910f77578a672bf5886936ed89e7f6bd21b", + "provider/inputs/caller/packet_engine.py": "c80fc3aa9092f91cc309b2fb2dbc3618bf96bdb9b8498503993ea161f0ae2134", + "provider/inputs/caller/peel.py": "8b20888f74b4cd814a97b42ec72528fbfb6d2e936c5022df726f0785d0d01a2e", + "provider/inputs/caller/predecessor/cardinal_counts.py": "59ddeac102a0cc51fa49b15aae6aeb68cd68ed217fa974ce916372a177d2ec8f", + "provider/inputs/caller/predecessor/catalogue.py": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "provider/inputs/caller/predecessor/check_headers.py": "a41dab0c487c341eb32b34a03af74454e15e9e61e7386a1ca426d83f3b68b1ca", + "provider/inputs/caller/predecessor/check_layout.py": "8f776a21dc0e31f9738d822cfda38db92f1e3672afb880d4246ec5e084a50a41", + "provider/inputs/caller/predecessor/check_runtime.py": "5357e4ff255f17c4209aaf71a3413a4148475f11180c4f829e8f0ebacd2877cb", + "provider/inputs/caller/predecessor/check_sources.py": "6463c2724e04a313181b78e90a17cd62ee42465754902cca3e9a65c6140a15a1", + "provider/inputs/caller/predecessor/consumer.py": "b28ec97b0873ff2be25aff4bdde268247ffcec0d21279d0ada196de19a0bdc66", + "provider/inputs/caller/predecessor/control.py": "d3a93e54bb7d333b73917586407d11674d38b5c3fda4fbdc436fb5293ae7786a", + "provider/inputs/caller/predecessor/control_checks.py": "5ea6ded8c2508fbb00d93655affdfe7907ffb60916389e0736249c003a7a5148", + "provider/inputs/caller/predecessor/driver.py": "ee9e42fe95ab28fdd5e927c2d46fd480305aaad610eb2ca7ae514a5d22d9f0ac", + "provider/inputs/caller/predecessor/fresh_rows.py": "e4ae08fbd658add630eb7754ebe0cbcb42c6f39cf4128f9cb92e27fcf5213a7d", + "provider/inputs/caller/predecessor/layout.py": "7534b0166805f2ae8d11495c811d2bd272cea89c89b6bb5251fd411c89245a20", + "provider/inputs/caller/predecessor/model.py": "c937ae8e46162f88fc1cd7646d3b22c99273029ad0f0e3131f46ddec230676cb", + "provider/inputs/caller/predecessor/node.py": "b88fc9ac0b22d939311ff4f7aff788e8c87a64fd5e866498e59bd27940ee3f28", + "provider/inputs/caller/predecessor/NOTICE.md": "c446b32b8a621844fb2fbe654810c8122035bdd43fed2132f1137d98cb6f9943", + "provider/inputs/caller/predecessor/packet_engine.py": "ce7f132a6a69c802406f07c4a2119ef921e8978520ff58d5eeaeedb982c257f2", + "provider/inputs/caller/predecessor/peel.py": "3de018e68601566c364c7568b110f60c1bf34941b846cdffb94401bb799f85e3", + "provider/inputs/caller/predecessor/PROOF.md": "88754d57bae35a2089d9de221ff32ba802b7a56b810f96271f3ea36985edfb14", + "provider/inputs/caller/predecessor/README.md": "15631eb826b2d8d54fbee18fb6f70ee035e172d524c2a209b6c467c3f0204f64", + "provider/inputs/caller/predecessor/RESULT.json": "0d94c5e9150f3fbd603526c67ea33168d3ba45e158aaf722e848bf5c316a37a8", + "provider/inputs/caller/predecessor/SOURCES.json": "1b02a5c607a5967948988c3beaf37d9975d650ad501a99fcf74c135dc1f05fdd", + "provider/inputs/caller/predecessor/TASK.json": "a4cd54d4b09ad12a90a5feeb39a127f0f0d5a2a04f9f88554c5fc3ee0cfe77f4", + "provider/inputs/caller/predecessor/topology.py": "384d456ddba76de137a63b50019d5bba2e9f6daa4177c91643e0565d4cf1d44b", + "provider/inputs/caller/predecessor/vendor/binding.py": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b", + "provider/inputs/caller/predecessor/vendor/bitstream.py": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783", + "provider/inputs/caller/predecessor/vendor/cardinality.py": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22", + "provider/inputs/caller/predecessor/vendor/check_support.py": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964", + "provider/inputs/caller/predecessor/vendor/children.py": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6", + "provider/inputs/caller/predecessor/vendor/controller.py": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c", + "provider/inputs/caller/predecessor/vendor/counts.py": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069", + "provider/inputs/caller/predecessor/vendor/directory.py": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7", + "provider/inputs/caller/predecessor/vendor/episode.py": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff", + "provider/inputs/caller/predecessor/vendor/forms.py": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4", + "provider/inputs/caller/predecessor/vendor/low_codes.py": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87", + "provider/inputs/caller/predecessor/vendor/matrices.py": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459", + "provider/inputs/caller/predecessor/vendor/numeric.py": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514", + "provider/inputs/caller/predecessor/vendor/oracle.py": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67", + "provider/inputs/caller/predecessor/vendor/packet.py": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5", + "provider/inputs/caller/predecessor/vendor/plan.py": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "provider/inputs/caller/predecessor/vendor/records.py": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372", + "provider/inputs/caller/predecessor/vendor/residual.py": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df", + "provider/inputs/caller/predecessor/vendor/routes.py": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada", + "provider/inputs/caller/predecessor/vendor/selection.py": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b", + "provider/inputs/caller/predecessor/vendor/sources.py": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62", + "provider/inputs/caller/predecessor/vendor/stream.py": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5", + "provider/inputs/caller/predecessor/vendor/stream_runner.py": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249", + "provider/inputs/caller/predecessor/vendor/trace.py": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984", + "provider/inputs/caller/predecessor/vendor/words.py": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9", + "provider/inputs/caller/predecessor/VERIFY.json": "e1dd0ee5f267ffa515bb345054ff8637cfedb0079b0d2da29b90b7848264926e", + "provider/inputs/caller/predecessor/verify.py": "cd83797d1f420f7e5de61c1a693110b4ee0c80bac0adae4699599046b7f76f8a", + "provider/inputs/caller/PREDECESSOR.json": "e3127475913d62dbdf1b45d9283d2db2e9b689e0f81a703189150c1e5be2bca0", + "provider/inputs/caller/PROOF.md": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "provider/inputs/caller/README.md": "6ce41fd7e6dfbe5faecc25bd36561f0a65b6ebca6fc69d3fb72569424a405045", + "provider/inputs/caller/recursive_call.py": "157deaa5972557893d43494a81151483bdc46373448ec677cb6a738c9b7e6f1e", + "provider/inputs/caller/RESULT.json": "4919655bae2e5cff051e8f2d240a8e4ebb03392a9da2fb5328daa9248fb7e88b", + "provider/inputs/caller/scheduler.py": "0d96f7fbd6f90416167c5a52c0e3de942d1a0cae3d2968831932a9576701699f", + "provider/inputs/caller/SOURCES.json": "7c78f539078e1bc3d893b78b5ee24cb22dc090d3763fe554e861b6c3d3e7eaf7", + "provider/inputs/caller/stream_runner.py": "b255feaf6cc6e40413ae73fe302bf8f290bf4dd89f4128b23a91cc9860601801", + "provider/inputs/caller/TASK.json": "ac7d4b38da31b373e665929027fc04afb66c3e9aedaea3296e3783637912d0e8", + "provider/inputs/caller/trace.py": "3a664224c558244f606b603cad816d75e94a17c9b2620a06a1530e893dfceac2", + "provider/inputs/caller/VALIDATION.md": "ac0f2fab0ca810ce0202d31480daa8329cba0897ab015520a2bfd4b689c4086b", + "provider/inputs/caller/VERIFY.json": "6ad0e07f68458afedece927550655b5bc5cd9861a70044fcd95bb10a2179f0a6", + "provider/inputs/caller/verify.py": "65126e788eeea10e830fc583cf4afe0bfc4d67495cbf8ac21de3507dbe624d56", + "provider/inputs/CALLER-GEOMETRY.json.gz": "a1629f8cf4321addc5a1e24c4ce2bc744a4c35c1d1eff9bd59fc6fd437f9f0c1", + "provider/inputs/CONTROLLER.py": "6368196a393ac25bb2918880e4c4bd31ed733b762c27b6873ab391cbc0c5c3c8", + "provider/inputs/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "provider/inputs/native/bits/stdc++.h": "420094be2af295eed03a983dd66debbbe9cfb78d8252859f4498a615a0074b99", + "provider/inputs/native/columns_k.cpp": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "provider/inputs/native/json.hpp": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63", + "provider/inputs/native/legality_h.cpp": "6c1ef2b24e57781d6951c172a1024fc4300e6fd392c9d6672079a7806ab663b3", + "provider/inputs/native/stage_cohort.py": "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a", + "provider/inputs/PR4183-RESULT.json": "ccd419ac1cb123edd8a27aa9d0a6ab3713087a8bcd5be39114a7bd0f254ceebc", + "provider/inputs/proofs/assemble9.py": "4bf6768224a3fac81ccda26df24f3763f9a4fbc35ad62bef2888595cdae519fe", + "provider/inputs/proofs/batched-bit-rows.tex": "ef72c0ead19373cbc19c8a3aacb44dd0f75353ee5f4d055f775a986a4878022c", + "provider/inputs/proofs/local-ring-packets.md": "846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7", + "provider/inputs/proofs/recursive-caller.md": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "provider/inputs/proofs/stopped-recurrence.md": "74cc8de20f21acb5123fe2d20996fe0925ea6e51b3dec633bd5221fb719b3344", + "provider/inputs/proofs/terminal-chart-admission.py": "762357be4644da879251eca070a81dfd73ec3ef4991191cdd630896e7e9b44a3", + "provider/inputs/proofs/whole-call-hosting.md": "59cae781bfbe1a01ed9e66a8efeeb5a2b995e5ecdf908586b23ecc39f2b8d647", + "provider/inputs/R438-CERTIFICATE.json": "6da8c593257c8440f0fe35488d941715d953d715e2e464ffdfffff7ed31eee9c", + "provider/inputs/SELECTED-ASSEMBLY.json": "1122cb3a575f8c788345fc1bf4c108ac7c3250fb81a5988671f5eb04b3ab3045", + "provider/inputs/TERMINAL-CHARTS.json": "489216ea25f47f061675ab7b7e4a17289a531bce6fe77cca166a13265bfcbb17", + "provider/inputs/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "provider/MANIFEST.json": "ed8e41b73d0fc47cab4db094965a196388b313f62e28e2036318e9ac02155af1", + "provider/native-check.py": "d50efb920aba302adde5ff5fbf94d11a49d45f359414495c6fe79034fb3cde18", + "provider/NATIVE-CXX.json": "98b5541f9eab24c62593bac11089c80dead012c4276348b5345444a1d85cb668", + "provider/NATIVE-PROOF.md": "991a15cad6769837312de0a7f7934edcf87e44bfbd8ceac19210bf8639e9e2f0", + "provider/NATIVE.json": "6fd351c5eb23b2c041e39bc2f0abd9e18111660b11336e488fa03116b2314745", + "provider/native.py": "db92b1c2e61c8b8f3d94581e1bcd921af881cdf9d8fd03eba646864195134f2a", + "provider/new-owners/CHARTS.json.gz": "a794812b3fac17be06d272ed60b735165a5384d7ba967dccfb329d8f00ab3396", + "provider/new-owners/DISPATCH.json.gz": "8d21435c04c44ff86c93d823d7d04b7eeef5766917a2127ae964e42957a34a20", + "provider/new-owners/FILL.json.gz": "833faa24c31eebb50c9c28310dae89a9baca8c69adb2e98476900c98eb8a5af2", + "provider/new-owners/ORDER.json.gz": "8a153e3c5086e67735310bc47b2a83a41b55ba8ce102eb9a90e960d49328bbe4", + "provider/new-owners/REMAINDERS.json.gz": "72667ea46851acfe735fd76091c380764792c05dedf6441506b222818947d709", + "provider/new-owners/SLOTS.json.gz": "8131efe36eae3a25f53b5acd09ff0560ab8fbf693546dbb92af9f6e0ba509994", + "provider/new_probe.py": "a240ea5d621bf231ac732cccc5a0ae977d8a2c709b2c4bf3fe3065e8bcfb1073", + "provider/nomination.py": "3fbf5768f9fc319ff93f84e5bd807e5f6befad7bd95f28a4f811fabd13132c21", + "provider/OWNER-PROOF.md": "68c0cf7f5e04c33609f342bcd1097fae68eb63fe40182e8236e48330d654315f", + "provider/owner.py": "7762d66cf47b7ff27d1e0e273e223acd52b04b5e400db33cb3b0fb2c79dd38f4", + "provider/OWNERS.json": "7b5f86dc0baf0210b4c9cd4f05b2afcfb9044d35dacb91fedfe00d5efdbbd91b", + "provider/price.py": "e3a97177b140d32519bfe2cdb0b0acdb6783378fc957cf8d2287fabae7da7840", + "provider/RECURSION.md": "cd4b15dc76686c87c1cbeb834a6b32331ef021c0bc91918712aea0cc78bf1f62", + "provider/REHOST-MANIFEST.json": "72babcd6967946ef8a9d0a1c76bab53c237af8d690b3b813bcda3cf63e84ed9e", + "provider/SOURCE-AUDIT-PINS.json": "520c6ea6c315ddcc043413d18868821fbf8e83416f23df9e081dc09cf6e49cfc", + "provider/SOURCES.json": "0bbed564d734179d490721eb00f68320899945882b316cc51d05978041125631", + "provider/TASK.json": "fe48d7144714507feb436166db2851990cf78886d2a7c0e21436b24ba4cad3e4", + "provider/UPSTREAM-CALLER.json": "e78211b1044de8381fa8bbe1ad674b6ebf5b970e206841216cb91e67b186ce2e", + "provider/upstream-caller.py": "eda0aedcd1b57451c9fb3ad3b9e696dd3601dc7e956ef55d16819b32a42c6c88", + "provider/upstream-owner.py": "b6232c9f7f5d7b9a4be868e5e1d147b57e8e7ba9ddc0d35e7f7170c65b600c66", + "provider/UPSTREAM-PRICING.json": "b0fe2786761fd2b1b954f845b3a9bf29931938bd39f72f5522b675d06eb7fb7a", + "provider/UPSTREAM-README.md": "6ddc6fc758cc60bb60aca568454840fdfef7e6619a1af30e03b0ea11be13e6b2", + "provider/UPSTREAM-VERIFY.json": "eb683ae89f337a74c31b91cd9d938fe768a3cfed08d9e2cd0c55b6c54d69e0a0", + "provider/UPSTREAM-verify.py": "08b4d2af8729a910682471cfa38d4c719e56e9804490bc4c884726917c58e881", + "provider/VALIDATION.md": "661bcc904c63e0c5437ffc07de980011e3f7ebef9aaa26a9affa97b6e3dc4e06", + "provider/verify_new_owners.py": "9b0cb0fbab85c38985d394acdeff58a55fa71a529e2952d6ab174668045a9a03", + "provider/verify_rehost.py": "6e3696ac7bdb8fc701d6ecfd44195d65857c2d49ae6917eb2444e6155f693283", + "README.md": "c92347e45cfe0974539246c9bbc484220ea4d7447625e1969fa4c0894bde7e1a", + "RECORD.json": "f005d47ae2c06b701dbbe243e9eaaa53041bfc6f811a618daa57e1f02aa2672a", + "SOURCE-ORIGINS.json": "c8f15893d2ea4893e14320e0f53103f9f2fb746089afa43de224d9e769465a0b", + "SOURCES.json": "ab2470cb52426b9bd8c0ab1b915477b8ce430e7fcc730a7730988ff7a49a6342", + "TASK.json": "c6b17d4790782d9def7b18926b721b547782cce99a5fa5181f6df053f49eefb0", + "VERIFY.json": "522504e99e96a21da43dd6b8244ede396e84006bfa3bca57b4c6217ab9130629", + "verify.py": "07e2eb36c738c79500c2af7a8e0e64732f2231123c245c6c49a27d5ed14b8bbf" + } +} diff --git a/research/bit-stage-mixedwidth-packing/OVERLAP.json b/research/bit-stage-mixedwidth-packing/OVERLAP.json new file mode 100644 index 0000000000..7443ba8dd6 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/OVERLAP.json @@ -0,0 +1,277 @@ +{ + "status": "POSSIBLE_OVERLAP_NOT_A_NOVELTY_CERTIFICATE", + "searched_at": "2026-10-21T07:55:31.750310+00:00", + "terms": [ + "mixed-width", + "4183", + "901312", + "stage-eligible" + ], + "coverage": { + "open_prs": { + "fetched_at": "2026-10-21T07:54:33.530340+00:00", + "complete_pagination": true, + "records": 432 + }, + "discussions": { + "fetched_at": "2026-10-21T07:55:31.656865+00:00", + "complete_pagination": true, + "records": 3179 + } + }, + "local_records": 3, + "warnings": [], + "reference_terms": [], + "limits": "Remote PR scope is open PRs including drafts. Closed work is searched through local READMEs, TASK metadata and ledger only. No code diffs or arbitrary package files are searched. Recheck relevant heads before submission.", + "matches_total": 19, + "matches": [ + { + "number": 1269, + "title": "Bit slot model: exact partial width-seven packing optimum (seed 3)", + "kind": "discussion", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1269", + "updated_at": "2026-10-13T21:42:27Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "roves the pooled32 relaxation, improving 60 of 74 over repeated local optima. The proof reduces all mixed-width fills to nine width-eight slack moves and 45 Bellman comparisons (nine identities, 30 distinct strict analytic differences). All 150 attaining placements are checked.\n\nRegistered Python 3.12 replay passes, with both retained exact moment engines including the bad-residue surcharge, 60 independently enumerated mixed-bin cases, six mathematical controls, three real on-disk controls and o" + }, + { + "number": 2325, + "title": "Complete T74 owner reassignment above the PR2322 candidate", + "kind": "discussion", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2325", + "updated_at": "2026-10-15T06:40:25Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "ng improvement, global optimum or selected-frontier update is claimed.\n\n**Next questions:** coupled mixed-width exchanges beyond this assignment, or partial alias/changed-parent constructions screened by whole-width costs first. The final overlap check found PR2360's reported cap below 0.0016870 for the full PR2339 inventory on unchanged T74 bins, so that full inventory is not presented as an immediate improvement. PR2359's separate raw-word ledger confirms the adopted local frame delta. Detaile" + }, + { + "number": 1776, + "title": "DONE: exact mutable connector cost with sequential delivery cuts (PR1780)", + "kind": "discussion", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1776", + "updated_at": "2026-10-16T21:29:58Z", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": " matching comparisons; separate Dijkstra agrees on all tariff cases, settling 67023 cut-local and 184183 delayed-adapter states without a depth cap. All 16384 2x2 map/path instances pass, and each three-output schedule passes all 131072 dirty inputs at every delivery. Six semantic controls, six package test groups, source/receipt corruptions, selected-record integrity, and both implementations in a read-only committed Git export pass. Both implementations have the same assisted author; no indepe" + }, + { + "number": 1289, + "title": "CLAIM: selected PR589 bit hosting, ambient-axis disjointness across idle children", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1289#discussioncomment-18953091", + "updated_at": "2026-10-15T16:44:58Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "s in the reply below.\n**Concrete question and changed premise:** do PR1736's concrete prefix-packed mixed-width slots actually split q-perp, or does the completion-free PR1307 argument apply to them? This takes PR1736 Open next question 3.\n**Established result and evidence status:** Author-checked scoped proof and finite certificate: all 75 retained PR #1736 mixed width-seven/eight placements keep the whole q-perp block in one slot or the remainder, with 296,325 slots, zero splits, 111 port proj" + }, + { + "number": 2325, + "title": "Complete T74 owner reassignment above the PR2322 candidate", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2325#discussioncomment-18942729", + "updated_at": "2026-10-15T06:39:55Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "ng improvement, global optimum or selected-frontier update is claimed.\n\n**Next questions:** coupled mixed-width exchanges beyond this assignment, or partial alias/changed-parent constructions screened by whole-width costs first. The final overlap check found PR2360's reported cap below 0.0016870 for the full PR2339 inventory on unchanged T74 bins, so that full inventory is not presented as an immediate improvement. PR2359's separate raw-word ledger confirms the adopted local frame delta. Detaile" + }, + { + "number": 4173, + "title": "DONE: PR4100 CRT reservoir placement and coordinate descriptors", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/4173#discussioncomment-19070631", + "updated_at": "2026-10-20T12:48:57Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": " is not a cost certificate. Next useful task is an actual caller composition with explicitly shared mixed-width rows and correct endpoint-only padding validity, before claiming full E.\r\n\r\nCredit: Cinna Davis PR4100 (337d04939571a637aeab54a0f58f54fde811663a) original compiler/full-scan proposal; Hiroki KUMAZAKI PR4174 context, Douglas Colkitt/OpenAI framework, complete retained NOTICE lineage. This adds an explicit component lowering/audit, not a new Bene\u0161 mechanism.\r\n\r\nMain and overlap refreshed" + }, + { + "number": 2732, + "title": "DONE: historical replay snapshot setup 1.41 times faster, complete file coverage", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2732#discussioncomment-18964462", + "updated_at": "2026-10-16T05:43:44Z", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": "workflow passes on Linux](https://github.com/antunishdPursuit/integer-mult-bounds/actions/runs/38855418321), as does [reconciliation92](https://github.com/antunishdPursuit/integer-mult-bounds/actions/runs/38855418469). The [main matrix](https://github.com/antunishdPursuit/integer-mult-bounds/actions/runs/38855418536) is still running (15 passes, no failures at this checkpoint); this is not an all-green claim. The repaired native workflow passed at `9b173438` with identical native inputs: [fresh " + }, + { + "number": 1166, + "title": "Handoffs and requests for independent checks", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19038308", + "updated_at": "2026-10-19T10:54:28Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "ucer composition using ToikY/4025 plus4011/4010; guarded coefficient DAG evaluation; changed affine/mixed-width COPY; changed two-window carrier chronology. Separate scoped packages/PRs; complete-budget gates, frozen sources and predecessor credit retained. No selected \u03ba change. Wider Discussion/closed/code overlap remains partial. Chris R/Clear1nsight with substantial OpenAI Codex assistance." + }, + { + "number": 1166, + "title": "Handoffs and requests for independent checks", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19074777", + "updated_at": "2026-10-20T14:48:46Z", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": "independent verification, seed 60, base `12fa8c5c844be21bfefb38a19503fbd867a1c6ec`.\n\n**Object:** [PR4183](https://github.com/CrocSwap/integer-mult-bounds/pull/4183) head `59a1d97a86ea82b4d62958d705709ea46d7509f1` \u2014 delayed carrier retirement into full logical BIT recursion via code-disjoint stdlib checker on pinned receipts. Finite replay only; not formal proof.\n\n**Scope:** stated finite retirement / recursion identities and pinned receipt consistency. Explicitly not: full logical induction as f" + }, + { + "number": 1166, + "title": "Handoffs and requests for independent checks", + "kind": "discussion-comment", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19081901", + "updated_at": "2026-10-20T21:01:53Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "dversarial-audit / independent verification, seed 60, base `19cf7a065115`.\n\n**Object:** #4195 \u2014 CRT mixed-width padded caller.\n\n**Scope:** Finite pin / seal / math checks recomputable from committed package files without importing package verifiers. No new \u03ba; no merge/close; finite replay \u2260 formal proof.\n\n**Method:** Code-disjoint stdlib checker; post finding on the PR; reply DONE here.\n\nJames Reed (@rcfc-jreed), with substantial AI assistance (Claude, in Cursor)." + }, + { + "number": 1289, + "title": "CLAIM: selected PR589 bit hosting, ambient-axis disjointness across idle children", + "kind": "discussion-reply", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1289#discussioncomment-18953753", + "updated_at": "2026-10-15T16:44:57Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "a Git-free export. Reproduce with `python3 -I -B scripts/research_package.py --package research/bit-mixed-width-projectors` (about 26 seconds), expecting `PASS_BIT_MIXED_WIDTH_PROJECTORS k=0..74 slots=296325 split=0 ports=111 controls=9 no_new_kappa`.\n\n**Scope:** the geometric factorization only. No physical width-seven provider, helper-to-host intertwiner, correlated dirty-state whole-call hosting, new price, supplier admission or \u03ba change; the predecessor DP's optimum is not re-proved. A delib" + }, + { + "number": 1166, + "title": "Handoffs and requests for independent checks", + "kind": "discussion-reply", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19033169", + "updated_at": "2026-10-19T06:21:08Z", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": "at most 49911 coarse children per bad class). An alternate all-class construction additionally pays 41832 ordinary interchanges; that term cannot disappear into the cheap local toll.\r\n\r\nAll seven registered checks and exact published-byte/source-history checks pass. Actual encoded COPY515 numerical components work with a declared synthetic rank26 ancestor, 1664->182; this is not a complete physical payload/stock/return test. Uniform physical admission remains open.\r\n\r\nSmallest next task: refresh" + }, + { + "number": 1166, + "title": "Handoffs and requests for independent checks", + "kind": "discussion-reply", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19074889", + "updated_at": "2026-10-20T14:54:11Z", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": "**DONE**: finding posted on https://github.com/CrocSwap/integer-mult-bounds/pull/4183#issuecomment-6293793725. No defect in the finite query/owner/price scope. Independent check 35/35. Formal-kernel caller induction, supplier admission and \u03ba race not covered. Finite replay, not a proof. Claim released." + }, + { + "number": 1166, + "title": "Handoffs and requests for independent checks", + "kind": "discussion-reply", + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19081919", + "updated_at": "2026-10-20T21:02:56Z", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "://github.com/CrocSwap/integer-mult-bounds/pull/4195#issuecomment-6301423598. 14/14 SOURCES+3 forks mixed-width caller Claim released." + }, + { + "kind": "pr", + "number": 4183, + "title": "Admit delayed carrier retirement to the full logical BIT recursion", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/4183", + "head": "59a1d97a86ea82b4d62958d705709ea46d7509f1", + "base": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "updated_at": "2026-10-20T14:54:09Z", + "draft": false, + "state": "open", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": "carrier-owner-admission/RECURSION.md).\n\n## Task and overlap\n\nUser-assigned recursive admission of PR4183; catalogue card `bit-new-register-model` is retained with declared changed scope. Scientific base: `12fa8c5c844be21bfefb38a19503fbd867a11244`. The admission package pins the original local result at `928066009267fb32ab2c1a29b50fa3093ea18aef`; its source package and integer-output-preserving variant remain unchanged.\n\n- [PR4068](https://github.com/CrocSwap/integer-mult-bounds/pull/4068), `5a34" + }, + { + "kind": "pr", + "number": 4174, + "title": "Audit CRT reservoir placement and split-axis coordinate descriptors", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/4174", + "head": "5fec853f0c048871de3b8098d1e30d4ee19cda23", + "base": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "updated_at": "2026-10-20T16:00:35Z", + "draft": false, + "state": "open", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "ot's inactive-quarter choice and axes split by placement.\n\nThe quantified proof covers the original mixed-width domain and constants. It gives at most 25,600 batches per synchronized switch layer, three mutually disjoint field exchanges plus their inverses, and at most d+12 coordinate fragments. Full dirty-state restoration is conditional on the completed repaired switch's all-address contract. The allocator and verifier make the coordinates and counterexamples independently inspectable.\n\nValida" + }, + { + "kind": "pr", + "number": 4195, + "title": "Bind declared-width CRT shared rows to the complete padded caller", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/4195", + "head": "19cf7a065115d28dd8ee37c0fb4b626d8ddf289a", + "base": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "updated_at": "2026-10-20T21:02:56Z", + "draft": false, + "state": "open", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "ned scope `4600c179be2d8ba14466`; exact domain, dependencies and next question are in `research/crt-mixed-width-caller/TASK.json` and `PROOF.md`. Reproduce with Python3.12: `python3.12 -B scripts/research_package.py --package research/crt-mixed-width-caller`. Smallest follow-up: bind the decoded row and current-state interface to the complete uniformly priced evaluator; this package supplies no uncharged arithmetic or movement oracle." + }, + { + "kind": "pr", + "number": 4228, + "title": "Prove exact intermediate-rank BIT header densities", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/4228", + "head": "bb25dcedb5bbbacd3c35359eb6b5488b087bcde6", + "base": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "updated_at": "2026-10-20T20:34:50Z", + "draft": false, + "state": "open", + "matched_terms": [ + "4183" + ], + "score": 1, + "excerpt": "egate corpus differs from this header/image census, so no shared aggregate is asserted or rerun.\n- #4183 changes a logical BIT word and its paid profile. That admission is not used here; no moment/root number is shared or compared.\n\nThe merged #3950 finite rows agree numerically at the four overlapping domains: bad fractions 20/48, 144/480, 468/2016 and 6528/11232. Its F17 row is not rerun. The earlier exact endpoint claim and this contribution's scope are linked in the README.\n\n## CI notes\n\nLoc" + }, + { + "kind": "pr", + "number": 20, + "title": "Source-framed h53 conditional witness above 2^-20: attributed research record", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/20", + "head": "4f8d6c8272b5ff307a0da51df545ec3cd96a8b6e", + "base": "6e564879f51ae16f23d392e9e196c605f36d90df", + "updated_at": "2026-10-08T10:57:04Z", + "draft": true, + "state": "open", + "matched_terms": [ + "mixed-width" + ], + "score": 1, + "excerpt": "sistance remains acknowledged.\n- **icekylinx**, for the related recursive batching, whole-residual, mixed-width tape and precision framework in #10. Our common ambient metric-isometry and separately reviewed transfer arguments use a different basis construction.\n- **Bortlesboat** (#2) and **dleen** (#4), for aligned pairing and retained-total/stage-sharing work in the source lineage.\n- **Zhihao Chen (jacklightChen)**, for ternary producers and nested bases (#7/#16), and **Rohan Arun (rohanarun)*" + } + ] +} diff --git a/research/bit-stage-mixedwidth-packing/PROOF.md b/research/bit-stage-mixedwidth-packing/PROOF.md new file mode 100644 index 0000000000..9a0729eb00 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/PROOF.md @@ -0,0 +1,103 @@ +# Placement, source binding and stopped recurrence + +Retain the exact local word and logical caller hypotheses of PR4183 head +`59a1d97a86ea82b4d62958d705709ea46d7509f1`. Only the owner assignment changes. +Frozen predecessor sources/notices and new executable adapters are distinguished. + +## Chronological placement + +The K=4 controller has nine local stages and ten pending idle children. A child's +open window is strictly after its pair's last observation and before the pending +advance. A helper uses another pair inside that window. The constructor assigns +all438 helpers at every stage and all32 replicas:126144 occurrences and288 calls. +Assigned supports in every physical family are disjoint, also across children. +Every unassigned coordinate is returned in its exact compact idle suffix. + +Width-four roles462/463/464/467/470 end at frames506/506/506/508/509. In child6, +family-copy202, a stage-six width-eight helper occupies offset0. The five +stage-four partials occupy offsets8,12,16,20,24. This pending child starts at +axis22, so their slices are30..33,34..37,38..41,42..45,46..49 and its returned +suffix is50..63, rank14. The actual open window admits these stages. Other +partials fill twenty bins in child2 and twenty in child7; the verifier checks +the complete nomination, not just this example. + +## Operators, owners and the actual caller + +Let E_h be the terminal projector, rankk, and B_h the authenticated dyadic +orthogonal basis with B_h diag(I_k,0) B_h^T=E_h. For assigned sliceS use + + R_h=pi_S diag(B_h^T,I_56), sigma_h=A_q R_h. + +Then sigma_h E_h sigma_h^-1=A_q E_S A_q^-1. This retains the common family +chart, complements and all spectators. Actual primitive programs and inverse +routes are charged. The maximum route length is159 and selector bound1149. + +At invocationd the owner is(family,d sigma_h^-1), so all roles align. Different +families are disjoint. Every same-family chart pair has full matrix-difference +numerator gcd1 (5597 pairs per replica), hence remains distinct over every odd +residue ring. An integer label or equal rank alone is not SOURCE admission. + +Each local call returns its assigned residual while restoring arbitrary DIRTY. +The host is unobserved until its pending child. Disjoint residuals commute; +their union plus the paid suffix is exactly the old advance. This is the retained +whole-call hosting proof applied to a fully specified new assignment. Private +zeros, unused rows and omitted spectators provide no original DATA credit. + +The new Catalogue/Topology/Consumer binds all actual matrices and requests: +28166 canonical requests,81 guarded COPY episodes,540 bases,2710 charts and +32 replicas. Source histories, literal instructions and primitive grammar are +unchanged. Tests cover all literal events, split bases, compiled routes, +Consumer actions, complete threshold traces and recursive Frame lifecycle; +new cohosted partial/idle descriptors are probed separately. Small callbacks +are not execution of an enormous completed production payload. + +## Complete price + +The local profile is{1:1321,2:1342,3:79,4:39,5:102,6:10,7:19}. +The new idle profile per replica is{0:262,2:424,4:404,6:444,7:666,14:1,42:19}. +After288 local calls and32 idle copies the full paid profileP is + + {1:380448,2:400064,3:22752,4:24160,5:29376, + 6:17088,7:26784,14:32,42:608}. + +It has E=901312 requests, rank mass1808352, W=28416 original families and +nine additional private families. Put epsilon=10^-16 and B_bad=32*64^2*E. +The conservative moment is + + mu(b)=sum_r(P_r/W)(r/64)^(1-b) + +epsilon*(B_bad/W)*(1/64)^(1-b). + +Independent exact interval engines include the positive fallback term and prove +the adjacent10^-24 root signs in RECORD.json. At b=871/500000 they prove + + mu(0)<199/200, mu(b)<1-1/2400000. + +Thisb exceeds1.001 times the public upper moment bracket. Strong induction in +the retained stopped recurrence gives + + T(n,w)<=200 C n+2400000 C n^(1-b) w. + +For n<64 use the retained leaf boundCw. At internal nodes apply the induction +hypothesis to each proper childr floor(n/64) and every fallback width at most +floor(n/64). No monotonicity ofT is assumed. The two strict moment margins +absorb Cn and Cw respectively. Maximumrank42 is proper. This is a sufficient +power bound, not a runtime comparison at every finite width. + +## Uniform domain and stock + +Retain fixedq>2^80, canonical widths, root couplingn<=e and +w>=ceil(e^(17/10000)), and compatible fresh-row stockR=t K^D(n). Each child +retains all prefix, unused-row, gap, tail and spectator fields. Arbitrary stock +requires the separate outer compatible padding/restoration law. + +New fixed matrices have the same dimensions and SOURCE grammar. The bounds +28166<28278 requests,660<661 roles,680 packets and2^24 index/residue arena +capacity retain the latest proof. Its direct rational-matrix logical compiler +charges preparation, route/read/clear and suspended ancestors. The changed +historical selector bound1149 is explicit; no old1117 tariff is imported. +The compatible-stock ledger retains live logical symbols<11 V_root+F'_q. +Verifier heap use is not that production-space proof. + +Normal-form, whole-call hosting and logical primitive contracts remain premises. +Fixed physical tapes, complete physical arena cleanup and the outer join are +not established here. No selected whole kappa or complex supplier is changed. diff --git a/research/bit-stage-mixedwidth-packing/README.md b/research/bit-stage-mixedwidth-packing/README.md new file mode 100644 index 0000000000..b786c678d2 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/README.md @@ -0,0 +1,104 @@ +# Stage-eligible mixed-width BIT packing + +The five rank-four helpers in PR4183's admitted local word were still using its +inherited allocation. This package repacks their actual terminal operators into +chronological idle windows. The local word and its arbitrary dirty-input response +are unchanged. + +The complete nine-stage, 32-replica construction has **901,312 paid requests**, +down from 902,592, with the same rank mass 1,808,352 and original stock 28,416. +Every remaining idle coordinate is returned and charged. Nine private packets +are additional storage and contribute no original DATA credit. + +The conservative BIT moment root lies strictly between + +``` +1743059363170060183941 / 10^24 +1743059363170060183942 / 10^24 +``` + +The lower endpoint is approximately **0.001743059363170060183941**, 0.31235% +above PR4183's upper bracket 0.001737631818486007553484. For an actual stopped +recurrence bound use **b = 871/500000 = 0.001742**. Under the retained +source-bound logical `p=1` caller contracts, + +``` +T(n,w) <= 200 C n + 2400000 C n^(1-b) w. +``` + +C is uniform on the stated canonical, root-coupled domain for fixed prime +q > 2^80. Fixed physical tapes, physical arena cleanup, arbitrary-stock outer +padding and the multiplication assembly remain separate obligations. The +selected whole κ and complex supplier are unchanged. + +## What changes + +All 438 helpers, 660 ordinary input roles, SOURCE histories, COPY guards and +local instructions are retained from PR4183 head +`59a1d97a86ea82b4d62958d705709ea46d7509f1`. New deterministic bin offsets and +stage assignments place all 126,144 helper occurrences. Five stage-four partial +helpers share one eligible family with a width-eight helper. Exact dyadic +terminal charts map to disjoint coordinate slices; this is not rank-only packing. + +The new idle profile per replica is +`{0:262, 2:424, 4:404, 6:444, 7:666, 14:1, 42:19}`. It has 1,958 positive +idle requests, forty fewer than before. Maximum child rank remains 42. +This is a feasible assignment; no packing optimum is claimed. + +The historical elementary-selector bound increases from 1117 to **1149**, and +its route bound from 151 to **159**. That increase is charged. The retained +logical caller compiles the same fixed-size rational matrices directly; +changed constants enter C and the fixed-q preparation term. + +## Evidence and reproduction + +[PROOF.md](PROOF.md) gives the assignment, SOURCE/owner argument and stopped +recurrence. `RECORD.json` separates the moment bracket, logical separator, +comparison and publication status. Retained predecessor receipts are historical; +the new caller output is recorded separately. + +The verifier uses Python and the standard library: + +```sh +python3.12 -B scripts/research_package.py --package research/bit-stage-mixedwidth-packing +``` + +The validation receipt identifies the actual local Python version and fresh +normal/optimized, source-integrity and export replays. Finite evidence covers +the complete owner ledger, source-bound catalogue, 11,193,984 literal events, +split bases, Consumer/route/threshold/Frame probes, and new cohosted partial/idle +requests. These tests do not execute the enormous complete GL64 production +payload or establish a formal-kernel multiplication theorem. + +## Sources and credit + +Scientific base: `12fa8c5c844be21bfefb38a19503fbd867a11244`. Ross Richardson +supplied PR4183's retirement and logical admission and PR4021's five terminal +charts. Retain Ali Romman's R438/PR1043; Sagar Thakrar's allocation, transported +hosting and idle-window work; the PR2423/2653 inventories; cheesegrader's PR540 +framework; PR589 hosting; commdata2338's projector census; CubeJerry's native +rehost; Jose Manuel's complete packets and compatible stock; David Arias's +executable recursive caller; and all source-specific predecessor notices. +This contribution supplies the new mixed-width assignment and its integration. + +The pending predecessor head is retained as package-local source bytes rather +than assumed to be available in a clean checkout's Git history. +`SOURCE-ORIGINS.json` records its original paths, blob IDs and SHA256 hashes; +the local byte manifests bind every replay input. The direct verifier works +without Git or network access. These byte checks do not independently establish +the predecessor's publication ancestry or mathematical correctness. + +Prepared for **ai-nanachi** with substantial OpenAI Codex assistance, including +separate code-disjoint AI checks. Those are internal assisted reviews, not +independent human certification. New work is Apache-2.0; original notices remain. +No external author's approval is claimed. + +## Open next questions + +- Lower this exact logical caller to fixed physical tapes with paid access, + head/template return and rounded private cleanup. Start with the stage-four + cohosted partial requests; the source/owner proof does not supply that lowering. +- Certify an upper bound for this fixed stage-eligible packing model. Start with + the emitted slot/idle ledger. This witness does not establish optimality. +- Bind stronger BIT and complex suppliers to a complete outer multiplication + assembly. The limiting complex supplier and outer contracts are unchanged. diff --git a/research/bit-stage-mixedwidth-packing/RECORD.json b/research/bit-stage-mixedwidth-packing/RECORD.json new file mode 100644 index 0000000000..82a46bc790 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/RECORD.json @@ -0,0 +1,34 @@ +{ + "status": "PROPOSED_CONDITIONAL_LOGICAL_BIT_SUPPLIER", + "source_head": "59a1d97a86ea82b4d62958d705709ea46d7509f1", + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "moment_root": { + "lower": "1743059363170060183941/1000000000000000000000000", + "upper": "871529681585030091971/500000000000000000000000" + }, + "logical_b": "871/500000", + "logical_time": "T(n,w) <= 200 C n + 2400000 C n^(1-b) w", + "domain": "Fixed prime q>2^80, canonical/root-coupled domain and R=t K^D(n) compatible fresh-row stock.", + "query_count": 901312, + "previous_query_count": 902592, + "rankmass": 1808352, + "W": 28416, + "private": 9, + "comparator": { + "PR": 4183, + "head": "59a1d97a86ea82b4d62958d705709ea46d7509f1", + "upper": "434407954621501888371/250000000000000000000000" + }, + "relative_gain_lower": "603060520450292273/193070202054000839276", + "logical_b_relative_gain": "1092045378498111629/434407954621501888371", + "whole_kappa_changed": false, + "selected_record_changed": false, + "physical_tape_lowering_proved": false, + "publication": { + "PR": null, + "url": null, + "created_at": null + }, + "review_status": "Internal code-disjoint AI checks; no external maintainer approval claimed.", + "validation_receipt": "VALIDATION.json; consult its recorded actual outcomes" +} diff --git a/research/bit-stage-mixedwidth-packing/SOURCE-ORIGINS.json b/research/bit-stage-mixedwidth-packing/SOURCE-ORIGINS.json new file mode 100644 index 0000000000..e8b436869b --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/SOURCE-ORIGINS.json @@ -0,0 +1,801 @@ +{ + "repository": "CrocSwap/integer-mult-bounds", + "head_sha": "59a1d97a86ea82b4d62958d705709ea46d7509f1", + "read_only_snapshot_observed_at": "2026-10-21T07:31:45.538995+00:00", + "retained_files": [ + { + "shipped_path": "provider/CALLER-PROOF.md", + "source_path": "research/bit-carrier-owner-admission/CALLER-PROOF.md", + "git_blob": "16e941b2229c696758a0a8c564c0a1f0ca03b3d3", + "sha256": "28c5457da4d273a558c43936f9da9a49094994a2f5da9f780d5d822e7faa9d56" + }, + { + "shipped_path": "provider/CALLER-REVIEW.md", + "source_path": "research/bit-carrier-owner-admission/CALLER-REVIEW.md", + "git_blob": "ec1cd2290e6fb0af52c570f018fb407a094aa6f9", + "sha256": "1c65e4680f2b7ef8867fdbae698de5bf8c6c1e63200eab187eae90a9d78d4ba3" + }, + { + "shipped_path": "provider/CALLER-SOURCE-CUTS.json", + "source_path": "research/bit-carrier-owner-admission/CALLER-SOURCE-CUTS.json", + "git_blob": "bd761d4b8244ccda217e01448953b5dd376d66ea", + "sha256": "78aa2e2b33410540ae0bed856d722522cb5c43b5687e49b9fb0b435fb461ba5d" + }, + { + "shipped_path": "provider/CALLER-SOURCES.json", + "source_path": "research/bit-carrier-owner-admission/CALLER-SOURCES.json", + "git_blob": "bc383a32bb48079b08cde86296e0fa8b10829002", + "sha256": "ad4a6ad33e24baf471263a0e1a73db7fbaa071223ff11d1b20410185d8d5e8e3" + }, + { + "shipped_path": "provider/caller_source_cuts.py", + "source_path": "research/bit-carrier-owner-admission/caller_source_cuts.py", + "git_blob": "5fe2ab3bad3d0d1f7b296270b821bc2425d54034", + "sha256": "fb05ca0e7fa5ca229efd4be517c8462c4a9a30263738d3297753bc71f03a1df4" + }, + { + "shipped_path": "provider/INDEPENDENT-OWNERS.json", + "source_path": "research/bit-carrier-owner-admission/INDEPENDENT-OWNERS.json", + "git_blob": "8eeb7b8b306fb069587024a339733f3e41ffc14b", + "sha256": "53118b1f749bebf4ec0229855b7e5859966acf67a102286a8d4a5f06cfa7c00d" + }, + { + "shipped_path": "provider/independent_owner.py", + "source_path": "research/bit-carrier-owner-admission/independent_owner.py", + "git_blob": "29908f8d8284043026ba801de3c572529797a593", + "sha256": "cb90fbcb2fe955f8e79c9bce6747a5c98b3ce51442c288ac0e2d2ba9476e3fae" + }, + { + "shipped_path": "provider/INPUT-SOURCES.json", + "source_path": "research/bit-carrier-owner-admission/INPUT-SOURCES.json", + "git_blob": "ce662e4587dc466a969b0df00168a12f84229781", + "sha256": "502edb186ea7dca267f7ccb3fe1f450cee5c32ba5b3eadf931282c66d9a60c15" + }, + { + "shipped_path": "provider/inputs/ALLOCATION.json", + "source_path": "research/bit-carrier-owner-admission/inputs/ALLOCATION.json", + "git_blob": "c2fb443f44f2c7c420cd367ab5fa12644efe318a", + "sha256": "06fa9322508aba3d8a5dc6469151cdfaa906b60559582b49c8b024428b158021" + }, + { + "shipped_path": "provider/inputs/caller/bootstrap.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/bootstrap.py", + "git_blob": "448c9b3a86eedb84220646ab27ff089a32ad5b9b", + "sha256": "eef1c418e8edbdf317d159683e30beaecd971c77cf41d6b09708576405e2141e" + }, + { + "shipped_path": "provider/inputs/caller/check_layout.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/check_layout.py", + "git_blob": "be59d614d25961f891e1640bf85cf5e2f474a059", + "sha256": "454b1587d1ed5ccaea19b621a67e2ceba999d7ede61188125faa41c4dd2ab2b1" + }, + { + "shipped_path": "provider/inputs/caller/check_nested_model.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/check_nested_model.py", + "git_blob": "20fed6bd389cb53fc52d0ad8389e9e7704c90265", + "sha256": "b1941b882b0659722c3c41994c82f020c1f7ab320dc28c43c2758029ef8a48b7" + }, + { + "shipped_path": "provider/inputs/caller/check_recursion.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/check_recursion.py", + "git_blob": "8f36c88e196cf5afc0d6e227ba8568a10bb23c6a", + "sha256": "dde82badf043e553bc635a34295e2b5505d84d6dfbaf96e0cfccb8a8c3dbb158" + }, + { + "shipped_path": "provider/inputs/caller/check_runtime.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/check_runtime.py", + "git_blob": "fe355a703475325bca4807b8ffedfa9f6edb74f5", + "sha256": "9fcf0c9a3c84a17446fafe8da50b63db296ba9465d48ddb6fdeac8742dfc98b1" + }, + { + "shipped_path": "provider/inputs/caller/check_sign.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/check_sign.py", + "git_blob": "50669949a1325e8c49aa0ff714c40a50077b5eb8", + "sha256": "ee4fd34acd49962a18d268aefeb20aa3c2673a10e7a43eee3e51a9bd3cf9106a" + }, + { + "shipped_path": "provider/inputs/caller/check_sources.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/check_sources.py", + "git_blob": "5c09a13943070a3bb3c0da06fd19fbc6916d1743", + "sha256": "1c49984ae6ee7f8a44cde16b51e486f0b3ba4ee5c973389ac8d58a82d0a0aa3b" + }, + { + "shipped_path": "provider/inputs/caller/consumer.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/consumer.py", + "git_blob": "a66d9276f829ce2c619871866816649d5f3687fd", + "sha256": "2f2a8604c23fb2c81f24320c71ed0142118d98dde3be6086adad28e89954a777" + }, + { + "shipped_path": "provider/inputs/caller/control_checks.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/control_checks.py", + "git_blob": "11daa0b2221c5870d19ba2eaf411a6bff3a0398d", + "sha256": "c09d33327932b4ffbb8acb26c8a6bb621bcca542157d22f1edf72679a9359981" + }, + { + "shipped_path": "provider/inputs/caller/driver.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/driver.py", + "git_blob": "5b7846a70aada53d87480b337e1c04217118771b", + "sha256": "ceaf8f75de9810a05ebf8f65780b6f8bd7599a5768401d5e4386182afe615cdf" + }, + { + "shipped_path": "provider/inputs/caller/evidence/NOTICE.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/evidence/NOTICE.md", + "git_blob": "d0318d43ed420e21dc52166a19de703aa87fbb3e", + "sha256": "fd7c42e89878cda6df86dde8720ece34625a337cf5edd795a421e2d3b42919e9" + }, + { + "shipped_path": "provider/inputs/caller/evidence/pr2688-NOTICE.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2688-NOTICE.md", + "git_blob": "f2b49cdef83a4a685fad32c01fba93e12cfcb5a8", + "sha256": "c899fccf7bd32397f0ddd85e4af35a166cefb3e3ae3407ec40edc3ab2051b617" + }, + { + "shipped_path": "provider/inputs/caller/evidence/pr2688-PROOF.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2688-PROOF.md", + "git_blob": "1395e1941863e40ff6d62dd91c41de2cb56edae9", + "sha256": "fa9bec0952468e4acb760a88d45d5be216325650e1a4080cf590e07b90c9f533" + }, + { + "shipped_path": "provider/inputs/caller/evidence/pr2708-README.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2708-README.md", + "git_blob": "79b8742f32b4ffb991f91ddd2d3c6be693084e6d", + "sha256": "5906f6b7b2c8eea90e441476c4cbd60fe2ef981b690c63357bcfe67e3104aeef" + }, + { + "shipped_path": "provider/inputs/caller/evidence/pr2731-README.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2731-README.md", + "git_blob": "ac5b826f9c34e1faadc5d5a02d5d260823112078", + "sha256": "19683df4394de299cbd7e1cce39bf9434ad260b1a37006587cf9aed84c9c0a03" + }, + { + "shipped_path": "provider/inputs/caller/EVIDENCE.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/EVIDENCE.json", + "git_blob": "c2c347abc2b8c19bb642c4da1aad5b3e8383016f", + "sha256": "77b7cbefa2ca30acf2f77e23d14808ccd27848e9c76e4c5e68a045ef7891a07f" + }, + { + "shipped_path": "provider/inputs/caller/layout.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/layout.py", + "git_blob": "aa554b14fe0f6b308d9fba0a2afc92e5a28e20cb", + "sha256": "3beef6534b02c3b011b741f957a7d9fb05a9ac0bba1fed53b2c71834e4ea6bc1" + }, + { + "shipped_path": "provider/inputs/caller/linear_sign.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/linear_sign.py", + "git_blob": "6a6e5c02f299fad8c4f7ab724fc36e14a22ab13c", + "sha256": "73e895fc701a4145cbe89d60f5775128354e7f08d0a45eacf22f423913f54e67" + }, + { + "shipped_path": "provider/inputs/caller/node.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/node.py", + "git_blob": "28c98a3573b458f7a055678d70b602b80e6e959e", + "sha256": "0bd4f640cafb5c8f070c161d86445910f77578a672bf5886936ed89e7f6bd21b" + }, + { + "shipped_path": "provider/inputs/caller/packet_engine.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/packet_engine.py", + "git_blob": "72543f684f38fefeacc2ee66d81661f1a2439cf7", + "sha256": "c80fc3aa9092f91cc309b2fb2dbc3618bf96bdb9b8498503993ea161f0ae2134" + }, + { + "shipped_path": "provider/inputs/caller/peel.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/peel.py", + "git_blob": "38502515afc928082c849cd2cda8578d33a5050a", + "sha256": "8b20888f74b4cd814a97b42ec72528fbfb6d2e936c5022df726f0785d0d01a2e" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/cardinal_counts.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/cardinal_counts.py", + "git_blob": "6a14feac45094ae9156e8c2c982d6727544f180e", + "sha256": "59ddeac102a0cc51fa49b15aae6aeb68cd68ed217fa974ce916372a177d2ec8f" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/catalogue.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/catalogue.py", + "git_blob": "0efc0575a7623ac41c094d2e8772beda5a9fdc29", + "sha256": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/check_headers.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_headers.py", + "git_blob": "1c372b19e19b838a89c0e64daeda15ec6b49f079", + "sha256": "a41dab0c487c341eb32b34a03af74454e15e9e61e7386a1ca426d83f3b68b1ca" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/check_layout.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_layout.py", + "git_blob": "174d843716a684145f934cb55a612bca85aad725", + "sha256": "8f776a21dc0e31f9738d822cfda38db92f1e3672afb880d4246ec5e084a50a41" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/check_runtime.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_runtime.py", + "git_blob": "5647693b3a5c1555b65e281c6609f98b92d45542", + "sha256": "5357e4ff255f17c4209aaf71a3413a4148475f11180c4f829e8f0ebacd2877cb" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/check_sources.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_sources.py", + "git_blob": "9219cdf863d9f060d6e38a4f2f4760fd227af003", + "sha256": "6463c2724e04a313181b78e90a17cd62ee42465754902cca3e9a65c6140a15a1" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/consumer.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/consumer.py", + "git_blob": "24b53521fce94d3349072cf47d70e62195f4d541", + "sha256": "b28ec97b0873ff2be25aff4bdde268247ffcec0d21279d0ada196de19a0bdc66" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/control.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/control.py", + "git_blob": "4f6ac09bffab43dbccc470bd0bde2ffbe969a8b2", + "sha256": "d3a93e54bb7d333b73917586407d11674d38b5c3fda4fbdc436fb5293ae7786a" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/control_checks.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/control_checks.py", + "git_blob": "712cfddc4caaad9e788d97b0e1e3f623172c43ed", + "sha256": "5ea6ded8c2508fbb00d93655affdfe7907ffb60916389e0736249c003a7a5148" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/driver.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/driver.py", + "git_blob": "0bdee4c9e348259b470a636a98e7657770f97fae", + "sha256": "ee9e42fe95ab28fdd5e927c2d46fd480305aaad610eb2ca7ae514a5d22d9f0ac" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/fresh_rows.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/fresh_rows.py", + "git_blob": "aa3a327604308d3a5c7a27b65f5e631d430ab093", + "sha256": "e4ae08fbd658add630eb7754ebe0cbcb42c6f39cf4128f9cb92e27fcf5213a7d" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/layout.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/layout.py", + "git_blob": "267d5ab98cd013ee82ba75e6d41609f1778af25f", + "sha256": "7534b0166805f2ae8d11495c811d2bd272cea89c89b6bb5251fd411c89245a20" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/model.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/model.py", + "git_blob": "9fb82fa57d29cdf8402f91534dffed8f586ced6c", + "sha256": "c937ae8e46162f88fc1cd7646d3b22c99273029ad0f0e3131f46ddec230676cb" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/node.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/node.py", + "git_blob": "13badda6f059da2132cbe325c071307e5191baa3", + "sha256": "b88fc9ac0b22d939311ff4f7aff788e8c87a64fd5e866498e59bd27940ee3f28" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/NOTICE.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/NOTICE.md", + "git_blob": "ef9f81510db86eaf2f0a7191d85e92a6db30ddc0", + "sha256": "c446b32b8a621844fb2fbe654810c8122035bdd43fed2132f1137d98cb6f9943" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/packet_engine.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/packet_engine.py", + "git_blob": "27a0dbf82e78252beede56ff86f5933c93eb55c1", + "sha256": "ce7f132a6a69c802406f07c4a2119ef921e8978520ff58d5eeaeedb982c257f2" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/peel.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/peel.py", + "git_blob": "2ae1769a9726ab738d3981891d0b76beccac2d99", + "sha256": "3de018e68601566c364c7568b110f60c1bf34941b846cdffb94401bb799f85e3" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/PROOF.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/PROOF.md", + "git_blob": "a4746d1786f41e45a36fdedf37966b80fbab3562", + "sha256": "88754d57bae35a2089d9de221ff32ba802b7a56b810f96271f3ea36985edfb14" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/README.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/README.md", + "git_blob": "988ff622029aff49d7e99deb2468684d904bc852", + "sha256": "15631eb826b2d8d54fbee18fb6f70ee035e172d524c2a209b6c467c3f0204f64" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/RESULT.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/RESULT.json", + "git_blob": "7b7dfe0eab22a7b511483f268b97a7c707fd8b90", + "sha256": "0d94c5e9150f3fbd603526c67ea33168d3ba45e158aaf722e848bf5c316a37a8" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/SOURCES.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/SOURCES.json", + "git_blob": "4fef1a4d6c2d5e2620d3506d6032f9226870ed39", + "sha256": "1b02a5c607a5967948988c3beaf37d9975d650ad501a99fcf74c135dc1f05fdd" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/TASK.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/TASK.json", + "git_blob": "eb2ce7cc00df816daf566f101d56a0330852c1d9", + "sha256": "a4cd54d4b09ad12a90a5feeb39a127f0f0d5a2a04f9f88554c5fc3ee0cfe77f4" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/topology.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/topology.py", + "git_blob": "39a2916c207d04be5efc44750d8606f5da0c2990", + "sha256": "384d456ddba76de137a63b50019d5bba2e9f6daa4177c91643e0565d4cf1d44b" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/binding.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/binding.py", + "git_blob": "21a5a21220a18ab62a19ac403a9944bc3a8665c8", + "sha256": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/bitstream.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/bitstream.py", + "git_blob": "4d1fd4abb0f2aabe833e5cbc9efb51039739e7ca", + "sha256": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/cardinality.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/cardinality.py", + "git_blob": "b8ba857e32c5903408e1e61ff916300848b4a208", + "sha256": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/check_support.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/check_support.py", + "git_blob": "e1f961df9fa3a441fc5b600d1288a8d038eca51e", + "sha256": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/children.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/children.py", + "git_blob": "ce4935f838516e2b08d13bec767cb803786fbc6b", + "sha256": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/controller.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/controller.py", + "git_blob": "c631a9e77fbcccf0e8f448adc22978728aed7b60", + "sha256": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/counts.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/counts.py", + "git_blob": "81b48940ce222290a40d4fb349ce827f4788469d", + "sha256": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/directory.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/directory.py", + "git_blob": "c74cacf5ce809c0561d374f137a52df0992b4226", + "sha256": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/episode.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/episode.py", + "git_blob": "30d11ff4f333813855d36da3eb5a1ab0e154bafe", + "sha256": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/forms.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/forms.py", + "git_blob": "6667c0b772a63f0059c7caffec63e0d919a92398", + "sha256": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/low_codes.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/low_codes.py", + "git_blob": "737edfc4a10f4b7b3b97a7cef4b40864efd806e6", + "sha256": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/matrices.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/matrices.py", + "git_blob": "5d497353efbb9eeaaf4facd96ab40ffb0f3aa20d", + "sha256": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/numeric.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/numeric.py", + "git_blob": "6d4ebca8398008375b8f4762d1a9f1514e8c2611", + "sha256": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/oracle.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/oracle.py", + "git_blob": "244f131466698a3ace10b657242fe1f65c07fd1f", + "sha256": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/packet.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/packet.py", + "git_blob": "ebc9b616514412b80c56d523776e6ba5d6766453", + "sha256": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/plan.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/plan.py", + "git_blob": "48255d5454308c07635fae4e7eb4873b0bd2a4f8", + "sha256": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/records.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/records.py", + "git_blob": "4f00467a0ff580954ad2fd0c7380240c753ddef3", + "sha256": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/residual.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/residual.py", + "git_blob": "3d070d2539a529f3b14ecb086a92a3db056229fe", + "sha256": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/routes.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/routes.py", + "git_blob": "35531201dc349a811dfabc6f1f6e64697d665194", + "sha256": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/selection.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/selection.py", + "git_blob": "2c28f1aaec104a75c4e6c170b3e6a60300ee6700", + "sha256": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/sources.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/sources.py", + "git_blob": "16d5e7e6a28018f1e2d76d61efe2d54f6a6941d4", + "sha256": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/stream.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/stream.py", + "git_blob": "5e5a4bb0f98971447043e25d4dd6991bfc070389", + "sha256": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/stream_runner.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/stream_runner.py", + "git_blob": "efff281d4c4be5c1378e31404fbcc634fe4ade59", + "sha256": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/trace.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/trace.py", + "git_blob": "bb845a90f5bcf006e683e581e385936208f6a1f4", + "sha256": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/vendor/words.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/words.py", + "git_blob": "8d4ba37e2778acb35b34e0719df2caf138fbeb50", + "sha256": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/VERIFY.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/VERIFY.json", + "git_blob": "69c7ad75abe494be386f73a5d51359b9053cd9be", + "sha256": "e1dd0ee5f267ffa515bb345054ff8637cfedb0079b0d2da29b90b7848264926e" + }, + { + "shipped_path": "provider/inputs/caller/predecessor/verify.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/predecessor/verify.py", + "git_blob": "121acc1ff15ec85a8011e96eda2eb587608413b9", + "sha256": "cd83797d1f420f7e5de61c1a693110b4ee0c80bac0adae4699599046b7f76f8a" + }, + { + "shipped_path": "provider/inputs/caller/PREDECESSOR.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/PREDECESSOR.json", + "git_blob": "56d76c357b51f4fc6856923222bfca47f03334e7", + "sha256": "e3127475913d62dbdf1b45d9283d2db2e9b689e0f81a703189150c1e5be2bca0" + }, + { + "shipped_path": "provider/inputs/caller/PROOF.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/PROOF.md", + "git_blob": "1a08e57eac2a37764066d31baa3ecd3769759158", + "sha256": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d" + }, + { + "shipped_path": "provider/inputs/caller/README.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/README.md", + "git_blob": "75461632856f94d6b48ae820cf5d0b2b232305c2", + "sha256": "6ce41fd7e6dfbe5faecc25bd36561f0a65b6ebca6fc69d3fb72569424a405045" + }, + { + "shipped_path": "provider/inputs/caller/recursive_call.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/recursive_call.py", + "git_blob": "6d33224145aa04f7fbaf7b6cda7c9c164311a402", + "sha256": "157deaa5972557893d43494a81151483bdc46373448ec677cb6a738c9b7e6f1e" + }, + { + "shipped_path": "provider/inputs/caller/RESULT.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/RESULT.json", + "git_blob": "75faec7844e18fc7c44543dbab87aba2ecf32b3e", + "sha256": "4919655bae2e5cff051e8f2d240a8e4ebb03392a9da2fb5328daa9248fb7e88b" + }, + { + "shipped_path": "provider/inputs/caller/scheduler.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/scheduler.py", + "git_blob": "60c2b6d065eba91dd5e0edb7a77fc087971eca3f", + "sha256": "0d96f7fbd6f90416167c5a52c0e3de942d1a0cae3d2968831932a9576701699f" + }, + { + "shipped_path": "provider/inputs/caller/SOURCES.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/SOURCES.json", + "git_blob": "ff8c8e36176aa56e319d0f9e584167ac21d67f33", + "sha256": "7c78f539078e1bc3d893b78b5ee24cb22dc090d3763fe554e861b6c3d3e7eaf7" + }, + { + "shipped_path": "provider/inputs/caller/stream_runner.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/stream_runner.py", + "git_blob": "6ba5df130bb4a0fcb06b6c630830ae3a6922921b", + "sha256": "b255feaf6cc6e40413ae73fe302bf8f290bf4dd89f4128b23a91cc9860601801" + }, + { + "shipped_path": "provider/inputs/caller/TASK.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/TASK.json", + "git_blob": "d70ad317275d2a517ab1294ce48ecb1f83dfedbf", + "sha256": "ac7d4b38da31b373e665929027fc04afb66c3e9aedaea3296e3783637912d0e8" + }, + { + "shipped_path": "provider/inputs/caller/trace.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/trace.py", + "git_blob": "4b002201ce54cdecec9acf4e874b7f71cd75fe71", + "sha256": "3a664224c558244f606b603cad816d75e94a17c9b2620a06a1530e893dfceac2" + }, + { + "shipped_path": "provider/inputs/caller/VALIDATION.md", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/VALIDATION.md", + "git_blob": "d91680665a28c12c27c99336b55c3d5341dd0fe4", + "sha256": "ac0f2fab0ca810ce0202d31480daa8329cba0897ab015520a2bfd4b689c4086b" + }, + { + "shipped_path": "provider/inputs/caller/VERIFY.json", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/VERIFY.json", + "git_blob": "b6072f66c13a38b5d8dff3ca3bc5f3f3562f1b6e", + "sha256": "6ad0e07f68458afedece927550655b5bc5cd9861a70044fcd95bb10a2179f0a6" + }, + { + "shipped_path": "provider/inputs/caller/verify.py", + "source_path": "research/bit-carrier-owner-admission/inputs/caller/verify.py", + "git_blob": "96be8f5859a3f3799344d46dec1ee68170d96bfa", + "sha256": "65126e788eeea10e830fc583cf4afe0bfc4d67495cbf8ac21de3507dbe624d56" + }, + { + "shipped_path": "provider/inputs/CALLER-GEOMETRY.json.gz", + "source_path": "research/bit-carrier-owner-admission/inputs/CALLER-GEOMETRY.json.gz", + "git_blob": "1f6b960978daa060627462780ebe07643482dc67", + "sha256": "a1629f8cf4321addc5a1e24c4ce2bc744a4c35c1d1eff9bd59fc6fd437f9f0c1" + }, + { + "shipped_path": "provider/inputs/CONTROLLER.py", + "source_path": "research/bit-carrier-owner-admission/inputs/CONTROLLER.py", + "git_blob": "3df12bd632f1fdba825ced57110a1fee82eb2857", + "sha256": "6368196a393ac25bb2918880e4c4bd31ed733b762c27b6873ab391cbc0c5c3c8" + }, + { + "shipped_path": "provider/inputs/GEOMETRY.json.gz", + "source_path": "research/bit-carrier-owner-admission/inputs/GEOMETRY.json.gz", + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + }, + { + "shipped_path": "provider/inputs/native/bits/stdc++.h", + "source_path": "research/bit-carrier-owner-admission/inputs/native/bits/stdc++.h", + "git_blob": "fc5664e929d9a81d9b4926bee049a93330be86ec", + "sha256": "420094be2af295eed03a983dd66debbbe9cfb78d8252859f4498a615a0074b99" + }, + { + "shipped_path": "provider/inputs/native/columns_k.cpp", + "source_path": "research/bit-carrier-owner-admission/inputs/native/columns_k.cpp", + "git_blob": "42bb232fbec4de703e70cc13dc2f39a3b43a3a01", + "sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2" + }, + { + "shipped_path": "provider/inputs/native/json.hpp", + "source_path": "research/bit-carrier-owner-admission/inputs/native/json.hpp", + "git_blob": "82d69f7c5d044c9887c96b90c97f5639083ecd14", + "sha256": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63" + }, + { + "shipped_path": "provider/inputs/native/legality_h.cpp", + "source_path": "research/bit-carrier-owner-admission/inputs/native/legality_h.cpp", + "git_blob": "cb1233c7e96b1aa8bbf4d2e4165d75ab0dca64b9", + "sha256": "6c1ef2b24e57781d6951c172a1024fc4300e6fd392c9d6672079a7806ab663b3" + }, + { + "shipped_path": "provider/inputs/native/stage_cohort.py", + "source_path": "research/bit-carrier-owner-admission/inputs/native/stage_cohort.py", + "git_blob": "f6d7afe3e623208c4207b6a683a1e3e49249e31c", + "sha256": "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a" + }, + { + "shipped_path": "provider/inputs/PR4183-RESULT.json", + "source_path": "research/bit-carrier-owner-admission/inputs/PR4183-RESULT.json", + "git_blob": "12fc1c8c17af6bceac754913847b28b74190764d", + "sha256": "ccd419ac1cb123edd8a27aa9d0a6ab3713087a8bcd5be39114a7bd0f254ceebc" + }, + { + "shipped_path": "provider/inputs/proofs/assemble9.py", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/assemble9.py", + "git_blob": "238226c568742dd5723b03eabae564a2eaa2bda9", + "sha256": "4bf6768224a3fac81ccda26df24f3763f9a4fbc35ad62bef2888595cdae519fe" + }, + { + "shipped_path": "provider/inputs/proofs/batched-bit-rows.tex", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/batched-bit-rows.tex", + "git_blob": "cbaa8cb42cad1e714a1d24b16ab160ae6eaf60c9", + "sha256": "ef72c0ead19373cbc19c8a3aacb44dd0f75353ee5f4d055f775a986a4878022c" + }, + { + "shipped_path": "provider/inputs/proofs/local-ring-packets.md", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/local-ring-packets.md", + "git_blob": "4330de85dd9862ed15d84ab917887d249753df99", + "sha256": "846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7" + }, + { + "shipped_path": "provider/inputs/proofs/recursive-caller.md", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/recursive-caller.md", + "git_blob": "1a08e57eac2a37764066d31baa3ecd3769759158", + "sha256": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d" + }, + { + "shipped_path": "provider/inputs/proofs/stopped-recurrence.md", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/stopped-recurrence.md", + "git_blob": "6c410cab5713979214a45835091fbeb9ee9b8531", + "sha256": "74cc8de20f21acb5123fe2d20996fe0925ea6e51b3dec633bd5221fb719b3344" + }, + { + "shipped_path": "provider/inputs/proofs/terminal-chart-admission.py", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/terminal-chart-admission.py", + "git_blob": "2fd5d7664575e4b324123eaad8729c100ededc2e", + "sha256": "762357be4644da879251eca070a81dfd73ec3ef4991191cdd630896e7e9b44a3" + }, + { + "shipped_path": "provider/inputs/proofs/whole-call-hosting.md", + "source_path": "research/bit-carrier-owner-admission/inputs/proofs/whole-call-hosting.md", + "git_blob": "bbd3f12b9a32b3ad3cba85a2d5a1b3054214fa02", + "sha256": "59cae781bfbe1a01ed9e66a8efeeb5a2b995e5ecdf908586b23ecc39f2b8d647" + }, + { + "shipped_path": "provider/inputs/R438-CERTIFICATE.json", + "source_path": "research/bit-carrier-owner-admission/inputs/R438-CERTIFICATE.json", + "git_blob": "674ef36f723fbcc593e7d2319dca131da09181e5", + "sha256": "6da8c593257c8440f0fe35488d941715d953d715e2e464ffdfffff7ed31eee9c" + }, + { + "shipped_path": "provider/inputs/SELECTED-ASSEMBLY.json", + "source_path": "research/bit-carrier-owner-admission/inputs/SELECTED-ASSEMBLY.json", + "git_blob": "5fd676df060f3b450782fdf5ff5f6beb63a5eeb0", + "sha256": "1122cb3a575f8c788345fc1bf4c108ac7c3250fb81a5988671f5eb04b3ab3045" + }, + { + "shipped_path": "provider/inputs/TERMINAL-CHARTS.json", + "source_path": "research/bit-carrier-owner-admission/inputs/TERMINAL-CHARTS.json", + "git_blob": "832e64f7268e8393ac862dd9f321d66fa71709c5", + "sha256": "489216ea25f47f061675ab7b7e4a17289a531bce6fe77cca166a13265bfcbb17" + }, + { + "shipped_path": "provider/inputs/WORD.json.gz", + "source_path": "research/bit-carrier-owner-admission/inputs/WORD.json.gz", + "git_blob": "aa9ec3c341ad87d7513b9ea6934d5253035b8d30", + "sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + { + "shipped_path": "provider/MANIFEST.json", + "source_path": "research/bit-carrier-owner-admission/MANIFEST.json", + "git_blob": "71c8b9a3feee66adcad2772ca2c36770b97d00d9", + "sha256": "ed8e41b73d0fc47cab4db094965a196388b313f62e28e2036318e9ac02155af1" + }, + { + "shipped_path": "provider/native-check.py", + "source_path": "research/bit-carrier-owner-admission/native-check.py", + "git_blob": "c77835976cdba60dade5953d1c6fed95d950efcc", + "sha256": "d50efb920aba302adde5ff5fbf94d11a49d45f359414495c6fe79034fb3cde18" + }, + { + "shipped_path": "provider/NATIVE-CXX.json", + "source_path": "research/bit-carrier-owner-admission/NATIVE-CXX.json", + "git_blob": "172f9a3de75b8c3d1deb8ff448bb627dcf30a57f", + "sha256": "98b5541f9eab24c62593bac11089c80dead012c4276348b5345444a1d85cb668" + }, + { + "shipped_path": "provider/NATIVE-PROOF.md", + "source_path": "research/bit-carrier-owner-admission/NATIVE-PROOF.md", + "git_blob": "7cb290902e51a6d5dabc582afef16a7e944a8c37", + "sha256": "991a15cad6769837312de0a7f7934edcf87e44bfbd8ceac19210bf8639e9e2f0" + }, + { + "shipped_path": "provider/NATIVE.json", + "source_path": "research/bit-carrier-owner-admission/NATIVE.json", + "git_blob": "af105e6c5322cd81eb91ff4664f4cd8e04eec56e", + "sha256": "6fd351c5eb23b2c041e39bc2f0abd9e18111660b11336e488fa03116b2314745" + }, + { + "shipped_path": "provider/native.py", + "source_path": "research/bit-carrier-owner-admission/native.py", + "git_blob": "1bce76b7f0aaab69d9c93b68274c99e4c04f27ba", + "sha256": "db92b1c2e61c8b8f3d94581e1bcd921af881cdf9d8fd03eba646864195134f2a" + }, + { + "shipped_path": "provider/OWNER-PROOF.md", + "source_path": "research/bit-carrier-owner-admission/OWNER-PROOF.md", + "git_blob": "8d769c0f105780bd1a187c22240da91b3d08a089", + "sha256": "68c0cf7f5e04c33609f342bcd1097fae68eb63fe40182e8236e48330d654315f" + }, + { + "shipped_path": "provider/price.py", + "source_path": "research/bit-carrier-owner-admission/price.py", + "git_blob": "f73ebb4d3d003d74aad743ec8f47c6dd94c8a394", + "sha256": "e3a97177b140d32519bfe2cdb0b0acdb6783378fc957cf8d2287fabae7da7840" + }, + { + "shipped_path": "provider/RECURSION.md", + "source_path": "research/bit-carrier-owner-admission/RECURSION.md", + "git_blob": "aa2d40c19a4bbd347a85d4f2f8a5b505f9cad044", + "sha256": "cd4b15dc76686c87c1cbeb834a6b32331ef021c0bc91918712aea0cc78bf1f62" + }, + { + "shipped_path": "provider/SOURCES.json", + "source_path": "research/bit-carrier-owner-admission/SOURCES.json", + "git_blob": "cb721ccefe990f32d0189793e7adeca17b87b210", + "sha256": "0bbed564d734179d490721eb00f68320899945882b316cc51d05978041125631" + }, + { + "shipped_path": "provider/TASK.json", + "source_path": "research/bit-carrier-owner-admission/TASK.json", + "git_blob": "c7b464d7df39ed128f9d4cc186a9343064e0b8b6", + "sha256": "fe48d7144714507feb436166db2851990cf78886d2a7c0e21436b24ba4cad3e4" + }, + { + "shipped_path": "provider/UPSTREAM-CALLER.json", + "source_path": "research/bit-carrier-owner-admission/CALLER.json", + "git_blob": "f5add0705f29077f6af0cca08f29e4fc62498d79", + "sha256": "e78211b1044de8381fa8bbe1ad674b6ebf5b970e206841216cb91e67b186ce2e" + }, + { + "shipped_path": "provider/upstream-caller.py", + "source_path": "research/bit-carrier-owner-admission/caller.py", + "git_blob": "2038b46583f91cd0e125d394fd6ac720c84179ff", + "sha256": "eda0aedcd1b57451c9fb3ad3b9e696dd3601dc7e956ef55d16819b32a42c6c88" + }, + { + "shipped_path": "provider/upstream-owner.py", + "source_path": "research/bit-carrier-owner-admission/owner.py", + "git_blob": "02d8e3c2831eaadd4e3f63b0f6041e8ef6f0e9d0", + "sha256": "b6232c9f7f5d7b9a4be868e5e1d147b57e8e7ba9ddc0d35e7f7170c65b600c66" + }, + { + "shipped_path": "provider/UPSTREAM-PRICING.json", + "source_path": "research/bit-carrier-owner-admission/PRICING.json", + "git_blob": "b96705acf71561b7e7897fde2d4f9f270046298f", + "sha256": "b0fe2786761fd2b1b954f845b3a9bf29931938bd39f72f5522b675d06eb7fb7a" + }, + { + "shipped_path": "provider/UPSTREAM-README.md", + "source_path": "research/bit-carrier-owner-admission/README.md", + "git_blob": "ec253c59fb4ef935fa555b07fff251e4b105c5a5", + "sha256": "6ddc6fc758cc60bb60aca568454840fdfef7e6619a1af30e03b0ea11be13e6b2" + }, + { + "shipped_path": "provider/UPSTREAM-VERIFY.json", + "source_path": "research/bit-carrier-owner-admission/VERIFY.json", + "git_blob": "1264d8d5f7ca35730ebc3c33517dca8c1b5821aa", + "sha256": "eb683ae89f337a74c31b91cd9d938fe768a3cfed08d9e2cd0c55b6c54d69e0a0" + }, + { + "shipped_path": "provider/UPSTREAM-verify.py", + "source_path": "research/bit-carrier-owner-admission/verify.py", + "git_blob": "73894323303757cd37acd5993188e7c8c2daf295", + "sha256": "08b4d2af8729a910682471cfa38d4c719e56e9804490bc4c884726917c58e881" + }, + { + "shipped_path": "provider/VALIDATION.md", + "source_path": "research/bit-carrier-owner-admission/VALIDATION.md", + "git_blob": "312f38a8ee0ff3bb041e49663774a7a1547b7f39", + "sha256": "661bcc904c63e0c5437ffc07de980011e3f7ebef9aaa26a9affa97b6e3dc4e06" + } + ], + "verification": "Static Git blob/SHA256 equality to the exact-head API snapshot; runtime replay is Git-free.", + "limit": "Registered Git provenance binds the base catalogue/selected record. Remote-head publication ancestry is recorded here, not proved by a Git-free replay." +} diff --git a/research/bit-stage-mixedwidth-packing/SOURCES.json b/research/bit-stage-mixedwidth-packing/SOURCES.json new file mode 100644 index 0000000000..01da603656 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/SOURCES.json @@ -0,0 +1,19 @@ +{ + "schema_version": 1, + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "64bfc5af6709ed9811171e0a2108f05e1219cb65", + "sha256": "352a6184713b8843d96fd2c2071eb7aeaa655906b7c51d45ad444912666c8a96" + } + ], + "external_runtime_archive": "SOURCE-ORIGINS.json; source bytes are checked by registered verifiers" +} diff --git a/research/bit-stage-mixedwidth-packing/TASK.json b/research/bit-stage-mixedwidth-packing/TASK.json new file mode 100644 index 0000000000..15c4726761 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/TASK.json @@ -0,0 +1,91 @@ +{ + "schema_version": 1, + "task_id": "selected-packing", + "priority_revision": 7, + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "original_card": { + "id": "selected-packing", + "question": "Does a named residual packing task have meaningful uncovered headroom after its exact fixed-inventory ceiling?", + "starting_points": [ + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "research/staged-fourth-mixture-ceiling/README.md", + "research/staged544-mixed-fourth-entry/README.md" + ], + "methods": [ + "Check a fixed-inventory ceiling and source equivalence before any explicitly bounded residual search.", + "Price a genuinely changed word/interface under a newly applicable model." + ], + "acceptance_gate": "Check live overlap and exact model/source binding first. Distinguish a chronological construction from a pooled optimum. State the applicable fixed-inventory ceiling and remaining headroom; changed words or interfaces require a new fully charged model. Do not launch a residual search without an explicit scope and time cap.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read #4091 fixed-word pooled ceiling and #4088 later 1090-call literal fill. Bind the unchanged local invoices/capacities/stock before transferring the ceiling; its earlier 1080-call residual-bin recipe is historical.", + "scope": "Source-binding orientation only; no scientific replay, theorem acceptance or supplier admission. Budget any heavy replay separately." + }, + "first_experiment": "Default to a bounded headroom/source-equivalence check. Only start residual search with an explicit unclaimed domain, time cap and reason the tiny remaining gain matters. Otherwise hand off or select a changed-word mechanism. A changed word or interface needs a fresh cost model, not the old ceiling. Stop at the fixed-inventory cap; do not extend by new random seeds.", + "bottleneck_link": "An actual paid-profile gain can improve the frontier up to the other supplier cap.", + "allowed_variations": [ + "One bounded residual packing instance or exact relaxation.", + "If the coverage law, template or guard changes, derive an applicable fully charged replacement bound instead of applying the incumbent ceiling outside its scope." + ], + "scope_change_triggers": [ + "Rerunning an existing search with only a different seed as a separate mathematical contribution." + ], + "overlap_terms": [ + "T16", + "owner exchange", + "packing", + "4091", + "4088", + "staged-fourth-mixture-ceiling", + "staged544-mixed-fourth-entry" + ], + "existing_checks": [ + { + "scope": "PR #4091: pooled optimum at one-third staging for pinned fixed words; not a chronological fill.", + "evidence": "research/staged-fourth-mixture-ceiling/README.md", + "remaining": "Independent scope/source check; any residual optimization is explicitly bounded and optional.", + "status": "author-checked", + "source_commit": "a29bdd8f56cd18b805917775cdec09ff935eddc4", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #4088: later 1090-call literal fill improves the earlier 1080-call witness.", + "evidence": "research/staged544-mixed-fourth-entry/README.md", + "remaining": "Complete admission remains separate; old residual-bin instructions must not be copied blindly.", + "status": "author-checked", + "source_commit": "72d7efc181edb21806a878f174847c96dd410ab0", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Source-bound chronological mixed-width packing of unchanged PR4183 BIT word, with retained logical p1 caller.", + "scope_change_reason": "The human assigned BIT work. The catalogue card starts from the selected complex inventory; this bounded experiment instead established new BIT headroom and realized it as actual owner descriptors.", + "bottleneck_link": "Fewer paid recursive requests improve the conditional logical BIT moment; the limiting complex/outer supplier is unchanged.", + "budget_minutes": 180, + "stop_rule": "No submission from a relaxation. Require exact owners, SOURCE binding, complete positive moment and logical caller; recheck current best immediately before posting.", + "outcome": "completed", + "evidence": "PROOF.md; CALLER-BINDING.md; RECORD.json; provider/new-owners; VERIFY.json", + "author": "ai-nanachi", + "ai_assistance": "Substantial OpenAI Codex assistance in mathematics, code, writing and separate code-disjoint AI reviews; no independent human certification.", + "open_questions": [ + { + "question": "Can this exact logical caller be lowered to fixed physical tapes?", + "why_it_matters": "The logical BIT rate does not yet discharge physical access/cleanup costs.", + "first_step": "Lower the new cohosted stage-four partial descriptors with paid head and template return.", + "blocked_by": "A complete compatible physical arena/rounded-cleanup implementation." + }, + { + "question": "What is the exact stage-eligible packing ceiling for this inventory?", + "why_it_matters": "The current assignment is feasible, not an optimum.", + "first_step": "Use the shipped slot and idle ledger to derive a dual certificate.", + "blocked_by": "No certified optimum for the actual source/chronology constraints." + } + ] +} diff --git a/research/bit-stage-mixedwidth-packing/VERIFY.json b/research/bit-stage-mixedwidth-packing/VERIFY.json new file mode 100644 index 0000000000..0a618879ac --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/VERIFY.json @@ -0,0 +1,28 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 360, + "checks": "Fresh full caller, exact SOURCE/owner and independent rational price; six semantic/source mutants." + }, + { + "argv": [ + "{python}", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 360, + "checks": "Same explicit guards, source pins and complete caller with Python optimization enabled." + } + ] +} diff --git a/research/bit-stage-mixedwidth-packing/independent_price.py b/research/bit-stage-mixedwidth-packing/independent_price.py new file mode 100644 index 0000000000..aa7c757976 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/independent_price.py @@ -0,0 +1,305 @@ +#!/usr/bin/env python3 +"""Independent exact price/census check for the mixed-width rehosting provider. + +Reads only --provider. No producer imports, external paths, network or Git. +All mathematical decisions are exact; receipt intervals are rounded outward. +Validation uses explicit exceptions and remains effective under Python -O. +""" +from argparse import ArgumentParser +from collections import Counter +from datetime import datetime, timezone +from decimal import Decimal, localcontext +from fractions import Fraction as Q +from functools import lru_cache +from pathlib import Path +import gzip +import hashlib +import json +import sys +import time + +M, W, REPLICAS, CALLS = 64, 28416, 32, 288 +LAMBDA = Q(32*M*M, 10**16) +INTERNAL_GRID = 1 << 320 +OUTPUT_GRID = 10**72 +BASELINE_WORD_SHA = 'fab5e51011239a13a79307f1d079551eef38387a45c9ab315ab6bc83aced8de2' +CANDIDATE_WORD_SHA = '5f301f0d668ded1028b7603c5ea9c88271e390fb9060ce8e118aad7d9927a7fd' +EXPECTED = {1:380448,2:400064,3:22752,4:24160,5:29376,6:17088,7:26784,14:32,42:608} +ROOT_LOWER = Q(1743059363170060183941, 10**24) +ROOT_UPPER = ROOT_LOWER + Q(1, 10**24) +PUBLIC_UPPER = Q(434407954621501888371, 25*10**22) +CHOSEN_B = Q(871, 500000) + + +def need(value, message): + if not value: + raise ValueError(message) + + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(',', ':')).encode('utf-8') + + +def read_bytes(provider, relative): + path = provider / relative + need(path.is_file(), 'missing provider file: '+relative) + return path.read_bytes() + + +def read_json(provider, relative): + try: + return json.loads(read_bytes(provider, relative)) + except (OSError, json.JSONDecodeError) as exc: + raise ValueError('invalid JSON file: '+relative) from exc + + +def load_artifacts(provider, summary): + need(isinstance(summary.get('artifacts'), dict), 'owner artifact metadata') + data, pins = {}, {} + names = ['CHARTS', 'DISPATCH', 'ORDER', 'REMAINDERS', 'SLOTS'] + if (provider/'new-owners/FILL.json.gz').is_file(): + names.append('FILL') + for name in names: + need(name in summary['artifacts'], 'artifact metadata: '+name) + meta = summary['artifacts'][name] + relative = 'new-owners/'+name+'.json.gz' + raw = read_bytes(provider, relative) + try: + body = gzip.decompress(raw) + except (OSError, EOFError) as exc: + raise ValueError('invalid gzip artifact: '+name) from exc + need(sha(raw) == meta.get('gzip_sha256'), 'gzip hash: '+name) + need(sha(body) == meta.get('content_sha256'), 'decompressed content hash: '+name) + need(len(body) == meta.get('uncompressed_bytes'), 'decompressed byte count: '+name) + data[name] = json.loads(body) + pins[relative] = dict(gzip_sha256=sha(raw), content_sha256=sha(body), bytes=len(body)) + return data, pins + + +def candidate_records(records): + need(sha(canonical(records)) == BASELINE_WORD_SHA, 'frozen baseline literal word hash') + need(records[23889] == [3,476,660,515,0,3], 'closed COPY edit anchor') + need(records[33619] == [0,469,517,1,1,32], 'terminal MOVE edit anchor') + retired = {53,20255,20256,23408,23409,33620} + moved = {23405,23406,23407,23515,24189,24190,24515} + out = [] + for i, row in enumerate(records): + if i == 33619: + out.append([0,469,0,517,7,32]) + if i not in retired | moved and not (row[0] == 1 and row[5] == 10 and row[2] == 469): + out.append(row) + if i == 23889: + out.extend(records[j] for j in (24189,24190,24515)) + out.append([1,413,50,1,509,2]) + out.extend(records[j] for j in (23405,23406,23407,23515)) + need(sha(canonical(out)) == CANDIDATE_WORD_SHA, 'once-edited candidate literal word hash') + return out + + +def census(provider, summary, artifacts): + need(summary.get('W') == W, 'live W must exclude the nine private families') + need(summary.get('physical') == W+9 and summary.get('private_reserve') == 9, 'physical/private stock') + need(summary.get('stages') == 9 and summary.get('replicas') == REPLICAS, 'stage/replica stock') + dispatch, order = artifacts['DISPATCH'], artifacts['ORDER'] + need(len(dispatch) == CALLS and len(order['calls']) == CALLS, 'complete 288 invocation census') + expected_calls = {(s,r) for s in range(9) for r in range(REPLICAS)} + need({(x['stage'],x['replica']) for x in dispatch} == expected_calls, 'all stage/replica dispatches') + need({(x['stage'],x['replica']) for x in order['calls']} == expected_calls, 'all stage/replica order entries') + raw_word = read_bytes(provider, 'inputs/WORD.json.gz') + word = json.loads(gzip.decompress(raw_word)) + records = candidate_records(word['records']) + need(len(word['start']) == 660 and len(word['final']) == 660, 'ordinary RAW inventory') + local = Counter(x[4] for x in records if x[0] == 0) + copies = sum(x[0] == 2 for x in records) + need(copies == 9 and sum(x[0] == 3 for x in records) == 9, 'guarded COPY/ERASE census') + local[7] += copies + idle = Counter() + keys = set() + for child, family, axes in artifacts['REMAINDERS']: + need(type(child) is int and 0 <= child < 10 and type(family) is int and 0 <= family < 222, + 'idle child/family range') + need((child,family) not in keys, 'duplicate idle factor') + keys.add((child,family)) + need(isinstance(axes,list) and len(set(axes)) == len(axes), 'distinct idle axes') + need(all(type(a) is int and 0 <= a < M for a in axes), 'idle ADDRESS range') + idle[len(axes)] += 1 + need(len(keys) == 2220, 'all 10 by 222 idle factors') + profile = Counter({r:CALLS*n for r,n in local.items()}) + profile.update({r:REPLICAS*n for r,n in idle.items() if r}) + declared = {int(r):n for r,n in summary['actual_global_profile'].items()} + need(dict(profile) == declared == EXPECTED, 'independent complete paid profile') + need(dict(idle) == {int(r):n for r,n in summary['idle_per_replica_including_zero'].items()}, + 'all idle heights, including zero returns') + validate_invoice(profile, summary['W'], LAMBDA) + return profile, dict(local), dict(idle), dict( + local_events=len(records), local_opcodes=dict(Counter(x[0] for x in records)), + canonical_paid_labels=sum(profile.values())//REPLICAS, + baseline_literal_sha256=BASELINE_WORD_SHA, candidate_literal_sha256=CANDIDATE_WORD_SHA, + word_container_sha256=sha(raw_word)) + + +def validate_invoice(profile, live_w, fallback): + need(live_w == W, 'wrong W: private streams are not profitable live stock') + need(fallback == LAMBDA and fallback > 0, 'complete positive per-QUERY fallback is required') + need(all(type(r) is int and 0 < r < M and type(n) is int and n > 0 for r,n in profile.items()), + 'proper positive integer paid queries') + need(dict(profile) == EXPECTED, 'underpriced or changed complete QUERY profile') + need(sum(profile.values()) == 901312, 'all paid QUERYs') + need(sum(r*n for r,n in profile.items()) == 1808352, 'full completed rank mass') + + +def ceildiv(a, b): + return -((-a)//b) + + +def log_unit(y): + need(1 <= y <= 2, 'range-reduced log domain') + z = (y-1)/(y+1) + term, total = z, Q(0) + for j in range(110): + total += 2*term/(2*j+1) + term *= z*z + return total, total+2*term/(221*(1-z*z)) + + +@lru_cache(None) +def log_scaled(x): + need(x >= 1, 'positive logarithm domain') + k = 0 + while x >= 2: + x /= 2 + k += 1 + lo, hi = log_unit(x) + a, b = log_unit(Q(2)) + return ((lo+k*a)*INTERNAL_GRID).__floor__(), ((hi+k*b)*INTERNAL_GRID).__ceil__() + + +@lru_cache(None) +def power(exponent, base): + a, b = log_scaled(base) + xl, xh = (exponent*a).__floor__(), (exponent*b).__ceil__() + need(0 <= xl <= xh < INTERNAL_GRID//10, 'small nonnegative exponential domain') + tl = th = sl = sh = INTERNAL_GRID + for j in range(1,49): + tl = tl*xl//(j*INTERNAL_GRID) + th = ceildiv(th*xh, j*INTERNAL_GRID) + sl += tl + sh += th + tail = Q(th,INTERNAL_GRID)*Q(xh,INTERNAL_GRID)/49/(1-Q(xh,INTERNAL_GRID)/50) + return Q(sl,INTERNAL_GRID), Q(sh,INTERNAL_GRID)+tail + + +def moment(profile, exponent, live_w=W, fallback=LAMBDA): + lo = hi = Q(0) + for r, count in sorted(profile.items()): + a, b = power(exponent, Q(M,r)) + weight = Q(r*count, M*live_w) + lo += weight*a + hi += weight*b + a, b = power(exponent, Q(M)) + weight = fallback*sum(profile.values())/(M*live_w) + return lo+weight*a, hi+weight*b + + +def dec(value): + with localcontext() as ctx: + ctx.prec = 78 + return str(Decimal(value.numerator)/Decimal(value.denominator)) + + +def receipt_interval(lo, hi): + # Internal decisions remain exact; only serialization is outward rounded. + low = Q((lo*OUTPUT_GRID).__floor__(), OUTPUT_GRID) + high = Q((hi*OUTPUT_GRID).__ceil__(), OUTPUT_GRID) + return dict(lower=str(low), upper=str(high), decimal_lower=dec(low), decimal_upper=dec(high)) + + +def rejected(action, label): + try: + action() + except ValueError as exc: + return str(exc) + raise ValueError('negative control was accepted: '+label) + + +def verify(provider): + started = time.process_time() + summary = read_json(provider, 'OWNERS.json') + artifacts, pins = load_artifacts(provider, summary) + profile, local, idle, counts = census(provider, summary, artifacts) + public_guard = PUBLIC_UPPER*Q(1001,1000) + exponents = dict(zero=Q(0), root_lower=ROOT_LOWER, root_upper=ROOT_UPPER, + public_plus_point1=public_guard, logical_b=CHOSEN_B, + alternative_b=Q(1743,1000000)) + exact = {name:moment(profile,b) for name,b in exponents.items()} + need(exact['root_lower'][1] < 1 < exact['root_upper'][0], 'strict adjacent root bracket') + need(exact['public_plus_point1'][1] < 1 and CHOSEN_B > public_guard, 'latest plus .1 percent guard') + need(exact['zero'][1] < Q(199,200), '200C linear prefactor') + need(exact['logical_b'][1] < 1-Q(1,2400000), '2400000C precision prefactor') + need(exact['alternative_b'][0] > 1-Q(1,2400000), 'alternative b cannot reuse old prefactor') + need(exact['alternative_b'][1] < 1-Q(1,6000000), 'alternative b larger prefactor') + bad_idle = dict(profile) + bad_idle[42] -= REPLICAS # One omitted rank42 remainder per replica. + controls = [] + for label, p, w, fallback in [ + ('omitted_positive_fallback',profile,W,Q(0)), + ('underpriced_idle',bad_idle,W,LAMBDA), + ('private_families_credited_to_W',profile,W+9,LAMBDA)]: + error = rejected(lambda:validate_invoice(p,w,fallback), label) + a,b = moment(p,ROOT_UPPER,w,fallback) + need(b < 1, 'control must falsely pass the certified excluded next tick: '+label) + controls.append(dict(name=label,validation_rejected=True,reason=error, + underpriced_moment_at_excluded_tick=receipt_interval(a,b))) + rates = {} + for name, exponent in exponents.items(): + lo, hi = exact[name] + rates[name] = dict(exponent=str(exponent),moment=receipt_interval(lo,hi), + residual=receipt_interval(lo-1,hi-1)) + return dict(status='PASS_PORTABLE_INDEPENDENT_PRICE_CENSUS_AND_SEPARATOR', + optimized=not __debug__, at_utc=datetime.now(timezone.utc).isoformat(), + profile=dict(sorted(profile.items())),local_profile=dict(sorted(local.items())), + idle_per_replica_including_zero=dict(sorted(idle.items())), + QUERYs=sum(profile.values()),rankmass=sum(r*n for r,n in profile.items()), + live_W=W,physical=W+9,private_reserve=9,private_has_no_W_credit=True, + lambda_per_QUERY=str(LAMBDA),fallback_total=str(LAMBDA*sum(profile.values())), + literal_census=counts,verified_artifact_files=pins, + optional_FILL_included='FILL' in artifacts, + artifact_scope='All shipped price artifacts; FILL, when absent, is regenerated by the separate owner audit.', + moments=rates,root_lower=str(ROOT_LOWER),root_upper=str(ROOT_UPPER), + public_upper=str(PUBLIC_UPPER),public_plus_point1=str(public_guard), + matched_root_relative_gain=receipt_interval(ROOT_LOWER/PUBLIC_UPPER-1,ROOT_UPPER/PUBLIC_UPPER-1), + chosen_logical_b=str(CHOSEN_B),old_prefactors_200_and_2400000_pass=True, + logical_b_relative_gain=str(CHOSEN_B/PUBLIC_UPPER-1),negative_controls=controls, + output_interval_grid='10^-72 outward; internal exact rational decisions', + mathematical_scope='Complete finite price and census only; owner/operator/all-size caller and physical/outer premises remain separate.', + CPU_seconds=time.process_time()-started) + + +def main(): + parser = ArgumentParser(description=__doc__) + parser.add_argument('--provider',type=Path,required=True) + parser.add_argument('--output',type=Path,required=True) + args = parser.parse_args() + try: + need(args.provider.is_dir(), 'provider directory does not exist') + result = verify(args.provider) + except (ValueError,KeyError,TypeError,OSError) as exc: + result = dict(status='FAIL_PORTABLE_PRICE',error=str(exc),optimized=not __debug__) + args.output.parent.mkdir(parents=True,exist_ok=True) + args.output.write_text(json.dumps(result,sort_keys=True,indent=2)+'\n',encoding='utf-8') + print(json.dumps(result),file=sys.stderr) + return 1 + args.output.parent.mkdir(parents=True,exist_ok=True) + args.output.write_text(json.dumps(result,sort_keys=True,indent=2)+'\n',encoding='utf-8') + print(json.dumps(dict(status=result['status'],optimized=result['optimized'], + root_lower=result['root_lower'],chosen_b=result['chosen_logical_b'], + QUERYs=result['QUERYs'],controls=len(result['negative_controls'])))) + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/research/bit-stage-mixedwidth-packing/independent_source.py b/research/bit-stage-mixedwidth-packing/independent_source.py new file mode 100644 index 0000000000..e39ad78edc --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/independent_source.py @@ -0,0 +1,463 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Standalone independent mixed-width SOURCE/owner audit; Python stdlib only. + +Usage: python portable_source.py --provider PACKAGE --output RESULT.json +The provider supplies SOURCE-AUDIT-PINS.json or MANIFEST.json with a relative +files -> SHA256 map. No producer module, network, Git, or external cache is read. +""" +import argparse +from collections import Counter, defaultdict +from fractions import Fraction as Q +from hashlib import sha256 +from itertools import combinations +import json +import gzip +from math import gcd, lcm +from pathlib import Path, PurePosixPath +import sys +from time import process_time + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def eye(n): + return [[Q(i == j) for j in range(n)] for i in range(n)] + + +def tr(a): + return list(map(list, zip(*a))) + + +def mm(a, b): + return [[sum(x*y for x, y in zip(row, col)) for col in zip(*b)] for row in a] + + +def independent(rows): + reduced, pivots, original = [], [], [] + for row in rows: + z = list(map(Q, row)) + for u, j in zip(reduced, pivots): + c = z[j] + z = [x-c*y for x, y in zip(z, u)] + j = next((k for k, x in enumerate(z) if x), None) + if j is not None: + c = z[j] + reduced.append([x/c for x in z]) + pivots.append(j) + original.append(list(map(Q, row))) + return original + + +def determinant(a): + a = [list(map(Q, row)) for row in a] + d = Q(1) + for j in range(len(a)): + k = next((i for i in range(j, len(a)) if a[i][j]), None) + need(k is not None, 'singular Gram basis') + if j != k: + a[j], a[k] = a[k], a[j] + d = -d + c = a[j][j] + d *= c + for i in range(j+1, len(a)): + c = a[i][j]/a[j][j] + a[i] = [x-c*y for x, y in zip(a[i], a[j])] + return d + + +def inverse(a): + n = len(a) + z = [list(map(Q, row))+e for row, e in zip(a, eye(n))] + for j in range(n): + k = next((i for i in range(j, n) if z[i][j]), None) + need(k is not None, 'singular source matrix') + z[j], z[k] = z[k], z[j] + c = z[j][j] + z[j] = [x/c for x in z[j]] + for i in range(n): + if i != j: + c = z[i][j] + z[i] = [x-c*y for x, y in zip(z[i], z[j])] + return [row[n:] for row in z] + + +def replay(program, n): + a = eye(n) + for record in program: + op = record[0] + if op == 'swap': + need(len(record) == 3, 'swap schema') + _, i, j = record + need(0 <= i < n and 0 <= j < n, 'swap index') + a[i], a[j] = a[j], a[i] + elif op == 'scale': + need(len(record) == 3, 'scale schema') + _, i, c = record + c = Q(c) + need(0 <= i < n and c in (Q(-1), Q(2), Q(1, 2)), 'odd-unit scale alphabet') + a[i] = [c*x for x in a[i]] + else: + need(op == 'add' and len(record) == 4, 'coordinate opcode') + _, i, j, c = record + c = Q(c) + need(0 <= i < n and 0 <= j < n and i != j and c in (Q(-1), Q(1)), 'unit ADD schema') + a[i] = [x+c*y for x, y in zip(a[i], a[j])] + return a + + +def dyadic_scaled(a): + d = lcm(*(Q(t).denominator for row in a for t in row)) + need(d > 0 and d & (d-1) == 0, 'non-dyadic source coefficient') + return [[int(Q(t)*d) for t in row] for row in a], d + + +def sparse_orthogonal(a): + gram = defaultdict(Q) + for row in a: + z = [(j, Q(x)) for j, x in enumerate(row) if x] + for j, x in z: + for k, y in z: + gram[j, k] += x*y + n = len(a) + need(all(v == Q(i == j) for (i, j), v in gram.items()), 'chart orthogonality off-diagonal') + need(all(gram[i, i] == 1 for i in range(n)), 'chart orthogonality diagonal') + + +def authenticate(provider, relative, expected): + p = PurePosixPath(relative) + need(not p.is_absolute() and '..' not in p.parts and p.as_posix() == relative, + 'noncanonical provider pin path') + path = provider.joinpath(*p.parts) + need(path.is_file() and not path.is_symlink() and path.resolve().is_relative_to(provider), + 'pin leaves provider: '+relative) + raw = path.read_bytes() + need(sha256(raw).hexdigest() == expected, 'source byte pin: '+relative) + return raw + + +def loads(raw, name): + return json.loads(gzip.decompress(raw) if name.endswith('.gz') else raw) + + +def rejection(fn, label): + try: + fn() + except ValueError as error: + return {'name': label, 'rejected': True, 'reason': str(error)} + raise ValueError('defect accepted: '+label) + + +def relative_check(c, bases, projectors): + f = int(c['terminal_frame']) + need(f in bases, 'unknown terminal SOURCE frame') + k = 8 if f == 1 else 4 + axes = c['axes'] + need(len(axes) == k and len(set(axes)) == k and all(0 <= t < 64 for t in axes), + 'terminal axes/rank') + expected_perm = axes+[i for i in range(64) if i not in axes] + need(c['permutation'] == expected_perm, 'terminal permutation axes/order') + perm = replay(c['permutation_program'], 64) + need(all(sum(t != 0 for t in row) == 1 and sum(row) == 1 for row in perm), + 'nonpermutation chart program') + block = eye(64) + for i in range(8): + block[i][:8] = tr(bases[f])[i] + wanted = [block[next(j for j, t in enumerate(row) if t)] for row in perm] + actual = [[Q(x) for x in row] for row in c['relative_matrix']] + need(len(actual) == 64 and all(len(row) == 64 for row in actual), 'relative64 shape') + need(actual == wanted, 'actual SOURCE terminal/coframe matrix') + sparse_orthogonal(actual) + # Independently check image of every terminal image column. Since + # E=B[:,0:k] B[:,0:k]^T, this proves the full64-dimensional conjugation. + for j in range(k): + image = [sum(row[t]*bases[f][t][j] for t in range(8)) for row in actual] + need(image == [Q(i == axes[j]) for i in range(64)], 'wrong actual SOURCE projector axis') + need(projectors[f] == mm([row[:k] for row in bases[f]], tr([row[:k] for row in bases[f]])), + 'terminal SOURCE root-span binding') + return actual, dyadic_scaled(actual) + + +def canonical_controller(): + recipe = [{'kind': 'local', 'stage': 0, 'pair': 0, 'reverse': False}] + for p in range(4): + recipe.append({'kind': 'local', 'stage': 2*p+1, 'pair': p, 'reverse': True}) + if p < 3: + recipe.append({'kind': 'bridge', 'dst': p, 'src': p+1, 'coefficient': 1}) + recipe.append({'kind': 'local', 'stage': 2*p+2, 'pair': p, 'reverse': False}) + if p < 3: + recipe.append({'kind': 'bridge', 'dst': p, 'src': p+1, 'coefficient': -1}) + recipe += [{'kind': 'bridge', 'dst': p+1, 'src': p, 'coefficient': 1} for p in (2, 1, 0)] + recipe.append({'kind': 'exchange'}) + levels = [-1]*4 + events, children = [], [] + def advance(pair, hi): + lo = levels[pair] + axes = list(range(1 if lo == -1 else 8+7*lo, 8+7*hi)) + c = {'kind': 'idle', 'idx': len(children), 'pair': pair, 'source_level': lo, + 'target_level': hi, 'axes': axes, 'rank': len(axes)} + events.append(c) + children.append(c) + levels[pair] = hi + for event in recipe: + events.append(event) + if event['kind'] == 'local': + s, p = event['stage'], event['pair'] + need(levels[p] == s-1, 'canonical local source level') + levels[p] = s + if 1 <= s <= 6: + advance((s+1)//2, s) + if s == 8: + for p in range(4): + advance(p, 8) + elif event['kind'] == 'bridge': + need(levels[event['src']] == levels[event['dst']], 'canonical bridge source levels') + else: + need(levels == [8]*4, 'canonical final source level') + return events, children + + +def audit(objects): + word, geom, term, data_geom, charts, order, slots, remainders, dispatch, receipt = objects + need((geom['h'], geom['v'], geom['R']) == (8, 111, 438) and + len(geom['lines']) == 111 and all(len(row) == 8 for row in geom['lines']), + 'actual SOURCE geometry dimensions') + need(len(word['start']) == len(word['final']) == 660, 'all660 ordinary RAW roles') + need(word['start'][222:] == [0]*438, 'helper initial frames are zero gauges, not zero payload') + partial = {222+i: f for i, f in enumerate(word['final'][222:]) if f != 1} + need(partial == {462: 506, 463: 506, 464: 506, 467: 508, 470: 509}, 'actual partial terminal list') + bases = {int(f): [[Q(x) for x in row] for row in b] for f, b in charts['terminal_bases'].items()} + need(set(bases) == {1, 506, 508, 509} and bases[1] == eye(8), 'terminal SOURCE basis registry') + need(all(len(b) == 8 and all(len(row) == 8 for row in b) for b in bases.values()), + 'terminal8 SOURCE matrix shapes') + need({int(f) for f in charts['terminal_programs']} == set(bases), 'terminal SOURCE program inventory') + projectors, partials = {1: eye(8)}, [] + for f in (506, 508, 509): + basis = independent([geom['lines'][j] for j in geom['frames'][f]]) + need(len(basis) == 4, 'actual partial root rank') + gram = mm(basis, tr(basis)) + det = determinant(gram) + need(det.denominator == 1 and det > 0 and int(det) & (int(det)-1) == 0, + 'original root Gram has odd-prime exception') + e = mm(mm(tr(basis), inverse(gram)), basis) + projectors[f] = e + sparse_orthogonal(bases[f]) + old = next(c for c in term['charts'] if c['terminal_frame'] == f) + need([[Q(x) for x in row] for row in old['projector']] == e, 'SOURCE partial projector bytes') + need(tr([[Q(x) for x in col] for col in old['Q_columns']]) == bases[f], 'SOURCE terminal basis bytes') + partials.append({'frame': f, 'rank': 4, 'original_root_Gram_determinant': str(det), + 'projector': [[str(x) for x in row] for row in e]}) + for f, program in charts['terminal_programs'].items(): + need(replay(program['program'], 8) == bases[int(f)], 'terminal primitive forward') + need(replay(program['inverse'], 8) == tr(bases[int(f)]), 'terminal primitive inverse') + need(len(program['program']) == len(program['inverse']) == program['primitive_count'], 'terminal paid count') + need(len(charts['family_charts']) == len(charts['family_programs']) == len(geom['lines']) == 111, + 'family SOURCE inventory') + for port, (matrix, program) in enumerate(zip(charts['family_charts'], charts['family_programs'])): + a = [[Q(x) for x in row] for row in matrix] + need(len(a) == 8 and all(len(row) == 8 for row in a), 'family8 SOURCE chart shape') + sparse_orthogonal(a) + need([row[0] for row in a] == [Q(x, 2) for x in geom['lines'][port]], 'family SOURCE first axis') + need(replay(program['program'], 8) == a and replay(program['inverse'], 8) == tr(a), 'family primitive all-input replay') + need(len(program['program']) == program['primitive_count'], 'family primitive paid count') + need(len(data_geom['ports']) == 111, 'retained DATA SOURCE inventory') + rho_checks = 0 + for port, item in enumerate(data_geom['ports']): + need(item['port'] == port and item['q'] == geom['lines'][port], 'retained rho SOURCE port order') + rho, d = dyadic_scaled(item['rho15']) + need(len(rho) == 15 and all(len(row) == 15 for row in rho), 'rho15 shape') + for i in range(15): + for j in range(15): + dot = sum(a*b for a, b in zip(rho[i], rho[j])) + need(dot == d*d*int(i == j), 'rho15 orthogonality') + q = item['q']+[0]*7 + rv_i, rv_j = sum(a*b for a, b in zip(rho[i], q)), sum(a*b for a, b in zip(rho[j], q)) + line = q[i]*q[j] + head = 4*int(i == j and i < 8) + ext = 4*int(i == j and i >= 8) + hc = 4*sum(rho[i][k]*rho[j][k] for k in range(8)) + xc = 4*sum(rho[i][k]*rho[j][k] for k in range(8, 15)) + need(rv_i*rv_j == d*d*line, 'rho SOURCE line identity') + need(hc == d*d*(line+ext), 'rho full DATA head identity') + need(hc-rv_i*rv_j == d*d*ext, 'rho SOURCE complement identity') + need(xc == d*d*(head-line), 'rho SOURCE exterior identity') + rho_checks += 4 + relatives = charts['relative_charts'] + need(len(relatives) == 25 and [c['id'] for c in relatives] == list(range(25)), 'new25 relative SOURCE charts') + relative_matrices, scaled_matrices = [], [] + for c in relatives: + a, scaled = relative_check(c, bases, projectors) + relative_matrices.append(a) + scaled_matrices.append(scaled) + max_route = max(len(charts['terminal_programs'][str(c['terminal_frame'])]['inverse'])+ + len(c['permutation_program'])+len(p['program']) + for c in relatives for p in charts['family_programs']) + need(max_route == 159, 'new actual64 routing count') + need(receipt['max64chart_coordinate_primitives'] == max_route and + receipt['selector_G'] == 240+144+4*max_route+2+63+64 == 1149, 'new routing fee not old1117') + events, children = canonical_controller() + need(order['controller'] == events, 'actual canonical controller source order') + calls = {e['stage']: (i, e) for i, e in enumerate(events) if e['kind'] == 'local'} + windows = {} + for c in children: + end = events.index(c) + touches = [i for i, e in enumerate(events[:end]) if + (e['kind'] == 'local' and e['pair'] == c['pair']) or + (e['kind'] == 'bridge' and c['pair'] in (e['src'], e['dst']))] + lo = max(touches, default=-1) + ss = [s for s, (i, e) in calls.items() if lo < i < end and e['pair'] != c['pair']] + windows[c['idx']] = ss + need(order['windows'][str(c['idx'])] == {'lower_open_event': lo, 'upper_open_event': end, 'stages': ss}, + 'actual strict SOURCE window') + expected_calls = [{'stage': s, 'replica': r, 'event': calls[s][0]} for s in range(9) for r in range(32)] + need(order['calls'] == expected_calls, 'whole sweep/replica chronology') + widths = [8 if f == 1 else 4 for f in word['final'][222:]] + need(receipt['ordered_widths'] == widths, 'actual ordered helper SOURCE widths') + need((receipt['ordinaryRAW'], receipt['helpers'], receipt['W'], receipt['private_reserve']) == (660, 438, 28416, 9), + 'unchanged original stock/private reserve') + keys = {(tuple(c['axes']), c['terminal_frame']): c['id'] for c in relatives} + need(len(keys) == 25, 'duplicate SOURCE chart keys') + used, routes, same = defaultdict(set), {}, defaultdict(list) + for child, cp, offset, width, stage, helper in slots: + need(child in range(10) and stage in windows[child], 'slot SOURCE window') + need(0 <= cp < 222 and 0 <= helper < 438 and offset >= 0 and width == widths[helper], 'slot typed extent') + need(children[child]['pair'] != calls[stage][1]['pair'], 'host is active DATA pair') + axes = children[child]['axes'][offset:offset+width] + need(len(axes) == width and not used[child, cp].intersection(axes), 'slot overlap') + used[child, cp].update(axes) + need((stage, helper) not in routes, 'duplicate helper occurrence') + f = word['final'][222+helper] + need((tuple(axes), f) in keys, 'slot actual SOURCE chart missing') + cid = keys[tuple(axes), f] + routes[stage, helper] = child, cp, offset, width, cid + same[stage, 2*children[child]['pair']*111+cp].append(cid) + need(set(routes) == {(s, h) for s in range(9) for h in range(438)}, 'all helper SOURCE occurrences') + expected_rem = [] + for c in children: + for cp in range(222): + rest = [a for a in c['axes'] if a not in used[c['idx'], cp]] + need(rest == c['axes'][len(used[c['idx'], cp]):], 'noncompact pending SOURCE suffix') + expected_rem.append([c['idx'], cp, rest]) + need(remainders == expected_rem, 'unpaid/wrong pending SOURCE remainder') + pair_cache, hist = {}, Counter() + for ids in same.values(): + for ca, cb in combinations(ids, 2): + key = tuple(sorted((ca, cb))) + if key not in pair_cache: + ai, ad = scaled_matrices[ca] + bi, bd = scaled_matrices[cb] + d = lcm(ad, bd) + gg = 0 + for ar, br in zip(ai, bi): + for a, b in zip(ar, br): + delta = a*(d//ad)-b*(d//bd) + if delta: + gg = gcd(gg, abs(delta)//gcd(abs(delta), d)) + need(gg > 0 and gg & (gg-1) == 0, 'odd-prime SOURCE owner collision') + pair_cache[key] = gg + hist[pair_cache[key]] += 1 + need(hist == {1: 5597}, 'all5597 exact owner differences') + need(len(dispatch) == 288, 'all local dispatch SOURCE descriptors') + global_used, seen = defaultdict(set), set() + critical = [] + for descriptor in dispatch: + stage, rep = descriptor['stage'], descriptor['replica'] + need(0 <= stage < 9 and 0 <= rep < 32 and (stage, rep) not in seen, 'dispatch domain/duplicate') + seen.add((stage, rep)) + active, rev = calls[stage][1]['pair'], calls[stage][1]['reverse'] + need(descriptor['pair'] == active and descriptor['orientation'] == ('reverse' if rev else 'forward'), 'dispatch orientation SOURCE law') + need(len(descriptor['owners']) == 660, 'all660 owner descriptors') + for role in range(222): + side, port = divmod(role, 111) + if rev: + side = 1-side + need(descriptor['owners'][role] == [rep*888+(2*active+side)*111+port, ['data', stage, port]], + 'actual DATA SOURCE owner') + for h in range(438): + child, cp, offset, width, cid = routes[stage, h] + family = rep*888+2*children[child]['pair']*111+cp + need(descriptor['owners'][222+h] == [family, ['hosted', child, offset, width, cid]], 'actual hosted SOURCE owner') + axes = relatives[cid]['axes'] + need(not global_used[family].intersection(axes), 'cross-stage physical SOURCE overlap') + global_used[family].update(axes) + if stage == 4 and rep == 0 and h in (240, 241, 242, 245, 248): + critical.append({'absolute_helper': 222+h, 'family': family, 'child': child, + 'offset': offset, 'width': width, 'axes': axes, + 'terminal': word['final'][222+h], 'chart': cid}) + need(descriptor['private_owner'] == [28416+stage, ['private', 'd']], 'private/live SOURCE alias or wrong owner') + need([c['offset'] for c in critical] == [8, 12, 16, 20, 24] and + all(c['family'] == 202 and c['child'] == 6 and c['width'] == 4 for c in critical), 'critical stage4 SOURCE cohost') + need(next(r[2] for r in expected_rem if r[:2] == [6, 202]) == list(range(50, 64)), 'critical pending remainder') + mutants = [] + c = next(c for c in relatives if c['terminal_frame'] == 506) + wrong = dict(c) + wrong['terminal_frame'] = 508 + mutants.append(rejection(lambda: relative_check(wrong, bases, projectors), 'equal-rank-wrong-terminal')) + wrong_axes = dict(c) + wrong_axes['axes'] = c['axes'][:-1]+[63] + mutants.append(rejection(lambda: relative_check(wrong_axes, bases, projectors), 'equal-rank-wrong-axis')) + return {'partial_SOURCE_projectors': partials, 'relative_SOURCE_charts': 25, + 'family_SOURCE_charts': 111, 'rho15_SOURCE_identities': rho_checks, + 'all_coordinate_programs_replayed': True, 'max64_route': max_route, 'selector_G': 1149, + 'slots': len(slots), 'dispatches': len(dispatch), 'ordinary_owners_checked': 288*660, + 'helper_owner_occurrences': 288*438, 'samefamily_pairs_per_replica': sum(hist.values()), + 'owner_difference_numerator_gcds': dict(hist), 'all_odd_local_ring_owner_separation': True, + 'critical_stage4_family202': critical, 'defect_controls': mutants} + + +def main(): + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument('--provider', type=Path, required=True) + ap.add_argument('--output', type=Path, required=True, help='JSON result file or output directory') + args = ap.parse_args() + started = process_time() + provider = args.provider.resolve() + need(provider.is_dir(), 'provider directory missing') + manifest_name = 'SOURCE-AUDIT-PINS.json' if (provider/'SOURCE-AUDIT-PINS.json').is_file() else 'MANIFEST.json' + manifest = json.loads((provider/manifest_name).read_bytes()) + mapping = manifest.get('files') + need(isinstance(mapping, dict), 'configured manifest files map missing') + names = ['inputs/WORD.json.gz', 'inputs/GEOMETRY.json.gz', 'inputs/TERMINAL-CHARTS.json', + 'inputs/CALLER-GEOMETRY.json.gz', 'new-owners/CHARTS.json.gz', 'new-owners/ORDER.json.gz', + 'new-owners/SLOTS.json.gz', 'new-owners/REMAINDERS.json.gz', 'new-owners/DISPATCH.json.gz', 'OWNERS.json'] + values, local_pins = [], [] + for name in names: + need(name in mapping and isinstance(mapping[name], str), 'configured source pin absent: '+name) + raw = authenticate(provider, name, mapping[name]) + values.append(loads(raw, name)) + local_pins.append({'path': name, 'sha256': mapping[name], 'bytes': len(raw)}) + result = audit(values) + # Negative input authentication control is in memory; candidate files + # are never modified, even while exercising the rejection path. + sample = names[0] + raw = (provider/sample).read_bytes() + altered = bytes([raw[0] ^ 1])+raw[1:] + result['defect_controls'].append(rejection( + lambda: need(sha256(altered).hexdigest() == mapping[sample], 'source byte pin: '+sample), + 'source-byte-pin')) + result.update({'status': 'PASS_INDEPENDENT_PORTABLE_SOURCE_OWNER_AUDIT', + 'source_manifest': manifest_name, 'source_pins': local_pins, + 'producer_auditor_imported': False, 'stdlib_only': True, + 'new_exponent_admitted': None, + 'scope': 'Exact SOURCE/owner/typed whole-packet ROW compatibility; inherited logical p1 root-coupled input/stock/callee premises. Physical compiler and outer arbitrary stock transfer remain separate.', + 'CPU_seconds': process_time()-started}) + output = args.output + if output.suffix.lower() != '.json': + output = output/'RESULT.json' + need(output.resolve() not in {provider/name for name in names}, 'output would overwrite source input') + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(json.dumps(result, sort_keys=True, indent=2)+'\n', encoding='utf-8') + print(json.dumps({k: result[k] for k in ('status', 'relative_SOURCE_charts', 'family_SOURCE_charts', + 'rho15_SOURCE_identities', 'helper_owner_occurrences', 'samefamily_pairs_per_replica', + 'max64_route', 'selector_G', 'defect_controls', 'CPU_seconds')}, sort_keys=True)) + + +if __name__ == '__main__': + try: + main() + except (ValueError, OSError, KeyError, TypeError, StopIteration) as error: + print(json.dumps({'status': 'FAIL', 'error': str(error)}), file=sys.stderr) + sys.exit(1) diff --git a/research/bit-stage-mixedwidth-packing/provider/CALLER-PROOF.md b/research/bit-stage-mixedwidth-packing/provider/CALLER-PROOF.md new file mode 100644 index 0000000000..16e941b222 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/CALLER-PROOF.md @@ -0,0 +1,349 @@ +# Source-bound logical recursive caller for the changed word + +`caller.py` supplies a new finite Catalogue and Topology to the unchanged +generic executable in `inputs/caller/`. It binds both the PR4183 word and +the frozen five-terminal word to the same mixed-width owners. The resulting +logical caller has the all-size endpoint and the baseline `p=1` time +recurrence below. This is a source-level construction and written proof, +supported by the finite checks in `CALLER.json`; it is not a formal-kernel +theorem or an execution of the enormous complete selected GL64 payload. + +All 84 retained files are exact exports from +`12fa8c5c844be21bfefb38a19503fbd867a11244`, authenticated by +`CALLER-SOURCES.json`. The loader reads and hashes every file before import, +then executes those same bytes with `compile(..., optimize=0)`. It neither +reads nor writes Python bytecode, and historical assertions remain enabled +under an optimized parent. The original Catalogue's 661-role, full-width +terminal and old-profile assertions remain unchanged. The new provider +overrides construction and binding; the new Topology overrides only +`call`. The retained request templates, coefficient grammar, numerical +normal forms, Consumer, Driver, recursive Frame and scheduler are reused. + +## Finite provider and operator binding + +The actual ordinary roles are the 111 sources, 111 targets and 438 dirty +helpers, for 660 roles. Private role 660 is separate. The helper terminals +are the actual 433 rank-eight and five rank-four projectors from +`NATIVE.json`, not a uniform rank-eight substitute. + +The provider reconstructs and hashes both literal orientations directly +from the pinned word. Every emitted local MOVE and COPY becomes one +retained `Request`, with its exact position, source role, frame difference, +rank and owner chart. COPY metadata binds the emitted private family +`28416+stage` and its `["private","d"]` descriptor. It is not a profitable +live family. All 288 dispatch records and their replica symmetry are +checked. ERASE keeps its paired COPY guard and is not an unpaid additional +recursive call. + +The complete candidate LocalState replay has 11,193,984 literal events: +836,064 MOVEs, 10,352,736 signed unit ADDs, 2,592 COPYs and 2,592 ERASEs. +All 660 frame/version states are checked for each invocation. The +canonical catalogue contains 28,206 paid labels: 26,127 MOVEs, 81 COPYs +and 1,998 nonzero idle remainders. Replicating each label 32 times gives +902,592 paid requests. The matched frozen word has 28,215 labels and +902,880 requests. Both catalogues use the same owner construction and +global controller. + +For nested local frames, the base is the exact projector difference of +larger minus smaller frame. Idle bases are the actual remaining coordinate +axes in their family chart. All 549 candidate base labels pass the unchanged +`binding.split_basis` at prime three: it checks + +``` +P B = B diag(I_r,0), rank(B mod 3)=64. +``` + +The all-prime statement does not follow from this prime-three check. +`NATIVE-PROOF.md` gives the exact nested-projector identities with +power-of-two Gram determinants; `OWNER-PROOF.md` supplies the exact +complement projectors. For any dyadic idempotent P of rational rank r, +all (r+1)-minors of P and (65-r)-minors of I-P vanish in `Z[1/2]`. +After reduction at an odd prime their ranks are at most r and 64-r. +Since their sum is I, the two ranks sum to at least 64, so both bounds +are equalities. This proves the stated image/kernel dimensions over +every odd prime. For any fixed odd prime q, the same unchanged +split-basis algorithm selects columns of P and I-P modulo q. Its combined +matrix is invertible modulo q and hence over every `Z/q^w`. Its entries +are dyadic; choosing columns introduces no new denominator. + +For a helper with terminal projector E and width k, the actual chart is + +``` +sigma = A_port pi_slice diag(Q_terminal^T,I_56), +sigma E sigma^-1 = A_port E_slice A_port^-1. +``` + +The provider uses the whole chart and terminal frame, including partial +complements in the reverse word. The owner certificate checks the 55 +relative charts and all occupied slices. Distinct helpers in one family +use distinct complete low packets; their chart difference has numerator +gcd one, so this separation holds for every odd prime. + +Data charts use the 111 actual retained rho15 matrices in the original +111-port order. `caller.py` verifies that order against the local roots, +exact orthogonality, and dyadic entries. For each port, writing P for its +line projector in the first eight coordinates and X for the seven +exterior coordinates, it checks all four identities + +``` +rho P rho^T=P, rho I_8 rho^T=P+I_X, +rho (I_8-P) rho^T=I_X, rho I_X rho^T=I_8-P. +``` + +These 444 exact identities connect the inherited data routing to the +new family completion even when their orthonormal complements differ. +The last stage embeds its seven exterior coordinates at 57 through 63; +there is no missing stage-eight boundary. + +The actual logical route compiler consumes these rational matrices directly. +`driver.inverse_chart` checks orthogonality and uses the transpose for the +fixed chart inverse. This path does not Gaussian-factor a chart into +elementary rational selectors. Its denominator domain is therefore every +odd prime. The separate historical `G=1117` primitive invoice retains the +old rho15 factorization's source-admissible-prime exclusions; this proof +does not remove those exclusions from that different invoice. + +## Current source, arbitrary dirt and private work + +The framed native identities act on arbitrary Boolean functions on complete +address packets. Signed unit ADDs become XOR, and a common frame is a +bijective pullback. The exact all-column argument therefore permits +arbitrary correlations between helper inputs, retained source inputs and +outputs. The changed integer public rows differ by even coefficients; +the Boolean public map is the required one. Exact signed source/helper +restoration and all literal COPY equalities are separately certified by +`NATIVE.json`, including both inverse compositions. + +The inserted source50 read uses the actual current `buffers[50]` in the +unchanged Driver. It is not a saved initial source or a scalar query. +`CALLER-SOURCE-CUTS.json` independently replays the emitted programs without +importing the producer. At the two forward and two reverse reads from +source50 into helper413, the current signed row is exactly `e50`, both +frames agree, and no COPY is open. Source50 has eight intervening temporary +writes in each orientation; it is not globally immutable. All 18 +COPY/ERASE integer equalities and five targeted source/frame/lifetime +mutations are checked by that companion certificate. + +For a local invocation, the Driver gathers complete current owner packets, +routes them into their common chart, executes the whole word, and +inverse-routes and scatters every ordinary role into the latest family +value. Previous returns to that family are retained. Hosting moves only +completed terminal residuals through the certified idle windows. Matching +idle complements pay every remaining direction. No open COPY, unfinished +child or internal local instruction is commuted. + +Private COPY is fresh, charged logical work. The Driver splits the arbitrary +input into W=28416 live families; it does not read an assumed-zero arbitrary +family `28416+stage`. `clone_packet` creates a fresh Tape from the complete +current source and preserves the source head. The rank-seven residual +returns a separate owned result. At ERASE, LocalState checks source/private +versions and frames, and the Driver clears that fresh work tape by a charged +read/write/move pass. Exact integer equality supports the mathematical +clean-copy interface. These charged clears complete the declared classical +logical Tape contract. A reversible-alphabet implementation would require +a separate XOR-uncompute routine; that stronger alphabet is not a premise +of the p=1 result here. Logical clearing does not prove exact cleanup for +approximately returned children. + +## All-size input and endpoint + +Fix an odd prime q, w>=1, A=q^w, and m=64. Put + +``` +N=|GL_64(F_q)|, H=q^(4096(w-1)), W=28416, P=28425, +K=lcm(W,P) N H=269241600 N H, +D(n)=0 for n<64; D(n)=1+D(42 floor(n/64)) otherwise. +``` + +At an internal node of width n>=64, supply R=t K^D(n) fresh rows, t>=1, +and the complete ordered packet + +``` +[C physical frozen-prefix ordinals][R fresh rows] +[B][head A^n][G][tail A^n][S]. +``` + +C,B,G,S are arbitrary positive extents. Repeated numerical frozen prefixes +remain separate physical ordinals. Every payload bit, including every dirty +helper packet, is arbitrary. The incoming unit a_i is generated by the +retained source-bound encoded program. It may read its frozen ancestor +prefix and coordinate i, but not this node's fresh family, low/high header, +unused rows, payload or spectators. An unrelated coefficient oracle is +outside this contract. + +The output is the Boolean pullback of + +``` +head_i' = a_i tail_(n-1-i), +tail_(n-1-i)' = a_i^-1 head_i, 0<=i=64. Smaller children use its completed +leaf interface; they are not new below-64 root constructor entry points. + +Here is the explicit induction transferring the retained caller theorem. +The new catalogue installs its topology once at +`catalogue._recursive_caller_topology`. Unchanged `node.selected_topology` +uses it, and every unchanged `recursive_call.Frame` passes the same +catalogue and Specifications to the child's SelectedNode. Production code +does not patch the Consumer, Frame or SelectedNode. + +Let f=floor(n/64) and delta=n-64f. The unchanged peel handles the delta +excluded pairs using their original source coordinates. For a projected +child at physical positions a,b and width c, the unchanged layout retains +the ordered packet + +``` +[C H frozen-prefix ordinals][U][B'][A^c][G'][A^c][S'], +B'=B A^a (G if a>=n else 1), +G'=A^(b-a-c) (G if a2^80 and retain the original-root coupling and canonical widths from +`inputs/caller/PROOF.md`: one fixed atom precision w across all descendants, +`w>=ceil(e^(17/10000))`, n<=e, the generated-history inequalities +`2^(h+1)<=8e^2` and `17(h+1)<=20051w`, and the encoded source grammar above. +For generated root histories these inequalities follow as in that proof. +An arbitrary unrelated long supplied history requires its explicit charge. + +The unchanged route and ordinary leaf routines cost O_q(wV), so their +primitive exponent is p=1. The new finite record count and charts may +change the uniform constant C and one-time fixed-q table allowance F_q'. +They do not alter the coefficient grammar's branching degree, matrix sizes +or maximal child rank. Under the stated root coupling, the retained +numerical-preparation absorption is uniform in e,w,n, history and +spectators. C may be the maximum for the two matched providers. + +With the complete candidate histogram P_r certified by `price.py`, and +`epsilon=10^-16`, `B_bad=32*64^2 sum_r P_r`, this gives the actual +source-bound stopped recurrence + +``` +T(n,w)<=Cw, 0=64. +``` + +Time here is charged logical Tape reads, writes and unit head movements +with the stated preparation absorption, not Python elapsed time or a +fixed-physical-tape bound. The generic bad-class estimate is per request; +it introduces no union factor over the catalogue. + +The exact price certificate proves, for b=139/80000, +`mu(0)<199/200` and `mu(b)<1-1/2400000`. Proper-width induction therefore +gives + +``` +T(n,w)<=200 C n+2400000 C n^(1-b) w. +``` + +The matched ordinary paid profiles differ by `288(e7-e6-e1)`, with +identical idle closure. The fallback allowance also decreases because +there are 288 fewer paid requests. Their strict complete moment improvement +is the one proved in `RECURSION.md`. It is not a claim that every finite input executes fewer +recursive invocations or fewer steps: at parent640, the new rank-seven +child has width70 and is internal, while the old rank-six child has +width60 and remains a leaf. + +Logical storage retains the proof's full ledger, including suspended +parents. This provider has fewer labels than 28278 and fewer ordinary +roles than 661, so its existing Q-bit label and 680-packet allowances +still cover it. Its single shared topology keeps immutable caches bounded +by fixed source labels and low classes. With minimal widths and root +residue/index arenas of capacity `2^24`, the unchanged ledger yields + +``` +live logical symbols < 11 V_root + F_q'. +``` + +This includes payload, all complete directories, numerical words, +continuations and active ancestors. It is neither a Python heap bound +nor a proved physical frame-bank compiler. The explicit unabsorbed ledger +in the retained proof applies outside the simplified root coupling. +Choosing `w=ceil(e^b)` satisfies the inherited lower coupling. For the +minimal stock divisor, define `k=ceil(D(e) log_q K)`; the capacity bound +`k<=8195 w log2(e)` transfers. A prescribed multiplier t additionally +requires its `log_q t` capacity. Actual executable stock is still +`tK^D(e)`: arbitrary q^k rows require the separate outer compatible +padding and restoration construction. + +## What the executable evidence covers + +`CALLER.json` records the complete literal/request census, all 549 +prime-three split bases, six actual Consumer coefficient probes, four +exact owner-route probes, and these actual generated trace decisions: +rank7 at parent576 gives leaf63; rank7 at640 gives internal70; frozen +rank6 at640 gives leaf60; frozen rank6 at704 gives internal66. + +Only these finite threshold fixtures memoize `Geometry.point`. Their keys +include the row, dimension and both complete encoded input words. Each +distinct input executes the unchanged routine, and every use returns a +fresh owned Arena copy. All cached words are freed before the normal +ownership/head/erasure audit. Every trace event is still traversed. +The registered check authenticates full ordered Event, Request and Reference +payloads against uncached reference digests, including word cells, heads +and the exact normalized parent identity. This is checker acceleration; +production Consumer/Driver/Frame arithmetic is unchanged. The fixture's +different numerical step and allocation counts are not production time +or storage claims. + +The Consumer probes execute the real numerical source callbacks for +MOVE, COPY, partial terminal and idle labels. A test-only packet-engine +substitution stops after checking both adapter and child coefficients; +it does not enumerate GL64 payloads. The Frame probes run actual +descriptor construction, Frame, SelectedNode construction, handoff and +cleanup for 640->70 and 256->168->84. They retain repeated physical +prefixes, U separately from U*B, and the same new topology. Their child +bodies are explicitly substituted 23-bit transformations with U=11. +That fixture stock deliberately bypasses the child's normal 9475 stock +guard: these are context/lifecycle checks, not an admissible completed +selected-payload execution or a compatible-stock test. + +Targeted controls reject omitted topology propagation, old private +index661, a wrong terminal-owner chart, and a MOVE inside COPY. The +separate source-cut certificate checks source contamination and +restoration defects. Finite probes challenge the binding; the all-size +statement is the written induction above, with the retained exact +normal-form and primitive proofs as dependencies. + +Physical tape lowering, physical arena/template cleanup, exact rounded +child return and COPY cleanup, faster p<1 route/leaf routines, outer +borrowing/padding, the complex supplier and multiplication transfer remain +separate obligations. No new kappa or selected-frontier admission follows. + +The retained all-size caller and logical reserve are David Arias's work +building on Jose Manuel's PR2697/PR2234 interfaces and their cited supplier +lineage. The unchanged component notices remain in `inputs/caller/`. +This contribution is the new source binding and its changed-profile +transfer, written and checked with substantial OpenAI Codex assistance. diff --git a/research/bit-stage-mixedwidth-packing/provider/CALLER-REVIEW.md b/research/bit-stage-mixedwidth-packing/provider/CALLER-REVIEW.md new file mode 100644 index 0000000000..ec1cd2290e --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/CALLER-REVIEW.md @@ -0,0 +1,459 @@ +# Independent review of the recursive source and restoration boundary + +The new provider meets the retained classical logical Tape caller contract. +Its exact endpoint, complete spectator packet, source grammar, completed +return, and logical storage bound transfer to arbitrary recursion depth. +The resulting tariff is the actual `p=1` tariff in +[CALLER-PROOF.md](CALLER-PROOF.md). The complete moment comparison and stopped +recurrence are separately derived in [RECURSION.md](RECURSION.md). + +This review checks the changed provider against unchanged generic source. It +does not infer an all-size theorem from the finite census. The written +argument uses the exact native and owner lemmas in +[NATIVE-PROOF.md](NATIVE-PROOF.md) and [OWNER-PROOF.md](OWNER-PROOF.md), and the +retained caller and component proofs in [inputs/caller/PROOF.md](inputs/caller/PROOF.md). +It supplies neither a formal-kernel proof nor a fixed-physical-tape compiler. + +The reviewed implementation and receipts have these SHA256 pins: + +| File | SHA256 | +|---|---| +|`caller.py`|`eda0aedcd1b57451c9fb3ad3b9e696dd3601dc7e956ef55d16819b32a42c6c88`| +|`CALLER.json`|`e78211b1044de8381fa8bbe1ad674b6ebf5b970e206841216cb91e67b186ce2e`| +|`CALLER-PROOF.md`|`28c5457da4d273a558c43936f9da9a49094994a2f5da9f780d5d822e7faa9d56`| +|`CALLER-SOURCES.json`|`ad4a6ad33e24baf471263a0e1a73db7fbaa071223ff11d1b20410185d8d5e8e3`| +|`caller_source_cuts.py`|`fb05ca0e7fa5ca229efd4be517c8462c4a9a30263738d3297753bc71f03a1df4`| +|`CALLER-SOURCE-CUTS.json`|`78aa2e2b33410540ae0bed856d722522cb5c43b5687e49b9fb0b435fb461ba5d`| + +The 84 retained caller files are byte exports from canonical commit +`12fa8c5c844be21bfefb38a19503fbd867a11244`; the changed literal word comes +from PR4183 head `928066009267fb32ab2c1a29b50fa3093ea18aef`. The loader's +canonical-JSON hash of the source map's `files` object is +`62682f12db2f42394d0ec0950af5a9f857c97ff6280b77656beb5e3d3a24909f`. +That object hash is distinct from the whole-file hash above. + +## 1. The exact input contract survives the change + +Fix an odd prime `q`, precision `w>=1`, atom radix `A=q^w`, and + +``` +N=|GL_64(F_q)|, H=q^(4096(w-1)), W=28416, P=28425, +K=lcm(W,P) N H=269241600 N H, +D(n)=0 (n<64), D(n)=1+D(42 floor(n/64)) (n>=64). +``` + +An internal node of width `n>=64` receives an arbitrary Boolean function on +the complete ordered domain + +``` +[C physical frozen-prefix ordinals][R fresh rows] +[B][A^n head][G][A^n tail][S], R=t K^D(n), t>=1. +``` + +All displayed extents are positive. Equal numerical frozen prefixes remain +distinct physical ordinals and may carry different or correlated payloads. +The helper inputs are arbitrary functions. No independence from retained +source or output functions is assumed. + +The incoming unit `a_i` is generated by the retained encoded coefficient +program. It can inspect the old frozen prefix and coordinate `i`. It cannot +inspect this node's fresh family, low/high header, unused rows, payload bits, +body addresses, or spectators. This is a source grammar restriction, not +permission to supply an unrelated coefficient oracle. + +The returned Boolean function is the pullback of + +``` +head_i' = a_i tail_(n-1-i), +tail_(n-1-i)' = a_i^-1 head_i, 0<=i=n else 1), +G'=A^(b-a-c) (G if a2^80`, minimal residue/index +widths, root arenas of capacity `2^24`, fixed precision throughout the +descendants of original root `e`, and + +``` +w>=ceil(e^(17/10000)), n<=e, +2^(h+1)<=8e^2, 17(h+1)<=20051w. +``` + +Although the source's chosen precision was an equality, its absorption +inequalities only use this lower bound. With `b_q=ceil(log2 q)`, + +``` +L<=b_q w+2, I<=591w, h+1<=1180w, Q<=4096b_q+16. +``` + +The last inequality follows because both new label counts are below +28278. The unchanged coefficientwise estimate gives `E<2V` and +`32Delta<2^-125 V`. Summing over the active chain yields + +``` +live < (10+2^-125) WN/(WN-1) V_root+F_q' + < 11 V_root+F_q'. +``` + +This counts borrowed input, suspended parents, complete directories, +numerical words, continuations and markers. Four-bit encoding gives +`<44V_root+4F_q'` bits. It is a bound on logical live contents, not Python +heap capacity or a fixed physical tape layout. Padded words, unrelated +long supplied histories and separately retained observer logs need their +actual charges in the explicit ledger. + +## 6. Uniform time and the meaning of the saving + +The route and ordinary leaf source still costs `O_q(wV)`. Linear address +signs keep fallback signs at `O_q(fV)`, and each fixed normal form has +`O_q(f)` adapters. The finite changed provider can enlarge the uniform +constant but does not change these powers. + +The coefficient evaluator has arity at most two and decreasing +chronological level, so its work is at most `2^h` times a fixed polynomial +in `L,I,h`. Under the displayed root coupling, +`2^(h+1)<=8e^2` and `e<=w^(10000/17)` make this a fixed polynomial in `w`. +Its ratio to the complete target fibre `q^w` has a finite supremum over +positive integer `w`. Directory and numerical-frame preparation has the +same absorption. Canonical spectator counters are paid through their +scans. Hence a constant depending only on fixed `q` and the finite source +provides the `C(n+w)` overhead, uniformly in root width, spectators and +ancestor contents. The two matched providers may use their maximum `C`. + +This is the all-parameter justification for the actual `p=1` recurrence. +A finite coefficient invoice alone would not establish it. Precision is +fixed at the original root, not recomputed from each descendant's width. +In particular `w=ceil(e^(139/80000))` satisfies the inherited lower +coupling. + +The independent price proof includes every idle remainder and COPY +request and keeps the bridge/private work in the local overhead. Its +complete profile difference is `288(e7-e6-e1)`. Its strict moment gain +therefore survives the logical recursive construction. This means a +better complete power majorant; it does not establish pointwise ordering +of finite runtimes or invocation counts. For example the candidate's +width-70 child at parent 640 is internal while the removed rank-six +child has width 60 and remains a leaf. + +## 7. Executed evidence and remaining boundary + +The final `CALLER.json` records all 288 candidate calls and 11,193,984 +candidate literal events, all 549 prime-three split bases, all 111 +orthogonal dyadic rho15 matrices and 444 projector identities, six real +Consumer coefficient probes, four owner-route probes, threshold traces, +and four targeted binding controls. The matched baseline has its own +catalogue/profile and threshold checks and the complete two-orientation +native proof. Its full 288-call caller census was not separately run. + +The four threshold fixtures use a reviewed cache confined to their nested +`FixtureGeometry` class. Relative to the published uncached caller at +`8bb569889d4a8b4707178a50eccd93f8c23593ec`, only `threshold_probes` and +the checker's `main` dispatch changed. The production catalogue, +Consumer, Driver, Frame, normal forms and retained source files are +unchanged. + +For one fixture, `Geometry.point` depends on its fixed arena and constant +words, the plan dimension, row, encoded extent and encoded column. The +cache key includes the dimension, row and both complete input word +contents, with canonical input heads checked. A miss calls the unchanged +method and verifies unchanged inputs. The cache owns its saved result; +every use returns a fresh `Arena.copy`, so the trace can free or mutate +that returned word without affecting the cache. All saved words are +freed before the existing full ownership, head and erasure audit. + +The old source, SHA256 +`ed95651869d1631ab2760ac1179c2497ef2eb0e241abfb45ef893c6180713d96`, +and the cached fixture produced identical complete ordered event digests. +The comparison includes the Plan context, every Event/Request/Reference +field, complete encoded word contents and heads, and exact normalized +parent identity. All four returned arenas had zero live registers, +reset heads and erased work. The registered replay now checks those +uncached goldens and these independent event/address counts: + +| Word | Parent | Events | Address calls | Distinct complete inputs | +|---|---:|---:|---:|---:| +|candidate|576|89,354|177,696|1,152| +|candidate|640|98,723|197,440|1,280| +|matched baseline|640|96,922|192,880|1,280| +|matched baseline|704|106,087|212,168|1,408| + +For rank `r` the unchanged good Plan has +`4096+2*(63r-r(r-1)/2)` commands. Its two adapter directions and actual +leaf/internal body give the table's event counts, independently of the +digest calculation. Both executions made the same 780,184 address calls; +the registered distinct-input assertions total 5,120. The direct +comparison records address-call counts and complete emitted payloads, +not a separate serialized point-input stream. + +Every old semantic receipt field remains equal after removing only the +new `threshold_probes[*].full_trace` records. The default complete replay +retains all previous checks and adds full-event guards. The optional +`--scope thresholds --uncached-thresholds` mode calls the retained +address routine on every use and checks the same goldens. The fixture +cache changes checker allocation and numerical-step counts; those +counts are excluded from the production time and storage proof above. +This is a reduction in repeated checking work, not an additional +mathematical supplier improvement. + +The Frame probes use actual descriptor construction, Frame, +SelectedNode construction and cleanup, including `640->70` and +`256->168->84`. Their controlled child bodies act on 23 bits with +`U=11`. This deliberately bypasses the actual child stock guard; these +are source/context/lifetime probes, not an admissible complete GL64 +payload or compatible-stock execution. The written argument above +supplies the all-parameter transfer. + +No unresolved source, private-clearing, spectator, active-ancestor or +logical-storage defect was found in this bound implementation. Lowering +its logical tapes and arenas to the required fixed physical tapes, with +paid access, head return and physical template blank-return, remains +separate. Exact rounded-child return and COPY cleanup, faster `p<1` +route/leaf suppliers, outer padding/borrowing, the complex supplier and +multiplication transfer also remain separate. No new kappa or selected +frontier admission follows. + +This is an independent source/proof review by a second OpenAI Codex +agent, not independent human review. The retained caller, component +lemmas and their attribution remain unchanged; see the notices under +`inputs/caller/`. diff --git a/research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCE-CUTS.json b/research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCE-CUTS.json new file mode 100644 index 0000000000..bd761d4b82 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCE-CUTS.json @@ -0,0 +1,1232 @@ +{ + "candidate_native_raw6_sha256": "35b4d967ab9325a5e9bd433c121f73791b9bb79a299626fbccc6377c01dc074d", + "candidate_word_sha256": "5f301f0d668ded1028b7603c5ea9c88271e390fb9060ce8e118aad7d9927a7fd", + "negative_controls": [ + { + "mutation": "earlier current-source mutation", + "rejected_by": "current source50 differs from its original input" + }, + { + "mutation": "omitted final source restoration", + "rejected_by": "current source50 differs from its original input" + }, + { + "mutation": "wrong frame at inserted read", + "rejected_by": "actual source-cut ADD frames" + }, + { + "mutation": "open valid COPY at inserted read", + "rejected_by": "source50 read cut has an open COPY" + }, + { + "mutation": "omitted inverse source restoration", + "rejected_by": "current source50 differs from its original input" + } + ], + "no_new_kappa": true, + "orientations": { + "forward": { + "cuts": [ + { + "current_source_integer_row": [ + [ + 50, + 1 + ] + ], + "destination_frame": 509, + "destination_integer_row_before": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ], + [ + 413, + 1 + ], + [ + 605, + -1 + ] + ], + "position": 23829, + "private_closed": true, + "record": [ + 1, + 413, + 50, + 1, + 509, + 0 + ], + "source_frame": 509 + }, + { + "current_source_integer_row": [ + [ + 50, + 1 + ] + ], + "destination_frame": 1, + "destination_integer_row_before": [ + [ + 50, + 1 + ], + [ + 58, + 1 + ], + [ + 60, + 1 + ], + [ + 63, + 1 + ], + [ + 67, + 1 + ], + [ + 74, + 2 + ], + [ + 76, + 1 + ], + [ + 79, + 1 + ], + [ + 87, + 2 + ], + [ + 92, + 1 + ], + [ + 94, + 1 + ], + [ + 96, + 1 + ], + [ + 106, + 1 + ], + [ + 109, + 1 + ], + [ + 413, + 1 + ] + ], + "position": 31990, + "private_closed": true, + "record": [ + 1, + 413, + 50, + -1, + 1, + 0 + ], + "source_frame": 1 + } + ], + "event_sha256": "6fd82cdb16f4c6a3aa7e572b94856f9a285f7388119e7da2d0ff1d5b3cc3d98b", + "events": 38868, + "final_source50": [ + [ + 50, + 1 + ] + ], + "independent_integer_columns": 660, + "integer_COPY_ERASE_equalities": 9, + "private_final_zero": true, + "source50_globally_immutable": false, + "source50_write_history": [ + { + "current_integer_row": [ + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 24473, + "record": [ + 1, + 50, + 87, + 1, + 509, + 0 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 24474, + "record": [ + 1, + 50, + 17, + 1, + 509, + 0 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 2 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 24475, + "record": [ + 1, + 50, + 67, + 1, + 509, + 0 + ] + }, + { + "current_integer_row": [ + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 11, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 24, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 40, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 4 + ], + [ + 51, + 1 + ], + [ + 53, + 1 + ], + [ + 55, + 1 + ], + [ + 57, + 1 + ], + [ + 60, + 1 + ], + [ + 67, + 2 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 85, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 101, + 1 + ], + [ + 342, + 1 + ] + ], + "position": 24841, + "record": [ + 1, + 50, + 342, + 1, + 397, + 0 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 2 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 25846, + "record": [ + 1, + 50, + 342, + -1, + 1, + 0 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 26229, + "record": [ + 1, + 50, + 67, + -1, + 1, + 0 + ] + }, + { + "current_integer_row": [ + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 26230, + "record": [ + 1, + 50, + 17, + -1, + 1, + 0 + ] + }, + { + "current_integer_row": [ + [ + 50, + 1 + ] + ], + "position": 26231, + "record": [ + 1, + 50, + 87, + -1, + 1, + 0 + ] + } + ] + }, + "reverse": { + "cuts": [ + { + "current_source_integer_row": [ + [ + 50, + 1 + ] + ], + "destination_frame": 1, + "destination_integer_row_before": [ + [ + 58, + 1 + ], + [ + 60, + 1 + ], + [ + 63, + 1 + ], + [ + 67, + 1 + ], + [ + 74, + 2 + ], + [ + 76, + 1 + ], + [ + 79, + 1 + ], + [ + 87, + 2 + ], + [ + 92, + 1 + ], + [ + 94, + 1 + ], + [ + 96, + 1 + ], + [ + 106, + 1 + ], + [ + 109, + 1 + ], + [ + 413, + 1 + ] + ], + "position": 6877, + "private_closed": true, + "record": [ + 1, + 413, + 50, + 1, + 1, + 1 + ], + "source_frame": 1 + }, + { + "current_source_integer_row": [ + [ + 50, + 1 + ] + ], + "destination_frame": 509, + "destination_integer_row_before": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 50, + 1 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ], + [ + 413, + 1 + ], + [ + 605, + -1 + ] + ], + "position": 15038, + "private_closed": true, + "record": [ + 1, + 413, + 50, + -1, + 509, + 1 + ], + "source_frame": 509 + } + ], + "event_sha256": "4bb2786c1e7fad6132af51cad9e6ae702f149cc7fc77d65aae1da8a34ec687ab", + "events": 38868, + "final_source50": [ + [ + 50, + 1 + ] + ], + "independent_integer_columns": 660, + "integer_COPY_ERASE_equalities": 9, + "private_final_zero": true, + "source50_globally_immutable": false, + "source50_write_history": [ + { + "current_integer_row": [ + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 12636, + "record": [ + 1, + 50, + 87, + 1, + 1, + 1 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 12637, + "record": [ + 1, + 50, + 17, + 1, + 1, + 1 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 2 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 12638, + "record": [ + 1, + 50, + 67, + 1, + 1, + 1 + ] + }, + { + "current_integer_row": [ + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 11, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 24, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 40, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 4 + ], + [ + 51, + 1 + ], + [ + 53, + 1 + ], + [ + 55, + 1 + ], + [ + 57, + 1 + ], + [ + 60, + 1 + ], + [ + 67, + 2 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 85, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 101, + 1 + ], + [ + 342, + 1 + ] + ], + "position": 13021, + "record": [ + 1, + 50, + 342, + 1, + 1, + 1 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 2 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 14026, + "record": [ + 1, + 50, + 342, + -1, + 397, + 1 + ] + }, + { + "current_integer_row": [ + [ + 17, + 1 + ], + [ + 22, + 1 + ], + [ + 33, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 14392, + "record": [ + 1, + 50, + 67, + -1, + 509, + 1 + ] + }, + { + "current_integer_row": [ + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 50, + 2 + ], + [ + 60, + 1 + ], + [ + 67, + 1 + ], + [ + 77, + 1 + ], + [ + 87, + 1 + ], + [ + 92, + 1 + ] + ], + "position": 14393, + "record": [ + 1, + 50, + 17, + -1, + 509, + 1 + ] + }, + { + "current_integer_row": [ + [ + 50, + 1 + ] + ], + "position": 14394, + "record": [ + 1, + 50, + 87, + -1, + 509, + 1 + ] + } + ] + } + }, + "scope": "Independent finite integer column/source-history proof for all actual helper413 source50 read cuts; no caller import, GL64 enumeration, rounded cleanup or physical tape claim.", + "serialized_input_sha256": { + "249-states.json": "103de24baca3bb119fafee6778d5596bce00f8731cf05d107ea7bad300786f08", + "LOCAL-PROGRAMS.json": "c2c35a98c7674c8b16b6c014e2dafd9912ae8ae93cf0ccd2cb1dc654ca2bc6bf", + "frames.json": "76a3c2af379ab20bb179baf40eadb5051eadd12cd2442c8eb323404b8ae9b5cd" + }, + "status": "PASS_EXACT_CURRENT_SOURCE50_CUTS" +} diff --git a/research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCES.json b/research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCES.json new file mode 100644 index 0000000000..bc383a32bb --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/CALLER-SOURCES.json @@ -0,0 +1,89 @@ +{ + "base": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "files": { + "research/selected-bit-recursive-caller/EVIDENCE.json": "77b7cbefa2ca30acf2f77e23d14808ccd27848e9c76e4c5e68a045ef7891a07f", + "research/selected-bit-recursive-caller/PREDECESSOR.json": "e3127475913d62dbdf1b45d9283d2db2e9b689e0f81a703189150c1e5be2bca0", + "research/selected-bit-recursive-caller/PROOF.md": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "research/selected-bit-recursive-caller/README.md": "6ce41fd7e6dfbe5faecc25bd36561f0a65b6ebca6fc69d3fb72569424a405045", + "research/selected-bit-recursive-caller/RESULT.json": "4919655bae2e5cff051e8f2d240a8e4ebb03392a9da2fb5328daa9248fb7e88b", + "research/selected-bit-recursive-caller/SOURCES.json": "7c78f539078e1bc3d893b78b5ee24cb22dc090d3763fe554e861b6c3d3e7eaf7", + "research/selected-bit-recursive-caller/TASK.json": "ac7d4b38da31b373e665929027fc04afb66c3e9aedaea3296e3783637912d0e8", + "research/selected-bit-recursive-caller/VALIDATION.md": "ac0f2fab0ca810ce0202d31480daa8329cba0897ab015520a2bfd4b689c4086b", + "research/selected-bit-recursive-caller/VERIFY.json": "6ad0e07f68458afedece927550655b5bc5cd9861a70044fcd95bb10a2179f0a6", + "research/selected-bit-recursive-caller/bootstrap.py": "eef1c418e8edbdf317d159683e30beaecd971c77cf41d6b09708576405e2141e", + "research/selected-bit-recursive-caller/check_layout.py": "454b1587d1ed5ccaea19b621a67e2ceba999d7ede61188125faa41c4dd2ab2b1", + "research/selected-bit-recursive-caller/check_nested_model.py": "b1941b882b0659722c3c41994c82f020c1f7ab320dc28c43c2758029ef8a48b7", + "research/selected-bit-recursive-caller/check_recursion.py": "dde82badf043e553bc635a34295e2b5505d84d6dfbaf96e0cfccb8a8c3dbb158", + "research/selected-bit-recursive-caller/check_runtime.py": "9fcf0c9a3c84a17446fafe8da50b63db296ba9465d48ddb6fdeac8742dfc98b1", + "research/selected-bit-recursive-caller/check_sign.py": "ee4fd34acd49962a18d268aefeb20aa3c2673a10e7a43eee3e51a9bd3cf9106a", + "research/selected-bit-recursive-caller/check_sources.py": "1c49984ae6ee7f8a44cde16b51e486f0b3ba4ee5c973389ac8d58a82d0a0aa3b", + "research/selected-bit-recursive-caller/consumer.py": "2f2a8604c23fb2c81f24320c71ed0142118d98dde3be6086adad28e89954a777", + "research/selected-bit-recursive-caller/control_checks.py": "c09d33327932b4ffbb8acb26c8a6bb621bcca542157d22f1edf72679a9359981", + "research/selected-bit-recursive-caller/driver.py": "ceaf8f75de9810a05ebf8f65780b6f8bd7599a5768401d5e4386182afe615cdf", + "research/selected-bit-recursive-caller/evidence/NOTICE.md": "fd7c42e89878cda6df86dde8720ece34625a337cf5edd795a421e2d3b42919e9", + "research/selected-bit-recursive-caller/evidence/pr2688-NOTICE.md": "c899fccf7bd32397f0ddd85e4af35a166cefb3e3ae3407ec40edc3ab2051b617", + "research/selected-bit-recursive-caller/evidence/pr2688-PROOF.md": "fa9bec0952468e4acb760a88d45d5be216325650e1a4080cf590e07b90c9f533", + "research/selected-bit-recursive-caller/evidence/pr2708-README.md": "5906f6b7b2c8eea90e441476c4cbd60fe2ef981b690c63357bcfe67e3104aeef", + "research/selected-bit-recursive-caller/evidence/pr2731-README.md": "19683df4394de299cbd7e1cce39bf9434ad260b1a37006587cf9aed84c9c0a03", + "research/selected-bit-recursive-caller/layout.py": "3beef6534b02c3b011b741f957a7d9fb05a9ac0bba1fed53b2c71834e4ea6bc1", + "research/selected-bit-recursive-caller/linear_sign.py": "73e895fc701a4145cbe89d60f5775128354e7f08d0a45eacf22f423913f54e67", + "research/selected-bit-recursive-caller/node.py": "0bd4f640cafb5c8f070c161d86445910f77578a672bf5886936ed89e7f6bd21b", + "research/selected-bit-recursive-caller/packet_engine.py": "c80fc3aa9092f91cc309b2fb2dbc3618bf96bdb9b8498503993ea161f0ae2134", + "research/selected-bit-recursive-caller/peel.py": "8b20888f74b4cd814a97b42ec72528fbfb6d2e936c5022df726f0785d0d01a2e", + "research/selected-bit-recursive-caller/predecessor/NOTICE.md": "c446b32b8a621844fb2fbe654810c8122035bdd43fed2132f1137d98cb6f9943", + "research/selected-bit-recursive-caller/predecessor/PROOF.md": "88754d57bae35a2089d9de221ff32ba802b7a56b810f96271f3ea36985edfb14", + "research/selected-bit-recursive-caller/predecessor/README.md": "15631eb826b2d8d54fbee18fb6f70ee035e172d524c2a209b6c467c3f0204f64", + "research/selected-bit-recursive-caller/predecessor/RESULT.json": "0d94c5e9150f3fbd603526c67ea33168d3ba45e158aaf722e848bf5c316a37a8", + "research/selected-bit-recursive-caller/predecessor/SOURCES.json": "1b02a5c607a5967948988c3beaf37d9975d650ad501a99fcf74c135dc1f05fdd", + "research/selected-bit-recursive-caller/predecessor/TASK.json": "a4cd54d4b09ad12a90a5feeb39a127f0f0d5a2a04f9f88554c5fc3ee0cfe77f4", + "research/selected-bit-recursive-caller/predecessor/VERIFY.json": "e1dd0ee5f267ffa515bb345054ff8637cfedb0079b0d2da29b90b7848264926e", + "research/selected-bit-recursive-caller/predecessor/cardinal_counts.py": "59ddeac102a0cc51fa49b15aae6aeb68cd68ed217fa974ce916372a177d2ec8f", + "research/selected-bit-recursive-caller/predecessor/catalogue.py": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "research/selected-bit-recursive-caller/predecessor/check_headers.py": "a41dab0c487c341eb32b34a03af74454e15e9e61e7386a1ca426d83f3b68b1ca", + "research/selected-bit-recursive-caller/predecessor/check_layout.py": "8f776a21dc0e31f9738d822cfda38db92f1e3672afb880d4246ec5e084a50a41", + "research/selected-bit-recursive-caller/predecessor/check_runtime.py": "5357e4ff255f17c4209aaf71a3413a4148475f11180c4f829e8f0ebacd2877cb", + "research/selected-bit-recursive-caller/predecessor/check_sources.py": "6463c2724e04a313181b78e90a17cd62ee42465754902cca3e9a65c6140a15a1", + "research/selected-bit-recursive-caller/predecessor/consumer.py": "b28ec97b0873ff2be25aff4bdde268247ffcec0d21279d0ada196de19a0bdc66", + "research/selected-bit-recursive-caller/predecessor/control.py": "d3a93e54bb7d333b73917586407d11674d38b5c3fda4fbdc436fb5293ae7786a", + "research/selected-bit-recursive-caller/predecessor/control_checks.py": "5ea6ded8c2508fbb00d93655affdfe7907ffb60916389e0736249c003a7a5148", + "research/selected-bit-recursive-caller/predecessor/driver.py": "ee9e42fe95ab28fdd5e927c2d46fd480305aaad610eb2ca7ae514a5d22d9f0ac", + "research/selected-bit-recursive-caller/predecessor/fresh_rows.py": "e4ae08fbd658add630eb7754ebe0cbcb42c6f39cf4128f9cb92e27fcf5213a7d", + "research/selected-bit-recursive-caller/predecessor/layout.py": "7534b0166805f2ae8d11495c811d2bd272cea89c89b6bb5251fd411c89245a20", + "research/selected-bit-recursive-caller/predecessor/model.py": "c937ae8e46162f88fc1cd7646d3b22c99273029ad0f0e3131f46ddec230676cb", + "research/selected-bit-recursive-caller/predecessor/node.py": "b88fc9ac0b22d939311ff4f7aff788e8c87a64fd5e866498e59bd27940ee3f28", + "research/selected-bit-recursive-caller/predecessor/packet_engine.py": "ce7f132a6a69c802406f07c4a2119ef921e8978520ff58d5eeaeedb982c257f2", + "research/selected-bit-recursive-caller/predecessor/peel.py": "3de018e68601566c364c7568b110f60c1bf34941b846cdffb94401bb799f85e3", + "research/selected-bit-recursive-caller/predecessor/topology.py": "384d456ddba76de137a63b50019d5bba2e9f6daa4177c91643e0565d4cf1d44b", + "research/selected-bit-recursive-caller/predecessor/vendor/binding.py": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b", + "research/selected-bit-recursive-caller/predecessor/vendor/bitstream.py": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783", + "research/selected-bit-recursive-caller/predecessor/vendor/cardinality.py": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22", + "research/selected-bit-recursive-caller/predecessor/vendor/check_support.py": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964", + "research/selected-bit-recursive-caller/predecessor/vendor/children.py": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6", + "research/selected-bit-recursive-caller/predecessor/vendor/controller.py": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c", + "research/selected-bit-recursive-caller/predecessor/vendor/counts.py": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069", + "research/selected-bit-recursive-caller/predecessor/vendor/directory.py": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7", + "research/selected-bit-recursive-caller/predecessor/vendor/episode.py": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff", + "research/selected-bit-recursive-caller/predecessor/vendor/forms.py": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4", + "research/selected-bit-recursive-caller/predecessor/vendor/low_codes.py": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87", + "research/selected-bit-recursive-caller/predecessor/vendor/matrices.py": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459", + "research/selected-bit-recursive-caller/predecessor/vendor/numeric.py": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514", + "research/selected-bit-recursive-caller/predecessor/vendor/oracle.py": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67", + "research/selected-bit-recursive-caller/predecessor/vendor/packet.py": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5", + "research/selected-bit-recursive-caller/predecessor/vendor/plan.py": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "research/selected-bit-recursive-caller/predecessor/vendor/records.py": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372", + "research/selected-bit-recursive-caller/predecessor/vendor/residual.py": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df", + "research/selected-bit-recursive-caller/predecessor/vendor/routes.py": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada", + "research/selected-bit-recursive-caller/predecessor/vendor/selection.py": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b", + "research/selected-bit-recursive-caller/predecessor/vendor/sources.py": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62", + "research/selected-bit-recursive-caller/predecessor/vendor/stream.py": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5", + "research/selected-bit-recursive-caller/predecessor/vendor/stream_runner.py": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249", + "research/selected-bit-recursive-caller/predecessor/vendor/trace.py": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984", + "research/selected-bit-recursive-caller/predecessor/vendor/words.py": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9", + "research/selected-bit-recursive-caller/predecessor/verify.py": "cd83797d1f420f7e5de61c1a693110b4ee0c80bac0adae4699599046b7f76f8a", + "research/selected-bit-recursive-caller/recursive_call.py": "157deaa5972557893d43494a81151483bdc46373448ec677cb6a738c9b7e6f1e", + "research/selected-bit-recursive-caller/scheduler.py": "0d96f7fbd6f90416167c5a52c0e3de942d1a0cae3d2968831932a9576701699f", + "research/selected-bit-recursive-caller/stream_runner.py": "b255feaf6cc6e40413ae73fe302bf8f290bf4dd89f4128b23a91cc9860601801", + "research/selected-bit-recursive-caller/trace.py": "3a664224c558244f606b603cad816d75e94a17c9b2620a06a1530e893dfceac2", + "research/selected-bit-recursive-caller/verify.py": "65126e788eeea10e830fc583cf4afe0bfc4d67495cbf8ac21de3507dbe624d56" + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/INDEPENDENT-OWNERS.json b/research/bit-stage-mixedwidth-packing/provider/INDEPENDENT-OWNERS.json new file mode 100644 index 0000000000..8eeb7b8b30 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/INDEPENDENT-OWNERS.json @@ -0,0 +1,16 @@ +{ + "call_descriptors": 288, + "difference_numerator_gcds": { + "1": 180736 + }, + "family_charts": 111, + "helper_occurrences": 126144, + "idle_rank_per_replica": 10602, + "nonzero_idle_per_replica": 1998, + "owner_receipt_sha256": "28493f72227d9f268b06e675dff4742fe9414067e8b6ba96b2b497e013dd394a", + "relative_charts": 55, + "same_family_pairs": 180736, + "scope": "Independent serialized schedule/projector/packet-separation audit; all-size callee and physical tariffs remain hypotheses.", + "selector_G": 1117, + "status": "PASS_INDEPENDENT_SERIALIZED_OWNER_AUDIT" +} diff --git a/research/bit-stage-mixedwidth-packing/provider/INPUT-SOURCES.json b/research/bit-stage-mixedwidth-packing/provider/INPUT-SOURCES.json new file mode 100644 index 0000000000..ce662e4587 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/INPUT-SOURCES.json @@ -0,0 +1,742 @@ +{ + "files": [ + { + "git_blob": "aa9ec3c341ad87d7513b9ea6934d5253035b8d30", + "local_path": "inputs/WORD.json.gz", + "sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/bit-delayed-carrier-retirement/inputs/WORD.json.gz" + }, + { + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "local_path": "inputs/GEOMETRY.json.gz", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/bit-delayed-carrier-retirement/inputs/GEOMETRY.json.gz" + }, + { + "git_blob": "12fc1c8c17af6bceac754913847b28b74190764d", + "local_path": "inputs/PR4183-RESULT.json", + "sha256": "ccd419ac1cb123edd8a27aa9d0a6ab3713087a8bcd5be39114a7bd0f254ceebc", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/bit-delayed-carrier-retirement/RESULT.json" + }, + { + "git_blob": "c2fb443f44f2c7c420cd367ab5fa12644efe318a", + "local_path": "inputs/ALLOCATION.json", + "sha256": "06fa9322508aba3d8a5dc6469151cdfaa906b60559582b49c8b024428b158021", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/bit-r438-transport-rehost/verify_rehost.receipt.json" + }, + { + "git_blob": "832e64f7268e8393ac862dd9f321d66fa71709c5", + "local_path": "inputs/TERMINAL-CHARTS.json", + "sha256": "489216ea25f47f061675ab7b7e4a17289a531bce6fe77cca166a13265bfcbb17", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/bit-five-rank4-terminals/admission/inputs/TERMINAL-CHARTS.json" + }, + { + "git_blob": "3df12bd632f1fdba825ced57110a1fee82eb2857", + "local_path": "inputs/CONTROLLER.py", + "sha256": "6368196a393ac25bb2918880e4c4bd31ed733b762c27b6873ab391cbc0c5c3c8", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-p111-tuned/vendor/pr510/e8-r480-nine-stage/vendor/e8-r715-eleven-stage-whole/code/global_k.py" + }, + { + "git_blob": "674ef36f723fbcc593e7d2319dca131da09181e5", + "local_path": "inputs/R438-CERTIFICATE.json", + "sha256": "6da8c593257c8440f0fe35488d941715d953d715e2e464ffdfffff7ed31eee9c", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/r438-native-rehost/CERTIFICATE.json" + }, + { + "git_blob": "5fd676df060f3b450782fdf5ff5f6beb63a5eeb0", + "local_path": "inputs/SELECTED-ASSEMBLY.json", + "sha256": "1122cb3a575f8c788345fc1bf4c108ac7c3250fb81a5988671f5eb04b3ab3045", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/community-frontier1094-audit/ASSEMBLY.json" + }, + { + "git_blob": "cb1233c7e96b1aa8bbf4d2e4165d75ab0dca64b9", + "local_path": "inputs/native/legality_h.cpp", + "sha256": "6c1ef2b24e57781d6951c172a1024fc4300e6fd392c9d6672079a7806ab663b3", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-carrier-skeleton/code/bit/checkers/legality_h.cpp" + }, + { + "git_blob": "42bb232fbec4de703e70cc13dc2f39a3b43a3a01", + "local_path": "inputs/native/columns_k.cpp", + "sha256": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-carrier-skeleton/code/bit/checkers/columns_k.cpp" + }, + { + "git_blob": "82d69f7c5d044c9887c96b90c97f5639083ecd14", + "local_path": "inputs/native/json.hpp", + "sha256": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-carrier-skeleton/code/bit/checkers/json.hpp" + }, + { + "git_blob": "f6d7afe3e623208c4207b6a683a1e3e49249e31c", + "local_path": "inputs/native/stage_cohort.py", + "sha256": "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-carrier-skeleton/code/bit/regression/stage_cohort.py" + }, + { + "git_blob": "fc5664e929d9a81d9b4926bee049a93330be86ec", + "local_path": "inputs/native/bits/stdc++.h", + "sha256": "420094be2af295eed03a983dd66debbbe9cfb78d8252859f4498a615a0074b99", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-carrier-skeleton/portable-include/bits/stdc++.h" + }, + { + "git_blob": "bbd3f12b9a32b3ad3cba85a2d5a1b3054214fa02", + "local_path": "inputs/proofs/whole-call-hosting.md", + "sha256": "59cae781bfbe1a01ed9e66a8efeeb5a2b995e5ecdf908586b23ecc39f2b8d647", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/pr589-five-helper-hosting/PROOF.md" + }, + { + "git_blob": "4330de85dd9862ed15d84ab917887d249753df99", + "local_path": "inputs/proofs/local-ring-packets.md", + "sha256": "846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/selected-bit-local-ring-sweeps/PROOF.md" + }, + { + "git_blob": "1a08e57eac2a37764066d31baa3ecd3769759158", + "local_path": "inputs/proofs/recursive-caller.md", + "sha256": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/selected-bit-recursive-caller/PROOF.md" + }, + { + "git_blob": "2fd5d7664575e4b324123eaad8729c100ededc2e", + "local_path": "inputs/proofs/terminal-chart-admission.py", + "sha256": "762357be4644da879251eca070a81dfd73ec3ef4991191cdd630896e7e9b44a3", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/bit-five-rank4-terminals/admission/verify.py" + }, + { + "git_blob": "238226c568742dd5723b03eabae564a2eaa2bda9", + "local_path": "inputs/proofs/assemble9.py", + "sha256": "4bf6768224a3fac81ccda26df24f3763f9a4fbc35ad62bef2888595cdae519fe", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/e8-bit-p111-tuned/vendor/pr510/e8-r480-nine-stage/code/assemble9.py" + }, + { + "git_blob": "6c410cab5713979214a45835091fbeb9ee9b8531", + "local_path": "inputs/proofs/stopped-recurrence.md", + "sha256": "74cc8de20f21acb5123fe2d20996fe0925ea6e51b3dec633bd5221fb719b3344", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "research/lean-stopped-recurrence-audit/sources/pr2234/PROOF.md" + }, + { + "git_blob": "cbaa8cb42cad1e714a1d24b16ab160ae6eaf60c9", + "local_path": "inputs/proofs/batched-bit-rows.tex", + "sha256": "ef72c0ead19373cbc19c8a3aacb44dd0f75353ee5f4d055f775a986a4878022c", + "source_commit": "928066009267fb32ab2c1a29b50fa3093ea18aef", + "source_path": "notes/batched-bit-rows.tex" + }, + { + "git_blob": "c2c347abc2b8c19bb642c4da1aad5b3e8383016f", + "local_path": "inputs/caller/EVIDENCE.json", + "sha256": "77b7cbefa2ca30acf2f77e23d14808ccd27848e9c76e4c5e68a045ef7891a07f", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/EVIDENCE.json" + }, + { + "git_blob": "56d76c357b51f4fc6856923222bfca47f03334e7", + "local_path": "inputs/caller/PREDECESSOR.json", + "sha256": "e3127475913d62dbdf1b45d9283d2db2e9b689e0f81a703189150c1e5be2bca0", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/PREDECESSOR.json" + }, + { + "git_blob": "1a08e57eac2a37764066d31baa3ecd3769759158", + "local_path": "inputs/caller/PROOF.md", + "sha256": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/PROOF.md" + }, + { + "git_blob": "75461632856f94d6b48ae820cf5d0b2b232305c2", + "local_path": "inputs/caller/README.md", + "sha256": "6ce41fd7e6dfbe5faecc25bd36561f0a65b6ebca6fc69d3fb72569424a405045", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/README.md" + }, + { + "git_blob": "75faec7844e18fc7c44543dbab87aba2ecf32b3e", + "local_path": "inputs/caller/RESULT.json", + "sha256": "4919655bae2e5cff051e8f2d240a8e4ebb03392a9da2fb5328daa9248fb7e88b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/RESULT.json" + }, + { + "git_blob": "ff8c8e36176aa56e319d0f9e584167ac21d67f33", + "local_path": "inputs/caller/SOURCES.json", + "sha256": "7c78f539078e1bc3d893b78b5ee24cb22dc090d3763fe554e861b6c3d3e7eaf7", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/SOURCES.json" + }, + { + "git_blob": "d70ad317275d2a517ab1294ce48ecb1f83dfedbf", + "local_path": "inputs/caller/TASK.json", + "sha256": "ac7d4b38da31b373e665929027fc04afb66c3e9aedaea3296e3783637912d0e8", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/TASK.json" + }, + { + "git_blob": "d91680665a28c12c27c99336b55c3d5341dd0fe4", + "local_path": "inputs/caller/VALIDATION.md", + "sha256": "ac0f2fab0ca810ce0202d31480daa8329cba0897ab015520a2bfd4b689c4086b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/VALIDATION.md" + }, + { + "git_blob": "b6072f66c13a38b5d8dff3ca3bc5f3f3562f1b6e", + "local_path": "inputs/caller/VERIFY.json", + "sha256": "6ad0e07f68458afedece927550655b5bc5cd9861a70044fcd95bb10a2179f0a6", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/VERIFY.json" + }, + { + "git_blob": "448c9b3a86eedb84220646ab27ff089a32ad5b9b", + "local_path": "inputs/caller/bootstrap.py", + "sha256": "eef1c418e8edbdf317d159683e30beaecd971c77cf41d6b09708576405e2141e", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/bootstrap.py" + }, + { + "git_blob": "be59d614d25961f891e1640bf85cf5e2f474a059", + "local_path": "inputs/caller/check_layout.py", + "sha256": "454b1587d1ed5ccaea19b621a67e2ceba999d7ede61188125faa41c4dd2ab2b1", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/check_layout.py" + }, + { + "git_blob": "20fed6bd389cb53fc52d0ad8389e9e7704c90265", + "local_path": "inputs/caller/check_nested_model.py", + "sha256": "b1941b882b0659722c3c41994c82f020c1f7ab320dc28c43c2758029ef8a48b7", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/check_nested_model.py" + }, + { + "git_blob": "8f36c88e196cf5afc0d6e227ba8568a10bb23c6a", + "local_path": "inputs/caller/check_recursion.py", + "sha256": "dde82badf043e553bc635a34295e2b5505d84d6dfbaf96e0cfccb8a8c3dbb158", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/check_recursion.py" + }, + { + "git_blob": "fe355a703475325bca4807b8ffedfa9f6edb74f5", + "local_path": "inputs/caller/check_runtime.py", + "sha256": "9fcf0c9a3c84a17446fafe8da50b63db296ba9465d48ddb6fdeac8742dfc98b1", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/check_runtime.py" + }, + { + "git_blob": "50669949a1325e8c49aa0ff714c40a50077b5eb8", + "local_path": "inputs/caller/check_sign.py", + "sha256": "ee4fd34acd49962a18d268aefeb20aa3c2673a10e7a43eee3e51a9bd3cf9106a", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/check_sign.py" + }, + { + "git_blob": "5c09a13943070a3bb3c0da06fd19fbc6916d1743", + "local_path": "inputs/caller/check_sources.py", + "sha256": "1c49984ae6ee7f8a44cde16b51e486f0b3ba4ee5c973389ac8d58a82d0a0aa3b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/check_sources.py" + }, + { + "git_blob": "a66d9276f829ce2c619871866816649d5f3687fd", + "local_path": "inputs/caller/consumer.py", + "sha256": "2f2a8604c23fb2c81f24320c71ed0142118d98dde3be6086adad28e89954a777", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/consumer.py" + }, + { + "git_blob": "11daa0b2221c5870d19ba2eaf411a6bff3a0398d", + "local_path": "inputs/caller/control_checks.py", + "sha256": "c09d33327932b4ffbb8acb26c8a6bb621bcca542157d22f1edf72679a9359981", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/control_checks.py" + }, + { + "git_blob": "5b7846a70aada53d87480b337e1c04217118771b", + "local_path": "inputs/caller/driver.py", + "sha256": "ceaf8f75de9810a05ebf8f65780b6f8bd7599a5768401d5e4386182afe615cdf", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/driver.py" + }, + { + "git_blob": "d0318d43ed420e21dc52166a19de703aa87fbb3e", + "local_path": "inputs/caller/evidence/NOTICE.md", + "sha256": "fd7c42e89878cda6df86dde8720ece34625a337cf5edd795a421e2d3b42919e9", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/evidence/NOTICE.md" + }, + { + "git_blob": "f2b49cdef83a4a685fad32c01fba93e12cfcb5a8", + "local_path": "inputs/caller/evidence/pr2688-NOTICE.md", + "sha256": "c899fccf7bd32397f0ddd85e4af35a166cefb3e3ae3407ec40edc3ab2051b617", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/evidence/pr2688-NOTICE.md" + }, + { + "git_blob": "1395e1941863e40ff6d62dd91c41de2cb56edae9", + "local_path": "inputs/caller/evidence/pr2688-PROOF.md", + "sha256": "fa9bec0952468e4acb760a88d45d5be216325650e1a4080cf590e07b90c9f533", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/evidence/pr2688-PROOF.md" + }, + { + "git_blob": "79b8742f32b4ffb991f91ddd2d3c6be693084e6d", + "local_path": "inputs/caller/evidence/pr2708-README.md", + "sha256": "5906f6b7b2c8eea90e441476c4cbd60fe2ef981b690c63357bcfe67e3104aeef", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/evidence/pr2708-README.md" + }, + { + "git_blob": "ac5b826f9c34e1faadc5d5a02d5d260823112078", + "local_path": "inputs/caller/evidence/pr2731-README.md", + "sha256": "19683df4394de299cbd7e1cce39bf9434ad260b1a37006587cf9aed84c9c0a03", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/evidence/pr2731-README.md" + }, + { + "git_blob": "aa554b14fe0f6b308d9fba0a2afc92e5a28e20cb", + "local_path": "inputs/caller/layout.py", + "sha256": "3beef6534b02c3b011b741f957a7d9fb05a9ac0bba1fed53b2c71834e4ea6bc1", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/layout.py" + }, + { + "git_blob": "6a6e5c02f299fad8c4f7ab724fc36e14a22ab13c", + "local_path": "inputs/caller/linear_sign.py", + "sha256": "73e895fc701a4145cbe89d60f5775128354e7f08d0a45eacf22f423913f54e67", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/linear_sign.py" + }, + { + "git_blob": "28c98a3573b458f7a055678d70b602b80e6e959e", + "local_path": "inputs/caller/node.py", + "sha256": "0bd4f640cafb5c8f070c161d86445910f77578a672bf5886936ed89e7f6bd21b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/node.py" + }, + { + "git_blob": "72543f684f38fefeacc2ee66d81661f1a2439cf7", + "local_path": "inputs/caller/packet_engine.py", + "sha256": "c80fc3aa9092f91cc309b2fb2dbc3618bf96bdb9b8498503993ea161f0ae2134", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/packet_engine.py" + }, + { + "git_blob": "38502515afc928082c849cd2cda8578d33a5050a", + "local_path": "inputs/caller/peel.py", + "sha256": "8b20888f74b4cd814a97b42ec72528fbfb6d2e936c5022df726f0785d0d01a2e", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/peel.py" + }, + { + "git_blob": "ef9f81510db86eaf2f0a7191d85e92a6db30ddc0", + "local_path": "inputs/caller/predecessor/NOTICE.md", + "sha256": "c446b32b8a621844fb2fbe654810c8122035bdd43fed2132f1137d98cb6f9943", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/NOTICE.md" + }, + { + "git_blob": "a4746d1786f41e45a36fdedf37966b80fbab3562", + "local_path": "inputs/caller/predecessor/PROOF.md", + "sha256": "88754d57bae35a2089d9de221ff32ba802b7a56b810f96271f3ea36985edfb14", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/PROOF.md" + }, + { + "git_blob": "988ff622029aff49d7e99deb2468684d904bc852", + "local_path": "inputs/caller/predecessor/README.md", + "sha256": "15631eb826b2d8d54fbee18fb6f70ee035e172d524c2a209b6c467c3f0204f64", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/README.md" + }, + { + "git_blob": "7b7dfe0eab22a7b511483f268b97a7c707fd8b90", + "local_path": "inputs/caller/predecessor/RESULT.json", + "sha256": "0d94c5e9150f3fbd603526c67ea33168d3ba45e158aaf722e848bf5c316a37a8", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/RESULT.json" + }, + { + "git_blob": "4fef1a4d6c2d5e2620d3506d6032f9226870ed39", + "local_path": "inputs/caller/predecessor/SOURCES.json", + "sha256": "1b02a5c607a5967948988c3beaf37d9975d650ad501a99fcf74c135dc1f05fdd", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/SOURCES.json" + }, + { + "git_blob": "eb2ce7cc00df816daf566f101d56a0330852c1d9", + "local_path": "inputs/caller/predecessor/TASK.json", + "sha256": "a4cd54d4b09ad12a90a5feeb39a127f0f0d5a2a04f9f88554c5fc3ee0cfe77f4", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/TASK.json" + }, + { + "git_blob": "69c7ad75abe494be386f73a5d51359b9053cd9be", + "local_path": "inputs/caller/predecessor/VERIFY.json", + "sha256": "e1dd0ee5f267ffa515bb345054ff8637cfedb0079b0d2da29b90b7848264926e", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/VERIFY.json" + }, + { + "git_blob": "6a14feac45094ae9156e8c2c982d6727544f180e", + "local_path": "inputs/caller/predecessor/cardinal_counts.py", + "sha256": "59ddeac102a0cc51fa49b15aae6aeb68cd68ed217fa974ce916372a177d2ec8f", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/cardinal_counts.py" + }, + { + "git_blob": "0efc0575a7623ac41c094d2e8772beda5a9fdc29", + "local_path": "inputs/caller/predecessor/catalogue.py", + "sha256": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/catalogue.py" + }, + { + "git_blob": "1c372b19e19b838a89c0e64daeda15ec6b49f079", + "local_path": "inputs/caller/predecessor/check_headers.py", + "sha256": "a41dab0c487c341eb32b34a03af74454e15e9e61e7386a1ca426d83f3b68b1ca", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/check_headers.py" + }, + { + "git_blob": "174d843716a684145f934cb55a612bca85aad725", + "local_path": "inputs/caller/predecessor/check_layout.py", + "sha256": "8f776a21dc0e31f9738d822cfda38db92f1e3672afb880d4246ec5e084a50a41", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/check_layout.py" + }, + { + "git_blob": "5647693b3a5c1555b65e281c6609f98b92d45542", + "local_path": "inputs/caller/predecessor/check_runtime.py", + "sha256": "5357e4ff255f17c4209aaf71a3413a4148475f11180c4f829e8f0ebacd2877cb", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/check_runtime.py" + }, + { + "git_blob": "9219cdf863d9f060d6e38a4f2f4760fd227af003", + "local_path": "inputs/caller/predecessor/check_sources.py", + "sha256": "6463c2724e04a313181b78e90a17cd62ee42465754902cca3e9a65c6140a15a1", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/check_sources.py" + }, + { + "git_blob": "24b53521fce94d3349072cf47d70e62195f4d541", + "local_path": "inputs/caller/predecessor/consumer.py", + "sha256": "b28ec97b0873ff2be25aff4bdde268247ffcec0d21279d0ada196de19a0bdc66", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/consumer.py" + }, + { + "git_blob": "4f6ac09bffab43dbccc470bd0bde2ffbe969a8b2", + "local_path": "inputs/caller/predecessor/control.py", + "sha256": "d3a93e54bb7d333b73917586407d11674d38b5c3fda4fbdc436fb5293ae7786a", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/control.py" + }, + { + "git_blob": "712cfddc4caaad9e788d97b0e1e3f623172c43ed", + "local_path": "inputs/caller/predecessor/control_checks.py", + "sha256": "5ea6ded8c2508fbb00d93655affdfe7907ffb60916389e0736249c003a7a5148", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/control_checks.py" + }, + { + "git_blob": "0bdee4c9e348259b470a636a98e7657770f97fae", + "local_path": "inputs/caller/predecessor/driver.py", + "sha256": "ee9e42fe95ab28fdd5e927c2d46fd480305aaad610eb2ca7ae514a5d22d9f0ac", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/driver.py" + }, + { + "git_blob": "aa3a327604308d3a5c7a27b65f5e631d430ab093", + "local_path": "inputs/caller/predecessor/fresh_rows.py", + "sha256": "e4ae08fbd658add630eb7754ebe0cbcb42c6f39cf4128f9cb92e27fcf5213a7d", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/fresh_rows.py" + }, + { + "git_blob": "267d5ab98cd013ee82ba75e6d41609f1778af25f", + "local_path": "inputs/caller/predecessor/layout.py", + "sha256": "7534b0166805f2ae8d11495c811d2bd272cea89c89b6bb5251fd411c89245a20", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/layout.py" + }, + { + "git_blob": "9fb82fa57d29cdf8402f91534dffed8f586ced6c", + "local_path": "inputs/caller/predecessor/model.py", + "sha256": "c937ae8e46162f88fc1cd7646d3b22c99273029ad0f0e3131f46ddec230676cb", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/model.py" + }, + { + "git_blob": "13badda6f059da2132cbe325c071307e5191baa3", + "local_path": "inputs/caller/predecessor/node.py", + "sha256": "b88fc9ac0b22d939311ff4f7aff788e8c87a64fd5e866498e59bd27940ee3f28", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/node.py" + }, + { + "git_blob": "27a0dbf82e78252beede56ff86f5933c93eb55c1", + "local_path": "inputs/caller/predecessor/packet_engine.py", + "sha256": "ce7f132a6a69c802406f07c4a2119ef921e8978520ff58d5eeaeedb982c257f2", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/packet_engine.py" + }, + { + "git_blob": "2ae1769a9726ab738d3981891d0b76beccac2d99", + "local_path": "inputs/caller/predecessor/peel.py", + "sha256": "3de018e68601566c364c7568b110f60c1bf34941b846cdffb94401bb799f85e3", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/peel.py" + }, + { + "git_blob": "39a2916c207d04be5efc44750d8606f5da0c2990", + "local_path": "inputs/caller/predecessor/topology.py", + "sha256": "384d456ddba76de137a63b50019d5bba2e9f6daa4177c91643e0565d4cf1d44b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/topology.py" + }, + { + "git_blob": "21a5a21220a18ab62a19ac403a9944bc3a8665c8", + "local_path": "inputs/caller/predecessor/vendor/binding.py", + "sha256": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/binding.py" + }, + { + "git_blob": "4d1fd4abb0f2aabe833e5cbc9efb51039739e7ca", + "local_path": "inputs/caller/predecessor/vendor/bitstream.py", + "sha256": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/bitstream.py" + }, + { + "git_blob": "b8ba857e32c5903408e1e61ff916300848b4a208", + "local_path": "inputs/caller/predecessor/vendor/cardinality.py", + "sha256": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/cardinality.py" + }, + { + "git_blob": "e1f961df9fa3a441fc5b600d1288a8d038eca51e", + "local_path": "inputs/caller/predecessor/vendor/check_support.py", + "sha256": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/check_support.py" + }, + { + "git_blob": "ce4935f838516e2b08d13bec767cb803786fbc6b", + "local_path": "inputs/caller/predecessor/vendor/children.py", + "sha256": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/children.py" + }, + { + "git_blob": "c631a9e77fbcccf0e8f448adc22978728aed7b60", + "local_path": "inputs/caller/predecessor/vendor/controller.py", + "sha256": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/controller.py" + }, + { + "git_blob": "81b48940ce222290a40d4fb349ce827f4788469d", + "local_path": "inputs/caller/predecessor/vendor/counts.py", + "sha256": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/counts.py" + }, + { + "git_blob": "c74cacf5ce809c0561d374f137a52df0992b4226", + "local_path": "inputs/caller/predecessor/vendor/directory.py", + "sha256": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/directory.py" + }, + { + "git_blob": "30d11ff4f333813855d36da3eb5a1ab0e154bafe", + "local_path": "inputs/caller/predecessor/vendor/episode.py", + "sha256": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/episode.py" + }, + { + "git_blob": "6667c0b772a63f0059c7caffec63e0d919a92398", + "local_path": "inputs/caller/predecessor/vendor/forms.py", + "sha256": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/forms.py" + }, + { + "git_blob": "737edfc4a10f4b7b3b97a7cef4b40864efd806e6", + "local_path": "inputs/caller/predecessor/vendor/low_codes.py", + "sha256": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/low_codes.py" + }, + { + "git_blob": "5d497353efbb9eeaaf4facd96ab40ffb0f3aa20d", + "local_path": "inputs/caller/predecessor/vendor/matrices.py", + "sha256": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/matrices.py" + }, + { + "git_blob": "6d4ebca8398008375b8f4762d1a9f1514e8c2611", + "local_path": "inputs/caller/predecessor/vendor/numeric.py", + "sha256": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/numeric.py" + }, + { + "git_blob": "244f131466698a3ace10b657242fe1f65c07fd1f", + "local_path": "inputs/caller/predecessor/vendor/oracle.py", + "sha256": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/oracle.py" + }, + { + "git_blob": "ebc9b616514412b80c56d523776e6ba5d6766453", + "local_path": "inputs/caller/predecessor/vendor/packet.py", + "sha256": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/packet.py" + }, + { + "git_blob": "48255d5454308c07635fae4e7eb4873b0bd2a4f8", + "local_path": "inputs/caller/predecessor/vendor/plan.py", + "sha256": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/plan.py" + }, + { + "git_blob": "4f00467a0ff580954ad2fd0c7380240c753ddef3", + "local_path": "inputs/caller/predecessor/vendor/records.py", + "sha256": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/records.py" + }, + { + "git_blob": "3d070d2539a529f3b14ecb086a92a3db056229fe", + "local_path": "inputs/caller/predecessor/vendor/residual.py", + "sha256": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/residual.py" + }, + { + "git_blob": "35531201dc349a811dfabc6f1f6e64697d665194", + "local_path": "inputs/caller/predecessor/vendor/routes.py", + "sha256": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/routes.py" + }, + { + "git_blob": "2c28f1aaec104a75c4e6c170b3e6a60300ee6700", + "local_path": "inputs/caller/predecessor/vendor/selection.py", + "sha256": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/selection.py" + }, + { + "git_blob": "16d5e7e6a28018f1e2d76d61efe2d54f6a6941d4", + "local_path": "inputs/caller/predecessor/vendor/sources.py", + "sha256": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/sources.py" + }, + { + "git_blob": "5e5a4bb0f98971447043e25d4dd6991bfc070389", + "local_path": "inputs/caller/predecessor/vendor/stream.py", + "sha256": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/stream.py" + }, + { + "git_blob": "efff281d4c4be5c1378e31404fbcc634fe4ade59", + "local_path": "inputs/caller/predecessor/vendor/stream_runner.py", + "sha256": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/stream_runner.py" + }, + { + "git_blob": "bb845a90f5bcf006e683e581e385936208f6a1f4", + "local_path": "inputs/caller/predecessor/vendor/trace.py", + "sha256": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/trace.py" + }, + { + "git_blob": "8d4ba37e2778acb35b34e0719df2caf138fbeb50", + "local_path": "inputs/caller/predecessor/vendor/words.py", + "sha256": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/vendor/words.py" + }, + { + "git_blob": "121acc1ff15ec85a8011e96eda2eb587608413b9", + "local_path": "inputs/caller/predecessor/verify.py", + "sha256": "cd83797d1f420f7e5de61c1a693110b4ee0c80bac0adae4699599046b7f76f8a", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/predecessor/verify.py" + }, + { + "git_blob": "6d33224145aa04f7fbaf7b6cda7c9c164311a402", + "local_path": "inputs/caller/recursive_call.py", + "sha256": "157deaa5972557893d43494a81151483bdc46373448ec677cb6a738c9b7e6f1e", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/recursive_call.py" + }, + { + "git_blob": "60c2b6d065eba91dd5e0edb7a77fc087971eca3f", + "local_path": "inputs/caller/scheduler.py", + "sha256": "0d96f7fbd6f90416167c5a52c0e3de942d1a0cae3d2968831932a9576701699f", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/scheduler.py" + }, + { + "git_blob": "6ba5df130bb4a0fcb06b6c630830ae3a6922921b", + "local_path": "inputs/caller/stream_runner.py", + "sha256": "b255feaf6cc6e40413ae73fe302bf8f290bf4dd89f4128b23a91cc9860601801", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/stream_runner.py" + }, + { + "git_blob": "4b002201ce54cdecec9acf4e874b7f71cd75fe71", + "local_path": "inputs/caller/trace.py", + "sha256": "3a664224c558244f606b603cad816d75e94a17c9b2620a06a1530e893dfceac2", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/trace.py" + }, + { + "git_blob": "96be8f5859a3f3799344d46dec1ee68170d96bfa", + "local_path": "inputs/caller/verify.py", + "sha256": "65126e788eeea10e830fc583cf4afe0bfc4d67495cbf8ac21de3507dbe624d56", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/selected-bit-recursive-caller/verify.py" + }, + { + "encoding": "gzip", + "git_blob": "44006542202ca6037533a754f0bcd00549d7e088", + "local_path": "inputs/CALLER-GEOMETRY.json.gz", + "sha256": "a1629f8cf4321addc5a1e24c4ce2bc744a4c35c1d1eff9bd59fc6fd437f9f0c1", + "source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_path": "research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json", + "source_sha256": "0058c491d839142aa99ef86a5ec697ce99857632228531512ea3fa74fb24d734" + } + ], + "schema_version": 1 +} diff --git a/research/bit-stage-mixedwidth-packing/provider/MANIFEST.json b/research/bit-stage-mixedwidth-packing/provider/MANIFEST.json new file mode 100644 index 0000000000..71c8b9a3fe --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/MANIFEST.json @@ -0,0 +1,137 @@ +{ + "files": { + "CALLER-PROOF.md": "28c5457da4d273a558c43936f9da9a49094994a2f5da9f780d5d822e7faa9d56", + "CALLER-REVIEW.md": "1c65e4680f2b7ef8867fdbae698de5bf8c6c1e63200eab187eae90a9d78d4ba3", + "CALLER-SOURCE-CUTS.json": "78aa2e2b33410540ae0bed856d722522cb5c43b5687e49b9fb0b435fb461ba5d", + "CALLER-SOURCES.json": "ad4a6ad33e24baf471263a0e1a73db7fbaa071223ff11d1b20410185d8d5e8e3", + "CALLER.json": "e78211b1044de8381fa8bbe1ad674b6ebf5b970e206841216cb91e67b186ce2e", + "INDEPENDENT-OWNERS.json": "53118b1f749bebf4ec0229855b7e5859966acf67a102286a8d4a5f06cfa7c00d", + "INPUT-SOURCES.json": "502edb186ea7dca267f7ccb3fe1f450cee5c32ba5b3eadf931282c66d9a60c15", + "NATIVE-CXX.json": "98b5541f9eab24c62593bac11089c80dead012c4276348b5345444a1d85cb668", + "NATIVE-PROOF.md": "991a15cad6769837312de0a7f7934edcf87e44bfbd8ceac19210bf8639e9e2f0", + "NATIVE.json": "6fd351c5eb23b2c041e39bc2f0abd9e18111660b11336e488fa03116b2314745", + "OWNER-PROOF.md": "68c0cf7f5e04c33609f342bcd1097fae68eb63fe40182e8236e48330d654315f", + "OWNERS.json": "28493f72227d9f268b06e675dff4742fe9414067e8b6ba96b2b497e013dd394a", + "PRICING.json": "b0fe2786761fd2b1b954f845b3a9bf29931938bd39f72f5522b675d06eb7fb7a", + "README.md": "6ddc6fc758cc60bb60aca568454840fdfef7e6619a1af30e03b0ea11be13e6b2", + "RECURSION.md": "cd4b15dc76686c87c1cbeb834a6b32331ef021c0bc91918712aea0cc78bf1f62", + "SOURCES.json": "0bbed564d734179d490721eb00f68320899945882b316cc51d05978041125631", + "TASK.json": "fe48d7144714507feb436166db2851990cf78886d2a7c0e21436b24ba4cad3e4", + "VALIDATION.md": "661bcc904c63e0c5437ffc07de980011e3f7ebef9aaa26a9affa97b6e3dc4e06", + "VERIFY.json": "eb683ae89f337a74c31b91cd9d938fe768a3cfed08d9e2cd0c55b6c54d69e0a0", + "caller.py": "eda0aedcd1b57451c9fb3ad3b9e696dd3601dc7e956ef55d16819b32a42c6c88", + "caller_source_cuts.py": "fb05ca0e7fa5ca229efd4be517c8462c4a9a30263738d3297753bc71f03a1df4", + "independent_owner.py": "cb90fbcb2fe955f8e79c9bce6747a5c98b3ce51442c288ac0e2d2ba9476e3fae", + "inputs/ALLOCATION.json": "06fa9322508aba3d8a5dc6469151cdfaa906b60559582b49c8b024428b158021", + "inputs/CALLER-GEOMETRY.json.gz": "a1629f8cf4321addc5a1e24c4ce2bc744a4c35c1d1eff9bd59fc6fd437f9f0c1", + "inputs/CONTROLLER.py": "6368196a393ac25bb2918880e4c4bd31ed733b762c27b6873ab391cbc0c5c3c8", + "inputs/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "inputs/PR4183-RESULT.json": "ccd419ac1cb123edd8a27aa9d0a6ab3713087a8bcd5be39114a7bd0f254ceebc", + "inputs/R438-CERTIFICATE.json": "6da8c593257c8440f0fe35488d941715d953d715e2e464ffdfffff7ed31eee9c", + "inputs/SELECTED-ASSEMBLY.json": "1122cb3a575f8c788345fc1bf4c108ac7c3250fb81a5988671f5eb04b3ab3045", + "inputs/TERMINAL-CHARTS.json": "489216ea25f47f061675ab7b7e4a17289a531bce6fe77cca166a13265bfcbb17", + "inputs/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "inputs/caller/EVIDENCE.json": "77b7cbefa2ca30acf2f77e23d14808ccd27848e9c76e4c5e68a045ef7891a07f", + "inputs/caller/PREDECESSOR.json": "e3127475913d62dbdf1b45d9283d2db2e9b689e0f81a703189150c1e5be2bca0", + "inputs/caller/PROOF.md": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "inputs/caller/README.md": "6ce41fd7e6dfbe5faecc25bd36561f0a65b6ebca6fc69d3fb72569424a405045", + "inputs/caller/RESULT.json": "4919655bae2e5cff051e8f2d240a8e4ebb03392a9da2fb5328daa9248fb7e88b", + "inputs/caller/SOURCES.json": "7c78f539078e1bc3d893b78b5ee24cb22dc090d3763fe554e861b6c3d3e7eaf7", + "inputs/caller/TASK.json": "ac7d4b38da31b373e665929027fc04afb66c3e9aedaea3296e3783637912d0e8", + "inputs/caller/VALIDATION.md": "ac0f2fab0ca810ce0202d31480daa8329cba0897ab015520a2bfd4b689c4086b", + "inputs/caller/VERIFY.json": "6ad0e07f68458afedece927550655b5bc5cd9861a70044fcd95bb10a2179f0a6", + "inputs/caller/bootstrap.py": "eef1c418e8edbdf317d159683e30beaecd971c77cf41d6b09708576405e2141e", + "inputs/caller/check_layout.py": "454b1587d1ed5ccaea19b621a67e2ceba999d7ede61188125faa41c4dd2ab2b1", + "inputs/caller/check_nested_model.py": "b1941b882b0659722c3c41994c82f020c1f7ab320dc28c43c2758029ef8a48b7", + "inputs/caller/check_recursion.py": "dde82badf043e553bc635a34295e2b5505d84d6dfbaf96e0cfccb8a8c3dbb158", + "inputs/caller/check_runtime.py": "9fcf0c9a3c84a17446fafe8da50b63db296ba9465d48ddb6fdeac8742dfc98b1", + "inputs/caller/check_sign.py": "ee4fd34acd49962a18d268aefeb20aa3c2673a10e7a43eee3e51a9bd3cf9106a", + "inputs/caller/check_sources.py": "1c49984ae6ee7f8a44cde16b51e486f0b3ba4ee5c973389ac8d58a82d0a0aa3b", + "inputs/caller/consumer.py": "2f2a8604c23fb2c81f24320c71ed0142118d98dde3be6086adad28e89954a777", + "inputs/caller/control_checks.py": "c09d33327932b4ffbb8acb26c8a6bb621bcca542157d22f1edf72679a9359981", + "inputs/caller/driver.py": "ceaf8f75de9810a05ebf8f65780b6f8bd7599a5768401d5e4386182afe615cdf", + "inputs/caller/evidence/NOTICE.md": "fd7c42e89878cda6df86dde8720ece34625a337cf5edd795a421e2d3b42919e9", + "inputs/caller/evidence/pr2688-NOTICE.md": "c899fccf7bd32397f0ddd85e4af35a166cefb3e3ae3407ec40edc3ab2051b617", + "inputs/caller/evidence/pr2688-PROOF.md": "fa9bec0952468e4acb760a88d45d5be216325650e1a4080cf590e07b90c9f533", + "inputs/caller/evidence/pr2708-README.md": "5906f6b7b2c8eea90e441476c4cbd60fe2ef981b690c63357bcfe67e3104aeef", + "inputs/caller/evidence/pr2731-README.md": "19683df4394de299cbd7e1cce39bf9434ad260b1a37006587cf9aed84c9c0a03", + "inputs/caller/layout.py": "3beef6534b02c3b011b741f957a7d9fb05a9ac0bba1fed53b2c71834e4ea6bc1", + "inputs/caller/linear_sign.py": "73e895fc701a4145cbe89d60f5775128354e7f08d0a45eacf22f423913f54e67", + "inputs/caller/node.py": "0bd4f640cafb5c8f070c161d86445910f77578a672bf5886936ed89e7f6bd21b", + "inputs/caller/packet_engine.py": "c80fc3aa9092f91cc309b2fb2dbc3618bf96bdb9b8498503993ea161f0ae2134", + "inputs/caller/peel.py": "8b20888f74b4cd814a97b42ec72528fbfb6d2e936c5022df726f0785d0d01a2e", + "inputs/caller/predecessor/NOTICE.md": "c446b32b8a621844fb2fbe654810c8122035bdd43fed2132f1137d98cb6f9943", + "inputs/caller/predecessor/PROOF.md": "88754d57bae35a2089d9de221ff32ba802b7a56b810f96271f3ea36985edfb14", + "inputs/caller/predecessor/README.md": "15631eb826b2d8d54fbee18fb6f70ee035e172d524c2a209b6c467c3f0204f64", + "inputs/caller/predecessor/RESULT.json": "0d94c5e9150f3fbd603526c67ea33168d3ba45e158aaf722e848bf5c316a37a8", + "inputs/caller/predecessor/SOURCES.json": "1b02a5c607a5967948988c3beaf37d9975d650ad501a99fcf74c135dc1f05fdd", + "inputs/caller/predecessor/TASK.json": "a4cd54d4b09ad12a90a5feeb39a127f0f0d5a2a04f9f88554c5fc3ee0cfe77f4", + "inputs/caller/predecessor/VERIFY.json": "e1dd0ee5f267ffa515bb345054ff8637cfedb0079b0d2da29b90b7848264926e", + "inputs/caller/predecessor/cardinal_counts.py": "59ddeac102a0cc51fa49b15aae6aeb68cd68ed217fa974ce916372a177d2ec8f", + "inputs/caller/predecessor/catalogue.py": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "inputs/caller/predecessor/check_headers.py": "a41dab0c487c341eb32b34a03af74454e15e9e61e7386a1ca426d83f3b68b1ca", + "inputs/caller/predecessor/check_layout.py": "8f776a21dc0e31f9738d822cfda38db92f1e3672afb880d4246ec5e084a50a41", + "inputs/caller/predecessor/check_runtime.py": "5357e4ff255f17c4209aaf71a3413a4148475f11180c4f829e8f0ebacd2877cb", + "inputs/caller/predecessor/check_sources.py": "6463c2724e04a313181b78e90a17cd62ee42465754902cca3e9a65c6140a15a1", + "inputs/caller/predecessor/consumer.py": "b28ec97b0873ff2be25aff4bdde268247ffcec0d21279d0ada196de19a0bdc66", + "inputs/caller/predecessor/control.py": "d3a93e54bb7d333b73917586407d11674d38b5c3fda4fbdc436fb5293ae7786a", + "inputs/caller/predecessor/control_checks.py": "5ea6ded8c2508fbb00d93655affdfe7907ffb60916389e0736249c003a7a5148", + "inputs/caller/predecessor/driver.py": "ee9e42fe95ab28fdd5e927c2d46fd480305aaad610eb2ca7ae514a5d22d9f0ac", + "inputs/caller/predecessor/fresh_rows.py": "e4ae08fbd658add630eb7754ebe0cbcb42c6f39cf4128f9cb92e27fcf5213a7d", + "inputs/caller/predecessor/layout.py": "7534b0166805f2ae8d11495c811d2bd272cea89c89b6bb5251fd411c89245a20", + "inputs/caller/predecessor/model.py": "c937ae8e46162f88fc1cd7646d3b22c99273029ad0f0e3131f46ddec230676cb", + "inputs/caller/predecessor/node.py": "b88fc9ac0b22d939311ff4f7aff788e8c87a64fd5e866498e59bd27940ee3f28", + "inputs/caller/predecessor/packet_engine.py": "ce7f132a6a69c802406f07c4a2119ef921e8978520ff58d5eeaeedb982c257f2", + "inputs/caller/predecessor/peel.py": "3de018e68601566c364c7568b110f60c1bf34941b846cdffb94401bb799f85e3", + "inputs/caller/predecessor/topology.py": "384d456ddba76de137a63b50019d5bba2e9f6daa4177c91643e0565d4cf1d44b", + "inputs/caller/predecessor/vendor/binding.py": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b", + "inputs/caller/predecessor/vendor/bitstream.py": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783", + "inputs/caller/predecessor/vendor/cardinality.py": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22", + "inputs/caller/predecessor/vendor/check_support.py": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964", + "inputs/caller/predecessor/vendor/children.py": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6", + "inputs/caller/predecessor/vendor/controller.py": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c", + "inputs/caller/predecessor/vendor/counts.py": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069", + "inputs/caller/predecessor/vendor/directory.py": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7", + "inputs/caller/predecessor/vendor/episode.py": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff", + "inputs/caller/predecessor/vendor/forms.py": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4", + "inputs/caller/predecessor/vendor/low_codes.py": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87", + "inputs/caller/predecessor/vendor/matrices.py": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459", + "inputs/caller/predecessor/vendor/numeric.py": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514", + "inputs/caller/predecessor/vendor/oracle.py": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67", + "inputs/caller/predecessor/vendor/packet.py": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5", + "inputs/caller/predecessor/vendor/plan.py": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "inputs/caller/predecessor/vendor/records.py": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372", + "inputs/caller/predecessor/vendor/residual.py": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df", + "inputs/caller/predecessor/vendor/routes.py": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada", + "inputs/caller/predecessor/vendor/selection.py": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b", + "inputs/caller/predecessor/vendor/sources.py": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62", + "inputs/caller/predecessor/vendor/stream.py": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5", + "inputs/caller/predecessor/vendor/stream_runner.py": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249", + "inputs/caller/predecessor/vendor/trace.py": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984", + "inputs/caller/predecessor/vendor/words.py": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9", + "inputs/caller/predecessor/verify.py": "cd83797d1f420f7e5de61c1a693110b4ee0c80bac0adae4699599046b7f76f8a", + "inputs/caller/recursive_call.py": "157deaa5972557893d43494a81151483bdc46373448ec677cb6a738c9b7e6f1e", + "inputs/caller/scheduler.py": "0d96f7fbd6f90416167c5a52c0e3de942d1a0cae3d2968831932a9576701699f", + "inputs/caller/stream_runner.py": "b255feaf6cc6e40413ae73fe302bf8f290bf4dd89f4128b23a91cc9860601801", + "inputs/caller/trace.py": "3a664224c558244f606b603cad816d75e94a17c9b2620a06a1530e893dfceac2", + "inputs/caller/verify.py": "65126e788eeea10e830fc583cf4afe0bfc4d67495cbf8ac21de3507dbe624d56", + "inputs/native/bits/stdc++.h": "420094be2af295eed03a983dd66debbbe9cfb78d8252859f4498a615a0074b99", + "inputs/native/columns_k.cpp": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "inputs/native/json.hpp": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63", + "inputs/native/legality_h.cpp": "6c1ef2b24e57781d6951c172a1024fc4300e6fd392c9d6672079a7806ab663b3", + "inputs/native/stage_cohort.py": "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a", + "inputs/proofs/assemble9.py": "4bf6768224a3fac81ccda26df24f3763f9a4fbc35ad62bef2888595cdae519fe", + "inputs/proofs/batched-bit-rows.tex": "ef72c0ead19373cbc19c8a3aacb44dd0f75353ee5f4d055f775a986a4878022c", + "inputs/proofs/local-ring-packets.md": "846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7", + "inputs/proofs/recursive-caller.md": "552fa306d5cc228f4d8d8553f8ac5fc6a738ef2b66a2cb765ba0638cd229794d", + "inputs/proofs/stopped-recurrence.md": "74cc8de20f21acb5123fe2d20996fe0925ea6e51b3dec633bd5221fb719b3344", + "inputs/proofs/terminal-chart-admission.py": "762357be4644da879251eca070a81dfd73ec3ef4991191cdd630896e7e9b44a3", + "inputs/proofs/whole-call-hosting.md": "59cae781bfbe1a01ed9e66a8efeeb5a2b995e5ecdf908586b23ecc39f2b8d647", + "native-check.py": "d50efb920aba302adde5ff5fbf94d11a49d45f359414495c6fe79034fb3cde18", + "native.py": "db92b1c2e61c8b8f3d94581e1bcd921af881cdf9d8fd03eba646864195134f2a", + "owner.py": "b6232c9f7f5d7b9a4be868e5e1d147b57e8e7ba9ddc0d35e7f7170c65b600c66", + "price.py": "e3a97177b140d32519bfe2cdb0b0acdb6783378fc957cf8d2287fabae7da7840", + "verify.py": "08b4d2af8729a910682471cfa38d4c719e56e9804490bc4c884726917c58e881" + }, + "schema_version": 1 +} diff --git a/research/bit-stage-mixedwidth-packing/provider/NATIVE-CXX.json b/research/bit-stage-mixedwidth-packing/provider/NATIVE-CXX.json new file mode 100644 index 0000000000..172f9a3de7 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/NATIVE-CXX.json @@ -0,0 +1,289 @@ +{ + "boost_dependency": { + "archive_sha256": "af57be25cb4c4f4b413ed692fe378affb4352ea50fbe294a11ef548f4d527d89", + "source": "https://archives.boost.io/release/1.87.0/source/boost_1_87_0.tar.bz2", + "version": "1.87.0" + }, + "boost_include": "{boost_include}", + "compiler": "/usr/bin/c++", + "compiler_version": "Apple clang version 17.0.0 (clang-1700.6.4.2)\nTarget: arm64-apple-darwin25.5.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin", + "executed_commands": [ + { + "argv": [ + "/usr/bin/c++", + "--version" + ], + "elapsed_seconds": 0.133414, + "label": "compiler-version", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "cec35ee58b68480b15c7872bab77f6e5300715758e22c7bf9c176a9d644b4015" + }, + { + "argv": [ + "/usr/bin/c++", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DNCOPY=9", + "-DVPORTS=111", + "-I", + "{output}/source", + "-I", + "{boost_include}", + "{output}/source/legality_h.cpp", + "-o", + "{output}/legality" + ], + "elapsed_seconds": 2.550752, + "label": "compile-legality", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "argv": [ + "/usr/bin/c++", + "-O2", + "-std=c++17", + "-DHDIM=8", + "-DNCOPY=9", + "-DVPORTS=111", + "-I", + "{output}/source", + "-I", + "{boost_include}", + "-DRHELP=438", + "-DKPAIRS=2", + "{output}/source/columns_k.cpp", + "-o", + "{output}/columns-k2" + ], + "elapsed_seconds": 1.410663, + "label": "compile-columns-control", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "-c", + "import hashlib,pathlib,sys;p=pathlib.Path(sys.argv[1]);b=p.read_bytes();assert sys.flags.optimize==0;assert hashlib.sha256(b).hexdigest()==sys.argv[2];sys.argv=[str(p)]+sys.argv[3:];exec(compile(b,str(p),'exec'),{'__name__':'__main__','__file__':str(p)})", + "{output}/source/stage_cohort.py", + "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a", + "{provider}/baseline", + "{provider}/baseline", + "{output}/baseline-cin", + "{output}/baseline-cout" + ], + "elapsed_seconds": 0.041435, + "label": "stage-baseline", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "argv": [ + "{output}/legality", + "{output}/baseline-cin", + "{output}/baseline-cout", + "{output}/baseline-legality.json" + ], + "elapsed_seconds": 0.379914, + "label": "legality-baseline", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "ae4e1c8133fd87963cfcb8f4069b00606f8b2cbb5330e13564185ddfb5cb4391" + }, + { + "argv": [ + "{output}/columns-k2", + "{provider}/baseline/249-records.bin", + "{output}/baseline-old-columns.json" + ], + "elapsed_seconds": 0.487613, + "label": "old-cap-baseline", + "returncode": 2, + "stderr_sha256": "d50ddc47f5e048542534443df0cbf9e2c60a0fd6b0b8ab0391e11f1151c4569c", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "-c", + "import hashlib,pathlib,sys;p=pathlib.Path(sys.argv[1]);b=p.read_bytes();assert sys.flags.optimize==0;assert hashlib.sha256(b).hexdigest()==sys.argv[2];sys.argv=[str(p)]+sys.argv[3:];exec(compile(b,str(p),'exec'),{'__name__':'__main__','__file__':str(p)})", + "{output}/source/stage_cohort.py", + "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a", + "{provider}/candidate", + "{provider}/candidate", + "{output}/candidate-cin", + "{output}/candidate-cout" + ], + "elapsed_seconds": 0.052044, + "label": "stage-candidate", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "argv": [ + "{output}/legality", + "{output}/candidate-cin", + "{output}/candidate-cout", + "{output}/candidate-legality.json" + ], + "elapsed_seconds": 0.010231, + "label": "legality-candidate", + "returncode": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_sha256": "de642b0f35e8e1ddc5db51c54ac75d7296fc2be3cbbdb40a0cd54b9924b55883" + }, + { + "argv": [ + "{output}/columns-k2", + "{provider}/candidate/249-records.bin", + "{output}/candidate-old-columns.json" + ], + "elapsed_seconds": 0.003632, + "label": "old-cap-candidate", + "returncode": 2, + "stderr_sha256": "d50ddc47f5e048542534443df0cbf9e2c60a0fd6b0b8ab0391e11f1151c4569c", + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + ], + "native_source_pins": { + "bits/stdc++.h": "420094be2af295eed03a983dd66debbbe9cfb78d8252859f4498a615a0074b99", + "columns_k.cpp": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "json.hpp": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63", + "legality_h.cpp": "6c1ef2b24e57781d6951c172a1024fc4300e6fd392c9d6672079a7806ab663b3", + "stage_cohort.py": "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a" + }, + "no_new_kappa": true, + "normalization": { + "kind": "Replace local run paths and Python executable with documented placeholders; retain commands, exit status, output hashes, compiler and full C++ receipts.", + "observed_at_utc": "2026-10-20T12:15:42.856420+00:00", + "original_receipt_sha256": "a55df3c1c59debf78b3a58355cf4123c5fa8aa0d00f73ca6946a1a1cfb4bbc1a" + }, + "old_CXX_scalar_columns_pass_claimed": false, + "old_H1_H5_pipeline_pass_claimed": false, + "physical_global_compiler_run_claimed": false, + "platform": "macOS-26.5.2-arm64-arm-64bit", + "provider_receipt_sha256": "6fd351c5eb23b2c041e39bc2f0abd9e18111660b11336e488fa03116b2314745", + "scope": "New raw6 provider, unchanged chronological C++ legality; old scalar cap rejection is deliberate.", + "status": "PASS_FRESH_UNCHANGED_CPP_LEGALITY_AND_PRECISION_REJECTION_CONTROLS", + "words": { + "baseline": { + "legality": { + "all_final_frames_pass": true, + "common_frame_ADDs": 36005, + "containment_pairs_checked": 2385, + "copies": 9, + "donor_intersections": 0, + "erasures": 9, + "max_inherited_integer_abs": 2, + "nested_MOVEs": 2904, + "new_frame_ids_collision": false, + "nondegeneracy_checked_by_separate_exact_bank_audit": true, + "old_max_frame_id": 635, + "paid_histogram": [ + [ + 1, + 1322 + ], + [ + 2, + 1342 + ], + [ + 3, + 79 + ], + [ + 4, + 39 + ], + [ + 5, + 102 + ], + [ + 6, + 11 + ], + [ + 7, + 18 + ] + ], + "rank_mass": 5101, + "records": 38927, + "scope": "Independent chronological geometry/copy/source-owner audit. F2 all-column replay is in the separately freshly compiled transform receipt; address transform theorem and bank completion remain separate.", + "selected_helpers": 0, + "selected_pairs": 0, + "source_owner_intersections": 0, + "status": "PASS_INDEPENDENT_COHORT_LEGALITY_SOURCE_OWNERS_AND_LIFECYCLE" + }, + "native_raw6_sha256": "a4c3c14e242a78b14367710d571f61a7126118089fe9888512d766570514dce9", + "old_104_bit_cap_rejected": true + }, + "candidate": { + "legality": { + "all_final_frames_pass": true, + "common_frame_ADDs": 35947, + "containment_pairs_checked": 2385, + "copies": 9, + "donor_intersections": 0, + "erasures": 9, + "max_inherited_integer_abs": 2, + "nested_MOVEs": 2903, + "new_frame_ids_collision": false, + "nondegeneracy_checked_by_separate_exact_bank_audit": true, + "old_max_frame_id": 635, + "paid_histogram": [ + [ + 1, + 1321 + ], + [ + 2, + 1342 + ], + [ + 3, + 79 + ], + [ + 4, + 39 + ], + [ + 5, + 102 + ], + [ + 6, + 10 + ], + [ + 7, + 19 + ] + ], + "rank_mass": 5101, + "records": 38868, + "scope": "Independent chronological geometry/copy/source-owner audit. F2 all-column replay is in the separately freshly compiled transform receipt; address transform theorem and bank completion remain separate.", + "selected_helpers": 0, + "selected_pairs": 0, + "source_owner_intersections": 0, + "status": "PASS_INDEPENDENT_COHORT_LEGALITY_SOURCE_OWNERS_AND_LIFECYCLE" + }, + "native_raw6_sha256": "35b4d967ab9325a5e9bd433c121f73791b9bb79a299626fbccc6377c01dc074d", + "old_104_bit_cap_rejected": true + } + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/NATIVE-PROOF.md b/research/bit-stage-mixedwidth-packing/provider/NATIVE-PROOF.md new file mode 100644 index 0000000000..7cb290902e --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/NATIVE-PROOF.md @@ -0,0 +1,212 @@ +# Signed literal provider and native legality + +This package introduces the provider interface +`signed-framed-literal-v1`. It accepts the final PR4183 closed-cut word, +including its signed dirty prelude, interleaved source reads and five +rank-four helper endpoints. It does not claim that the older +`A / scatter / B / C` exporter already accepts that interface. + +The scientific input is the frozen R438 word and geometry, authenticated +by the compressed-file hashes in [NATIVE.json](NATIVE.json). The candidate +recipe is reconstructed directly in [native.py](native.py), separately from +the predecessor's two implementations. Its full literal-record hash is +`5f301f0d668ded1028b7603c5ea9c88271e390fb9060ce8e118aad7d9927a7fd`. +The insertion is after original ERASE23889, and helper469 closes by the +rank-seven query to517 followed by the retained rank-one query to FULL. + +## Exact local contract + +Every ordinary input is independent: 111 sources, 111 public targets and +438 dirty helpers. The single private stream starts at literal zero. +The provider checks each complete orientation in two representations: + +1. A bitset calculation checks all 660 Boolean columns and the public shear. +2. Sparse signed integer rows check exact source and helper identities, + every COPY snapshot and ERASE equality, and both complete inverse + compositions. This calculation never reduces coefficients modulo two. + +Both words have nine COPY episodes in each orientation. During each episode +the original source and private copy are immutable, and every ERASE compares +the complete integer rows. There is no recursive MOVE while that private +copy is live. Consequently this exact-copy statement is stronger than +equality modulo two. It is still conditional on executing exact child +operators; an approximate child return requires its own rounded cleanup +theorem. + +The candidate restores all 111 source and 438 helper integer rows. Its +public integer lift differs from the frozen word by `-2 h469` on exactly +51 targets, with every other output unchanged. The Boolean public map is +therefore the same. Signed row-l1 prefix peaks are `1300/1444` +forward/reverse, compared with `1302/1446`; the largest coefficient +magnitude is 22 in either word. + +“Helper restoration” here means restoration of the decoded dirty function +with the declared terminal frame. Physically, 433 helpers retain a FULL +residual and five retain their specified rank-four residuals. Helper469 +retains the FULL address swap. None of these statements turns that +physical residual into an identity operation. + +## Frame specialization and actual function semantics + +The provider derives integer span and annihilator bases from all 636 frozen +root frames. It verifies their dimensions and orthogonality, all executed +nested MOVE inclusions, every signed ADD's common frame, all COPY frames +and the actual final frame of every register. + +It additionally selects an independent subset of the original root rows +for every frame and checks that its Gram determinant is a positive power +of two. Both the emitted span basis and its annihilator also have +power-of-two Gram determinants: the 1272 determinants have histogram +`{1:56,4:652,16:500,64:64}`. This matters because rational row reduction +alone would not justify reduction in every odd characteristic. + +The checked determinants prove that the original root span and emitted +bases retain their ranks over every odd-characteristic field. Their +orthogonal projectors are defined over `Z[1/2]`, so the rational containment +and orthogonality identities specialize there as well. + +For a projector P, let + +``` +D_P(u,v) = ((I-P)u+Pv, Pu+(I-P)v). +``` + +For nested P and Q, the relative transport is `D_(Q-P)=D_Q D_P`. +If a physical function f is in frame P, its decoded function is +`c=f composed with D_P`. A correctly priced nested MOVE preserves c; +a common-frame signed ADD changes the decoded functions by the same +integer addition; a COPY into frame zero produces the decoded source. +The unchanged source permits its later exact erasure. + +Induction over the emitted events therefore gives the audited integer +recurrence on arbitrary input functions, with Boolean values obtained by +reduction modulo two. This is a written all-function argument supported +by the finite frame certificates. The covered domain is arbitrary dirty +Boolean-valued functions on pair-address space over odd-characteristic +fields, with exact completed child operations. It is not a formal-kernel +proof, a rounded-child theorem or an all-size physical machine construction. + +## Byte-level native translation + +The first five fields of every raw record are unchanged. The sixth field +in the frozen word is a section annotation, whereas the historical C++ +consumer uses it as the COPY rank. The provider performs exactly this +schema conversion: + +| Operation | Native six-field record | +| --- | --- | +| MOVE | `[0, destination, before, after, rank, 0]` | +| signed ADD | `[1, destination, source, coefficient, frame, section]` | +| COPY | `[2, source, 660, source_frame, 0, 7]` | +| ERASE | `[3, source, 660, source_frame, 0, 0]` | + +No operation is deleted, reordered, combined or newly charged by this +lowering. Serialization is six little-endian signed 32-bit integers per +record. The two emitted binary hashes are: + +``` +frozen: a4c3c14e242a78b14367710d571f61a7126118089fe9888512d766570514dce9 +candidate:35b4d967ab9325a5e9bd433c121f73791b9bb79a299626fbccc6377c01dc074d +``` + +Reverse programs read records in reverse order, swap MOVE endpoints, +negate ADD coefficients, turn an ERASE into a fresh COPY from its unchanged +recorded source, and turn the corresponding COPY into an ERASE. Both +integer inverse orders are verified separately. Inverse COPY work is +charged; a saved forward query does not make the inverse free. + +The complete forward native invoices are: + +| Word | Records | Unit ADDs | Nested MOVEs | COPY queries | Total queries | Rank mass | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| Frozen |38927|36005|2904|9|2913|5101| +| Candidate |38868|35947|2903|9|2912|5101| + +Every local recursive rank is at most 7, strictly below local dimension 8. +The complete histogram change is `e7-e6-e1`. + +## Bridged formal columns and precision + +The provider also replays the inherited signed orientation schedule and +twin-bridge rule, using its independently constructed forward/reverse +event arrays. The global public endpoint checks in this part are over F2: + +| Stages | Independent ordinary columns | Dirty helper columns | COPY episodes | Unit bridge ADDs | +| --- | ---: | ---: | ---: | ---: | +|5|882|438|45|666| +|9|1326|438|81|1998| +|11|1548|438|99|2664| + +Every one of the 6, 18 or 24 bridge omissions changes the respective complete +Boolean endpoint, for both input words. These are 96 defect-sensitive +controls in total. Literal private cleanup is supplied by the separate +integer local replay and unchanged-source invariant, rather than inferred +from the Boolean global endpoint. + +The cancellation-free forward/reverse majorants are +`8402567/630744` for the frozen word and `8401795/630740` for the candidate. +Using the inherited envelopes gives + +``` +P5 = 64 F^3 R^2 : 114 bits, charged 128 +P9 = 2^18 F^5 R^4 : 211 bits, charged 256. +``` + +Both words fail the older 104/192 caps. The exact positive bounds decrease, +but the charged precision stays the same for this matched comparison. +These envelopes are scalar coefficient bounds; the complete routing, +rounding and all-size invoice are stated separately in +[RECURSION.md](RECURSION.md). + +## What the unchanged native replay proves + +[native-check.py](native-check.py) is an optional compiler-dependent replay. +It authenticates the five bundled historical source/header files, copies +those exact bytes to a fresh output directory, compiles them without edits, +and executes the authenticated `stage_cohort.py` bytes with assertions +enabled and without importing bytecode caches. + +The replay freshly passed for both emitted words with Apple clang 17 and +Boost 1.87. The unchanged `legality_h.cpp` agrees with every invoice above, +all declared final frames and all COPY lifecycles. It checks 2,385 distinct +MOVE-containment pairs; COPY geometry is checked by the provider separately. +The historical stdout text says `COPY24` even when compiled with `NCOPY=9`; +the structured receipt correctly records nine copies and nine erasures. + +The empty cohort selection means that the old checker's zero +source-owner/donor intersections are vacuous. They do not verify the +new physical fill. That obligation is independently handled by +[owner.py](owner.py) and [OWNER-PROOF.md](OWNER-PROOF.md). Likewise, the +C++ receipt's hardcoded nondegeneracy flag is not accepted as evidence; +the exact Gram audit above supplies that evidence for the local framebank. + +The unchanged `columns_k.cpp` is deliberately run as a rejection control. +For both words it exits 2 with exactly `payloadfiniteprefix2^104`, before +its scalar replay, and produces no passing receipt. Its cap is not raised +or suppressed. The portable bridged checks above are a new verifier with +an explicit larger precision invoice, not a passing old scalar pipeline. + +For reproduction, supply a Boost include directory and a new output path: + +```sh +python3.12 -I -B research/bit-carrier-owner-admission/native-check.py \ + --boost-include /absolute/path/to/boost_1_87_0 \ + --output /absolute/path/to/new-native-replay +``` + +`NATIVE-CXX.json` in that output records the compiler identity, complete +commands, source and stream hashes, exit codes and structured results. +Portable verification does not execute this optional command. + +The old `xcheck_p.py` H4 grammar expects a literal reversed A/B cleanup, +and the old global emitter derives helper widths from FULL terminal +frames. Those assumptions do not describe the changed signed prelude and +five partial terminals. No old H1–H5/global-pipeline PASS is claimed. +The new provider, the explicit owner dispatch and the conditional complete +invoice identify the required replacement interfaces. Binding them to an +all-size physical caller, its coefficient grammar and exact returned +rounded-child contract remains a separate obligation. + +The finite provider and fresh C++ legality results establish no new kappa. +Written and checked with substantial OpenAI Codex assistance; no independent +human or formal-kernel review is claimed. Apache-2.0. diff --git a/research/bit-stage-mixedwidth-packing/provider/NATIVE.json b/research/bit-stage-mixedwidth-packing/provider/NATIVE.json new file mode 100644 index 0000000000..af105e6c53 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/NATIVE.json @@ -0,0 +1,332 @@ +{ + "candidate_integer_lift_difference": { + "coefficient": -2, + "column": 469, + "other_integer_outputs_unchanged": true, + "targets": [ + 113, + 114, + 117, + 118, + 120, + 121, + 122, + 124, + 125, + 127, + 134, + 135, + 138, + 141, + 147, + 149, + 150, + 152, + 153, + 154, + 155, + 157, + 162, + 163, + 164, + 168, + 170, + 173, + 177, + 179, + 182, + 184, + 186, + 189, + 191, + 192, + 194, + 196, + 197, + 198, + 199, + 201, + 208, + 210, + 213, + 214, + 215, + 216, + 218, + 219, + 221 + ] + }, + "frame_Gram_audit": { + "basis_and_annihilator_Grams": 1272, + "determinant_histogram": { + "1": 56, + "4": 652, + "16": 500, + "64": 64 + }, + "frames": 636, + "nondegenerate_over_every_odd_characteristic": true + }, + "input_pins": { + "GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "native_CXX_executed": false, + "native_source_pins": { + "bits/stdc++.h": "420094be2af295eed03a983dd66debbbe9cfb78d8252859f4498a615a0074b99", + "columns_k.cpp": "1c344d18fcd494eeca93e259f10cafae7705780e6592f6dcb35b34752dab9bc2", + "json.hpp": "aaf127c04cb31c406e5b04a63f1ae89369fccde6d8fa7cdda1ed4f32dfc5de63", + "legality_h.cpp": "6c1ef2b24e57781d6951c172a1024fc4300e6fd392c9d6672079a7806ab663b3", + "stage_cohort.py": "6c288f6f234b528c1a7c0a4adfb724e91e0fe6b18c8dffad96af3f973de1829a" + }, + "no_new_kappa": true, + "old_104_bit_scalar_checker_pass_claimed": false, + "old_interface_H1_H5_claimed": false, + "physical_compiler_run": false, + "provider": "signed-framed-literal-v1", + "source_base": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "status": "PASS_SIGNED_LITERAL_PROVIDER_AND_BRIDGED_BOOLEAN_COLUMNS", + "words": { + "baseline": { + "ADDs": 36005, + "bridged_scalar_checks": { + "11": { + "COPY_episodes": 99, + "bridge_ADDs": 2664, + "formal_columns": 1548, + "helper_columns": 438, + "omitted_bridge_controls": 24, + "private_zero": true, + "stages": 11 + }, + "5": { + "COPY_episodes": 45, + "bridge_ADDs": 666, + "formal_columns": 882, + "helper_columns": 438, + "omitted_bridge_controls": 6, + "private_zero": true, + "stages": 5 + }, + "9": { + "COPY_episodes": 81, + "bridge_ADDs": 1998, + "formal_columns": 1326, + "helper_columns": 438, + "omitted_bridge_controls": 18, + "private_zero": true, + "stages": 9 + } + }, + "emitted_file_sha256": { + "249-records.bin": "a4c3c14e242a78b14367710d571f61a7126118089fe9888512d766570514dce9", + "249-states.json": "103de24baca3bb119fafee6778d5596bce00f8731cf05d107ea7bad300786f08", + "LOCAL-PROGRAMS.json": "b0cadc6c6d16c1a959d8034160ca12c9942ed9fc49c325cc6dcdc345ad2688ca", + "frames.json": "76a3c2af379ab20bb179baf40eadb5051eadd12cd2442c8eb323404b8ae9b5cd" + }, + "literal_word_sha256": "fab5e51011239a13a79307f1d079551eef38387a45c9ab315ab6bc83aced8de2", + "local_checks": { + "forward": { + "ADDs": 36005, + "COPYs": 9, + "columns": 660, + "events_sha256": "e7d3f3a81639388f807492098db6bc5715f96ecaee1c79d0fe872958ec79807a", + "histogram": { + "1": 1322, + "2": 1342, + "3": 79, + "4": 39, + "5": 102, + "6": 11, + "7": 18 + }, + "orientation": "forward", + "positive_prefix_bound": 8402567 + }, + "reverse": { + "ADDs": 36005, + "COPYs": 9, + "columns": 660, + "events_sha256": "97636570f73c6d0187cb0a1fe17c438365a99e1bfa682bdd395c2b0e197f6445", + "histogram": { + "1": 1322, + "2": 1342, + "3": 79, + "4": 39, + "5": 102, + "6": 11, + "7": 18 + }, + "orientation": "reverse", + "positive_prefix_bound": 630744 + } + }, + "native_raw6_sha256": "a4c3c14e242a78b14367710d571f61a7126118089fe9888512d766570514dce9", + "paid_queries": 2913, + "precision": { + "forward_majorant": 8402567, + "local_bits": 114, + "local_bound": "15105050522746917552142185212669952", + "local_precision_charge": 128, + "new_local_128_cap_passes": true, + "new_nine_256_cap_passes": true, + "nine_bits": 211, + "nine_bound": "1737850264432662463887984248694818736482648196425093483769888768", + "nine_precision_charge": 256, + "old_104_local_cap_passes": false, + "old_192_nine_cap_passes": false, + "reverse_majorant": 630744 + }, + "rank_mass": 5101, + "records": 38927, + "signed_integer_checks": { + "both_integer_inverse_orders": true, + "forward": { + "COPY_episodes": 9, + "coefficient_peak": 22, + "exact_helper_rows": 438, + "exact_source_rows": 111, + "independent_integer_columns": 660, + "integer_output_sha256": "a82372b89660a4dcfa6d6da74bb2faab131784c08e1c665628e94de2e397e9b8", + "literal_integer_ERASE_equalities": 9, + "private_zero": true, + "public_boundary_domain": "integer lift; specified shear modulo two", + "signed_row_l1_peak": 1302 + }, + "reverse": { + "COPY_episodes": 9, + "coefficient_peak": 22, + "exact_helper_rows": 438, + "exact_source_rows": 111, + "independent_integer_columns": 660, + "integer_output_sha256": "eb399d0a182a5bb1d6397e1875e282117f2f58fc3e28fad7f6933ce177fd5feb", + "literal_integer_ERASE_equalities": 9, + "private_zero": true, + "public_boundary_domain": "integer lift; specified shear modulo two", + "signed_row_l1_peak": 1446 + } + } + }, + "candidate": { + "ADDs": 35947, + "bridged_scalar_checks": { + "11": { + "COPY_episodes": 99, + "bridge_ADDs": 2664, + "formal_columns": 1548, + "helper_columns": 438, + "omitted_bridge_controls": 24, + "private_zero": true, + "stages": 11 + }, + "5": { + "COPY_episodes": 45, + "bridge_ADDs": 666, + "formal_columns": 882, + "helper_columns": 438, + "omitted_bridge_controls": 6, + "private_zero": true, + "stages": 5 + }, + "9": { + "COPY_episodes": 81, + "bridge_ADDs": 1998, + "formal_columns": 1326, + "helper_columns": 438, + "omitted_bridge_controls": 18, + "private_zero": true, + "stages": 9 + } + }, + "emitted_file_sha256": { + "249-records.bin": "35b4d967ab9325a5e9bd433c121f73791b9bb79a299626fbccc6377c01dc074d", + "249-states.json": "103de24baca3bb119fafee6778d5596bce00f8731cf05d107ea7bad300786f08", + "LOCAL-PROGRAMS.json": "c2c35a98c7674c8b16b6c014e2dafd9912ae8ae93cf0ccd2cb1dc654ca2bc6bf", + "frames.json": "76a3c2af379ab20bb179baf40eadb5051eadd12cd2442c8eb323404b8ae9b5cd" + }, + "literal_word_sha256": "5f301f0d668ded1028b7603c5ea9c88271e390fb9060ce8e118aad7d9927a7fd", + "local_checks": { + "forward": { + "ADDs": 35947, + "COPYs": 9, + "columns": 660, + "events_sha256": "6fd82cdb16f4c6a3aa7e572b94856f9a285f7388119e7da2d0ff1d5b3cc3d98b", + "histogram": { + "1": 1321, + "2": 1342, + "3": 79, + "4": 39, + "5": 102, + "6": 10, + "7": 19 + }, + "orientation": "forward", + "positive_prefix_bound": 8401795 + }, + "reverse": { + "ADDs": 35947, + "COPYs": 9, + "columns": 660, + "events_sha256": "4bb2786c1e7fad6132af51cad9e6ae702f149cc7fc77d65aae1da8a34ec687ab", + "histogram": { + "1": 1321, + "2": 1342, + "3": 79, + "4": 39, + "5": 102, + "6": 10, + "7": 19 + }, + "orientation": "reverse", + "positive_prefix_bound": 630740 + } + }, + "native_raw6_sha256": "35b4d967ab9325a5e9bd433c121f73791b9bb79a299626fbccc6377c01dc074d", + "paid_queries": 2912, + "precision": { + "forward_majorant": 8401795, + "local_bits": 114, + "local_bound": "15100695968851455914066985443200000", + "local_precision_charge": 128, + "new_local_128_cap_passes": true, + "new_nine_256_cap_passes": true, + "nine_bits": 211, + "nine_bound": "1737008008359635422110153482596055813195031503390507008000000000", + "nine_precision_charge": 256, + "old_104_local_cap_passes": false, + "old_192_nine_cap_passes": false, + "reverse_majorant": 630740 + }, + "rank_mass": 5101, + "records": 38868, + "signed_integer_checks": { + "both_integer_inverse_orders": true, + "forward": { + "COPY_episodes": 9, + "coefficient_peak": 22, + "exact_helper_rows": 438, + "exact_source_rows": 111, + "independent_integer_columns": 660, + "integer_output_sha256": "85fdba52b4151181085d8e4b648826eed276141922579717bfd1efa7776224c6", + "literal_integer_ERASE_equalities": 9, + "private_zero": true, + "public_boundary_domain": "integer lift; specified shear modulo two", + "signed_row_l1_peak": 1300 + }, + "reverse": { + "COPY_episodes": 9, + "coefficient_peak": 22, + "exact_helper_rows": 438, + "exact_source_rows": 111, + "independent_integer_columns": 660, + "integer_output_sha256": "e203ef61f4f37ec720d4be8e3dc931fd4d19a654147d9c6a46072975f6c66495", + "literal_integer_ERASE_equalities": 9, + "private_zero": true, + "public_boundary_domain": "integer lift; specified shear modulo two", + "signed_row_l1_peak": 1444 + } + } + } + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/OWNER-PROOF.md b/research/bit-stage-mixedwidth-packing/provider/OWNER-PROOF.md new file mode 100644 index 0000000000..8d769c0f10 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/OWNER-PROOF.md @@ -0,0 +1,328 @@ +# Mixed-terminal owner and controller admission + +This is a written exact-stream proof with a complete finite allocation +certificate. It admits the terminal boundary shared by PR4183 and its frozen +five-terminal comparator to the nine-stage, 32-replica controller. It does not +supply an efficient physical recursive caller, a formal-kernel proof, or a new +integer-multiplication exponent. + +The source constructions retain their premises and credit. Sagar Thakrar's +PR2423 supplies the R438 allocation and stage demands; Ali Romman supplies the +R438 source word; commdata2338's PR2653 supplies the pending-projector census. +The PR589 whole-call hosting proof, alephnan's PR1627, and the selected +local-ring packet proof, PR2234, supply the common-label, retained-dirty-state +and complete-packet arguments. Eumemic's PR490 is an earlier whole-owner +local-ring argument. The terminal charts and their unit-coordinate lowering +come from the frozen `bit-five-rank4-terminals/admission` supplement. The +selected PR442/386/589/555/545 geometry and controller lineage remains credited. +All consumed input bytes are pinned by this package. + +## 1. The exact interface + +There are 111 source roles, 111 target roles and 438 independently dirty helper +roles. Helper numbering in this proof is the absolute local register number: + +| Helpers | Entrance | Terminal projector | Residual width | +| --- | --- | --- | --- | +| 462, 463, 464 | 0 | frame 506 | 4 | +| 467 | 0 | frame 508 | 4 | +| 470 | 0 | frame 509 | 4 | +| Other 433 helpers | 0 | full local eight-space | 8 | + +Thus the ordered residual-width sum is 3484 per call. The verifier reads this +ordered registry from `WORD.final`, with `WORD.start` checked zero on every +helper. The older geometry object's full helper endpoints are not substituted +for those endpoints. + +The local premise is the complete PR4183 literal-word endpoint, in either +orientation: decoded source and helper values are restored, decoded targets +receive the stipulated source XOR, and the private COPY row returns to zero. +The physical helper endpoint is the swap on its terminal projector, not +identity. Both comparator and candidate have the same ordered endpoints. +Their local endpoint proof is a separate input to this owner proof. + +The global controller is exactly the pinned K=4 recipe. It has nine local +cover sweeps, eighteen bridge shears, ten idle children including the zero +child, and the final exchange. There are 29 controller records because each +bridge record denotes its two opposite-side shears. Stages are executed in +order, with replicas 0 through 31 in order within each stage. There are 288 +local-call descriptors. Each descriptor denotes a whole cover sweep, not one +individual cover-class invocation. + +## 2. A literal chronological fill + +For a port vector q with q^T q=4, choose one fixed dyadic orthogonal family +chart A_q whose first column is q/2; it is the identity on the 56 exterior +coordinates. In this chart, an idle child advancing a family pair from level +a to level b has the ordered pending axes + + [1, 8+7b) when a = -1, + [8+7a, 8+7b) when a >= 0. + +The first expression contains all seven q-perpendicular axes and the +appropriate exterior blocks. These are the actual source pending projectors, +independently of which orthonormal completion was used in the data routes. + +`owner.py` independently reconstructs the 29-record chronology and compares +its literal recipe with the authenticated source function. At every local +stage the active pair is at level s-1; at every bridge the two pairs have +equal levels; the final exchange starts with every pair at level eight. + +For each child, let L be the last preceding local or bridge touch of its +physical pair, and let U be the child's position. Its host-stage window is +strictly L < position(stage) < U. Other idle operations on that family are +allowed between these positions only because their pending axes are disjoint. +The complete windows are regenerated from the actual events: + +| Child | Pair | Rank | Allowed stages | +| --- | --- | --- | --- | +| 0 | 1 | 14 | 0, 1 | +| 1 | 1 | 7 | 2 | +| 2 | 2 | 28 | 0, 1, 2, 3 | +| 3 | 2 | 7 | 4 | +| 4 | 3 | 42 | 0, 1, 2, 3, 4, 5 | +| 5 | 3 | 7 | 6 | +| 6 | 0 | 42 | 3, 4, 5, 6, 7, 8 | +| 7 | 1 | 28 | 5, 6, 7, 8 | +| 8 | 2 | 14 | 7, 8 | +| 9 | 3 | 0 | none | + +The inherited PR2423 selection expands to 3942 width-eight slots per replica. +Its complete slot-list digest is checked against the source receipt. +For each `(child, copy)` bin, keep the inherited ordered sequence of +`(stage, helper)` roles. Replace each helper's old width by its actual ordered +terminal width, then reset offsets to cumulative width sums in that same +sequence. No helper changes child, copy, stage, replica or physical family. +Every occupied interval remains a contiguous prefix of its pending axes; its +idle remainder is exactly the suffix. + +This deterministic construction assigns every helper occurrence once, checks +all widths, capacities and windows, and checks disjointness across both a +single child and different children of the same physical family. The complete +`FILL` has 126144 rows. It uses the physical family + + replica*888 + (2*pair + side)*111 + port, + +where `copy=side*111+port`. The helper's pair is always inactive during its +whole local sweep. + +All three certificates are available through `owner.py --emit NEW_DIRECTORY`: +`ORDER.json`, `FILL.json.gz`, and `DISPATCH.json.gz`. The latter contains all +660 ordinary owners for every one of the 288 call descriptors. The verifier +checks those emitted descriptors separately against the reconstructed slots, +data-family formula, chart supports, replica index and private-family rule. +`OWNERS.json` records deterministic digests, rather than trusting the +digests in place of the enumeration. + +## 3. Actual partial-terminal charts and owner separation + +Let E_h be the local terminal projector of helper h, of rank k in {4,8}. +Use the pinned orthogonal matrix Q_h with + + Q_h diag(I_k,0) Q_h^T = E_h. + +For a full-width helper Q_h=I_8. The three rank-four matrices have entries +in {0, 1, -1, 1/2, -1/2}. The checker reconstructs E_h from the actual root +lines and checks this identity and orthogonality exactly. + +For a helper slice S of size k, define pi_S by sending the first k local axes +to S in order, and the remaining axes to the unused ambient axes in increasing +order. Use the 64-dimensional owner chart + + sigma_h = A_q pi_S diag(Q_h^T, I_56). + +Then + + sigma_h E_h sigma_h^-1 = A_q E_S A_q^-1. + +In particular, partial slices may split q-perp. This is permitted because +their exact A_q-dependent projectors, and the matching remainder, are now +specified. Rank counts alone would not specify these operators. + +At common invocation d, the physical helper owner is `(family, d sigma_h^-1)`. +All roles therefore align by `g sigma_h=d`. The data owners retain their +source data charts and the 222 distinct active families. + +Several helpers may use one family. Different physical *families* are not +required by this source interface: physical storage is indexed by family +and cover class. Merely giving routes different names would also be +insufficient. Because E_h can differ between two partial helpers, even +disjoint final supports alone do not prove that their sigma matrices differ. + +The certificate checks the actual matrices. A common A_q cancels for every +same-family pair, so it compares + + pi_S diag(Q_h^T,I_56). + +For every pair within every stage/family it computes the gcd of all nonzero +numerators of the entrywise difference. The gcd is a power of two. Thus no +odd prime makes the two matrices equal, and their reductions are distinct +over every odd residue ring. Replicas use disjoint physical-family ranges; +the same comparison covers all 32 replicas. This proves injective owners at +each fixed common invocation. Here all 5648 pair comparisons per replica +actually have gcd one, covering 180736 pairs over all replicas. There are +28096 occupied physical families, with at most five helpers in a family at +one call. + +The private owner uses family `28416+stage` and common class d. These nine +families are outside the live stock. The complete local word restores the +private packet after each COPY/ERASE episode. Replicas therefore reuse it +sequentially, with no reset of arbitrary dirty payloads and no reduction of +the inherited nine-family reserve. + +## 4. Complete local-ring packets + +We use PR2234's packet interface explicitly, rather than inferring it from +point-owner injectivity. Fix an odd prime q, w>=1 and R=Z/q^w. Payloads are +arbitrary Boolean functions of the complete address blocks and spectators; +R is the address ring, while payload XOR is over F2. + +For each invertible low matrix d0 define the full high fibre + + F_d0 = {d0 + q G : G ranges over [q^(w-1)]^(64*64)}. + +Every chart is invertible over R. Right multiplication gives a bijection + + F_d0 sigma^-1 = F_(d0 sigma_bar^-1), + +including the carries in low/high coordinates. The actual chart-separation +check above makes these low classes different for every same-family helper +pair. Their complete high packets are consequently disjoint. Pointwise +injectivity at one d would not have been enough for this conclusion. + +Execute the entire local word for one low class on its complete high packet +before proceeding to the next low class. Address callees must preserve all +spectators, restore row coordinates and close their work before returning. +Under these explicit premises, the local common-label induction applies to +each high coordinate and hence the complete packet. Correlated helper +contents are allowed. Later low invocations may revisit a packet in a +different role; the complete endpoint theorem uses its current dirty value. + +The gauges may include a fixed ancestor-dependent diagonal unit matrix A, +provided it is independent of this node's family, cover coordinates and +unused descendant row field. With the retained tail reversal C, use + + D_C(P) = [[I-P, PC], [CP, I-CPC]], + Q_A = diag(A,I), Q_d = diag(d,CdC). + +The projector is conjugated by `d P d^-1`; a transpose of d is incorrect for +a general GL matrix. The projector, nested-difference and common-label +identities are dyadic identities and specialize to R. Image/kernel columns +independent modulo q lift to an invertible basis over R, proving the actual +split ranks even when q divides the rank. For f-atom blocks tensor with I_f +and retain every specified spectator and the source reversal convention. + +This proves an exact owner interface for arbitrary q and w under the stated +whole-packet callee contracts. It does not implement those contracts at +sublinear recursive exponent, or bound physical scans, address generation, +packet routing, work erasure or tape movement merely by counting matrix +entries. + +## 5. Chronological restoration + +In the forward word a helper changes gauge from the zero local frame to E_h; +its physical residual is the swap D_C(E_h). In the reflected reversed word +the initial helper gauge is the complement of E_h and the final gauge is +the full local block. Their relative map is again D_C(E_h). The reflected +helper does not start at the old zero/complement-full boundary. + +Apply the complete arbitrary-dirty local endpoint before commuting any +operation. A full cover sweep sends `d -> d sigma_h^-1` bijectively through +the full cover, so that slot's residual occurs once at each physical class. +Between its host stage and nominated child, every completed call or bridge +on other pairs has an endpoint independent of this helper family. +Intervening hosted and idle residuals on this family occupy disjoint +pending axes. + +For a fixed family and cover element g, the physical factors are + + g A_q E_S A_q^-1 g^-1. + +These idempotents commute and have zero pairwise products. Their exact +remainder is the complementary axis set in the same fixed A_q chart. +Consequently their partial swaps multiply to the original pending child. +This is an operator identity on arbitrary retained payloads, not an +argument that fresh helper inputs can be supplied at each occurrence. + +At every deadline the helper slices plus remainder partition all pending +axes. The global source controller can therefore be reduced to the original +unhosted controller, with its actual bridge and exchange order. No inner +MOVE is commuted across a dirty ADD or a COPY episode. PR4183's local retiming +is entirely internal to a complete call, so none of these source windows +changes. + +## 6. Complete idle and coordinate bills + +The old full-width R438 fill and the admitted mixed-terminal fill have these +nonzero idle profiles per replica: + + old: {2:433, 4:444, 6:444, 7:666, 34:1, 42:10} + new: {2:420, 4:435, 6:444, 7:666, 8:6, 10:9, + 14:4, 16:3, 34:1, 42:10}. + +Each also has 222 zero remainders. The mixed-terminal idle rank mass is +10602 per replica, an increase of 180=9*5*4, or 5760 globally. These returned +pieces are paid. There remain 1998 positive idle children per replica, +28416 live families, nine reserved private families, and zero banks. + +The global paid profile is `288*local_profile + 32*new_idle_profile`. +Its mass is `288*5101 + 32*10602 = 1808352`, leaving the unchanged deficit +`64*28416 - 1808352 = 10272`. Because both frozen mixed-terminal words use +this identical fill, PR4183's local delta `e7-e6-e1` survives here as +`288*(e7-e6-e1)`. The comparison with the older all-full-terminal R438 word +must also include the changed idle profile above. + +Coordinate lowering is explicit and separately priced. A_q uses a signed +four-coordinate Hadamard/2 butterfly followed by a permutation, or just a +signed permutation for a coordinate root. The elementary alphabet is unit +signed ADD, NEGATE, DOUBLE, HALF and SWAP. The terminal Q_h programs retain +their predecessor's counts 24,70,70 and are replayed here exactly, including +their inverses. pi_S is a literal swap program. + +Across all 55 relative charts and 111 ports, sigma_h needs at most 151 +coordinate primitives in either direction. On both head and tail blocks the +bound is 302, and the chart followed by its inverse costs at most 604. +No scratch field element is used by these coordinate programs. The forward +prefix infinity-norm bound is 8, the inverse bound is 16, and the prefix +denominator bound is 4. These are exact arithmetic bounds, not permission +to round. + +For the retained finite selector expression we conservatively use + + G = 240 + 144 + 604 + 2 + 63 + 64 = 1117. + +The 240 bounds the retained 15-coordinate data-chart Gaussian factors; +144,2,63,64 are retained legacy terms. The additional 604 charges the complete +new helper chart on both address halves in both directions. The inherited +outer factor two is also retained, so no restoration cost is removed by +this bound. `routing_invoice` exposes every term. Its use in a physical +payload invoice remains conditional on the retained selector/callee +implementation contract; coordinate operations alone do not prove an +O(V) physical route. The old rational Gaussian lowering retains its source +admissible-prime exclusions, if any; the all-odd-ring owner theorem uses the +dyadic matrices themselves. The new A_q, Q_h and permutation programs use +only dyadic unit primitives over every odd ring. + +## 7. Coverage and remaining obligations + +The finite checker authenticates the five inputs, derives the ordered widths, +all charts, every owner, every source window, complete pending factorizations, +literal dispatch, coordinate programs and the full idle bill. Its defects +include missing/duplicate helpers, a host outside its strict window, an +incorrect terminal width, overlapping slices, identical same-family charts, +a wrong replica, private/live aliasing and an equal-rank wrong projector. +Assertions are not used as acceptance gates, so the check also runs under +`python -O`. + +The arbitrary-q/w packet extension and retained-state chronological argument +are written proofs, not exhaustive enumeration of all q,w or a proof-kernel +replay. The finite matrix/owner calculations cover the complete fixed +64-dimensional construction. They do not themselves complete rounded-child +cleanup, all-size physical compiler/routing, storage/tape scheduling, or +compatible joint outer-supplier hypotheses. In particular, an available +p=1 whole-packet implementation cannot be advertised as an implementation +of the stronger p<1 recursive tariff. + +New material is Apache-2.0 and was prepared with substantial OpenAI Codex +assistance. No independent human review or formal-kernel certification is +claimed. diff --git a/research/bit-stage-mixedwidth-packing/provider/OWNERS.json b/research/bit-stage-mixedwidth-packing/provider/OWNERS.json new file mode 100644 index 0000000000..31d7a9f04d --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/OWNERS.json @@ -0,0 +1,674 @@ +{ + "status": "INTEGER_MIXEDWIDTH_OWNER_ASSIGNMENT_AND_COMPLETE_PRICE_PASS", + "oldWORD_unchanged": true, + "ordinaryRAW": 660, + "helpers": 438, + "ordered_widths": [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 4, + 4, + 4, + 8, + 8, + 4, + 8, + 8, + 4, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ], + "partial_terminals": { + "462": 506, + "463": 506, + "464": 506, + "467": 508, + "470": 509 + }, + "stages": 9, + "replicas": 32, + "W": 28416, + "physical": 28425, + "private_reserve": 9, + "banks": 0, + "full_helper_occurrences": 126144, + "calls": 288, + "open_windows": { + "0": { + "lower_open_event": -1, + "upper_open_event": 2, + "stages": [ + 0, + 1 + ] + }, + "1": { + "lower_open_event": 3, + "upper_open_event": 5, + "stages": [ + 2 + ] + }, + "2": { + "lower_open_event": -1, + "upper_open_event": 8, + "stages": [ + 0, + 1, + 2, + 3 + ] + }, + "3": { + "lower_open_event": 9, + "upper_open_event": 11, + "stages": [ + 4 + ] + }, + "4": { + "lower_open_event": -1, + "upper_open_event": 14, + "stages": [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + }, + "5": { + "lower_open_event": 15, + "upper_open_event": 17, + "stages": [ + 6 + ] + }, + "6": { + "lower_open_event": 6, + "upper_open_event": 21, + "stages": [ + 3, + 4, + 5, + 6, + 7, + 8 + ] + }, + "7": { + "lower_open_event": 12, + "upper_open_event": 22, + "stages": [ + 5, + 6, + 7, + 8 + ] + }, + "8": { + "lower_open_event": 18, + "upper_open_event": 23, + "stages": [ + 7, + 8 + ] + }, + "9": { + "lower_open_event": 20, + "upper_open_event": 24, + "stages": [] + } + }, + "idle_per_replica_including_zero": { + "0": 262, + "2": 424, + "4": 404, + "6": 444, + "7": 666, + "14": 1, + "42": 19 + }, + "distinct_relative_charts": 25, + "max_helpers_per_family": { + "0": 4, + "1": 3, + "2": 5, + "3": 5, + "4": 5, + "5": 5, + "6": 5, + "7": 4, + "8": 3 + }, + "owner_difference_gcds": { + "1": 5597 + }, + "allSOURCE_charts_actual_terminal_projectors": true, + "all_chart_coordinate_primitives_charged": true, + "max64chart_coordinate_primitives": 159, + "selector_G": 1149, + "actual_global_profile": { + "1": 380448, + "2": 400064, + "3": 22752, + "4": 24160, + "5": 29376, + "6": 17088, + "7": 26784, + "14": 32, + "42": 608 + }, + "rankmass": 1808352, + "QUERYs": 901312, + "public_guard_plus_point1": "434842362576123390259371/250000000000000000000000000", + "primary_moment_at_guard": [ + "6739905838772106316197316209968104608220207049400844942369540452103/6739986666787659948666753771754907668409286105635143120275902562304", + "13479811677544212632394632419936209216440414098801689884739080904207/13479973333575319897333507543509815336818572211270286240551805124608" + ], + "independent_moment_at_guard": [ + "9072264803201248785600935653522169395879160613828112816845875174709546611/9072373601926062041481414400729830367022935603326924881920000000000000000", + "4536132401600624392800467826761084697939580306917067539572586085555175207/4536186800963031020740707200364915183511467801663462440960000000000000000" + ], + "CONDITIONAL_price_control_root": { + "lower": "1743059363170060183941/1000000000000000000000000", + "upper": "871529681585030091971/500000000000000000000000", + "decimal_lower": "0.001743059363170060183941", + "decimal_upper": "0.001743059363170060183942", + "primary_lower_residual": { + "lower": "-350798340463454402752916498170275933458289/421249166674228746791672110734681729275580381602196445017243910144", + "upper": "-11225546894830540888093327941448829870665247/13479973333575319897333507543509815336818572211270286240551805124608", + "decimal_lower": "-8.3275735174271052943966444050170407191270228826215082102315647045E-25", + "decimal_upper": "-8.3275735174271052943966444050170407191270221407802780727472875582E-25" + }, + "primary_upper_residual": { + "lower": "65169971383461228542657921946737552847141989/26959946667150639794667015087019630673637144422540572481103610249216", + "upper": "65169971383461228542657921946737552847141991/26959946667150639794667015087019630673637144422540572481103610249216", + "decimal_lower": "2.4172885869565762923349875130498352830807657404783540208704114253E-24", + "decimal_upper": "2.4172885869565762923349875130498352830807658146624770346188391399E-24" + }, + "binomial_lower_residual": { + "lower": "-15110171629520846649373323324505322511055980610837/18144747203852124082962828801459660734045871206653849763840000000000000000", + "upper": "-22665257444281269974059967201399125758301632808523/27217120805778186124444243202189491101068806809980774645760000000000000000", + "decimal_lower": "-8.3275735174271052943966508738190982163713327635365028308634158681E-25", + "decimal_upper": "-8.3275735174271052943966443391973853155503586691081096393480109270E-25" + }, + "binomial_upper_residual": { + "lower": "43861090329083989783218248098903971807572475486643/18144747203852124082962828801459660734045871206653849763840000000000000000", + "upper": "65791635493625984674827389933716105379064913092901/27217120805778186124444243202189491101068806809980774645760000000000000000", + "decimal_lower": "2.4172885869565762923349868661696526503467382500091460949321139047E-24", + "decimal_upper": "2.4172885869565762923349875196318713245527135959057520285316516867E-24" + }, + "max_binomial_terms": 6348 + }, + "new_admitted_exponent": null, + "artifacts": { + "ORDER": { + "path": "new-owners/ORDER.json.gz", + "gzip_sha256": "8a153e3c5086e67735310bc47b2a83a41b55ba8ce102eb9a90e960d49328bbe4", + "content_sha256": "86a35f173d20e9a66af79eaa777ae415141ab99363603f3d5f7a0491070cfb23", + "uncompressed_bytes": 13184 + }, + "CHARTS": { + "path": "new-owners/CHARTS.json.gz", + "gzip_sha256": "a794812b3fac17be06d272ed60b735165a5384d7ba967dccfb329d8f00ab3396", + "content_sha256": "a15eea3592914f80fd16ac54dfef2578c533deb8d88a86be8b1e2a8ff4144c75", + "uncompressed_bytes": 584949 + }, + "SLOTS": { + "path": "new-owners/SLOTS.json.gz", + "gzip_sha256": "8131efe36eae3a25f53b5acd09ff0560ab8fbf693546dbb92af9f6e0ba509994", + "content_sha256": "68cc57e6e3b4c1fcc717549324ed0c925def7f010406269fb33e7037cec1e610", + "uncompressed_bytes": 69687 + }, + "REMAINDERS": { + "path": "new-owners/REMAINDERS.json.gz", + "gzip_sha256": "72667ea46851acfe735fd76091c380764792c05dedf6441506b222818947d709", + "content_sha256": "eca3476c6b65da142596477ae551b0d8ba4ae39ff3f1391161bb8b24e4acbb11", + "uncompressed_bytes": 52947 + }, + "FILL": { + "path": "new-owners/FILL.json.gz", + "gzip_sha256": "833faa24c31eebb50c9c28310dae89a9baca8c69adb2e98476900c98eb8a5af2", + "content_sha256": "9d2147dbb562118dd1b0e4ad9472d4592f56bded9542bfa05be5f65299df1e85", + "uncompressed_bytes": 3137949 + }, + "DISPATCH": { + "path": "new-owners/DISPATCH.json.gz", + "gzip_sha256": "8d21435c04c44ff86c93d823d7d04b7eeef5766917a2127ae964e42957a34a20", + "content_sha256": "bebefc176f0590df9e80053a0189772d3a506e532a6a00775f7adbf07735c0fb", + "uncompressed_bytes": 4874479 + } + }, + "peak_working_set_bytes": 166768640, + "CPU": 3.21875, + "remaining": "ActualnewCatalogue/Topology/Consumer binding, retainedp1logicalallsize proof andcompleteROW/stack/stock must be checked; oldWORDallRAW/proof unchanged, physicaltapes/outer remain inherited open obligations.", + "source_head": "59a1d97a86ea82b4d62958d705709ea46d7509f1", + "source_provenance": "SOURCE-ORIGINS.json; unchanged published local WORD, new owner assignment" +} diff --git a/research/bit-stage-mixedwidth-packing/provider/RECURSION.md b/research/bit-stage-mixedwidth-packing/provider/RECURSION.md new file mode 100644 index 0000000000..aa2d40c19a --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/RECURSION.md @@ -0,0 +1,463 @@ +# PR4183: transfer of the saving through a matched complete recurrence + +This note concerns the exact PR4183 head +`928066009267fb32ab2c1a29b50fa3093ea18aef` and canonical source +`12fa8c5c844be21bfefb38a19503fbd867a11244`. The complete finite moment +improves after idle closure and fallback. The companion `caller.py` now +binds both words to the retained all-size logical caller, yielding the +`p=1` stopped recurrence below under its explicit root-coupled contracts. +The stronger finite source invoice and physical transfer retain their +separate premises. The result is a strict improvement of a recursive +majorant; pointwise runtime ordering is not a conclusion. + +## Complete finite inputs + +The ambient parent has `m=64`, nine stages, 32 replicas and 111 ports: + +``` +local invocations N = 9*32 = 288 +live public families W = 2*4*111*32 = 28416 +physical families W+9 = 28425 +local helper residual widths = 433 copies of 8 and 5 copies of 4 +local helper progress = 3484 +copied-total rank = 9*7 = 63 +local data progress = 111*14 = 1554 +local paid rank mass = 3484+63+1554 = 5101. +``` + +The actual chronological owner construction determines a nonnegative integer +remainder histogram `I[r]`, including every nonzero pending-axis complement. +It must have total rank mass `339264`. In contrast, the all-width-eight R438 +word has remainder mass `333504`. The extra `5760=288*20` is mandatory: +deleting the five rank-four terminal calls returns exactly those ranks to +idle work. It gives no additional zero-exponent deficit. + +The independently checked compacted fill has, per replica, + +``` +I_rep = {2:420,4:435,6:444,7:666,8:6,10:9,14:4,16:3,34:1,42:10}. +``` + +There are additionally 222 zero remainders per replica, which are omitted +as calls. There are 1998 nonzero children and 10602 ranks per replica. +The global remainder histogram is `I=32 I_rep`; it is the same for both +compared words. + +For either frozen five-terminal word or the PR4183 word under the *same +owner construction*, the complete paid histogram is + +``` +P[r] = 288 H[r] + I[r]. +``` + +Its complete mass is `1808352` and its deficit is + +``` +64*28416 - 1808352 = 10272 = 32*(8*111 - 9*63). +``` + +Thus private reserves are not counted as profitable live stock. The +chronological bridge bill is `6*(4-1)*111*32=63936` unit ADDs. There are +`9*288=2592` COPY/ERASE episodes. Neither the bridge nor private charge +vanishes when the local query count decreases. + +## Normalized recursion and complete comparison + +Write `E=sum_r P[r]`, `epsilon=10^-16`, and `B=32*m^2*E`. +The inherited conservative BIT charge treats each paid request separately: +its exceptional classes have fraction at most epsilon and use at most +`32*m^2` children of width at most `f=floor(n/m)`. The corresponding moment +is + +``` +mu_P(b) = (sum_r P[r]*(r/m)^(1-b) + + epsilon*B*(1/m)^(1-b))/W. +``` + +The raw residual, equivalent after multiplication by `mW`, is + +``` +F_P(b) = sum_r P[r]*r*(m/r)^b + + lambda*E*m^b - mW, +lambda = 32*m^2/10^16 = 2/152587890625. +``` + +This is the ordinary BIT surcharge convention. The complex supplier's +native-exact license does not remove this BIT charge. Each rank is positive +and less than 64, so the moment is strictly increasing in b. A lower endpoint +requires an upper residual bound below zero, while an excluded endpoint +requires a lower residual bound above zero. + +For the bound logical caller's moment, take one fixed odd prime `q>2^80`. +Its exact endpoint construction applies to every odd prime and every +`w>=1`. Its actual route implementation consumes the full fixed dyadic +orthogonal charts and uses their transposes; it does not execute the +historical rational Gaussian factorization. The separate finite G240 +selector tariff below retains that factorization's admissible-prime +denominator exclusions. Each actual request is a split rank-r idempotent conjugated by a +fresh `g in GL64(Z/q^w)`. The nonzero-minor argument bounds its bad low +classes by `2*64^3/q<10^-16`; the whole high packet inherits that decision. +This is applied separately to each paid request. There is no simultaneous +all-label goodness premise and no extra union factor over the catalogue. +New fixed dyadic charts do not alter that generic degree bound. Using the +fallback allowance for a different child implementation would require that +implementation's own bound. + +For the matched owner construction PR4183 changes exactly + +``` +P_new-P_frozen = 288*(e7-e6-e1), E_new-E_frozen = -288. +``` + +Consequently, for every `0 0. +``` + +Strict subadditivity of `x^(1-b)` proves the sign. This includes all idle +closure and conservative fallback costs. With positive roots below one, it +implies that the new complete moment root is strictly larger. This compares +the actual two complete histograms; it does not follow from rank mass alone. +At b=0 the ordinary rank mass ties, and only the decreased fallback allowance +provides the tiny strict difference. + +The complete profiles are: + +| Rank | Frozen five-terminal | PR4183 | +|---:|---:|---:| +|1|380736|380448| +|2|399936|399936| +|3|22752|22752| +|4|25152|25152| +|5|29376|29376| +|6|17376|17088| +|7|26496|26784| +|8|192|192| +|10|288|288| +|14|128|128| +|16|96|96| +|34|32|32| +|42|320|320| +|Total calls|902880|902592| + +`price.py` certifies the following strict adjacent root brackets, including +the conservative BIT fallback: + +| Complete finite construction | Lower endpoint | Upper endpoint | +|---|---:|---:| +|Original all-width-eight R438|.001734846264120199151475|.001734846264120199151476| +|Frozen five-terminal, new matched owners|.001737388318390108294399|.001737388318390108294400| +|PR4183, same owners|.001737631818486007553483|.001737631818486007553484| + +The original R438 comparison uses its actual emitted profile, not an ideal +all-rank-42 remainder allowance. The five-terminal improvement and the +subsequent carrier improvement are separated in the table. The latter +increases the finite root by an amount strictly between +`0.000000243500095899259083` and `0.000000243500095899259085`. +At `b=139/80000=.0017375`, the frozen moment exceeds one while PR4183's +is below one. At `b=.002`, the complete global raw saving exceeds +`1.663199991846095434838270235`; both complete moments still exceed one. + +The first arithmetic method uses a positive rational atanh series for +logarithms, a positive exponential series and explicit tails, with outward +rounding on a `2^-224` grid. The independent method uses +`(1-z)^(-b)=sum_n (b)_n z^n/n!`, with integer-grid rounding on `2^-192` +and a geometric tail. No floating point decides an endpoint sign; Decimal +only nominates adjacent `10^-24` grid points. Both methods prove an upper +bound below one at every lower endpoint and a lower bound above one at +every upper endpoint. + +Composition through two levels preserves the ordering. If the inherited +uniform normalized child contract applies at both levels, the product +majorant has moment `mu_P(b)^2`; the difference is +`(mu_frozen-mu_new)*(mu_frozen+mu_new)>0`. Floors and the fallback maximum +can be bounded by the increasing proposed power majorant. This is not a +pointwise comparison of measured runtimes or an assumption that every actual +runtime is monotone. + +In particular, replacing `T(6f)+T(f)` by `T(7f)` need not reduce an arbitrary +cost function: the three values could be `1,1,10`. The proven comparison is +of the complete power majorants used by the recursive induction. The +902592/902880 counts are per complete finite template; they are not total +counts after recursively expanding every child. + +The actual bound trace exhibits the stopping-threshold difference: + +| Literal request | Parent width | Child width | Dispatch | +|---|---:|---:|---| +|New rank seven|576|63|Leaf| +|New rank seven|640|70|Internal| +|Frozen rank six|640|60|Leaf| +|Frozen rank six|704|66|Internal| + +These four cases are exercised in `CALLER.json`. Thus neither fewer +per-template requests nor a stronger sufficient moment asserts fewer +total recursive invocations or machine steps at every finite width. + +## Exact precision and finite source-routing invoice + +The frozen positive majorants are `F=8402567,R=630744`; PR4183's are +`F=8401795,R=630740`. The inherited envelopes are + +``` +P5 = 64 F^3 R^2 +P9 = 2^18 F^5 R^4. +``` + +For both words they require 114 and 211 bits, respectively. The old 104/192 +caps fail. Rounding charges upward to a multiple of 64 gives **128/256**; +this change must be disclosed in any native checker adaptation. The new +finite majorant decreases, but does not cross a charged-precision boundary. +This exact integer-lift bound is not an exact rounded COPY cleanup theorem. +These scalar-envelope charges belong to the inherited finite invoice. +They are distinct from the variable address-atom precision w in the +logical caller. + +The historical nine-stage invoice is explicit. Let G bound all changed +route/terminal chart factors in the same elementary coordinate alphabet, +with every source selection and inverse charged. Define + +``` +unit = 288*local_ADDs + 63936 +J = 8*32*9*(222+438) + 8*28416 + 2*9*32*438 + 2*2592 +high = 16*(64^2+1)^2 +good = 8*64^2+8 +compiler = 128*(2*64)^3 +selectors = 2*9*32*((28416-1) + 438*64*G) +C = unit + J*high + J*28425 + E*(good+compiler) + + 16*64^3 + 2592 + selectors + P9 + 1 +C2 = (C+1)^2*(E+1)^2. +``` + +The old source used +`G=max_route_factors+144+2+(m-1)+m`; changed charts must justify a new G, +not silently reuse that term. Literal exact address-coordinate operations +enter C here, while a recursive payload permutation must enter P. A claim +that they are merely finite or invertible is not a complete tariff. + +The owner certificate replays all changed charts in the unit ADD, NEGATE, +DOUBLE, HALF and SWAP alphabet. It finds at most 151 primitives per +64-coordinate chart sigma, 302 for its application on both address halves, +and 604 for the complete chart/inverse pair. Its field has no extra scratch +cell. The inherited rho15 Gaussian factorization has at most 240 factors, +under its retained finite denominator exclusions. A bound `q>2^80` alone +is not asserted here to discharge those exclusions. +We deliberately retain the legacy 144, 2, 63 and 64 terms and overcharge +the new complete chart pair again inside the outside factor two: + +``` +G = 240+144+604+2+63+64 = 1117. +selectors = 18051931584 +J = 2005440. +``` + +These are explicit coordinate-operation charges under the inherited selector +implementation contract. They are not a proof that this primitive executes +in the claimed time on a fixed physical tape. + +The complete frozen/new unit ADD totals are `10433376/10416672`. +The nonprefix parts of C are exactly +`781063758501377/780986439633857`, respectively, both below `2^50`. +Both complete C values need 211 bits, and both C2 values need **460 bits**, +so the charged depth-two allowance remains **512 bits**. These are actual +arithmetic comparisons, stronger than the sufficient `2^210` nonprefix +budget. With this common overcharged G, the Boolean candidate has smaller +ADD count, E and P9, so C and C2 strictly decrease. + +The inherited row coefficient remains +`2*(64^2+1)+9909+252=18355<20161` if the same row theorem applies. The +largest rank is at most 42, giving `2*42^2=3528<4096=64^2`. + +Finite prefix increases change absorption cutoffs, rather than the above +moment exponent, *provided* that the all-size compiler and common-grid +contracts charge the operations as stipulated. This proviso is mathematical, +not an implementation detail. + +## Bound all-size logical caller and remaining physical interfaces + +The stronger ideal `O(V)` local-overhead transfer remains conditional: + +``` +T(n) <= (sum_r P[r] T(r floor(n/64)) + + epsilon B max_{1<=j<=floor(n/64)} T(j))/W + C, +``` + +with bounded positive-width leaves. A strict moment below one proves a +power bound by proper-width induction. This requires actual child volume +`V/W`, pointwise spectator restoration, a uniform C, compatible fresh +row stock, exact returned child operators and physical routing at the +claimed cost. + +The new `caller.py` supplies source-bound Catalogue and Topology instances +for both literal words to the unchanged generic executable. Candidate and +frozen catalogues have 28206 and 28215 canonical paid labels, respectively. +The exact `CALLER.json` profiles agree with the two complete profiles above. +The same installed topology is passed through every recursive Frame; +native request templates, coefficient grammar and completed return +protocol are retained. `CALLER-PROOF.md` gives the all-size endpoint +induction and distinguishes its finite probes from full-payload execution. +The finite Frame probes use controlled 23-bit child bodies and stock U=11; +they check context propagation and return, not the full compatible-stock +execution. Prime-three operator probes likewise do not test the +`q>2^80` moment domain. The all-size conclusion uses the written +source-bound induction and the stock contract below. + +This executable has the baseline primitive tariff `p=1`: routes and +ordinary leaf atom swaps cost `O_q(wV)`. Its source-bound stopped recurrence +is + +``` +T(n,w) <= Cw (0=64). +``` + +Here atom precision w is fixed across one root's descendants. Retain the +original root e, canonical minimal residue/index widths, the encoded +source grammar, and the coupling + +``` +w>=ceil(e^(17/10000)), n<=e, +2^(h+1)<=8e^2, 17(h+1)<=20051w. +``` + +The retained preparation argument makes C uniform over these contexts; +C depends on fixed q and the finite provider. Use their maximum as a +common C for the matched two providers. Unrelated long histories or padded +numerical words retain their explicit preparation charges. If +`mu_P(0)<=1-delta_1` and `mu_P(b)<=1-delta_b`, proper-width induction gives + +``` +T(n,w) <= (C/delta_1)*n + (C/delta_b)*n^(1-b)*w. +``` + +For the explicit separating rate `b=139/80000`, `price.py` proves +`mu_P(0)<199/200` and `mu_P(b)<1-1/2400000`. A concrete majorant is + +``` +T(n,w) <= 200 C n + 2400000 C n^(1-b) w. +``` + +The proof is strong induction on positive n. The linear part pays the +`Cn` toll, and the second part pays `Cw` because `n^(1-b)>=1`. Each +fallback width lies between one and f and is bounded by the increasing +majorant; no monotonicity of T is assumed. Leaves below 64 are covered +by the same constants. The time constant C in this implication is a +uniform primitive-cost constant, not an assertion that the displayed +finite integer coefficient alone establishes that uniform bound. + +The compatible row divisor remains + +``` +K(w)=lcm(28416,28425)*|GL64(Fq)|*q^(4096(w-1)) + =269241600*|GL64(Fq)|*q^(4096(w-1)), +D(n)=0 (n<64), otherwise 1+D(42 floor(n/64)). +``` + +Using `t*K(w)^D(n)` fresh rows, with positive integer t, gives the actual +child stock + +``` +U=t*9475*K(w)^(D(n)-1). +``` + +Every positive child width c obeys `c<=42 floor(n/64)2^80, avoiding all inherited selector-program denominator primes; the new dyadic owner algebra separately holds over every odd residue ring.", + "source_sha256": { + "local": "ccd419ac1cb123edd8a27aa9d0a6ab3713087a8bcd5be39114a7bd0f254ceebc", + "owner": "28493f72227d9f268b06e675dff4742fe9414067e8b6ba96b2b497e013dd394a", + "r438": "6da8c593257c8440f0fe35488d941715d953d715e2e464ffdfffff7ed31eee9c", + "selected_assembly": "1122cb3a575f8c788345fc1bf4c108ac7c3250fb81a5988671f5eb04b3ab3045" + }, + "status": "PASS_COMPLETE_CONDITIONAL_RECURSIVE_PRICE", + "stopped_recurrence": { + "b": "139/80000", + "bound": "T(n,w)<=200*C*n+2400000*C*n^(1-b)*w", + "conditional_ordinary_wrapper_saving": "11100679/6400000000", + "fractional_majorant_coefficient": 2400000, + "linear_majorant_coefficient": 200, + "scope": "Written induction under the stated uniform local charge, completed-child, fresh-stock and primitive contracts; current selected executable is not rebound here." + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-README.md b/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-README.md new file mode 100644 index 0000000000..ec253c59fb --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-README.md @@ -0,0 +1,171 @@ +# Delayed carrier retirement in the complete logical BIT recursion + +The PR4183 local saving fits an explicit chronological owner/controller +construction. After all idle remainders are returned, the complete +nine-stage, 32-replica template has **902,592 paid recursive requests**, +compared with **902,880** for the frozen five-terminal word using the same +owners. Both have paid rank mass **1,808,352** and live stock **28,416**. +The difference is exactly `288*(e7-e6-e1)`. + +The construction now binds those packets to an actual all-size logical +caller. Its source-level proof includes coefficient access, complete +spectator packets, recursive returns, private cleanup and logical storage. +The saving survives the full fallback-inclusive recursive moment and +strictly improves the sufficient power bound for this `p=1` caller. +This is not a pointwise runtime comparison at every finite width, a fixed +physical-tape implementation or a stronger multiplication exponent. + +## What is constructed + +The source is [delayed carrier retirement](../bit-delayed-carrier-retirement/README.md) +at `928066009267fb32ab2c1a29b50fa3093ea18aef`. Its principal Boolean word +has 438 dirty helpers, including five terminal residuals of rank four, +and restores its private COPY stream. Both independent rank-two queries +on helpers 413 and 444 remain. + +`owner.py` derives the actual 29-event controller, open source windows, +ordered helper widths, owner charts and all 126,144 helper occurrences. +It retains the R438 allocation's families and stages, compacts each +bin according to the actual widths, and dispatches every residual +complement. The five shortened helpers return **5,760 additional ranks** +globally to idle work. These ranks are charged. + +Helpers can share a physical family only through distinct owned cover +classes. Explicit dyadic charts establish separation, including complete +high packets, and conjugate each actual terminal residual to its allocated +support. Complete local calls are reduced to their proven endpoints before +their residuals are moved inside untouched windows. No internal +noncommuting queries are commuted past one another. + +The address-coordinate programs include chart inverses and have no +arithmetic scratch cells. Their operation counts are explicit, but are +not themselves native payload or tape tariffs. See +[OWNER-PROOF.md](OWNER-PROOF.md) and [OWNERS.json](OWNERS.json). + +`native.py` is a new provider for the signed, framed literal records. +It emits the existing raw-record schema, checks both orientations, +and replays complete five-, nine- and eleven-stage Boolean columns. +It authenticates heterogeneous terminal states and checks literal +COPY/source/helper contracts separately from Boolean public endpoints. +It does not claim compatibility with the older A/scatter/B exporter. +See [NATIVE-PROOF.md](NATIVE-PROOF.md) and [NATIVE.json](NATIVE.json). + +`caller.py` supplies the changed Catalogue and Topology to the retained +generic Consumer, Driver and recursive Frame. The complete candidate +replay checks 11,193,984 literal events and all 28,206 canonical paid labels; +the replicated count is exactly the owner/price census. Independent +source-cut checks establish that source50 has been restored at every +new read. Charged private clears satisfy the classical logical Tape +contract. The all-size induction preserves the complete ordered source +packet, every spectator and the root's compatible row stock. See +[CALLER-PROOF.md](CALLER-PROOF.md), [CALLER-REVIEW.md](CALLER-REVIEW.md) and +[CALLER.json](CALLER.json). + +## Complete price and precision + +With conservative ordinary BIT fallback charged per paid request, exact +rational interval calculations give: + +| Matched construction | Complete requests | Fallback-inclusive moment root | +| --- | ---: | --- | +| Frozen five-terminal word | 902,880 | `(0.001737388318390108294399, 0.001737388318390108294400)` | +| PR4183 changed word | 902,592 | `(0.001737631818486007553483, 0.001737631818486007553484)` | + +The rational rate `139/80000 = 0.0017375` strictly separates the two +complete moments. Two independent rational interval methods certify the +signs. For every `0 < b < 1`, strict subadditivity gives the exact +improvement + +``` +288 * 64^b * (1 + 6^(1-b) - 7^(1-b) + 32*64^2/10^16) > 0. +``` + +Both words need 114-bit local and 211-bit nine-stage positive envelopes, +charged as **128 and 256 bits**. The older 104/192 caps fail. The changed +word does not cross a charged-precision boundary. The complete finite +invoice includes source selectors, chart returns, bridges and private +work; its two-level sufficient precision remains 512 bits under the +explicitly stated inherited implementation contracts. + +For the bound logical caller, the actual `O(wV)` route/leaf implementation +gives, after dividing work by fresh-row payload, + +``` +T(n,w) <= 200 C n + 2400000 C n^(1-139/80000) w. +``` + +Here `C` is a uniform source-dependent constant for a fixed odd prime +`q > 2^80`, canonical address widths, compatible root stock and generated +ancestor histories. It is not the finite scalar invoice's integer +coefficient, and address precision `w` is not a fixed 128/256/512-bit cap. +[RECURSION.md](RECURSION.md) gives the exact domain, recurrence and stock. +The logical storage bound is less than `11V_root + F_q'` symbols under +the stated root coupling. + +The strict improvement is in the complete moment and resulting sufficient +power bound. At parent width 640 the new rank-seven child has width 70, +whereas the removed rank-six child had width 60. Only the former recurses. +Thus 288 fewer requests in a template does not imply fewer total +invocations or faster execution at every finite input width. + +The selected complex endpoint is about `0.0016754626768081035`, below +both BIT roots. Keeping that supplier and the selected assembly unchanged +leaves the selected multiplication exponent unchanged. + +## Replay + +From the repository root: + +```sh +python3.12 -I -B research/bit-carrier-owner-admission/verify.py +python3.12 -I -O -B research/bit-carrier-owner-admission/verify.py +``` + +The portable registered replay uses only Python's standard library. +It recomputes the complete typed receipts and rejects named defects. +The optional C++ replay and its exact executed scope are documented in +[VALIDATION.md](VALIDATION.md). A portable pass does not imply that the +optional native command, historical full pipeline, Lean kernel or +physical-tape construction was run. + +## Open next questions + +1. Lower the logical arena/tape stack to the specified fixed physical + tapes, including paid access, head return and blank/restored templates. + The logical caller and live-symbol bound provide the starting contract; + a physical compiler and its full cost proof are still needed. +2. Establish a stronger route/leaf tariff and exact cleanup with rounded + child returns. Price the actual chart routes, source selection and + private return together. The finite precision envelope alone does not + prove these contracts. +3. Bind the outer wrapper and improve the limiting complex supplier if + the objective is a larger + joint multiplication exponent. A better BIT moment alone cannot + change the current selected assembly. + +## Sources and credit + +[INPUT-SOURCES.json](INPUT-SOURCES.json) pins every bundled source to its +recorded commit and Git blob; [SOURCES.json](SOURCES.json) records +publication ancestry. The caller's 84 retained files come from canonical +commit `12fa8c5c844be21bfefb38a19503fbd867a11244`. Frozen sources are +unmodified; the separately marked caller-geometry gzip transports the +exact original JSON bytes after decompression. + +Credit Ali Romman's R438/PR1043 construction; Sagar Thakrar's transported +R438 allocation and window analysis; commdata2338's R438 projector census; +CubeJerry's native R438 rehost; cheesegrader's framed owner framework; +the PR589 whole-call hosting and retained controller authors; Jose Manuel +(`jmbarrancoml`) for complete local-ring owner packets; and David Arias +for the executable recursive-caller boundary. The five-terminal charts +and PR4183 literal compensation are prior contributions by Ross Richardson. +Generic owner transport, full-cover commutation and the stopped-recurrence +method are inherited work. + +This contribution binds the changed word to a complete mixed-width +allocation, native record provider and logical recursive caller, accounts +for every returned idle rank, and certifies its matched recursive price. + +Ross Richardson, with substantial OpenAI Codex assistance in mathematics, +implementation, independent checks and writing. No independent human or +formal-kernel review is claimed. Apache-2.0. diff --git a/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-VERIFY.json b/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-VERIFY.json new file mode 100644 index 0000000000..1264d8d5f7 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-VERIFY.json @@ -0,0 +1,136 @@ +{ + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/verify.py" + ], + "checks": "Authenticate all source bytes; reconstruct chronological mixed-width owners, native signed/bridged contracts, independent source cuts, complete logical caller bindings and the fallback-inclusive stopped moment; compare every typed receipt and named defect control.", + "timeout_seconds": 600 + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py" + ], + "checks": "Repeat the complete portable verification under optimized Python; new checks use explicit exceptions and authenticated historical modules retain their original assertions.", + "timeout_seconds": 600 + } + ], + "inputs": [ + "research/bit-carrier-owner-admission/inputs/ALLOCATION.json", + "research/bit-carrier-owner-admission/inputs/CALLER-GEOMETRY.json.gz", + "research/bit-carrier-owner-admission/inputs/CONTROLLER.py", + "research/bit-carrier-owner-admission/inputs/GEOMETRY.json.gz", + "research/bit-carrier-owner-admission/inputs/PR4183-RESULT.json", + "research/bit-carrier-owner-admission/inputs/R438-CERTIFICATE.json", + "research/bit-carrier-owner-admission/inputs/SELECTED-ASSEMBLY.json", + "research/bit-carrier-owner-admission/inputs/TERMINAL-CHARTS.json", + "research/bit-carrier-owner-admission/inputs/WORD.json.gz", + "research/bit-carrier-owner-admission/inputs/caller/EVIDENCE.json", + "research/bit-carrier-owner-admission/inputs/caller/PREDECESSOR.json", + "research/bit-carrier-owner-admission/inputs/caller/PROOF.md", + "research/bit-carrier-owner-admission/inputs/caller/README.md", + "research/bit-carrier-owner-admission/inputs/caller/RESULT.json", + "research/bit-carrier-owner-admission/inputs/caller/SOURCES.json", + "research/bit-carrier-owner-admission/inputs/caller/TASK.json", + "research/bit-carrier-owner-admission/inputs/caller/VALIDATION.md", + "research/bit-carrier-owner-admission/inputs/caller/VERIFY.json", + "research/bit-carrier-owner-admission/inputs/caller/bootstrap.py", + "research/bit-carrier-owner-admission/inputs/caller/check_layout.py", + "research/bit-carrier-owner-admission/inputs/caller/check_nested_model.py", + "research/bit-carrier-owner-admission/inputs/caller/check_recursion.py", + "research/bit-carrier-owner-admission/inputs/caller/check_runtime.py", + "research/bit-carrier-owner-admission/inputs/caller/check_sign.py", + "research/bit-carrier-owner-admission/inputs/caller/check_sources.py", + "research/bit-carrier-owner-admission/inputs/caller/consumer.py", + "research/bit-carrier-owner-admission/inputs/caller/control_checks.py", + "research/bit-carrier-owner-admission/inputs/caller/driver.py", + "research/bit-carrier-owner-admission/inputs/caller/evidence/NOTICE.md", + "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2688-NOTICE.md", + "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2688-PROOF.md", + "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2708-README.md", + "research/bit-carrier-owner-admission/inputs/caller/evidence/pr2731-README.md", + "research/bit-carrier-owner-admission/inputs/caller/layout.py", + "research/bit-carrier-owner-admission/inputs/caller/linear_sign.py", + "research/bit-carrier-owner-admission/inputs/caller/node.py", + "research/bit-carrier-owner-admission/inputs/caller/packet_engine.py", + "research/bit-carrier-owner-admission/inputs/caller/peel.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/NOTICE.md", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/PROOF.md", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/README.md", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/RESULT.json", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/SOURCES.json", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/TASK.json", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/VERIFY.json", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/cardinal_counts.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/catalogue.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_headers.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_layout.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_runtime.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/check_sources.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/consumer.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/control.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/control_checks.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/driver.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/fresh_rows.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/layout.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/model.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/node.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/packet_engine.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/peel.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/topology.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/binding.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/bitstream.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/cardinality.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/check_support.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/children.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/controller.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/counts.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/directory.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/episode.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/forms.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/low_codes.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/matrices.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/numeric.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/oracle.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/packet.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/plan.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/records.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/residual.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/routes.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/selection.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/sources.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/stream.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/stream_runner.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/trace.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/vendor/words.py", + "research/bit-carrier-owner-admission/inputs/caller/predecessor/verify.py", + "research/bit-carrier-owner-admission/inputs/caller/recursive_call.py", + "research/bit-carrier-owner-admission/inputs/caller/scheduler.py", + "research/bit-carrier-owner-admission/inputs/caller/stream_runner.py", + "research/bit-carrier-owner-admission/inputs/caller/trace.py", + "research/bit-carrier-owner-admission/inputs/caller/verify.py", + "research/bit-carrier-owner-admission/inputs/native/bits/stdc++.h", + "research/bit-carrier-owner-admission/inputs/native/columns_k.cpp", + "research/bit-carrier-owner-admission/inputs/native/json.hpp", + "research/bit-carrier-owner-admission/inputs/native/legality_h.cpp", + "research/bit-carrier-owner-admission/inputs/native/stage_cohort.py", + "research/bit-carrier-owner-admission/inputs/proofs/assemble9.py", + "research/bit-carrier-owner-admission/inputs/proofs/batched-bit-rows.tex", + "research/bit-carrier-owner-admission/inputs/proofs/local-ring-packets.md", + "research/bit-carrier-owner-admission/inputs/proofs/recursive-caller.md", + "research/bit-carrier-owner-admission/inputs/proofs/stopped-recurrence.md", + "research/bit-carrier-owner-admission/inputs/proofs/terminal-chart-admission.py", + "research/bit-carrier-owner-admission/inputs/proofs/whole-call-hosting.md" + ], + "python": "3.12", + "requirements": [], + "schema_version": 1, + "status": "ready" +} diff --git a/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-verify.py b/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-verify.py new file mode 100644 index 0000000000..7389432330 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/UPSTREAM-verify.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 +"""Authenticate and replay the owner/provider/caller/price certificate. + +Ross Richardson, with substantial OpenAI Codex assistance. Apache-2.0. +The optional C++ replay has its own command and is not claimed by this hook. +""" +from copy import deepcopy +from hashlib import sha1, sha256 +from pathlib import Path, PurePosixPath +import gzip +import json +import subprocess +import sys +import tempfile + +ROOT = Path(__file__).resolve().parent + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")) + + +def read(path): + return json.loads(path.read_bytes()) + + +def authenticate(): + manifest = read(ROOT / "MANIFEST.json") + need(manifest["schema_version"] == 1, "manifest schema") + actual = {str(p.relative_to(ROOT)) for p in ROOT.rglob("*") if p.is_file()} + need(actual == set(manifest["files"]) | {"MANIFEST.json"}, "package inventory") + for name, expected in manifest["files"].items(): + path = PurePosixPath(name) + need(not path.is_absolute() and ".." not in path.parts + and path.as_posix() == name, "canonical package path") + source = ROOT / name + need(not source.is_symlink() and source.resolve().is_relative_to(ROOT), + "regular internal package file") + need(sha256(source.read_bytes()).hexdigest() == expected, "package hash " + name) + sources = read(ROOT / "INPUT-SOURCES.json") + seen = set() + for item in sources["files"]: + name = item["local_path"] + need(name not in seen, "duplicate bundled input") + seen.add(name) + raw = (ROOT / name).read_bytes() + need(sha256(raw).hexdigest() == item["sha256"], "bundled SHA256 " + name) + if item.get("encoding") == "gzip": + raw = gzip.decompress(raw) + need(sha256(raw).hexdigest() == item["source_sha256"], + "decompressed source SHA256 " + name) + else: + need("encoding" not in item, "unknown bundled encoding") + blob = sha1(b"blob " + str(len(raw)).encode() + b"\0" + raw).hexdigest() + need(blob == item["git_blob"], "bundled Git blob " + name) + need(seen == {name for name in actual if name.startswith("inputs/")}, + "complete bundled source inventory") + return manifest + + +def child(script, manifest, extra=(), *, accepted=True, timeout=180): + # Authenticate the bytes that are actually compiled. Bypass import caches, + # reset argv for the child's CLI, and retain optimization mode explicitly. + bootstrap = ( + "import hashlib,pathlib,sys\n" + "p=pathlib.Path(sys.argv[1]); b=p.read_bytes()\n" + "if hashlib.sha256(b).hexdigest()!=sys.argv[2]:\n" + " raise ValueError('child source hash')\n" + "sys.argv=[str(p)]+sys.argv[3:]\n" + "exec(compile(b,str(p),'exec')," + "{'__name__':'__main__','__file__':str(p),'__package__':None})\n" + ) + argv = [sys.executable, "-I", "-B"] + if sys.flags.optimize: + argv.append("-O") + argv += ["-c", bootstrap, str(ROOT / script), manifest["files"][script], *extra] + result = subprocess.run(argv, capture_output=True, text=True, timeout=timeout) + if accepted: + need(result.returncode == 0, script + " failed:\n" + result.stderr) + need(not result.stderr, script + " unexpected stderr") + else: + need(result.returncode != 0, script + " accepted malformed control") + return result + + +def price_controls(manifest, owners): + controls = [] + with tempfile.TemporaryDirectory(prefix="carrier-price-controls-") as temp: + path = Path(temp) / "owners.json" + cases = [] + bad = deepcopy(owners) + bad["idle_per_replica_including_zero"]["8"] -= 1 + cases.append(("omitted returned idle work", bad, "complete idle child and rank counts")) + bad = deepcopy(owners) + bad["live_families"] += bad["private_family_reserve"] + cases.append(("private reserve credited as live stock", bad, "fixed stock")) + bad = deepcopy(owners) + bad["routing_invoice"]["selector_G_terms"]["new_complete_chart"] = 0 + cases.append(("unpaid changed chart return", bad, "explicit route tariff components")) + for name, value, message in cases: + path.write_text(canonical(value) + "\n") + result = child("price.py", manifest, ("--owner-result", str(path)), accepted=False) + need(message in result.stderr, name + " rejected for an unrelated reason") + controls.append(name) + return controls + + +def main(): + manifest = authenticate() + with tempfile.TemporaryDirectory(prefix="carrier-owner-audit-") as temp: + artifacts = Path(temp) / "artifacts" + owner_run = child("owner.py", manifest, ("--emit", str(artifacts))) + need(owner_run.stdout.startswith("PASS_CARRIER_OWNERS "), "owner replay marker") + independent = json.loads(child("independent_owner.py", manifest, + ("--artifacts", str(artifacts))).stdout) + need(canonical(independent) == canonical(read(ROOT / "INDEPENDENT-OWNERS.json")), + "complete independent serialized owner receipt") + owners = read(ROOT / "OWNERS.json") + with tempfile.TemporaryDirectory(prefix="carrier-native-audit-") as temp: + artifacts = Path(temp) / "artifacts" + native = json.loads(child("native.py", manifest, + ("--output", str(artifacts))).stdout) + need(canonical(native) == canonical(read(ROOT / "NATIVE.json")), + "complete typed native receipt") + cuts = json.loads(child("caller_source_cuts.py", manifest, + ("--artifacts", str(artifacts))).stdout) + need(canonical(cuts) == canonical(read(ROOT / "CALLER-SOURCE-CUTS.json")), + "complete independent source-cut receipt") + price = json.loads(child("price.py", manifest).stdout) + need(canonical(price) == canonical(read(ROOT / "PRICING.json")), + "complete typed price receipt") + caller = json.loads(child("caller.py", manifest, timeout=540).stdout) + need(canonical(caller) == canonical(read(ROOT / "CALLER.json")), + "complete typed logical caller receipt") + local = read(ROOT / "inputs/PR4183-RESULT.json")["words"] + for name, previous in (("baseline", "baseline"), ("candidate", "boolean")): + word = native["words"][name] + need(word["literal_word_sha256"] == local[previous]["word_sha256"], + "native/predecessor literal binding") + need(word["local_checks"]["forward"]["histogram"] == local[previous]["histogram"], + "native/predecessor complete histogram") + need(word["rank_mass"] == local[previous]["rank_mass"], "local rank mass binding") + for new_key, old_key in (("ADDs", "adds"), ("paid_queries", "queries"), + ("records", "records")): + need(word[new_key] == local[previous][old_key], "complete local invoice binding") + need(word["precision"]["forward_majorant"] == local[previous]["positive_majorant"]["forward"] + and word["precision"]["reverse_majorant"] == local[previous]["positive_majorant"]["inverse"], + "native/predecessor precision envelope binding") + need(word["precision"]["local_precision_charge"] == 128 + and word["precision"]["nine_precision_charge"] == 256, "actual precision charge") + need(price["source_sha256"]["owner"] == sha256((ROOT / "OWNERS.json").read_bytes()).hexdigest(), + "price binds actual complete owners") + need(price["W"] == owners["live_families"] == 28416, "live stock binding") + need(price["profiles"]["frozen"]["children"] - price["profiles"]["candidate"]["children"] == 288, + "complete recursive saving") + for name, profile in (("catalogue", "candidate"), + ("matched_baseline_catalogue", "frozen")): + catalogue = caller[name] + need(catalogue["full_paid_requests"] == price["profiles"][profile]["children"] + and catalogue["rank_histogram"] == price["profiles"][profile]["profile"], + "caller/complete recursive profile binding") + for item, filename in (("native", "NATIVE.json"), ("owner", "OWNERS.json")): + need(caller["provenance"][item + "_receipt_sha256"] + == sha256((ROOT / filename).read_bytes()).hexdigest(), + "caller/" + item + " receipt binding") + for name in ("baseline", "candidate"): + need(caller["provenance"]["literal_word_sha256"][name] + == native["words"][name]["literal_word_sha256"], + "caller/native literal binding") + need(cuts["candidate_word_sha256"] + == caller["provenance"]["literal_word_sha256"]["candidate"] + and cuts["candidate_native_raw6_sha256"] + == native["words"]["candidate"]["native_raw6_sha256"], + "independent source-cut/native/caller binding") + need(caller["literal_binding"]["complete_calls"] == 288 + and caller["literal_binding"]["ordinary_roles"] == 660 + and caller["literal_binding"]["private_role"] == 660, + "complete caller role and dispatch census") + need(caller["split_bases"]["complete_base_labels"] + == caller["catalogue"]["base_labels"] == 549, + "complete caller split-basis census") + controls = price_controls(manifest, owners) + print("PASS_BIT_CARRIER_OWNER_ADMISSION owners=126144 " + "queries=902880->902592 logical_caller=p1 precision=128,256,512 " + "price_controls=%d optional_cpp_not_run no_new_kappa" % len(controls)) + + +if __name__ == "__main__": + main() diff --git a/research/bit-stage-mixedwidth-packing/provider/VALIDATION.md b/research/bit-stage-mixedwidth-packing/provider/VALIDATION.md new file mode 100644 index 0000000000..312f38a8ee --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/VALIDATION.md @@ -0,0 +1,169 @@ +# Validation scope and reproducible commands + +This package extends PR4183 head +`928066009267fb32ab2c1a29b50fa3093ea18aef`, whose canonical scientific +base is `12fa8c5c844be21bfefb38a19503fbd867a11244`. +`INPUT-SOURCES.json` identifies the exact unmodified source files. + +## Portable complete replay + +```sh +python3.12 -I -B research/bit-carrier-owner-admission/verify.py +python3.12 -I -O -B research/bit-carrier-owner-admission/verify.py +``` + +Expected final line: + +``` +PASS_BIT_CARRIER_OWNER_ADMISSION owners=126144 queries=902880->902592 logical_caller=p1 precision=128,256,512 price_controls=3 optional_cpp_not_run no_new_kappa +``` + +The wrapper authenticates the complete package inventory and every bundled +input, then executes exactly the authenticated Python source bytes with +isolated imports and bytecode writes disabled. It compares complete typed +receipts, not just selected headline fields. + +The owner check reconstructs all controller events, source windows, 126,144 +helper occurrences, complete remainder factors and 288 dispatch descriptors. +It checks actual dyadic chart matrices, primitive inverses and same-family +low-class separation. Ten named defects cover missing or duplicate owners, +window, width and support errors, a chart collision, wrong replica, +private/live aliasing, incorrect orientation even with consistently swapped +data owners, and an equal-rank wrong terminal projector. + +The wrapper emits the complete owner artifacts into a fresh temporary +directory. `independent_owner.py` reads those serialized artifacts without +importing the producer. It independently checks terminal projectors, +all spectator axes of the charts, reversed residuals, source windows, +every helper and dispatch, all 180,736 same-family pairs, and exact idle +complements. Its complete receipt must match `INDEPENDENT-OWNERS.json`. + +The literal provider checks both words and orientations over all 660 +independent integer input columns, including exact source/helper restoration, +literal private equality guards and both inverse orders. It separately +checks the public Boolean endpoints and their changed integer lift. +The actual frame bases and their original root spans are nondegenerate +over every odd characteristic. Complete five-, nine- and eleven-stage +Boolean replays cover 882, 1,326 and 1,548 formal columns. Omitting each +individual bridge yields 48 rejecting controls per word. + +The independently implemented `caller_source_cuts.py` consumes the freshly +emitted native artifacts without importing their producer or the caller. +It checks all four source50-to-helper413 reads in the two orientations: +the current integer row is exactly the original source50 column, the +frames agree, and COPY is closed at each read. Source50 has eight temporary +ADD writes in each orientation; the witness checks their restoration +before the later read. Five defects reject source contamination, missing +restoration, a wrong read frame and an open COPY at the read. The wrapper +compares the complete `CALLER-SOURCE-CUTS.json` receipt. + +The caller replay binds the same owner and literal receipts to the retained +Consumer, Driver and recursive Frame. It reconstructs both complete request +catalogues and executes the candidate's 288 local calls, covering +11,193,984 literal events. It checks all 549 candidate split bases at +prime three and all 444 exact rho15 projector identities. The all-odd-prime +and all-width extensions are written proofs, not consequences of that +single-prime test. + +Six representative requests exercise both coefficient callbacks; four +routes check exact low-packet return; four traces straddle recursive +thresholds. Actual Frame/SelectedNode fixtures cover `640 -> 70` and +`256 -> 168 -> 84`, repeated-prefix directories, source/head preservation +and closed arenas. Their child bodies are controlled 23-bit transforms, +and a test-only row stock of 11 bypasses the usual 9475 divisibility guard. +They test the unchanged context/return machinery, not a complete +compatible-stock GL64 payload run. Four targeted defects reject lost +topology propagation, the old private index, a wrong terminal chart and +a MOVE inside COPY. The full typed `CALLER.json` receipt and its literal, +owner and profile bindings must match. + +Only the four finite threshold fixtures memoize exact address results. +Each distinct complete input is evaluated by the unchanged `Geometry.point`; +repeated inputs receive fresh owned copies of that result. Every trace +event still executes, and all cached words are freed before the arena +audit. This fixture optimization changes its allocation and step counts, +which are excluded from the production caller's time and storage claims. +The production Consumer, Driver, Frame and frozen source files are unchanged. +The four golden streams cover 391,086 ordered events. Their uncached +reference at commit `8bb569889d4a8b4707178a50eccd93f8c23593ec` matched +the cached replay on every Event, Request and Reference field, complete +encoded word contents and heads, parent identity and final cleanup. +Both executions made the same 780,184 address calls; the registered checks +also count all 5,120 distinct complete inputs across the four fixtures. +The same four fixtures can be replayed without the cache against the same +complete-event goldens: + +```sh +python3.12 -I -B research/bit-carrier-owner-admission/caller.py \ + --scope thresholds --uncached-thresholds +``` + +This optional reference replay performs the repeated address arithmetic; +it is separate from the registered replay's fixed time budget. + +The price check binds the actual owner receipt, both complete profiles, +all idle complements, private reserve, fallback and the explicit coordinate +route invoice. Two independent exact interval methods certify every root +bracket. Three wrapper controls reject omitted idle work, crediting private +reserve as live stock, and removing the changed chart-return charge. + +The registered `VERIFY.json` commands have the same scope under normal and +optimized Python. New checks use explicit exceptions. The authenticated +frozen caller loader compiles original source with `optimize=0`, preserving +historical assertions even under an optimized parent. Each registered +command has a 600-second limit, including the caller replay. A portable +pass explicitly does not claim C++ execution. + +## Fresh native C++ legality + +This command was executed for both words with Apple Clang 17.0.0 and +Boost 1.87.0. [NATIVE-CXX.json](NATIVE-CXX.json) preserves the full native +receipts, exact source hashes, compiler flags, exit codes and output hashes. +Only local filesystem paths in the command transcript are replaced by +documented placeholders. + +```sh +python3.12 -I -B research/bit-carrier-owner-admission/native-check.py \ + --boost-include /path/to/boost_1_87_0 \ + --output /tmp/carrier-native-fresh +``` + +The output directory must not exist. A supplied `--provider-output` is +accepted only when its complete receipt and every emitted-file hash match +`NATIVE.json`; otherwise the runner emits fresh input. The Boost include +directory must contain `boost/multiprecision/cpp_int.hpp`. + +The official archive used here is +`boost_1_87_0.tar.bz2`, SHA256 +`af57be25cb4c4f4b413ed692fe378affb4352ea50fbe294a11ef548f4d527d89`. +It is an external build dependency, not a vendored research input. + +The unchanged `stage_cohort.py` and `legality_h.cpp` accepted both raw +streams, with every record, ADD, MOVE, COPY, ERASE, paid-rank and terminal +frame count matched against the independent provider. Assertions were +enabled. The unchanged `columns_k.cpp`, compiled for the five-stage +instance, rejected both words with exit code 2 and exactly +`payloadfiniteprefix2^104`. It emitted no passing receipt. This is an +expected precision-rejection control; it is not a successful replay of +that scalar checker. + +The new provider's exact positive envelopes require 114 and 211 bits, +charged as 128 and 256. The complete two-level arithmetic envelope has +460 bits, covered by the stated 512-bit charge. Those are exact-integer +bounds under the documented invoice, not exact rounded-child cleanup. + +## What these checks do not establish + +The new adapter reuses the retained generic all-size caller through its +Catalogue and Topology interfaces. It does not alter the old catalogue's +full-width terminal assumptions or claim acceptance by the old A/scatter/B +exporter or historical complete H1–H5 pipeline. The source-level induction +establishes the logical all-size endpoint and recurrence; finite probes +do not execute all input widths or the enormous full selected payload. + +No full historical selected-frontier replay, formal-kernel proof, +fixed physical-tape lowering, stronger `p<1` route/leaf implementation, +exact rounded private return, or changed complex/outer supplier is claimed. +The committed-byte check and Git-free export test certify transport of +this scoped package, not any of those missing theorems. Hosted CI is +reported separately on the actual published commit. diff --git a/research/bit-stage-mixedwidth-packing/provider/caller.py b/research/bit-stage-mixedwidth-packing/provider/caller.py new file mode 100644 index 0000000000..182446d2fd --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/caller.py @@ -0,0 +1,914 @@ +#!/usr/bin/env python3 +"""A new source-bound Catalogue/Topology for the unchanged logical caller. + +This adapter does not edit or relax the retained selected provider. It binds +the new finite request table to the retained generic executable interfaces. +Historical Python modules execute authenticated bytes, without bytecode imports. +""" +from collections import Counter +from fractions import Fraction as Q +from functools import lru_cache +from hashlib import sha256 +from pathlib import Path +from types import ModuleType +import argparse +import gzip +import importlib.abc +import importlib.util +import json +import sys + +ROOT=Path(__file__).resolve().parent +BASE="12fa8c5c844be21bfefb38a19503fbd867a11244" +PREFIX="research/selected-bit-recursive-caller/" +SOURCE_MAP_SHA="62682f12db2f42394d0ec0950af5a9f857c97ff6280b77656beb5e3d3a24909f" +GEOMETRY_RAW_SHA="0058c491d839142aa99ef86a5ec697ce99857632228531512ea3fa74fb24d734" +GEOMETRY_GZIP_SHA="a1629f8cf4321addc5a1e24c4ce2bc744a4c35c1d1eff9bd59fc6fd437f9f0c1" + + +def need(ok,message): + if not ok: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value,sort_keys=True,separators=(",",":")).encode() + + +def digest(value): + return sha256(canonical(value)).hexdigest() + + +class FrozenLoader(importlib.abc.MetaPathFinder,importlib.abc.Loader): + """Source bytes are authenticated before any predecessor module executes.""" + def __init__(self): + manifest=json.loads((ROOT/"CALLER-SOURCES.json").read_bytes()) + need(manifest["base"] == BASE,"caller source commit") + need(digest(manifest["files"]) == SOURCE_MAP_SHA,"complete caller source map") + self.sources={} + self.loaded={} + for rel,pin in manifest["files"].items(): + need(rel.startswith(PREFIX),"caller source path scope") + local=rel[len(PREFIX):] + path=ROOT/"inputs"/"caller"/local + raw=path.read_bytes() + need(sha256(raw).hexdigest() == pin,"caller source pin "+local) + self.sources[local]=(path,raw,pin) + need(len(self.sources) == 84,"complete caller source export") + self.modules={} + # Same precedence as the retained bootstrap, without normal imports. + for parent in ("predecessor/vendor/","predecessor/",""): + for local,data in self.sources.items(): + if local.startswith(parent) and "/" not in local[len(parent):] and local.endswith(".py"): + self.modules[Path(local).stem]=data + self.source_map=manifest["files"] + + def find_spec(self,fullname,path=None,target=None): + if fullname in self.modules: + return importlib.util.spec_from_loader(fullname,self) + return None + + def create_module(self,spec): + return None + + def exec_module(self,module): + path,raw,pin=self.modules[module.__name__] + need(sha256(raw).hexdigest() == pin,"loaded immutable source bytes") + module.__file__=str(path) + module.__package__="" + self.loaded[module.__name__]=pin + exec(compile(raw,str(path),"exec",dont_inherit=True,optimize=0),module.__dict__) + + def install(self): + need(not any(name in sys.modules for name in self.modules), + "caller must start with an unambiguous source module namespace") + sys.meta_path.insert(0,self) + + +def package_module(name): + """Execute this package's own source, bypassing any .pyc cache.""" + path=ROOT/(name+".py") + raw=path.read_bytes() + module=ModuleType("bound_"+name) + module.__file__=str(path) + exec(compile(raw,str(path),"exec",dont_inherit=True,optimize=0),module.__dict__) + return module,sha256(raw).hexdigest() + + +def build_provider(q=3,variant="candidate"): + loader=FrozenLoader() + loader.install() + import catalogue as retained + import topology as retained_topology + from low_codes import LowCodes + from sources import identity,product + native,native_sha=package_module("native") + owner,owner_sha=package_module("owner") + summary,artifacts=owner.construct() + need(json.loads(json.dumps(summary)) == json.loads((ROOT/"OWNERS.json").read_bytes()), + "fresh complete owner receipt") + transport=(ROOT/"inputs"/"CALLER-GEOMETRY.json.gz").read_bytes() + need(sha256(transport).hexdigest() == GEOMETRY_GZIP_SHA,"caller geometry transport") + raw_geometry=gzip.decompress(transport) + need(sha256(raw_geometry).hexdigest() == GEOMETRY_RAW_SHA,"caller geometry source bytes") + data_geometry=json.loads(raw_geometry) + word=json.loads(gzip.decompress((ROOT/"inputs"/"WORD.json.gz").read_bytes())) + geometry=json.loads(gzip.decompress((ROOT/"inputs"/"GEOMETRY.json.gz").read_bytes())) + record_sets={"candidate":native.candidate(word["records"]),"baseline":word["records"]} + need(all(native.digest(records) == native.WORD_HASHES[name] + for name,records in record_sets.items()),"both literal source words") + program_sets={key:{name:native.local_program(native.lower(records),rev) + for name,rev in (("forward",False),("reverse",True))} + for key,records in record_sets.items()} + native_receipt=json.loads((ROOT/"NATIVE.json").read_bytes()) + for key,programs in program_sets.items(): + for orientation in ("forward","reverse"): + need(digest(programs[orientation]) == + native_receipt["words"][key]["local_checks"][orientation]["events_sha256"], + "both native provider event bindings") + need(len(data_geometry["ports"]) == len(geometry["lines"]) == 111, + "exact selected port inventory") + denominators=Counter() + for i,port in enumerate(data_geometry["ports"]): + need(port["port"] == i and port["q"] == geometry["lines"][i],"rho15 port/root order") + rho=[[Q(x) for x in row] for row in port["rho15"]] + need(len(rho) == 15 and all(len(row) == 15 for row in rho),"rho15 shape") + need(product(rho,tuple(zip(*rho))) == identity(15),"rho15 exact orthogonality") + for row in rho: + for x in row: + need(x.denominator & (x.denominator-1) == 0,"rho15 dyadic coefficient") + denominators[x.denominator]+=1 + line=[[Q(port["q"][a]*port["q"][b],4) if a < 8 and b < 8 else Q(0) + for b in range(15)] for a in range(15)] + head=[[Q(a == b and a < 8) for b in range(15)] for a in range(15)] + exterior=[[Q(a == b and a >= 8) for b in range(15)] for a in range(15)] + complement=[[head[a][b]-line[a][b] for b in range(15)] for a in range(15)] + for source,target in ((line,line),(head,[[line[a][b]+exterior[a][b] + for b in range(15)] for a in range(15)]), + (complement,exterior),(exterior,complement)): + need(product(product(rho,source),tuple(zip(*rho))) == target, + "rho15 exact data/idle projector bridge") + + schedule=[] + for event in artifacts["ORDER"]["controller"]: + e=dict(event) + if e["kind"] == "local": + e["kind"]="local_cover_sweep" + schedule.append(e) + template_base={ + "m":64,"stages":9,"replicas":32,"live":28416, + "schedule":schedule, + "loop_order":"Each recipe phase: replicas then all cover classes; finish every local invocation before the next.", + "hosting":{"slots":artifacts["SLOTS"]}, + } + family_charts=[tuple(tuple(Q(x) for x in row) for row in matrix) + for matrix in artifacts["CHARTS"]["family_charts"]] + relative_charts=artifacts["CHARTS"]["relative_charts"] + projectors,dimensions=zip(*(owner.projector([geometry["lines"][i] for i in f]) + for f in geometry["frames"])) + + class Catalogue(retained.Catalogue): + private=660 + + def __init__(self,q,variant="candidate"): + need(variant in program_sets,"matched caller word variant") + self.q=q + self.variant=variant + self.programs=program_sets[variant] + calls=[dict(call,local_hash=digest(self.programs[call["orientation"]])) + for call in artifacts["DISPATCH"]] + self.word,self.geometry=word,data_geometry + self.template=dict(template_base,calls=calls,local_programs=self.programs) + self.projectors,self.dimensions=projectors,dimensions + self.idles={e["idx"]:e for e in self.template["schedule"] if e["kind"] == "idle"} + self.requests,self.bases,self.charts,self.erase_guards=[],{},set(),[] + self._bind() + self.codes=LowCodes(q,64,len(self.requests)) + self.identifiers={self.semantic_key(r):i for i,r in enumerate(self.requests)} + need(len(self.identifiers) == len(self.requests),"new unique complete request identifiers") + self._recursive_caller_topology=Topology(self) + + def base(self,a,b): + lo,hi=(a,b) if self.dimensions[a] <= self.dimensions[b] else (b,a) + matrix=tuple(tuple(x-y for x,y in zip(u,v)) + for u,v in zip(self.projectors[hi],self.projectors[lo])) + base=retained.Base("local",matrix,self.dimensions[hi]-self.dimensions[lo]) + return self.bases.setdefault(base.key,base) + + def pending(self,child): + return tuple(self.idles[child]["axes"]) + + def owner_chart(self,call,role): + family,route=call["owners"][role] + if route[0] == "data": + return retained.Chart("data",route[2],route[1]) + need(route[0] == "hosted" and len(route) == 5,"new hosted owner schema") + _,child,offset,width,cid=route + axes=self.pending(child)[offset:offset+width] + entry=relative_charts[cid] + need(tuple(entry["axes"]) == axes and width in (4,8),"actual mixed terminal support") + need(entry["terminal_frame"] == word["final"][role],"actual terminal frame binding") + return retained.Chart("host",family%111,entry["terminal_frame"],(cid,*axes)) + + @lru_cache(None) + def chart_matrix(self,chart): + out=identity(64) + if chart.kind == "identity": + return tuple(map(tuple,out)) + if chart.kind == "data": + if chart.stage == 0: + return tuple(map(tuple,out)) + axes=list(range(8))+list(range(8+7*(chart.stage-1),8+7*chart.stage)) + rho=self.geometry["ports"][chart.port]["rho15"] + for i,a in enumerate(axes): + for j,b in enumerate(axes): + out[a][b]=Q(rho[i][j]) + return tuple(map(tuple,out)) + need(chart.kind in ("family","host"),"new chart kind") + for i in range(8): + out[i][:8]=family_charts[chart.port][i] + if chart.kind == "family": + return tuple(map(tuple,out)) + cid,*axes=chart.axes + entry=relative_charts[cid] + need(entry["axes"] == axes and entry["terminal_frame"] == chart.stage, + "host chart key retains terminal and support") + relative=tuple(tuple(Q(x) for x in row) for row in entry["relative_matrix"]) + return tuple(map(tuple,product(out,relative))) + + def _bind(self): + template=self.template + for stage in range(9): + call=template["calls"][32*stage] + for replica in range(32): + other=template["calls"][32*stage+replica] + need((other["stage"],other["replica"],other["orientation"],other["local_hash"]) + == (stage,replica,call["orientation"],call["local_hash"]), + "new replica literal binding") + need(len(other["owners"]) == len(call["owners"]) == 660 + and all(route == r0 and family == f0+888*replica + for (family,route),(f0,r0) in zip(other["owners"],call["owners"])), + "new replica owner symmetry") + need(other["private_owner"] == [28416+stage,["private","d"]], + "new exact private owner descriptor") + opened=None + for position,event in enumerate(self.programs[call["orientation"]]): + op,role=event[:2] + if op == 0: + _,_,a,b,rank,_=event + base=self.base(a,b) + need(base.rank == rank and opened is None,"new MOVE paid rank/lifetime") + self._append(retained.Request("MOVE",stage,position,role,call["owners"][role][0], + a,b,base,self.owner_chart(call,role),"owner")) + elif op == 2: + _,_,temporary,a,b,rank,_=event + base=self.base(a,b) + need(temporary == 660 and opened is None and base.rank == rank == 7, + "new source-bound COPY") + opened=retained.Request("COPY",stage,position,role,call["private_owner"][0],a,b, + base,retained.Chart("identity"),"common",self.owner_chart(call,role)) + self._append(opened) + elif op == 3: + _,_,temporary,a,b,_,_=event + need(opened is not None and opened.role == role and temporary == 660 + and opened.base == self.base(a,b),"new exact ERASE source request") + self.erase_guards.append((stage,position,opened.position,role,opened.base.key)) + opened=None + else: + need(op == 1,"new local opcode") + need(opened is None,"new complete private lifetime") + for child,copy,axes in artifacts["REMAINDERS"]: + if not axes: + continue + event=self.idles[child] + base=retained.Base("idle",tuple(axes),len(axes)) + base=self.bases.setdefault(base.key,base) + self._append(retained.Request("IDLE",child,child,copy,event["pair"]*222+copy, + event["source_level"],event["target_level"],base, + retained.Chart("family",copy%111),"owner")) + self.profile=Counter() + for request in self.requests: + self.profile[request.base.rank]+=32 + expected=Counter({int(r):288*n for r,n in + native_receipt["words"][self.variant]["local_checks"]["forward"]["histogram"].items()}) + expected.update({int(r):32*n for r,n in + summary["idle_per_replica_including_zero"].items() if int(r)}) + total=901312 if self.variant == "candidate" else 901600 + need(self.profile == expected and sum(self.profile.values()) == total + and len(self.requests) == total//32,"new complete paid catalogue") + + class Topology(retained_topology.SelectedTopology): + @lru_cache(None) + def call(self,stage,replica): + source=self.catalogue.template["calls"][32*stage+replica] + events,identifiers,start,end,reverse=self.recipe(stage) + owners=tuple(retained_topology.Owner(family,self.catalogue.owner_chart(source,role)) + for role,(family,_route) in enumerate(source["owners"])) + need(len(owners) == len(start) == len(end) == 660,"new complete staged roles") + return retained_topology.Call(stage,replica,owners,start,end,events,identifiers,reverse) + + bound=Catalogue(q,variant) + provenance={ + "source_commit":BASE,"source_map_sha256":SOURCE_MAP_SHA, + "frozen_files":84,"geometry_raw_sha256":GEOMETRY_RAW_SHA, + "geometry_gzip_sha256":GEOMETRY_GZIP_SHA, + "package_source_sha256":{"native.py":native_sha,"owner.py":owner_sha}, + "owner_receipt_sha256":sha256((ROOT/"OWNERS.json").read_bytes()).hexdigest(), + "native_receipt_sha256":sha256((ROOT/"NATIVE.json").read_bytes()).hexdigest(), + "rho15_exact_orthogonal_dyadic_matrices":111, + "rho15_data_idle_projector_identities":444, + "data_route_stage8_ambient_boundary":64, + "rho15_denominator_histogram":dict(sorted(denominators.items())), + "literal_word_sha256":{key:native.digest(records) for key,records in record_sets.items()}, + } + return bound,loader,provenance + + +def literal_census(catalogue): + from control import LocalState + topology=catalogue._recursive_caller_topology + counts=Counter() + binding=sha256() + for stage in range(9): + for replica in range(32): + call=topology.call(stage,replica) + state=LocalState(call) + for position,event in enumerate(call.events): + op,role=state.accept(position) + counts[op]+=1 + if op in (0,2): + identifier=call.requests[position] + r=catalogue.requests[identifier] + need(r.role == role and r.stage == stage and r.position == position + and r.kind == ("MOVE" if op == 0 else "COPY"), + "complete literal-to-request provenance") + if replica == 0: + binding.update(canonical([stage,position,identifier])+b"\n") + state.finish() + need(counts == {0:836064,1:10352736,2:2592,3:2592},"new complete literal census") + return {"literal_counts":dict(counts),"literal_events":sum(counts.values()), + "consumer_binding_sha256":binding.hexdigest(),"complete_calls":288, + "ordinary_roles":660,"private_role":660} + + +def split_basis_census(catalogue): + """Execute the unchanged exact split-basis checker on every new label.""" + ranks=Counter() + signature=sha256() + for key,base in sorted(catalogue.bases.items()): + basis=base.basis(catalogue.q) + need(len(basis) == 64 and all(len(row) == 64 for row in basis), + "complete new fixed rational split basis") + ranks[base.rank]+=1 + signature.update(canonical([key,[[str(x) for x in row] for row in basis]])+b"\n") + return {"prime":catalogue.q,"complete_base_labels":sum(ranks.values()), + "ranks":dict(sorted(ranks.items())),"basis_sha256":signature.hexdigest(), + "checker":"unchanged binding.split_basis: exact PB=B diag(I_rank,0), modular full rank"} + + +def selected_requests(catalogue): + tests={ + "retired_carrier_rank7":lambda r:r.kind == "MOVE" and r.stage == 0 + and r.role == 469 and r.old_frame == 0 and r.new_frame == 517, + "advanced_source50":lambda r:r.kind == "MOVE" and r.stage == 0 + and r.role == 50 and r.old_frame == 52 and r.new_frame == 509, + "partial_terminal":lambda r:r.kind == "MOVE" and r.stage == 0 + and r.role == 462 and r.new_frame == 506, + "copy476":lambda r:r.kind == "COPY" and r.stage == 0 and r.role == 476, + "short_idle":lambda r:r.kind == "IDLE" and r.base.rank == 2, + "max_idle":lambda r:r.kind == "IDLE" and r.base.rank == 42, + } + return {key:next(i for i,r in enumerate(catalogue.requests) if test(r)) + for key,test in tests.items()} + + +def consumer_probes(catalogue,chosen): + """Actual coefficient programs, with the enormous payload scan explicit.""" + from cardinal_counts import Count + from catalogue import Specifications + from check_support import audit,no_decode + from consumer import Consumer + from directory import Context + from numeric import selected_page + import oracle + import packet_engine + from records import Fields,Program,Tape + from scheduler import complete + from words import Arena,Ring + specifications=Specifications(catalogue) + arena,indices=Arena(3),Arena(8) + mod=arena.input(3) + ring=Ring(mod) + context=Context(ring,catalogue.codes) + size,depth=indices.input(65),indices.input(0) + program=Program.fixture(indices,arena,65,2,[],catalogue.codes.bits) + consumer=Consumer(context,indices,program,specifications,size,depth) + old=Tape() + count=Count.literal(1) + before,gap,suffix=(Count.literal(v) for v in (2,5,3)) + result=[] + original=packet_engine.run_generator + try: + for name,identifier in chosen.items(): + request=catalogue.requests[identifier] + common=request.kind != "IDLE" + template=catalogue.template_for(identifier,common) + low=tuple(map(tuple,oracle.inverse(oracle.reduce_rational(template.preparation,3),3))) + spec=specifications.bind(identifier,common,low) + need(spec.good,"new numerical Consumer good-form control") + sampled=set() + sentinel=Tape() + + def probe(source,events,layout,directory,prefixes,field_count,coefficient,**options): + if False: + yield + need(source is sentinel and layout.parent_size is size and layout.gap is gap, + "new Consumer complete input geometry") + values=Fields(indices,arena,catalogue.codes.bits) + values.tape=directory + page,frame=selected_page(specifications.plan(spec.code),ring,indices,program, + values,specifications,spec.code) + try: + for event in events: + if event.kind != "add" or event.request.kind in sampled: + continue + actual=coefficient(directory,event.request) + expected=page.evaluate(event.request) + need(ring.raw.compare(actual,expected) == 0, + "new bound coefficient callback agrees with numeric page") + arena.free_many(actual,expected) + sampled.add(event.request.kind) + if len(sampled) == 2: + break + finally: + events.close() + page.close() + indices.free(page.columns) + frame.close() + return "bound-source-only-consumer-probe" + + packet_engine.run_generator=probe + with no_decode(): + observed=complete(consumer.apply(sentinel,identifier,common,low,old,count, + before,gap,suffix)) + need(observed == "bound-source-only-consumer-probe" + and sampled == {"adapter","child"},"both new Consumer coefficient junctions") + result.append({"name":name,"request":identifier,"kind":request.kind, + "rank":request.base.rank,"common":common, + "callbacks":sorted(sampled),"full_payload_executed":False}) + sentinel.clear() + finally: + packet_engine.run_generator=original + old.clear() + program.tape.clear() + for value in (count,before,gap,suffix): + value.close() + context.close() + ring.close() + arena.free(mod) + indices.free_many(size,depth) + audit(arena) + audit(indices) + return result + + +def route_probes(catalogue,chosen): + from driver import compile_owner,inverse_chart + import oracle + from sources import identity,product + common=tuple(map(tuple,oracle.eye(64))) + probes=[] + for name in ("retired_carrier_rank7","advanced_source50","partial_terminal","short_idle"): + request=catalogue.requests[chosen[name]] + matrix=catalogue.chart_matrix(request.chart) + need(product(matrix,tuple(zip(*matrix))) == identity(64),"actual route chart orthogonality") + inverse=inverse_chart(matrix) + need(inverse == tuple(zip(*matrix)),"actual inverse route is the dyadic transpose") + native,forward,backward=compile_owner(matrix,common,catalogue.codes) + need(forward.chart == matrix and backward.chart == inverse + and forward.target_low == common and backward.target_low == native, + "actual source route normal-form binding") + probes.append({"name":name,"chart_key":request.chart.key, + "forward_route_sha256":digest([[str(x) for x in row] for row in forward.chart]), + "inverse_route_sha256":digest([[str(x) for x in row] for row in backward.chart]), + "inverse_is_transpose":True,"exact_low_packet_return":True}) + return probes + + +def threshold_probes(candidate,baseline,*,use_address_cache=True): + """Walk every actual trace event, with checker-only pure-address caching.""" + from dataclasses import fields,is_dataclass + from catalogue import Specifications + from check_support import audit,inspect_count,no_decode + from numeric import Geometry + import oracle + from trace import execute + from words import Arena,Word + + # Full ordered traces obtained from the uncached published caller.py, + # SHA256 ed95651869d1631ab2760ac1179c2497ef2eb0e241abfb45ef893c6180713d96 + # at commit 8bb569889d4a8b4707178a50eccd93f8c23593ec. Both modes below + # independently regenerate every event; the cache only saves pure arithmetic. + golden={ + ("candidate",576):(89354,177696, + {"add":89037,"atom_swap":252,"enter":1,"return":1,"sign":63}, + "48adaf800f4505cc292949f6a691cac61c34ba6a4d73f168679cadbced215514"), + ("candidate",640):(98723,197440, + {"add":98720,"enter":1,"invoke":1,"return":1}, + "77d5a2846b0d75efe3642c01e1bc098df4548cdc985f6c3b8b3ee8d575eccd6f"), + ("baseline",640):(96922,192880, + {"add":96620,"atom_swap":240,"enter":1,"return":1,"sign":60}, + "5b70978fe85a68bdffb8d193d6007976bcfdd64f7a6bccb0e92089d71523e143"), + ("baseline",704):(106087,212168, + {"add":106084,"enter":1,"invoke":1,"return":1}, + "2a36ad722cbc14879fe4e72c45cf17bc6fd4800fa9811ad30fa828247dd14e9b"), + } + + class FixtureGeometry(Geometry): + """Memoize only this finite fixture's unchanged Geometry.point calls. + + Keys contain both complete encoded input words, the row and dimension. + The retained routine executes on every distinct input. Hits copy its + saved encoded result into a fresh owned register. This checker helper + is never installed on a production Consumer, Driver or recursive Frame. + """ + def __init__(self,*args): + super().__init__(*args) + self.points={} + self.point_calls=0 + self.point_inputs=set() + + def point(self,field,column): + need(self.columns.head == column.head == 1, + "canonical threshold fixture address inputs") + extent,coordinate=bytes(self.columns.cells),bytes(column.cells) + key=(self.plan.dimension,field,extent,coordinate) + self.point_calls+=1 + self.point_inputs.add(key) + if not use_address_cache or key not in self.points: + value=super().point(field,column) + need(self.columns.head == column.head == value.head == 1 + and bytes(self.columns.cells) == extent + and bytes(column.cells) == coordinate, + "unchanged threshold address oracle preserves its inputs") + if not use_address_cache: + return value + self.points[key]=value + value=self.points[key] + need(value.head == 1 and value.slot in self.index.live, + "owned canonical cached threshold address") + result=self.index.copy(value) + need(result is not value and result.head == 1 + and bytes(result.cells) == bytes(value.cells), + "fresh exact threshold address copy") + return result + + def close(self): + for value in self.points.values(): + self.index.free(value) + self.points.clear() + super().close() + + reports=[] + identifiers={ + "candidate":selected_requests(candidate)["retired_carrier_rank7"], + "baseline":next(i for i,r in enumerate(baseline.requests) if r.kind == "MOVE" + and r.stage == 0 and r.role == 469 and r.old_frame == 52 and r.new_frame == 517), + } + for name,parent in (("candidate",576),("candidate",640),("baseline",640),("baseline",704)): + catalogue=candidate if name == "candidate" else baseline + identifier=identifiers[name] + specifications=Specifications(catalogue) + template=catalogue.template_for(identifier,True) + low=tuple(map(tuple,oracle.inverse(oracle.reduce_rational(template.preparation,3),3))) + spec=specifications.bind(identifier,True,low) + need(spec.good,"threshold trace good-form source") + plan=specifications.plan(spec.code) + indices=Arena(12) + columns,depth=indices.input(parent//64),indices.zero() + geometry=FixtureGeometry(plan,indices,columns,depth,spec.code,object()) + signature=sha256() + counts=Counter() + initial=(bytes(geometry.columns.cells),bytes(geometry.depth.cells), + geometry.plan.dimension,geometry.plan.rank) + + def normalize(value): + if value is geometry.parent_identity: + return ["exact_fixture_parent"] + if isinstance(value,Word): + need(value.arena is indices and value.slot in indices.live, + "all emitted words belong to the exact threshold arena") + need(value.head == 1,"all emitted word heads canonical") + return ["word",value.head,bytes(value.cells).hex()] + if value is None or isinstance(value,(bool,int,str)): + return value + if isinstance(value,(tuple,list)): + return [normalize(x) for x in value] + if is_dataclass(value): + return [type(value).__name__,[[f.name,normalize(getattr(value,f.name))] + for f in fields(value)]] + raise ValueError("unrecognized emitted trace payload "+type(value).__name__) + + signature.update(canonical({ + "plan":normalize(geometry.plan), + "columns":normalize(geometry.columns), + "depth":normalize(geometry.depth), + "source_code":geometry.source_code, + })+b"\n") + entered,invoked,returned=[],[],[] + try: + with no_decode(): + for event in execute(geometry): + need(event.parent_identity is None + or event.parent_identity is geometry.parent_identity, + "exact normalized emitted parent identity") + # Consume every mutable word before the iterator resumes. + signature.update(canonical(normalize(event))+b"\n") + counts[event.kind]+=1 + if event.child_kind != "good": + continue + if event.kind == "enter": + entered.append(inspect_count(event.width)) + elif event.kind == "invoke": + invoked.append(inspect_count(event.width)) + elif event.kind == "return": + returned.append(inspect_count(event.width)) + width=template.rank*(parent//64) + need(entered == returned == [width] + and invoked == ([width] if width >= 64 else []), + "actual changed child threshold") + need(initial == (bytes(geometry.columns.cells),bytes(geometry.depth.cells), + geometry.plan.dimension,geometry.plan.rank), + "unchanged threshold geometry") + need((sum(counts.values()),geometry.point_calls,dict(counts), + signature.hexdigest()) == golden[name,parent], + "complete uncached-reference threshold trace") + need(len(geometry.point_inputs) == 128*(parent//64), + "complete threshold address input census") + reports.append({"word":name,"parent_width":parent,"request":identifier, + "rank":template.rank,"child_width":width, + "internal_invocations":len(invoked),"literal_trace_executed":True, + "full_trace":{ + "events":sum(counts.values()), + "event_kinds":dict(sorted(counts.items())), + "ordered_full_event_sha256":signature.hexdigest(), + "point_calls":geometry.point_calls, + "distinct_point_inputs":len(geometry.point_inputs)}}) + finally: + geometry.close() + indices.free_many(columns,depth) + audit(indices) + return reports + + +def new_rank7_frame(catalogue,identifier): + """Actual child_call/Frame protocol, with a labelled tiny child body.""" + from cardinal_counts import Count + from catalogue import Specifications + from check_support import audit,bits,inspect_count,no_decode + from directory import Context,append_tape + from layout import Layout + import node + from numeric import Geometry + import oracle + from packet import read_prefix + from records import Fields,Program,Tape + from recursive_call import child_call + from scheduler import complete + from trace import Event + from words import Arena,BLANK,Ring + specifications=Specifications(catalogue) + template=catalogue.template_for(identifier,True) + need(template.rank == 7,"new rank7 Frame request") + low=tuple(map(tuple,oracle.inverse(oracle.reduce_rational(template.preparation,3),3))) + spec=specifications.bind(identifier,True,low) + need(spec.good,"new rank7 Frame good normal form") + indices,arena=Arena(11),Arena(3) + modulus=arena.input(3) + ring=Ring(modulus) + context=Context(ring,catalogue.codes) + size,depth=indices.input(640),indices.zero() + program=Program.fixture(indices,arena,640,2,[],catalogue.codes.bits) + root=node.SelectedNode(context,indices,program,size,depth,catalogue,specifications) + topology=root.topology + need(topology is catalogue._recursive_caller_topology,"root actual provider topology") + common_call=topology.call(0,0) + high=[[0]*64 for _ in range(64)] + field=Fields.fixture(indices,arena,[(spec.code,high)],catalogue.codes.bits) + directory=Tape() + append_tape(field.tape,directory) + append_tape(field.tape,directory) + directory.rewind() + field.tape.clear() + prefixes,stock,before,gap,suffix=(Count.literal(x) for x in (2,11,2,5,3)) + field_count=indices.input(1) + source=Tape() + payload=bytes((i*7 ^ i//3)&1 for i in range(23)) + for bit in payload: + source.append(bit) + source.rewind() + saved_source,saved_directory,saved_program=map(lambda t:bytes(t.cells),(source,directory,program.tape)) + protected_indices,protected_residues=set(indices.live),set(arena.live) + original=node.SelectedNode.run_generator + frames=[] + observations=[] + + def controlled(self,current,old,count,unused,b,g,s,observe=None): + if False: + yield + frames.append(self) + need(self.topology is topology and self.topology.call(0,0) is common_call + and self.consumer.specifications is specifications, + "new rank7 topology and catalogue propagate through actual Frame") + need(self.indices is not indices and self.context.arena is not arena, + "new rank7 separate frame banks") + need(inspect_count(self.parent_size) == 70 and inspect_count(self.depth) == 1, + "new rank7 actual internal child width/depth") + need(unused is stock and inspect_count(unused) == 11 and inspect_count(count) == 2, + "fresh U separate from complete high-prefix count") + need(tuple(inspect_count(x) for x in (b,g,s)) == (2,5*3**1140,3), + "new rank7 ordered spectator extents") + root_size,unit,root_depth=self.program.root() + need((inspect_count(root_size),inspect_count(unit),inspect_count(root_depth)) == (640,2,1), + "new rank7 preserved root coefficient program") + self.indices.free_many(root_size,root_depth) + self.context.arena.free(unit) + slot=self.indices.input(1) + metadata,previous,generated=self.program.step(slot) + need(metadata == (0,spec.code,7,0,0,0) + and (inspect_count(previous),inspect_count(generated)) == (640,70), + "new rank7 exact generated child descriptor") + self.indices.free_many(slot,previous,generated) + old.rewind() + for _ in range(2): + prefix=read_prefix(old,self.depth) + need(bits(prefix) == bits(directory)[:len(bits(directory))//2], + "all physical frozen-prefix ordinals retained") + prefix.clear() + need(old.read() == BLANK,"complete two-prefix directory") + old.rewind() + output=Tape() + for bit in reversed(bits(current)): + output.append(bit) + output.rewind() + observations.append({"depth":1,"width":70,"prefixes":2,"stock":11, + "before":2,"gap":"5*3^1140","suffix":3, + "same_catalogue":True,"same_topology":True}) + return output + + node.SelectedNode.run_generator=controlled + columns=indices.input(10) + geometry=Geometry(specifications.plan(spec.code),indices,columns,depth,spec.code,program) + leading=Count.product(stock,before) + layout=Layout(geometry,size,ring,3,leading,gap,suffix) + operands=[indices.input(x) for x in (0,1210,70,1)] + event=Event("invoke",operands[0],operands[1],width=operands[2],depth=operands[3], + child_kind="good",source_code=spec.code,parent_identity=program) + output=None + try: + with no_decode(): + output=complete(child_call(root.consumer,source,event,layout,directory, + prefixes,field_count,stock,before)) + need(bits(output) == bytes(reversed(payload)),"new rank7 controlled child return") + need(bytes(source.cells) == saved_source and bytes(directory.cells) == saved_directory + and bytes(program.tape.cells) == saved_program,"new rank7 preserved caller inputs") + need(source.head == output.head == directory.head == program.tape.head == 1, + "new rank7 caller head return") + for frame in frames: + audit(frame.indices) + audit(frame.context.arena) + need(not bits(frame.program.tape),"new rank7 child program cleared") + finally: + node.SelectedNode.run_generator=original + if output is not None: + output.clear() + layout.close() + geometry.close() + leading.close() + indices.free_many(columns,*operands) + need(indices.live == protected_indices and arena.live == protected_residues, + "new rank7 no retained child numerical storage") + source.clear() + directory.clear() + program.tape.clear() + for value in (prefixes,stock,before,gap,suffix): + value.close() + indices.free_many(size,depth,field_count) + context.close() + ring.close() + arena.free(modulus) + audit(indices) + audit(arena) + return {"request":identifier,"rank":7,"parent_width":640,"child_width":70, + "actual_Frame_instances":len(frames),"handoffs":observations, + "controlled_payload_bits":23,"full_selected_GL64_payload_executed":False, + "source_and_directory_preserved":True,"private_frame_banks_closed":True, + "scope":"Actual unchanged child_call, descriptor, Frame, SelectedNode constructor and cleanup; tiny test-only child body."} + + +def binding_controls(catalogue): + from copy import copy + from dataclasses import replace + from control import LocalState + import node + failures=[] + + def reject(name,run,expected): + try: + run() + except ValueError as error: + need(str(error) == expected,"wrong caller control rejection "+name) + failures.append({"defect":name,"rejection":expected}) + else: + raise ValueError("caller control unexpectedly accepted "+name) + + def missing_topology(): + unbound=copy(catalogue) + del unbound._recursive_caller_topology + node.selected_topology(unbound).call(0,0) + reject("omitted_new_topology_propagation",missing_topology,"complete selected staged roles") + + call=catalogue._recursive_caller_topology.call(0,0) + opening=next(i for i,e in enumerate(call.events) if e[0] == 2) + + def wrong_private(): + events=list(call.events) + altered=list(events[opening]) + altered[2]=661 + events[opening]=tuple(altered) + state=LocalState(replace(call,events=tuple(events))) + for position in range(opening+1): + state.accept(position) + reject("old_private_index661",wrong_private,"fresh transported COPY interval") + + def wrong_terminal(): + event=catalogue.template["calls"][0] + altered=dict(event,owners=list(event["owners"])) + family,route=altered["owners"][462] + changed=list(route) + # Keep the same mixed-width axes but substitute a chart whose terminal + # frame is different, detected before any route can be compiled. + other=next(r for _,r in event["owners"][222:] + if r[0] == "hosted" and r[-1] != route[-1] and r[3] == 8) + changed[-1]=other[-1] + altered["owners"][462]=[family,changed] + catalogue.owner_chart(altered,462) + reject("wrong_terminal_owner_chart",wrong_terminal,"actual mixed terminal support") + + def inside_copy(): + events=list(call.events) + # Insert an actual later MOVE immediately after a COPY opens. The + # retained lifetime guard rejects it before any payload query executes. + move=next(e for e in events[opening+1:] if e[0] == 0) + events[opening+1]=move + requests=list(call.requests) + requests[opening+1]=0 + state=LocalState(replace(call,events=tuple(events),requests=tuple(requests))) + for position in range(opening+2): + state.accept(position) + reject("source_packet_moved_inside_COPY",inside_copy,"MOVE frame and lifetime") + return failures + + +def main(): + parser=argparse.ArgumentParser() + parser.add_argument("--scope",choices=("catalogue","literal","consumer","thresholds","complete"), + default="complete") + parser.add_argument("--uncached-thresholds",action="store_true", + help="replay all four threshold traces without address caching") + args=parser.parse_args() + if args.uncached_thresholds and args.scope != "thresholds": + parser.error("--uncached-thresholds requires --scope thresholds") + catalogue,loader,provenance=build_provider() + baseline=type(catalogue)(3,"baseline") + report={"status":"PASS_BOUND_CALLER_CATALOGUE","provenance":provenance, + "catalogue":catalogue.receipt(),"matched_baseline_catalogue":baseline.receipt(), + "no_new_kappa":True, + "scope":"New finite provider bound to unchanged generic logical caller; p=1 contracts remain explicit."} + if args.scope in ("literal","consumer","complete"): + report["literal_binding"]=literal_census(catalogue) + report["split_bases"]=split_basis_census(catalogue) + report["status"]="PASS_COMPLETE_BOUND_CALLER_LITERAL_CENSUS" + if args.scope in ("consumer","complete"): + chosen=selected_requests(catalogue) + report["consumer_probes"]=consumer_probes(catalogue,chosen) + report["route_probes"]=route_probes(catalogue,chosen) + if args.scope == "thresholds": + report["threshold_probes"]=threshold_probes( + catalogue,baseline,use_address_cache=not args.uncached_thresholds) + report["status"]="PASS_BOUND_CALLER_COMPLETE_THRESHOLD_TRACES" + elif args.scope in ("consumer","complete"): + report["threshold_probes"]=threshold_probes(catalogue,baseline) + report["status"]="PASS_BOUND_CALLER_CONSUMER_AND_THRESHOLD_PROBES" + if args.scope == "complete": + import check_recursion + report["recursive_rank42_frame_probe"]=check_recursion.frame_handoff(catalogue) + report["recursive_new_rank7_frame_probe"]=new_rank7_frame(catalogue,chosen["retired_carrier_rank7"]) + report["binding_controls"]=binding_controls(catalogue) + report["status"]="PASS_NEW_SOURCE_BOUND_LOGICAL_RECURSIVE_CALLER" + report["loaded_frozen_modules"]=dict(sorted(loader.loaded.items())) + print(json.dumps(report,sort_keys=True,indent=2)) + + +if __name__ == "__main__": + main() diff --git a/research/bit-stage-mixedwidth-packing/provider/caller_source_cuts.py b/research/bit-stage-mixedwidth-packing/provider/caller_source_cuts.py new file mode 100644 index 0000000000..5fe2ab3bad --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/caller_source_cuts.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +"""Independent integer source-history audit of the emitted PR4183 word. + +Reads native.py's authenticated serialized output; imports neither producer. +The source50 input is temporarily mutated. Only the actual helper413 read cuts +are proved to hold its original independent integer input, in the right frame. +Python 3.12 standard library. Output is deterministic under normal and -O runs. +""" +from copy import deepcopy +from hashlib import sha256 +from pathlib import Path +import argparse +import json + +ROOT = Path(__file__).resolve().parent +PINS = { + "LOCAL-PROGRAMS.json": + "c2c35a98c7674c8b16b6c014e2dafd9912ae8ae93cf0ccd2cb1dc654ca2bc6bf", + "249-states.json": + "103de24baca3bb119fafee6778d5596bce00f8731cf05d107ea7bad300786f08", + "frames.json": + "76a3c2af379ab20bb179baf40eadb5051eadd12cd2442c8eb323404b8ae9b5cd", +} +CUTS = { + "forward": ((23829, 1, 509), (31990, -1, 1)), + "reverse": ((6877, 1, 1), (15038, -1, 509)), +} +WRITES = { + "forward": (24473, 24474, 24475, 24841, 25846, 26229, 26230, 26231), + "reverse": (12636, 12637, 12638, 13021, 14026, 14392, 14393, 14394), +} + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + + +def sparse(row): + return [[column, row[column]] for column in sorted(row)] + + +def add(target, source, coefficient): + for column, value in source.items(): + total = target.get(column, 0) + coefficient * value + if total: + target[column] = total + else: + target.pop(column, None) + + +def load_artifacts(path): + expected = json.loads((ROOT / "NATIVE.json").read_bytes()) + provider = json.loads((path / "NATIVE-PROVIDER.json").read_bytes()) + need(canonical(provider) == canonical(expected), "complete native provider receipt") + loaded = {} + for name, pin in PINS.items(): + data = (path / "candidate" / name).read_bytes() + need(sha256(data).hexdigest() == pin, "source-cut serialized pin " + name) + need(provider["words"]["candidate"]["emitted_file_sha256"][name] == pin, + "source-cut provider file binding") + loaded[name] = json.loads(data) + return loaded, expected + + +def frame_table(state, orientation): + name = "final" if orientation == "reverse" else "initial" + need(set(state[name]) == {str(i) for i in range(660)}, "complete ordinary frame registry") + return [state[name][str(i)] for i in range(660)] + [-1] + + +def replay(events, state, framebank, orientation): + """Propagate all independent columns; no sampled scalar input is used.""" + reverse = int(orientation == "reverse") + frames = frame_table(state, orientation) + rows = [{i: 1} for i in range(660)] + [{}] + opened = None + cuts, writes = [], [] + copies = erases = 0 + for position, event in enumerate(events): + need(all(type(value) is int for value in event), "literal integer record fields") + op, role = event[:2] + need(0 <= role < 660, "ordinary source-history role") + need(event[-1] == reverse, "source-history orientation flag") + if op == 0: + _, _, before, after, rank, _ = event + need(opened is None and frames[role] == before, "MOVE frame and closed COPY") + need(abs(framebank[str(after)]["dim"] - framebank[str(before)]["dim"]) == rank, + "MOVE declared rank") + frames[role] = after + elif op == 1: + _, _, source, coefficient, frame, _ = event + need(0 <= source <= 660 and source != role and coefficient in (-1, 1), + "signed source-history ADD") + need(frames[role] == frames[source] == frame, "actual source-cut ADD frames") + need(source != 660 or opened is not None, "private read has a live COPY") + need(opened is None or role != opened[0], "copied source remains immutable") + if role == 413 and source == 50: + need(rows[50] == {50: 1}, "current source50 differs from its original input") + need(opened is None, "source50 read cut has an open COPY") + cuts.append({ + "position": position, "record": event, + "source_frame": frames[50], "destination_frame": frames[413], + "current_source_integer_row": sparse(rows[50]), + "destination_integer_row_before": sparse(rows[413]), + "private_closed": True, + }) + add(rows[role], rows[source], coefficient) + if role == 50: + writes.append({"position": position, "record": event, + "current_integer_row": sparse(rows[50])}) + elif op == 2: + _, _, temporary, before, after, rank, _ = event + need(temporary == 660 and opened is None and not rows[660] + and frames[660] == -1, "fresh clean private work") + need(frames[role] == before and after == 0 + and framebank[str(before)]["dim"] == rank == 7, + "actual transported COPY frames") + rows[660] = rows[role].copy() + frames[660] = after + opened = (role, before, after) + copies += 1 + else: + need(op == 3 and opened is not None, "matching integer ERASE") + _, _, temporary, before, after, rank, _ = event + need(temporary == 660 and opened == (role, before, after) + and frames[role] == before and frames[660] == after + and rank == (7 if reverse else 0), "exact ERASE frame guard") + need(rows[660] == rows[role], "exact integer transported ERASE equality") + rows[660] = {} + frames[660] = -1 + opened = None + erases += 1 + expected_frames = frame_table(state, "forward" if reverse else "reverse") + need(frames == expected_frames and opened is None and not rows[660], + "closed ordinary frame and private endpoint") + need(rows[50] == {50: 1}, "final source50 restoration") + observed = tuple((cut["position"], cut["record"][3], cut["source_frame"]) for cut in cuts) + need(observed == CUTS[orientation], "complete source50 read cuts") + need(tuple(row["position"] for row in writes) == WRITES[orientation], + "complete source50 mutation history") + need(len(writes) == 8 and all(row["current_integer_row"] != [[50, 1]] + for row in writes[:-1]) + and writes[-1]["current_integer_row"] == [[50, 1]], + "nontrivial source50 mutation and exact restoration") + need(copies == erases == 9, "all literal private lifetimes") + return {"events": len(events), "independent_integer_columns": 660, + "cuts": cuts, "source50_write_history": writes, + "final_source50": [[50, 1]], "source50_globally_immutable": False, + "integer_COPY_ERASE_equalities": erases, "private_final_zero": True, + "event_sha256": sha256(canonical(events)).hexdigest()} + + +def controls(programs, state, framebank): + cases = [] + forward = programs["forward"] + changed = deepcopy(forward) + changed.insert(23829, [1, 50, 413, 1, 509, 0]) + cases.append(("earlier current-source mutation", "forward", changed, + "current source50 differs")) + changed = deepcopy(forward) + del changed[26231] + cases.append(("omitted final source restoration", "forward", changed, + "current source50 differs")) + changed = deepcopy(forward) + changed[23829][4] = 1 + cases.append(("wrong frame at inserted read", "forward", changed, + "actual source-cut ADD frames")) + changed = deepcopy(forward) + changed.insert(23829, [2, 476, 660, 515, 0, 7, 0]) + cases.append(("open valid COPY at inserted read", "forward", changed, + "source50 read cut has an open COPY")) + changed = deepcopy(programs["reverse"]) + del changed[14394] + cases.append(("omitted inverse source restoration", "reverse", changed, + "current source50 differs")) + rejected = [] + for label, orientation, events, marker in cases: + try: + replay(events, state, framebank, orientation) + except ValueError as error: + need(marker in str(error), "unrelated source-cut control failure: " + label) + rejected.append({"mutation": label, "rejected_by": str(error)}) + else: + raise ValueError("source-cut control survived: " + label) + return rejected + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--artifacts", type=Path, required=True, + help="native.py --output directory, read only") + args = parser.parse_args() + files, provider = load_artifacts(args.artifacts) + programs = files["LOCAL-PROGRAMS.json"] + state = files["249-states.json"] + frames = files["frames.json"]["frames"] + need((state["n"], state["v"], state["R"], state["h"]) == (660, 111, 438, 8), + "source-cut source dimensions") + need(set(programs) == {"forward", "reverse"} and len(frames) == 636, + "source-cut complete orientation/frame inventory") + result = { + "status": "PASS_EXACT_CURRENT_SOURCE50_CUTS", + "scope": ("Independent finite integer column/source-history proof for all actual " + "helper413 source50 read cuts; no caller import, GL64 enumeration, " + "rounded cleanup or physical tape claim."), + "serialized_input_sha256": PINS, + "candidate_word_sha256": provider["words"]["candidate"]["literal_word_sha256"], + "candidate_native_raw6_sha256": provider["words"]["candidate"]["native_raw6_sha256"], + "orientations": {}, + "no_new_kappa": True, + } + for orientation in ("forward", "reverse"): + checked = replay(programs[orientation], state, frames, orientation) + need(checked["event_sha256"] == + provider["words"]["candidate"]["local_checks"][orientation]["events_sha256"], + "source-cut actual event order binding") + result["orientations"][orientation] = checked + result["negative_controls"] = controls(programs, state, frames) + print(json.dumps(result, sort_keys=True, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/research/bit-stage-mixedwidth-packing/provider/independent_owner.py b/research/bit-stage-mixedwidth-packing/provider/independent_owner.py new file mode 100644 index 0000000000..29908f8d82 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/independent_owner.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 +"""Independent mathematical audit of serialized owner artifacts; no producer import. + +Consumes the owner construction credited in OWNER-PROOF.md. +Apache-2.0; substantial OpenAI Codex assistance. +""" +import argparse +from collections import Counter, defaultdict +from fractions import Fraction as Q +from itertools import combinations +from math import gcd +from pathlib import Path +import gzip +import hashlib +import json + +PKG = Path(__file__).resolve().parent +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("--artifacts", required=True, type=Path, + help="directory emitted by owner.py --emit") +ART = parser.parse_args().artifacts + + +def need(x, why): + if not x: + raise ValueError(why) + + +def load(name, compressed=False): + p = ART / (name + (".json.gz" if compressed else ".json")) + raw = p.read_bytes() + return json.loads(gzip.decompress(raw) if compressed else raw) + + +def mm(a, b): + return [[sum((x*y for x, y in zip(row, col)), Q()) for col in zip(*b)] for row in a] + + +def tr(a): + return [list(x) for x in zip(*a)] + + +def ident(n): + return [[Q(i == j) for j in range(n)] for i in range(n)] + + +def swap_projector(p): + n = len(p) + return [[Q(i == j)-p[i][j] for j in range(n)]+p[i] for i in range(n)]+[ + p[i]+[Q(i == j)-p[i][j] for j in range(n)] for i in range(n)] + + +def project(vectors): + basis = [] + for vector in vectors: + z = list(map(Q, vector)) + for u in basis: + factor = sum(x*y for x, y in zip(z, u))/sum(x*x for x in u) + z = [x-factor*y for x, y in zip(z, u)] + if any(z): + basis.append(z) + return [[sum((v[i]*v[j]/sum(x*x for x in v) for v in basis), Q()) + for j in range(8)] for i in range(8)] + + +order = load("ORDER") +charts = load("CHARTS") +slots = load("SLOTS") +remainders = load("REMAINDERS") +fill = load("FILL", True) +dispatch = load("DISPATCH", True) +owners = json.loads((PKG/"OWNERS.json").read_text()) +word = json.loads(gzip.decompress((PKG/"inputs/WORD.json.gz").read_bytes())) +geometry = json.loads(gzip.decompress((PKG/"inputs/GEOMETRY.json.gz").read_bytes())) + +# Prove terminal conjugation and the complemented reverse residual, including +# partial q-perpendicular pieces rather than only their numerical ranks. +bases = {int(f): [[Q(x) for x in row] for row in b] + for f, b in charts["terminal_bases"].items()} +terminal_p = {} +for f, b in bases.items(): + k = 8 if f == 1 else 4 + d = [[Q(i == j and i < k) for j in range(8)] for i in range(8)] + p = project([geometry["lines"][i] for i in geometry["frames"][f]]) + need(mm(tr(b), b) == ident(8), "terminal isometry") + need(mm(mm(b, d), tr(b)) == p, "terminal image") + complement = [[Q(i == j)-p[i][j] for j in range(8)] for i in range(8)] + need(mm(swap_projector(ident(8)), swap_projector(complement)) == swap_projector(p), + "reverse complemented residual") + terminal_p[f] = p + +for q, a in zip(geometry["lines"], charts["family_charts"]): + a = [[Q(x) for x in row] for row in a] + need(mm(tr(a), a) == ident(8), "family isometry") + need([row[0] for row in a] == [Q(x, 2) for x in q], "family root axis") + +relative = [] +for c in charts["relative_charts"]: + m = [[Q(x) for x in row] for row in c["relative_matrix"]] + perm = c["permutation"] + need(sorted(perm) == list(range(64)), "complete chart permutation") + b = bases[c["terminal_frame"]] + expected = [[Q() for _ in range(64)] for _ in range(64)] + for i in range(64): + expected[perm[i]] = tr(b)[i]+[Q()]*56 if i < 8 else [Q(j == i) for j in range(64)] + need(m == expected, "entire relative chart including spectator axes") + e = terminal_p[c["terminal_frame"]] + # E is supported on the first eight input axes. Compute only those + # columns when conjugating: full 64-axis matrix, exact rational output. + thin = [row[:8] for row in m] + got = mm(mm(thin, e), tr(thin)) + s = set(c["axes"]) + need(got == [[Q(i == j and i in s) for j in range(64)] for i in range(64)], + "actual relative terminal image") + need(0 not in s, "hosted slice leaves port line unchanged") + relative.append({(i, j): x for i, row in enumerate(m) for j, x in enumerate(row) if x}) + +# Reconstruct strict source windows from literal events, not recorded windows. +events = order["controller"] +calls = {e["stage"]: (pos, e) for pos, e in enumerate(events) if e["kind"] == "local"} +children = {e["idx"]: (pos, e) for pos, e in enumerate(events) if e["kind"] == "idle"} +need(len(calls) == 9 and len(children) == 10 and len(events) == 29, "controller census") +windows = {} +for child, (end, c) in children.items(): + touches = [i for i, e in enumerate(events[:end]) + if ((e["kind"] == "local" and e["pair"] == c["pair"]) + or (e["kind"] == "bridge" and c["pair"] in (e["src"], e["dst"])))] + begin = max(touches, default=-1) + windows[child] = {s for s, (pos, e) in calls.items() if begin < pos < end} + source_level, target_level = c["source_level"], c["target_level"] + expected_axes = list(range(1 if source_level == -1 else 8+7*source_level, + 8+7*target_level)) + need(c["axes"] == expected_axes, "pending projector axis range") + +role_slots = {} +occupied = defaultdict(set) +widths = [8 if frame == 1 else 4 for frame in word["final"][222:]] +for child, cp, offset, width, stage, helper in slots: + need((stage, helper) not in role_slots, "duplicate slot role") + need(stage in windows[child] and calls[stage][1]["pair"] != children[child][1]["pair"], + "strict source window") + need(width == widths[helper], "actual terminal width") + axes = children[child][1]["axes"][offset:offset+width] + need(len(axes) == width and not occupied[child, cp].intersection(axes), "slice overlap") + occupied[child, cp].update(axes) + role_slots[stage, helper] = (child, cp, offset, width, axes) +need(set(role_slots) == {(s, h) for s in range(9) for h in range(438)}, "complete slot coverage") +idle = Counter() +for child, cp, rest in remainders: + whole = children[child][1]["axes"] + used = occupied[child, cp] + need(rest == [x for x in whole if x not in used], "exact idle complement") + need(rest == whole[len(used):], "compacted suffix") + idle[len(rest)] += 1 +need(len(remainders) == 2220 and sum(idle.values()) == 2220, "complete idle bins") +need(idle == Counter({int(r): n for r, n in owners["idle_per_replica_including_zero"].items()}), + "idle histogram") + +physical_axes = defaultdict(set) +same_family = defaultdict(list) +bound_fill = {} +for stage, rep, helper, family, child, offset, width, cid in fill: + c, cp, off, w, axes = role_slots[stage, helper] + need((child, offset, width) == (c, off, w), "fill slot binding") + need(0 <= rep < 32 and family == rep*888+2*children[child][1]["pair"]*111+cp, + "physical family and replica") + need(charts["relative_charts"][cid]["axes"] == axes + and charts["relative_charts"][cid]["terminal_frame"] == word["final"][222+helper], + "fill actual chart and terminal frame") + need(not physical_axes[family].intersection(axes), "cross-child physical disjointness") + physical_axes[family].update(axes) + need((stage, rep, helper) not in bound_fill, "duplicate full helper role") + bound_fill[stage, rep, helper] = [family, ["hosted", child, offset, width, cid]] + same_family[stage, family].append(cid) +need(len(bound_fill) == 126144, "complete physical helper count") +pairs = Counter() +for cids in same_family.values(): + pairs.update(tuple(sorted(x)) for x in combinations(cids, 2)) +gcds = Counter() +for (a, b), count in pairs.items(): + left, right = relative[a], relative[b] + g = 0 + for coordinate in left.keys() | right.keys(): + g = gcd(g, abs((left.get(coordinate, Q())-right.get(coordinate, Q())).numerator)) + need(g > 0 and g & (g-1) == 0, "complete low-packet owner separation for every odd q") + gcds[g] += count +need(gcds == Counter({1: 180736}), "same-family pair census") + +seen = set() +for desc in dispatch: + s, r, pair = desc["stage"], desc["replica"], desc["pair"] + expected = calls[s][1] + need(desc["orientation"] == ("reverse" if expected["reverse"] else "forward") + and pair == expected["pair"], "literal orientation") + need(desc["private_owner"] == [28416+s, ["private", "d"]], "private reserve") + need(len(desc["owners"]) == 660, "all ordinary owners") + for role, actual in enumerate(desc["owners"]): + if role < 222: + side, port = divmod(role, 111) + if expected["reverse"]: + side = 1-side + wanted = [r*888+(2*pair+side)*111+port, ["data", s, port]] + else: + wanted = bound_fill[s, r, role-222] + need(actual == wanted, "actual dispatch owner") + need((s, r) not in seen, "duplicate call") + seen.add((s, r)) +need(seen == {(s, r) for s in range(9) for r in range(32)}, "complete dispatch") + +route_count = max(len(charts["terminal_programs"][str(c["terminal_frame"])]["program"]) + +len(c["permutation_program"])+p["primitive_count"] + for c in charts["relative_charts"] for p in charts["family_programs"]) +need(route_count == 151 and 4*route_count == 604, "full chart/inverse coordinate charge") +need(240+144+4*route_count+2+63+64 == owners["routing_invoice"]["selector_G"] == 1117, + "complete inherited coordinate tariff") +result = { + "status": "PASS_INDEPENDENT_SERIALIZED_OWNER_AUDIT", + "owner_receipt_sha256": hashlib.sha256((PKG/"OWNERS.json").read_bytes()).hexdigest(), + "helper_occurrences": len(bound_fill), "call_descriptors": len(seen), + "relative_charts": len(relative), "family_charts": len(charts["family_charts"]), + "same_family_pairs": sum(pairs.values()), "difference_numerator_gcds": dict(gcds), + "nonzero_idle_per_replica": sum(n for r, n in idle.items() if r), + "idle_rank_per_replica": sum(r*n for r, n in idle.items()), + "selector_G": 1117, + "scope": "Independent serialized schedule/projector/packet-separation audit; all-size callee and physical tariffs remain hypotheses.", +} +print(json.dumps(result, indent=2, sort_keys=True)) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/ALLOCATION.json b/research/bit-stage-mixedwidth-packing/provider/inputs/ALLOCATION.json new file mode 100644 index 0000000000..c2fb443f44 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/ALLOCATION.json @@ -0,0 +1,726 @@ +{ + "claims": { + "c_pr1043_inplace": "0.001734176288479865766692", + "c_pr589": "0.001733427039589844234749", + "c_window_optimum_local_a": "0.001734802047828389852783", + "c_window_optimum_local_b": "0.001734846264120199151475", + "certificate": "moment(opt, c+1e-24) > 1 by both engines; every other no-bank R438 slot layout has a certified larger idle sum at c+1e-24 with the same child count and local profile, hence a larger moment; so no layout in the slot model reaches c+1e-24", + "kappa": "unchanged; the bit side does not bind", + "optimum_idle_per_replica": { + "2": 433, + "34": 1, + "4": 444, + "42": 10, + "6": 444, + "7": 666 + } + }, + "dp": { + "S45_positive_control": { + "c_star": "0.001733427039589844234750", + "exhaustive_layouts_covered": 3160688, + "optimum": "9x(42,5)", + "optimum_idle_per_replica": { + "2": 435, + "4": 444, + "42": 9, + "6": 444, + "7": 666 + }, + "pr1023_width8_optimality": { + "margin_lower_bound": "0.0025867731454302305368", + "runner_up_per_unit": "capacity 42, u = 4" + }, + "runner_up": "8x(42,5) + 1x(14,1) + 1x(42,4)", + "runner_up_gap_moment": [ + "0.0000003322715521960530587537556494937834", + "0.0000003322715521960530587537556494937835" + ], + "runner_up_gap_sum_g_per_replica": [ + "0.018883656854406087435093441072030701", + "0.018883656854406087435093441072030702" + ], + "runner_up_idle_per_replica": { + "14": 1, + "2": 435, + "34": 1, + "4": 444, + "42": 8, + "6": 443, + "7": 666 + }, + "slack_units": 45, + "third": "8x(42,5) + 1x(28,1) + 1x(42,4)" + }, + "S54_at_c_a_next": { + "c_star": "0.001734802047828389852784", + "exhaustive_layouts_covered": 10556685, + "optimum": "10x(42,5) + 1x(42,4)", + "optimum_idle_per_replica": { + "2": 433, + "34": 1, + "4": 444, + "42": 10, + "6": 444, + "7": 666 + }, + "runner_up": "10x(42,5) + 1x(14,1) + 1x(28,3)", + "runner_up_gap_moment": [ + "0.0000001390420665268048703185105882609695", + "0.0000001390420665268048703185105882609696" + ], + "runner_up_gap_sum_g_per_replica": [ + "0.007902038724851374389941593752047420", + "0.007902038724851374389941593752047421" + ], + "runner_up_idle_per_replica": { + "14": 1, + "2": 434, + "28": 1, + "4": 443, + "42": 10, + "6": 443, + "7": 666 + }, + "slack_units": 54, + "third": "10x(42,5) + 1x(28,1) + 1x(28,3)" + }, + "S54_at_c_b_next": { + "c_star": "0.001734846264120199151476", + "exhaustive_layouts_covered": 10556685, + "optimum": "10x(42,5) + 1x(42,4)", + "optimum_idle_per_replica": { + "2": 433, + "34": 1, + "4": 444, + "42": 10, + "6": 444, + "7": 666 + }, + "runner_up": "10x(42,5) + 1x(14,1) + 1x(28,3)", + "runner_up_gap_moment": [ + "0.0000001390456087131328961495995128689269", + "0.0000001390456087131328961495995128689270" + ], + "runner_up_gap_sum_g_per_replica": [ + "0.007902240034384768753974039515366855", + "0.007902240034384768753974039515366856" + ], + "runner_up_idle_per_replica": { + "14": 1, + "2": 434, + "28": 1, + "4": 443, + "42": 10, + "6": 443, + "7": 666 + }, + "slack_units": 54, + "third": "10x(42,5) + 1x(28,1) + 1x(28,3)" + }, + "pr1043_inplace_layout": { + "gap_moment_at_c_a_next": [ + "0.0000020441334240402170287422093671650918", + "0.0000020441334240402170287422093671650919" + ], + "gap_sum_g_per_replica_at_c_a_next": [ + "0.116172190755053614177477242754726502", + "0.116172190755053614177477242754726503" + ], + "idle_per_replica": { + "10": 5, + "12": 3, + "14": 1, + "2": 430, + "4": 441, + "42": 9, + "6": 443, + "7": 666 + }, + "layout": "9x(42,5) + 5x(42,1) + 3x(28,1) + 1x(14,1)" + } + }, + "endpoints": { + "pr1043_r438_inplace_local_a": { + "children": 904320, + "endpoint": "0.001734176288479865766692", + "profile": { + "1": 380448, + "10": 160, + "12": 96, + "14": 32, + "2": 400832, + "3": 22464, + "4": 26784, + "42": 288, + "5": 29376, + "6": 17344, + "7": 26496 + } + }, + "pr1043_r438_inplace_local_b": { + "endpoint": "0.001734220472884893243548", + "gain_vs_pr1043_percent": "0.00254786", + "gain_vs_pr589_percent": "0.04577252" + }, + "pr589_r439_selected": { + "endpoint": "0.001733427039589844234749", + "profile": { + "1": 381024, + "2": 400416, + "3": 22752, + "4": 26880, + "42": 288, + "5": 29376, + "6": 17376, + "7": 26784 + } + }, + "r438_runner_up_layout_local_a": { + "endpoint": "0.001734759469354358444809", + "gain_vs_pr1043_percent": "0.03362869", + "gain_vs_pr589_percent": "0.07686679", + "layout": "10x(42,5) + 1x(14,1) + 1x(28,3)" + }, + "r438_window_optimum_local_a": { + "children": 904320, + "endpoint": "0.001734802047828389852783", + "endpoint_fraction": "1734802047828389852783/1000000000000000000000000", + "gain_vs_pr1043_percent": "0.03608395", + "gain_vs_pr589_percent": "0.07932311", + "profile": { + "1": 380448, + "2": 400928, + "3": 22464, + "34": 32, + "4": 26880, + "42": 320, + "5": 29376, + "6": 17376, + "7": 26496 + }, + "rank_mass": 1808352 + }, + "r438_window_optimum_local_b": { + "children": 904320, + "endpoint": "0.001734846264120199151475", + "endpoint_fraction": "69393850564807966059/40000000000000000000000", + "gain_vs_pr1043_percent": "0.03863365", + "gain_vs_pr589_percent": "0.08187391", + "profile": { + "1": 380736, + "2": 400352, + "3": 22752, + "34": 32, + "4": 26880, + "42": 320, + "5": 29376, + "6": 17376, + "7": 26496 + }, + "rank_mass": 1808352 + } + }, + "inputs": { + "main_tree": { + "research/bit-helper470-window-placement-seed14/verify.py": { + "git_blob": "c716a44e3b920f91918903d3480560e3882fbe80", + "sha256": "9cceeb610eccd6171585b056020ab6c44d7428de403a9ed035be1df9ae63f55b" + }, + "research/bit589-width-packing/SOURCES.json": { + "git_blob": "f6a97de32691a1d426ac4819aad24c0c8414d97e", + "sha256": "53fe98c8f01de7e32e3110e591d62e60292abb38cc11ecde4839f2eebd3b5fbc" + }, + "research/bit589-width-packing/packing.py": { + "git_blob": "a6079ee0dd4d8037be477a3c4497f472348bde07", + "sha256": "2bb5515807714807961289e4ee6958c3ad7e0c27bbec4d9212b138c662a6cc7b" + }, + "research/bit589-width7-windows-seed72/verify.py": { + "git_blob": "7f79a47146b150c9446e5f45e401d70b5cd12427", + "sha256": "a5341ed222af84b51cd18645dd6b23e4613c0275cbf2663c94b07a9f916e9e60" + }, + "research/bit589-width7-windows-seed72/windows.py": { + "git_blob": "4bb4f075ad5c1a49b4af310094bde6b2a4ea0c2e", + "sha256": "a24295a51333b168ab73215f8a4bbb5bf831be829f572d1cde15fc322049c635" + }, + "research/bit589-width7-windows-seed72/wopt.py": { + "git_blob": "4e0bd3704d1a2be460ed25b363e95918119e8d42", + "sha256": "a72daf1c7cff422543371a220fd391fe3b33552ac6ed52763f50b0c2f93d9532" + }, + "research/e8-bit-p111-tuned/data/selection9-p111.json": { + "git_blob": "e69ea66a3add357f570fc5552ab6368b3c8f9bb2", + "sha256": "4ab1ed4529683cd184987f8bc3031fb7408b9cd22c25ab9cf541a8aaf896eaf1" + }, + "research/e8-bit-p111-tuned/tune/EXPECTED.json": { + "git_blob": "e293ddc557742637f9f679f083a1a282d87b1b13", + "sha256": "b9f0e5ca038abe837b0007c8fe006f366a6f02009244ac57705a8a200e2301f4" + }, + "research/e8-bit-p111-tuned/vendor/pr510/e8-r480-nine-stage/vendor/e8-r715-eleven-stage-whole/code/audit_hosted_k.py": { + "git_blob": "8864ca9b942a3507171edca0cf6cbaaf10fcf434", + "sha256": "57e558c80a2fea6e291587b04afd76dfaee3550729997798b61f33daf90b8ec9" + }, + "research/e8-bit-p111-tuned/vendor/pr510/e8-r480-nine-stage/vendor/e8-r715-eleven-stage-whole/code/global_k.py": { + "git_blob": "3df12bd632f1fdba825ced57110a1fee82eb2857", + "sha256": "6368196a393ac25bb2918880e4c4bd31ed733b762c27b6873ab391cbc0c5c3c8" + }, + "research/e8-bit-p111-tuned/vendor/pr510/e8-r480-nine-stage/vendor/idle-axis-hosting/hosting_core.py": { + "git_blob": "68b536daa9e6546c0aa046934bf840aaa3c3fde3", + "sha256": "d8b90cd5d152df3c7c351230863d9e61816ad5e1f21d69bea1a86a5daad559a3" + }, + "research/native-complex-moment552/engines/base_two_moment.py": { + "git_blob": "14a90fa0e788217856f070382c9e61bd7c603c61", + "sha256": "aee70c242a2f1d225528fabe2002e1564d1dc884797c07d28a831c7878ee9098" + }, + "research/native-complex-moment552/engines/moment.py": { + "git_blob": "7d697cb45203fe72d97037403d6da41f71f3b7fd", + "sha256": "81cbc864e106418fc7854322746f72180cb8110ff39f74450a3b8d55a82c1482" + }, + "research/native-complex-moment552/engines/outer.py": { + "git_blob": "43007488ad2c43187c77cc6798beff8b1cd76ad2", + "sha256": "c1ebb52163a7219504c728a5c2b098bf1e50bf20148a2879c5a74c3cadc7c03c" + } + }, + "vendored": { + "vendor/pr1043/CERTIFICATE.json": { + "git_blob": "56400920050c523e6e399f2455137b36c35cf528", + "origin": "PR1043 (Ali Romman, @aliromman) head e309e17f83f5759b1ea1fa24a76f24838784cb4d, research/bit-boundary-persistence/CERTIFICATE.json", + "sha256": "32c6cd6103006d627909cabdaf5083238c661a6582016a8b21075bd01c892eff" + } + } + }, + "negative_controls": [ + { + "name": "vendored_pr1043_certificate_tampered", + "reason": "Fail: sha256 pin: vendor/pr1043/CERTIFICATE.json", + "rejected": true + }, + { + "name": "pr1023_width8_optimality_hardcoded_45_rejects_R438", + "reason": "ValueError: slack per replica", + "rejected": true + }, + { + "name": "dp_with_move_42_4_dropped_vs_exhaustive", + "reason": "Fail: exhaustive enumeration disagrees with the DP (values)", + "rejected": true + }, + { + "name": "runner_up_claimed_optimal", + "reason": "Fail: claimed optimum not certified", + "rejected": true + }, + { + "name": "pr1043_inplace_layout_claimed_optimal", + "reason": "Fail: claimed optimum not certified", + "rejected": true + }, + { + "name": "optimum_profile_with_partial_slot_dropped", + "reason": "Fail: hosted rank mass (bad)", + "rejected": true + }, + { + "name": "endpoint_plus_1e-24_accepted_a", + "reason": "Fail: moment at c + 1e-24 is not below one", + "rejected": true + }, + { + "name": "endpoint_plus_1e-24_accepted_b", + "reason": "Fail: moment at c + 1e-24 is not below one", + "rejected": true + }, + { + "name": "window_child4_tightened_to_stages_0_1", + "reason": "Fail: infeasible: Hall violated by children [4]", + "rejected": true + }, + { + "name": "window_child6_tightened_to_stages_7_8", + "reason": "Fail: infeasible: Hall violated by children [6]", + "rejected": true + }, + { + "name": "r439_supply_into_r438_optimum", + "reason": "Fail: infeasible: 439 helpers per stage do not fit the R438 optimum", + "rejected": true + }, + { + "name": "placement_stage_outside_window/seed14", + "reason": "Reject: outside untouched window", + "rejected": true + }, + { + "name": "placement_stage_outside_window/independent", + "reason": "Fail: stage outside window", + "rejected": true + }, + { + "name": "placement_cell_collision/seed14", + "reason": "Reject: coordinate collision", + "rejected": true + }, + { + "name": "placement_cell_collision/independent", + "reason": "Fail: cell collision", + "rejected": true + }, + { + "name": "placement_duplicate_helper/seed14", + "reason": "Reject: duplicate helper", + "rejected": true + }, + { + "name": "placement_duplicate_helper/independent", + "reason": "Fail: duplicate (stage, helper)", + "rejected": true + }, + { + "name": "placement_missing_helper/seed14", + "reason": "Reject: missing helper", + "rejected": true + }, + { + "name": "placement_missing_helper/independent", + "reason": "Fail: missing (stage, helper)", + "rejected": true + }, + { + "name": "placement_slot_extent/seed14", + "reason": "Reject: slot extent", + "rejected": true + }, + { + "name": "placement_slot_extent/independent", + "reason": "Fail: slot extent", + "rejected": true + }, + { + "name": "placement_helper_out_of_domain/seed14", + "reason": "Reject: owner domain", + "rejected": true + }, + { + "name": "placement_helper_out_of_domain/independent", + "reason": "Fail: index domain", + "rejected": true + }, + { + "name": "placement_width7_residual/seed14", + "reason": "Reject: helper residual width", + "rejected": true + }, + { + "name": "placement_width7_residual/independent", + "reason": "Fail: residual width", + "rejected": true + }, + { + "name": "placement_host_pair_active/seed14", + "reason": "Reject: host is active data", + "rejected": true + }, + { + "name": "placement_host_pair_active/independent", + "reason": "Fail: host pair active at stage", + "rejected": true + }, + { + "name": "placement_audited_as_R439/seed14", + "reason": "Reject: missing helper", + "rejected": true + }, + { + "name": "placement_audited_as_R439/independent", + "reason": "Fail: missing (stage, helper)", + "rejected": true + } + ], + "placement": { + "audits": "seed14 placement_audit, independent audit_slots, seed14 owners_for_replicas", + "builders_agree": "seed14 allocate == PR442 hosting_core.expand", + "hosted_residual_roles": 126144, + "idle_per_replica": { + "2": 433, + "34": 1, + "4": 444, + "42": 10, + "6": 444, + "7": 666 + }, + "occurrences_per_replica": 3942, + "selection": { + "patterns": [ + [ + 0, + [ + 8 + ], + 222 + ], + [ + 1, + [], + 222 + ], + [ + 2, + [ + 8, + 8, + 8 + ], + 222 + ], + [ + 3, + [], + 222 + ], + [ + 4, + [ + 8, + 8, + 8, + 8, + 8 + ], + 222 + ], + [ + 5, + [], + 222 + ], + [ + 6, + [], + 10 + ], + [ + 6, + [ + 8 + ], + 1 + ], + [ + 6, + [ + 8, + 8, + 8, + 8, + 8 + ], + 211 + ], + [ + 7, + [ + 8, + 8, + 8 + ], + 222 + ], + [ + 8, + [ + 8 + ], + 222 + ] + ], + "stages": [ + [ + 0, + 8, + 0, + 222 + ], + [ + 2, + 8, + 0, + 216 + ], + [ + 2, + 8, + 1, + 438 + ], + [ + 2, + 8, + 2, + 12 + ], + [ + 4, + 8, + 2, + 426 + ], + [ + 4, + 8, + 3, + 438 + ], + [ + 4, + 8, + 4, + 246 + ], + [ + 6, + 8, + 4, + 192 + ], + [ + 6, + 8, + 5, + 438 + ], + [ + 6, + 8, + 6, + 426 + ], + [ + 7, + 8, + 6, + 12 + ], + [ + 7, + 8, + 7, + 438 + ], + [ + 7, + 8, + 8, + 216 + ], + [ + 8, + 8, + 8, + 222 + ] + ] + }, + "slot_list_sha256": "1ef76bb87f1cfac7b4281c308bd71064c1fb1b6b4b267cfe9f3290212a5de11e", + "split": "all 10 idle 42-copies and the one-residual copy in child 6" + }, + "scope": "bit headroom only; no new kappa; the selected record is complex-bound; every R438 row is conditional on PR1043 (open, not admitted); row (b) also on the transported word of verify_transport.py", + "slots_per_replica": { + "14": 444, + "28": 444, + "42": 444, + "7": 666 + }, + "status": "PASS_R438_WINDOW_REHOST", + "width8_units_per_replica": { + "capacity": 3996, + "slack_R438": 54, + "slack_R439": 45 + }, + "windows": { + "0": { + "capacity": 14, + "pair": 1, + "stages": [ + 0, + 1 + ] + }, + "1": { + "capacity": 7, + "pair": 1, + "stages": [ + 2 + ] + }, + "2": { + "capacity": 28, + "pair": 2, + "stages": [ + 0, + 1, + 2, + 3 + ] + }, + "3": { + "capacity": 7, + "pair": 2, + "stages": [ + 4 + ] + }, + "4": { + "capacity": 42, + "pair": 3, + "stages": [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + }, + "5": { + "capacity": 7, + "pair": 3, + "stages": [ + 6 + ] + }, + "6": { + "capacity": 42, + "pair": 0, + "stages": [ + 3, + 4, + 5, + 6, + 7, + 8 + ] + }, + "7": { + "capacity": 28, + "pair": 1, + "stages": [ + 5, + 6, + 7, + 8 + ] + }, + "8": { + "capacity": 14, + "pair": 2, + "stages": [ + 7, + 8 + ] + } + }, + "windows_feasibility": { + "configs_checked": 22, + "feasible": 22, + "note": "x4 idle 42-copies in child 4, 10-x4 in child 6, one-residual copy in child 4 or 6; children 0,2,7,8 full; capacity-7 children host nothing" + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/CALLER-GEOMETRY.json.gz b/research/bit-stage-mixedwidth-packing/provider/inputs/CALLER-GEOMETRY.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..1f6b960978daa060627462780ebe07643482dc67 GIT binary patch literal 105560 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 z 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

tNSiiBv?Fm4SBLHBu3hS?u7uS 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 Un!LMP(?^&>R;A@T^BO1qA6y8tx&QzG literal 0 HcmV?d00001 diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/CONTROLLER.py b/research/bit-stage-mixedwidth-packing/provider/inputs/CONTROLLER.py new file mode 100644 index 0000000000..3df12bd632 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/CONTROLLER.py @@ -0,0 +1,264 @@ +# Generalised from PR #443's global_kernel.py to an arbitrary odd stage count S = 2K+1 (compressed window m = 1+7S) +# by DreamingOfClouds with Claude Opus 5.5 (Anthropic), via Claude Code. At the defaults (S = 9, 32 replicas) the emitted +# GLOBAL-TEMPLATE.json.gz and GLOBAL.json equal PR #443's (GLOBAL.json except wall-clock seconds). +# Kernel integration of PR436/PR386 by chafreaky, with OpenAI Codex assistance. +# Original copyright and attribution retained below. This variant uses explicit +# residual isometries and mixed-width banks; the original all-zero-start +# requirement is replaced by the verified kernel entrance contract. +"""Source-bound compressed S-stage (S = 2K+1 odd, default 9) bit template with independent replicas. +PR386 global identity and PR436 generalization by Zhihao Chen and eumemic, +with their disclosed OpenAI Codex and Anthropic Claude assistance, Apache-2.0. +PR439 explicit residual routes and this replication extension by chafreaky, +with OpenAI Codex assistance. All owner assignments and emitted calls are checked. +Historical PR386 regression is performed by the unchanged parent wrapper. +""" +import argparse, gzip, hashlib, json, struct, time +from collections import Counter +from pathlib import Path +import os, sys +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../e8-r740-replica32/code')) +from bank_routes_k import placement, validate_isometries +from config import REPLICAS + +H,L,K,T,M=8,9,4,REPLICAS,64 # overwritten in main() from --stages / --replicas +NAMES={5:'FIVE',7:'SEVEN',9:'NINE',11:'ELEVEN',13:'THIRTEEN'} +def sha(p): return hashlib.sha256(p.read_bytes()).hexdigest() +def write(p,x): p.write_text(json.dumps(x,indent=2)+'\n') + +def recipe(K): + out=[dict(kind='local',stage=0,pair=0,reverse=False)]; stage=1 + for j in range(K): + out.append(dict(kind='local',stage=stage,pair=j,reverse=True)); stage+=1 + if j=5 and a.stages%2==1; L=a.stages; K=(L-1)//2; T=a.replicas; M=1+7*L; NOBANK=a.no_banks + if L!=9: assert NOBANK, 'bank tiling is only emitted for the nine-stage layout; use --no-banks and host every residual' + DEFICIT=T*(2*K*120-9*H*L) + wp=a.word; w=json.loads(gzip.decompress(wp.read_bytes()) if wp.suffix=='.gz' else wp.read_bytes()) + V,R=w['v'],w['R']; LOCAL=2*V+R; DATA=2*K*V*T; LIVE=DATA+L*R + assert (w['h'],V,w['form'])==(8,120,'/2') + geo=json.loads((out/'GEOMETRY.json').read_text()) + assert geo['status']=='PASS_COMPRESSED_%s_BIT_GEOMETRY_AND_BANK_BLOCKS'%NAMES[L] and geo['stages']==L and geo['m']==M + # the port routes depend only on the labels: same 120 label vectors, in the same order + assert len(geo['ports'])==V and all(p['port']==t and p['q']==w['lines'][t] for t,p in enumerate(geo['ports'])) + rp=a.local_check/'records/249-records.bin'; raw=rp.read_bytes(); rec=list(struct.iter_unpack('<6i',raw)) + state=json.loads((a.local_check/'records/249-states.json').read_text()) + fs=json.loads((a.local_check/'records/frames.json').read_text())['frames'] + dims={int(f):z['dim'] for f,z in fs.items()} + lg=json.loads((a.local_check/'cout/legality.json').read_text()) + cc=json.loads((a.local_check/'cout/columns.json').read_text()) + assert lg['status'].startswith('PASS') and cc['status'].startswith('PASS') + assert (state['v'],state['n'])==(V,LOCAL) and lg['copies']==lg['erasures']==9 + ADDS=lg['common_frame_ADDs'] + assert cc['formal_columns_checked']==4*V+R and cc['local_scalar_additions']==ADDS + initial=[state['initial'][str(i)] for i in range(LOCAL)] + final=[state['final'][str(i)] for i in range(LOCAL)] + assert all(dims[final[i]]==H for i in range(2*V,LOCAL)) + widths=[H-dims[initial[i]] for i in range(2*V,LOCAL)] + ENT=sum(H-z for z in widths) + if NOBANK: place,NB=None,None; LIVE=DATA + else: + place,NB=placement(widths,T,M) + assert T%8==0 and T*(H*R-ENT)%M==0 and NB==T*(H*R-ENT)//M + LIVE=DATA+L*NB + isometries=json.loads(a.isometries.read_text()) + assert validate_isometries(isometries,w['frames'],w['lines'],dims)==set(initial[2*V:]) + streams={}; checks={}; localH=None + for reverse in (False,True): + cur=(final if reverse else initial)[:]+[-1]; val=[1<=0 + cur[x]=newf + if f: hist[f]+=1 + events.append([0,x,oldf,newf,f,int(reverse)]) + elif op==1: + assert cur[x]==cur[y]==f and x!=y and xFBTBi$e^UDBOHQecEq(lL63BVYXf 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%0D#o{m4v0S^lXMc!B^5s|rQj}G= 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 literal 0 HcmV?d00001 diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/PR4183-RESULT.json b/research/bit-stage-mixedwidth-packing/provider/inputs/PR4183-RESULT.json new file mode 100644 index 0000000000..12fc1c8c17 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/PR4183-RESULT.json @@ -0,0 +1,191 @@ +{ + "controls": { + "dirty_private_copy": "COPY zero at 23524", + "early_source_without_target_read": "ADD frame at late178read", + "omit_direct_source": "Boolean endpoint differs", + "omit_final_rank1_completion": "final frames", + "omit_rank7_restoration": "MOVE frame at 33619", + "retain_old_compensation": "Boolean endpoint differs", + "retain_old_dirt_subtraction": "Boolean endpoint differs", + "underprice_new_query_rank6": "MOVE exact rank" + }, + "exact_integer_restored_non_targets": 549, + "geometry": { + "all_projectors_dyadic": true, + "frames": 636, + "helper_widths": { + "4": 5, + "8": 433 + }, + "largest_query_rank": 7, + "local_parent_dimension": 8, + "nested_pairs": 2394, + "new_query_rank": 7, + "retired_helper_width": 8 + }, + "input_columns": 660, + "inputs": { + "GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "no_new_kappa": true, + "old_compensation_reads": 55, + "physical_helper_endpoint": "unchanged D_FULL for469, not physical identity", + "prefix_difference": { + "391": { + "469": -1 + }, + "413": { + "469": 1 + }, + "444": { + "469": -1 + } + }, + "price": { + "all_parameter_domain": "m>0 and 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 H`HlYziN5}> literal 0 HcmV?d00001 diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/EVIDENCE.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/EVIDENCE.json new file mode 100644 index 0000000000..c2c347abc2 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/EVIDENCE.json @@ -0,0 +1,46 @@ +{ + "schema_version": 1, + "purpose": "Byte-exact predecessor proof evidence used by PROOF.md; no predecessor scientific result is claimed as new.", + "files": [ + { + "path": "evidence/pr2731-README.md", + "source_pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/2731", + "author": "starship-s", + "commit": "46c0c3554608a1096816ad668c755d3b5b7a8c0b", + "source_path": "research/selected-residual-live-volume/README.md", + "git_blob": "ac5b826f9c34e1faadc5d5a02d5d260823112078", + "sha256": "19683df4394de299cbd7e1cce39bf9434ad260b1a37006587cf9aed84c9c0a03", + "usage": "residual and retained-role lifetime proof" + }, + { + "path": "evidence/pr2708-README.md", + "source_pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/2708", + "author": "Nick Petalas (petalas)", + "commit": "2982489cc00a17bd1c7ee1e206e975eda9bcb64d", + "source_path": "research/selected-route-live-volume/README.md", + "git_blob": "79b8742f32b4ffb991f91ddd2d3c6be693084e6d", + "sha256": "5906f6b7b2c8eea90e441476c4cbd60fe2ef981b690c63357bcfe67e3104aeef", + "usage": "route and caller-phase lifetime proof" + }, + { + "path": "evidence/pr2688-PROOF.md", + "source_pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/2688", + "author": "ywz65", + "commit": "1b9e1ed8793ffdde3c4b115641f0e644a9289923", + "source_path": "research/selected-directory-storage-reserve/PROOF.md", + "git_blob": "1395e1941863e40ff6d62dd91c41de2cb56edae9", + "sha256": "fa9bec0952468e4acb760a88d45d5be216325650e1a4080cf590e07b90c9f533", + "usage": "canonical-directory storage theorem" + }, + { + "path": "evidence/pr2688-NOTICE.md", + "source_pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/2688", + "author": "ywz65", + "commit": "1b9e1ed8793ffdde3c4b115641f0e644a9289923", + "source_path": "research/selected-directory-storage-reserve/NOTICE.md", + "git_blob": "f2b49cdef83a4a685fad32c01fba93e12cfcb5a8", + "sha256": "c899fccf7bd32397f0ddd85e4af35a166cefb3e3ae3407ec40edc3ab2051b617", + "usage": "original source attribution" + } + ] +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/PREDECESSOR.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/PREDECESSOR.json new file mode 100644 index 0000000000..56d76c357b --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/PREDECESSOR.json @@ -0,0 +1,208 @@ +{ + "pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/2697", + "head": "a53fdf4bcbe33c6732f0bec1badc8c023380f9d1", + "author": "Jose Manuel (jmbarrancoml)", + "path": "research/selected-bit-node", + "files": { + "NOTICE.md": { + "sha256": "c446b32b8a621844fb2fbe654810c8122035bdd43fed2132f1137d98cb6f9943", + "git_blob": "ef9f81510db86eaf2f0a7191d85e92a6db30ddc0" + }, + "PROOF.md": { + "sha256": "88754d57bae35a2089d9de221ff32ba802b7a56b810f96271f3ea36985edfb14", + "git_blob": "a4746d1786f41e45a36fdedf37966b80fbab3562" + }, + "README.md": { + "sha256": "15631eb826b2d8d54fbee18fb6f70ee035e172d524c2a209b6c467c3f0204f64", + "git_blob": "988ff622029aff49d7e99deb2468684d904bc852" + }, + "RESULT.json": { + "sha256": "0d94c5e9150f3fbd603526c67ea33168d3ba45e158aaf722e848bf5c316a37a8", + "git_blob": "7b7dfe0eab22a7b511483f268b97a7c707fd8b90" + }, + "SOURCES.json": { + "sha256": "1b02a5c607a5967948988c3beaf37d9975d650ad501a99fcf74c135dc1f05fdd", + "git_blob": "4fef1a4d6c2d5e2620d3506d6032f9226870ed39" + }, + "TASK.json": { + "sha256": "a4cd54d4b09ad12a90a5feeb39a127f0f0d5a2a04f9f88554c5fc3ee0cfe77f4", + "git_blob": "eb2ce7cc00df816daf566f101d56a0330852c1d9" + }, + "VERIFY.json": { + "sha256": "e1dd0ee5f267ffa515bb345054ff8637cfedb0079b0d2da29b90b7848264926e", + "git_blob": "69c7ad75abe494be386f73a5d51359b9053cd9be" + }, + "cardinal_counts.py": { + "sha256": "59ddeac102a0cc51fa49b15aae6aeb68cd68ed217fa974ce916372a177d2ec8f", + "git_blob": "6a14feac45094ae9156e8c2c982d6727544f180e" + }, + "catalogue.py": { + "sha256": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "git_blob": "0efc0575a7623ac41c094d2e8772beda5a9fdc29" + }, + "check_headers.py": { + "sha256": "a41dab0c487c341eb32b34a03af74454e15e9e61e7386a1ca426d83f3b68b1ca", + "git_blob": "1c372b19e19b838a89c0e64daeda15ec6b49f079" + }, + "check_layout.py": { + "sha256": "8f776a21dc0e31f9738d822cfda38db92f1e3672afb880d4246ec5e084a50a41", + "git_blob": "174d843716a684145f934cb55a612bca85aad725" + }, + "check_runtime.py": { + "sha256": "5357e4ff255f17c4209aaf71a3413a4148475f11180c4f829e8f0ebacd2877cb", + "git_blob": "5647693b3a5c1555b65e281c6609f98b92d45542" + }, + "check_sources.py": { + "sha256": "6463c2724e04a313181b78e90a17cd62ee42465754902cca3e9a65c6140a15a1", + "git_blob": "9219cdf863d9f060d6e38a4f2f4760fd227af003" + }, + "consumer.py": { + "sha256": "b28ec97b0873ff2be25aff4bdde268247ffcec0d21279d0ada196de19a0bdc66", + "git_blob": "24b53521fce94d3349072cf47d70e62195f4d541" + }, + "control.py": { + "sha256": "d3a93e54bb7d333b73917586407d11674d38b5c3fda4fbdc436fb5293ae7786a", + "git_blob": "4f6ac09bffab43dbccc470bd0bde2ffbe969a8b2" + }, + "control_checks.py": { + "sha256": "5ea6ded8c2508fbb00d93655affdfe7907ffb60916389e0736249c003a7a5148", + "git_blob": "712cfddc4caaad9e788d97b0e1e3f623172c43ed" + }, + "driver.py": { + "sha256": "ee9e42fe95ab28fdd5e927c2d46fd480305aaad610eb2ca7ae514a5d22d9f0ac", + "git_blob": "0bdee4c9e348259b470a636a98e7657770f97fae" + }, + "fresh_rows.py": { + "sha256": "e4ae08fbd658add630eb7754ebe0cbcb42c6f39cf4128f9cb92e27fcf5213a7d", + "git_blob": "aa3a327604308d3a5c7a27b65f5e631d430ab093" + }, + "layout.py": { + "sha256": "7534b0166805f2ae8d11495c811d2bd272cea89c89b6bb5251fd411c89245a20", + "git_blob": "267d5ab98cd013ee82ba75e6d41609f1778af25f" + }, + "model.py": { + "sha256": "c937ae8e46162f88fc1cd7646d3b22c99273029ad0f0e3131f46ddec230676cb", + "git_blob": "9fb82fa57d29cdf8402f91534dffed8f586ced6c" + }, + "node.py": { + "sha256": "b88fc9ac0b22d939311ff4f7aff788e8c87a64fd5e866498e59bd27940ee3f28", + "git_blob": "13badda6f059da2132cbe325c071307e5191baa3" + }, + "packet_engine.py": { + "sha256": "ce7f132a6a69c802406f07c4a2119ef921e8978520ff58d5eeaeedb982c257f2", + "git_blob": "27a0dbf82e78252beede56ff86f5933c93eb55c1" + }, + "peel.py": { + "sha256": "3de018e68601566c364c7568b110f60c1bf34941b846cdffb94401bb799f85e3", + "git_blob": "2ae1769a9726ab738d3981891d0b76beccac2d99" + }, + "topology.py": { + "sha256": "384d456ddba76de137a63b50019d5bba2e9f6daa4177c91643e0565d4cf1d44b", + "git_blob": "39a2916c207d04be5efc44750d8606f5da0c2990" + }, + "vendor/binding.py": { + "sha256": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b", + "git_blob": "21a5a21220a18ab62a19ac403a9944bc3a8665c8" + }, + "vendor/bitstream.py": { + "sha256": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783", + "git_blob": "4d1fd4abb0f2aabe833e5cbc9efb51039739e7ca" + }, + "vendor/cardinality.py": { + "sha256": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22", + "git_blob": "b8ba857e32c5903408e1e61ff916300848b4a208" + }, + "vendor/check_support.py": { + "sha256": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964", + "git_blob": "e1f961df9fa3a441fc5b600d1288a8d038eca51e" + }, + "vendor/children.py": { + "sha256": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6", + "git_blob": "ce4935f838516e2b08d13bec767cb803786fbc6b" + }, + "vendor/controller.py": { + "sha256": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c", + "git_blob": "c631a9e77fbcccf0e8f448adc22978728aed7b60" + }, + "vendor/counts.py": { + "sha256": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069", + "git_blob": "81b48940ce222290a40d4fb349ce827f4788469d" + }, + "vendor/directory.py": { + "sha256": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7", + "git_blob": "c74cacf5ce809c0561d374f137a52df0992b4226" + }, + "vendor/episode.py": { + "sha256": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff", + "git_blob": "30d11ff4f333813855d36da3eb5a1ab0e154bafe" + }, + "vendor/forms.py": { + "sha256": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4", + "git_blob": "6667c0b772a63f0059c7caffec63e0d919a92398" + }, + "vendor/low_codes.py": { + "sha256": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87", + "git_blob": "737edfc4a10f4b7b3b97a7cef4b40864efd806e6" + }, + "vendor/matrices.py": { + "sha256": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459", + "git_blob": "5d497353efbb9eeaaf4facd96ab40ffb0f3aa20d" + }, + "vendor/numeric.py": { + "sha256": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514", + "git_blob": "6d4ebca8398008375b8f4762d1a9f1514e8c2611" + }, + "vendor/oracle.py": { + "sha256": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67", + "git_blob": "244f131466698a3ace10b657242fe1f65c07fd1f" + }, + "vendor/packet.py": { + "sha256": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5", + "git_blob": "ebc9b616514412b80c56d523776e6ba5d6766453" + }, + "vendor/plan.py": { + "sha256": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "git_blob": "48255d5454308c07635fae4e7eb4873b0bd2a4f8" + }, + "vendor/records.py": { + "sha256": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372", + "git_blob": "4f00467a0ff580954ad2fd0c7380240c753ddef3" + }, + "vendor/residual.py": { + "sha256": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df", + "git_blob": "3d070d2539a529f3b14ecb086a92a3db056229fe" + }, + "vendor/routes.py": { + "sha256": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada", + "git_blob": "35531201dc349a811dfabc6f1f6e64697d665194" + }, + "vendor/selection.py": { + "sha256": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b", + "git_blob": "2c28f1aaec104a75c4e6c170b3e6a60300ee6700" + }, + "vendor/sources.py": { + "sha256": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62", + "git_blob": "16d5e7e6a28018f1e2d76d61efe2d54f6a6941d4" + }, + "vendor/stream.py": { + "sha256": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5", + "git_blob": "5e5a4bb0f98971447043e25d4dd6991bfc070389" + }, + "vendor/stream_runner.py": { + "sha256": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249", + "git_blob": "efff281d4c4be5c1378e31404fbcc634fe4ade59" + }, + "vendor/trace.py": { + "sha256": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984", + "git_blob": "bb845a90f5bcf006e683e581e385936208f6a1f4" + }, + "vendor/words.py": { + "sha256": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9", + "git_blob": "8d4ba37e2778acb35b34e0719df2caf138fbeb50" + }, + "verify.py": { + "sha256": "cd83797d1f420f7e5de61c1a693110b4ee0c80bac0adae4699599046b7f76f8a", + "git_blob": "121acc1ff15ec85a8011e96eda2eb587608413b9" + } + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/PROOF.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/PROOF.md new file mode 100644 index 0000000000..1a08e57eac --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/PROOF.md @@ -0,0 +1,320 @@ +# Executable all-size selected BIT caller and complete logical reserve + +This package extends the selected first-range caller of [PR2697](https://github.com/CrocSwap/integer-mult-bounds/pull/2697), by Jose Manuel (`jmbarrancoml`), to every internal width n>=64. It implements the previously missing whole-packet recursive call and return, with an independent fresh-row coordinate, exact projected spectators and separate numerical frame banks. It also replaces the inherited digit-pass address sign by a linear-traffic sign, which is necessary when the fallback normal form is repeated over arbitrarily many columns. + +The result is a scoped construction and source-level proof. It supports the executable baseline p=1 and a complete logical live-symbol reserve under the stated root coupling. It does **not** establish the selected native H2 saving `a=384599/10^10`, a fixed-physical-tape compiler, the outer borrowing wrapper, the complex supplier, or a complete multiplication theorem. The selected frontier is unchanged. + +`predecessor/` preserves the PR2697 package at exact head `a53fdf4bcbe33c6732f0bec1badc8c023380f9d1`; [PREDECESSOR.json](PREDECESSOR.json) gives its author and byte pins. The selected finite operators, normal forms, chronological guards and generated-weight grammar remain attributed to that package and its [source notice](predecessor/NOTICE.md). The compatible stock comes from [PR2234](https://github.com/CrocSwap/integer-mult-bounds/pull/2234), `d047ef86fbc5b1614d3d8e2b8d3441413beab73f`, retained in [selected-bit-local-ring-sweeps](../selected-bit-local-ring-sweeps/PROOF.md). The earlier [written recursive closure](../selected-bit-recursive-closure/PROOF.md) supplies the paid profile and moment estimates; the present contribution implements and audits the missing all-size caller boundary. + +## 1. Complete input and endpoint contract + +Fix an odd prime q, precision w>=1, atom radix A=q^w, m=64, W=28416, P=28425, + + N = |GL_64(F_q)|, H = q^(4096(w-1)), + K = lcm(W,P) N H = 269241600 N H, + D(n) = 0 for n<64, + D(n) = 1+D(42 floor(n/64)) for n>=64. + +At a node of width n>=64, use fresh-row count R=t K^D(n), t>=1. The complete input order is + + [C physical frozen-prefix ordinals][R fresh rows] + [B][head A^n][G][tail A^n][S]. + +C,B,G,S are arbitrary positive complete extents. Frozen prefixes may repeat and carry arbitrary correlations in their Boolean payload; equal field values do not identify their physical ordinals. The incoming diagonal unit a_i is generated by the source-bound encoded program. It reads the frozen prefix and encoded coordinate i only. It cannot inspect fresh family/low/high/unused-row coordinates, body addresses or spectator values. + +The required address endpoint on each frozen prefix is + + head_i' = a_i tail_(n-1-i), + tail_(n-1-i)' = a_i^(-1) head_i, 0<=i=1 and delta=n-64f, 0<=delta<64. `peel.events` handles the delta pairs with original head coordinates 64f+i and absolute tail coordinates 2n-1-(64f+i), using the original frozen incoming coefficient at 64f+i. It appends no fictitious current field. The remaining logical core has 128f atoms and embedding + + phi(p)=p for p<64f, + phi(p)=p+2delta for p>=64f. + +Its middle spectator is the ordered product `[peeled head A^delta][G][peeled tail A^delta]`. This mixed-radix regrouping is injective, so preserving it restores each original coordinate rather than only its product size. + +For a child let a=phi(first), b=phi(second), c=width. The runtime checks c>0, a+c<=b, b+c<=2n, that each complete chunk lies in one original bank, and that mapping each final atom agrees with a+c-1 and b+c-1. These last checks rule out a chunk crossing the embedding discontinuity. + +The complete selected packet can then be read, without moving any payload, as + + [C H frozen prefixes][U][B'][A^c child head][G'][A^c child tail][S'], + +where + + B' = B*A^a * (G if a>=n else 1), + G' = A^(b-a-c) * (G if a0 | suffix | +| tail half-reset on k>=64 | kf | (k+1)f-d | d=floor(f/2)>0 | before | + +A half-reset retains the central A^(f-2d) spectator, including the middle atom for odd f. For f=1 it is omitted. In the good case B'=B, G'=G*A^((128-2r)f+2delta), S'=S. Every selected child satisfies the bank and contiguity checks. + +## 3. Program extension, ordinal preservation and completed return + +For c<64, `trace.child` keeps the completed eight-primitive weighted leaf. For c>=64 it yields ENTER, INVOKE, RETURN with the same encoded boundary. `packet_engine` checks the parent identity, source code, child kind, field, orientation, half flag, positions, width and depth, and permits exactly one INVOKE between matched boundaries. Primitive events are forbidden inside an unresolved internal child. + +On INVOKE, `recursive_call.child_call` constructs one source-bound child Request and calls the inherited `children.extend` once. It appends the parent source/rank/field/orientation/half and exact parent/child sizes. `Callback.step` verifies the exact rf, f or floor(f/2) formula and strict contraction. The new descriptor depends on the unchanged parent program and fixed low-class branch, never on a selected numerical high field. Reading the first directory prefix validates the encoded context; it does not choose the branch or replace the complete directory by that representative. + +The child receives the full current directory of C H physical prefixes, with h+1 frozen fields, and the whole selected packet. The call lies outside the prefix loop. No high-prefix value or repeated frozen prefix is deduplicated. The child's own `produce` appends its new field after those h+1 ancestors. Its incoming weight grammar has exactly the old fields and cannot read that new field. Ancestor field ordinals and their original source codes remain authenticated by the inherited callback. + +`Frame` creates separate residue/index arenas, copies encoded words and program symbols without runtime integer decoding, and constructs the child's `SelectedNode`. The scheduler uses an explicit generator stack, so Python call-stack depth does not impose an upper width limit. A single shared fixed-capacity arena would not suffice for arbitrarily many suspended parents. + +`node.selected_topology` retains one source topology on the shared fixed-q +Catalogue. The inherited recipe/call caches are therefore bounded by source +labels and low classes, rather than by the number of completed child invocations. +This sharing is necessary for the one-time compilation allowance F_q below. + +After the child returns an owned output, the engine clears its previous owned current packet and resumes the exact saved parent trace. The input source remains preserved. Family scatter always merges into the latest family state, including earlier returned roles. Private COPY retains the copied source for its literal lifetime; ERASE still checks the inherited chronological equality guard. The generated child preserves every spectator, including unused U, so it cannot invalidate those guards. + +## 4. Termination, compatible stock and endpoint induction + +Every child has positive c<=42f<=21n/32=2^80 and the root-coupled precision/history domain stated in section 6. The endpoint construction itself applies to odd source-admissible primes, but the displayed epsilon and imported moment gaps are not asserted for all odd primes. + +The inherited sign uses w digit passes. A fallback has signs in every column, so retaining that implementation would introduce an f*w local factor. `linear_sign.sign_address` repairs this concrete all-size issue. On `[before][A][suffix]`, copy the zero slice; move by charged unit head steps to the last nonzero suffix slice; copy each nonzero slice forward while visiting their starts in reverse order; then advance to the next outer row. This implements x->-x modulo A, preserves the source and resets both heads. Total source-head movements, including rewind, are at most 6V. Counter initialization and decrement remain explicit and have the inherited amortized linear scan charge. Thus all f signs cost O(fV). + +Adapter ADDs have O_q(V) complete-fibre cost after their numeric preparation is charged to the associated complete fibres. There are O_q(f) adapters. Peel has at most 63 pairs and costs O_q(wV). Owner routes and ordinary leaf atom swaps still use O_q(wV) implementations. The current code therefore has the **p=1 baseline**, not a general p=1-a<1 primitive contract. + +For completeness, the preparation absorption is an asymptotic source argument, not a measured finite invoice. Fixed-size ring arithmetic is polynomial in L,I,h. A pair expression branches at most twice per ancestor, giving at most 2^h times a fixed polynomial. Under the root coupling 2^(h+1)<=8e² and e<=w^(10000/17), this is a fixed polynomial in w. Its ratio to the complete target-fibre factor q^w has a finite supremum over w>=1. Old/current directory and frame setup costs have the same type of polynomial absorption. Spectator count initialization is charged to its scan; arbitrary spectator sizes stay in canonical count tapes. For independently chosen widths/history, retain those preparation terms explicitly. + +The source-bound paid profile is + + (H_1,H_2,H_3,H_4,H_5,H_6,H_7,H_42) + = (381024, 400416, 22752, 26880, 29376, 17376, 26784, 288). + +Here T(n,w) denotes a uniform normalized upper bound over admissible descendant +contexts with the original root e and its coupling retained. Atom precision w +is fixed for the entire recursion; it is not recomputed from a child's n. +The time unit is charged logical Tape reads, writes and unit head movements, +with the stated preparation absorption. It is neither Python wall-clock time +nor a bound for the still-unimplemented fixed-physical-tape lowering. + +A bad class has at most 3*(127+254+16256)=49911 main/half child calls. This is below the inherited 32*64² allowance. Their widths are at most f. For each paid request, the retained nonzero-minor argument bounds the bad fraction by 2*64^3/q: the minor union bound is conditioned on GL64, whose density is greater than one half. At the lower allowed boundary, 2*64^3*10^16 < 2^80, so the same epsilon=10^-16 is valid uniformly for every allowed prime. There is no union over all request labels. With F=32*64²*sum H_r=118606528512, the normalized stopped recurrence is + + T(n,w) <= Cw (0=64). + +C depends on fixed q and the pinned source, not original e, spectator values or a suspended parent's contents. The retained moment receipts give + + mu_1 = 2874298095721977/2890625000000000 <199/200, + mu_(1-c0) <9999/10000, c0=17/10000, + mu_t = [sum H_r(r/64)^t + epsilon F(1/64)^t]/W. + +Induction using the monotone proposed bound, not an assumed monotonicity of measured runtime, gives + + T(n,w) <=200Cn +10000Cn^(1-c0)w. + +This imports the existing moment evidence; it is not a new moment certificate. It supplies the baseline recurrence of the actual completed caller. Obtaining the selected H2 saving requires stronger implementations of every named route/leaf primitive, and their full numerical billing. Replacing only a leaf callback is insufficient. + +## 6. Complete reserve domain and statement + +The byte-exact proof exports are authenticated in [EVIDENCE.json](EVIDENCE.json), with author and source-path attribution in [evidence/NOTICE.md](evidence/NOTICE.md). The local storage inputs are [PR2731](https://github.com/CrocSwap/integer-mult-bounds/pull/2731), the [residual lifetime proof](evidence/pr2731-README.md) giving 3v+3r at `46c0c3554608a1096816ad668c755d3b5b7a8c0b`; [PR2708](https://github.com/CrocSwap/integer-mult-bounds/pull/2708), the [routing/key lifetime proof](evidence/pr2708-README.md) at `2982489cc00a17bd1c7ee1e206e975eda9bcb64d`; and [PR2688](https://github.com/CrocSwap/integer-mult-bounds/pull/2688), the [directory storage proof](evidence/pr2688-PROOF.md) at `1b9e1ed8793ffdde3c4b115641f0e644a9289923`. These sharp component results are predecessor work. The new reserve combines them with the all-size code's actual suspended-parent, numerical and control lifetimes. + +The space unit below is one live logical tape symbol, including LEFT/RIGHT/record delimiters. Cleared storage is reusable. This is not a Python heap bound. Observers that retain histories and external meter histories are checker instrumentation and are excluded. + +Put W=28416, N=|GL_64(F_q)|, H=q^(4096(w-1)), A=q^w, and + + K = 269241600 N H = lcm(28416, 28425) N H. + +Use distinct notation A for the atom radix; the constant 269241600 is the row-stock multiplier, not the atom radix. Let D(n)=0 for n<64 and D(n)=1+D(42 floor(n/64)) otherwise. A root with fresh-row count t K^D(e), t a positive integer, has sufficient stock on every branch. The algorithm invokes an internal child only for its actual width at least 64; smaller children use the completed eight-primitive leaf. + +Assume q is one fixed prime at least 2^80, the source-bound selected catalogue has 28278 requests, the residue and root-index words have their canonical minimal widths, and the generated history satisfies + + w = ceil(e^(17/10000)), n <= e, + 2^(h+1) <= 8e², 17(h+1) <= 20051w. + +The last inequality may instead be checked directly for the supplied initial history and every descendant. For a history generated from the original root, the global chronological level is never reset at a unit child and h+1<=D(e)<=2 log2(e) at every internal node. The inequality follows from max_(x>=1) log2(x)/x^(17/10000)=1/((17/10000)*exp(1)*log(2)); the rounded constant 20051/17 is conservative. Arbitrarily padded residue/index contexts or an unrelated large supplied history are outside this simplified constant bound; the explicit ledger below still charges their actual widths and lengths. + +For this reserve statement, supply root residue and index arenas of capacity 2^24, matching the child banks constructed by `Frame`. For the runtime inventory described below, all simultaneously live logical symbols, including borrowed input and suspended parents, are less than + + 11 V_root + F_q. + +F_q is the one-time finite source/compiler table storage for the fixed q and selected catalogue. It is independent of e,w,h and every runtime high residue. It can instead be part of the fixed machine description. If charged as work storage, the bound is `(11 + F_q/q²) V_root`, since V_root>=q². This is an explicit separation of compilation from execution, not an unpriced runtime numerical component. + +A uniform four-bit encoding suffices for the record alphabet, whose largest symbol is RETURN=13. Thus the corresponding encoded live contents occupy less than 44 V_root+4F_q bits. This is a storage encoding observation. Scheduling and scanning those contents on a fixed number of physical tapes, with a proved time bound, remains a separate compiler obligation. + +### Active packet volumes and suspended parents + +At one node write its input order as + + [C prefixes][R fresh rows][B][A^n head][G][A^n tail][S], + R = W N H U, + V = C R B G S A^(2n). + +After the fresh-row split, every selected low-class packet has exactly + + v = C H U B G S A^(2n) = V/(WN). + +`layout.child_extents` keeps U as the independent fresh-row factor. It moves each spectator interval into exactly one of B',G',S', including the old external gap once. The child's complete input is the same v-bit packet, not merely its two visible chunks. Its current directory is inherited with C H physical prefixes, and its old current field is frozen exactly once. Consequently, along the single active recursion chain, + + V_j = V_root/(WN)^j. + +This identity is the reason parent families may be retained: their costs form a geometric series. Charging every suspended parent as another V_root would be a different, weaker accounting. + +The row quotient is U=t*9475*K^(D-1) at a node whose supplied stock is t*K^D. Indeed 269241600/28416=9475. A shorter actual child uses fewer than D-1 levels and treats the remaining K power as a positive stock multiplier. No discarded or hidden U factor is allowed in this argument. + +The scheduler retains only one active chain. `recursive_call.Frame` gives each internal child separate residue and index arenas of capacity 2^24. The parent arena remains parked and counted. The parent clears the temporary extended program and temporary first prefix before yielding; `packet_engine` clears an obsolete current packet after each returned child; `node` clears peeled and family copies on return. These lifetime rules are necessary to the geometric accounting. `Frame.close` erases live numerical words and the program, but permanent arena templates and erased-slot LEFT markers are released with the logical frame bank; it does not implement a sequential physical blank-return procedure for them. + +### Local payload and routing-key allowance + +A deliberately coarse 8V allowance at a node covers its own payload and routing keys, including the copies it retains while a descendant is active. This is not a sharp first-range peak result. + +* Source, peeled source and all split families together occupy at most 3V. Merge occupies at most 4V. Peel's completed primitive pipeline is at most 6V: source/current/partial output plus at most three complete local-fibre copies; local fibres partition the complete current packet. +* The selected local call has 661 ordinary roles and at most one private role. PR2731 bounds a completed local residual by 3v+3r, borrowed input included, where r is one physical-prefix fibre. PR2708 bounds the route by 2v+3H(r+J) for w>1, with a smaller w=1 bound, and J=4096(L+1) for actual residue width L. Gather/scatter creates at most one additional native family copy Nv=V/W. +* With J<=r, every local phase is bounded by 3V+680v+V/W. The slack 680 includes all 662 role packets, the source/current/copy retained at an invocation, and the residual or route's active local copies. This quantity is below 4V even using N>=1 and W=28416. At an invocation no partially assembled primitive output exists: `packet_engine` yields before beginning the next prefix loop. +* A new child's own payload is charged in its own8v term. Retained parent references do not create a second physical copy; counting them twice would only increase this conservative allowance. + +Under the hypotheses J<=r follows from r>=A² and L<=bw+2, with b=ceil(log2q). Namely J<=4096(b+3)w<=q^(2w), using b+3<=q, w<=q^(w-1), and 4096<=q. Actual internal packets have a much larger A^(2n) factor, n>=64. + +Thus all payload and keys on the active chain cost at most + + 8 sum_j V_j <= 8 WN/(WN-1) V_root. + +### Explicit metadata ledger before absorption + +Let L be residue width, I root-index width, Q source-code width, and h the frozen history length at the node. Write ell(V)=1+floor(log2V). Canonical count tapes use at most ell(V)+4 symbols including a leading margin and delimiters. All cardinalities generated at an admissible internal node are at most V: this includes H, fresh-row quotients, prefix counts, projected spectator extents, powers of A and their intermediate nonnegative products. The required root stock ensures H<=V even for the deepest internal frame. + +A serialized field occupies exactly + + f = Q + 4096(L+1) + 2 + +symbols. A complete produced directory has + + Delta = 1 + C H (h+1) f + +symbols; the old directory and any one copied prefix are no larger. This includes physical multiplicities, source labels, word delimiters, record delimiters and LEFT. The root input directory is a supplied input of this exact canonical form, not free metadata. + +The exact program size at history length h is + + P_h = 2I + L + 6 + h(Q+2I+90). + +This follows directly from `records.Program`: a ROOT tag, two index words, one residue word and one record delimiter, then h STEP records with six finite fields (one Q-bit and five 16-bit), two index words, and a record delimiter; each encoded word carries WORD_END, and the whole tape carries LEFT. + +The following intentionally inflated ledger covers one frame: + + E(V,h,L,I,Q) = + (2^24+1)(L+I+4) two Word arenas and their templates + + 8 P_(h+1) original/extended/copied programs + + 16(h+3)(2I+L+8) pending/value stacks and pop reversals + + 2^20(ell(V)+4) Count/Counter tapes and saved continuations + + 2^32(Q+1) finite labels, form records, role bindings + + q² + 2^20. bucket and other LEFT markers + +In addition charge 32Delta for coexisting old/current directories and temporary raw-prefix/field copies. The current implementation needs far fewer than 32; this covers directory construction (old+output+saved prefix), one consumer directory and prefix, the child-extension prefix and an inherited borrowed directory, with slack. A child directory is charged to that child's associated complete packet; it is never charged against an isolated header or a single atom. + +Therefore a pre-absorption bound is + + F_q + sum_(active j) [8V_j + 32Delta_j + E(V_j,h_j,L,I,Q)]. + +This formula is also the appropriate form when widths are padded or a supplied history does not satisfy the root-coupled bounds. An arbitrary supplied byte string is not automatically a canonical Program or directory: successful execution checks exact depth, fields and prefix count. If a host separately retains unrelated input files or instrumentation, their actual sizes must be added. No reserve theorem can absorb an arbitrarily large unrelated supplied string into V. + +### Source inventory supporting the constants + +The arena capacity is a source bound, not an inference from a finite test. Every matrix is at most 128 by 256. At most64 such matrices, 2^19 other Word-vector entries, and 1024 scalar/index temporaries suffice: + + 64*(128*256) + 2^19 + 1024 < 2^22 < 2^24. + +`Matrices.prepare` retains the input high matrix with raw/common/projector intermediates, fewer than eight full matrices. `good_form` has at its late peak projector, left, right, li, ri, lp, a0, b, cross; its early a has been freed. Its row/column scalar lists total at most 4032 entries and at most 64 pivots. `fallback_form` retains a 128-square matrix, at most 16256 shear scalars, and 128 diagonal entries. A retained Page form may coexist with one ancestor matrix preparation by `Callback.weight`; there is no matrix per ancestor. `weight` uses explicit sequential pending/value stacks. Route decoration and directory odometers are separate phases and fit within the same inflated 64-matrix bound. Euclid/divmod/multiply loops free scalar temporaries on every iteration; fewer than 32 nested arithmetic temporaries are needed, covered by 1024. + +The callback evaluator has arity at most two and decreases the chronological level at every VALUE expansion. At most two pending records per level, one retained completed value per level, and a constant number of pop/reverse records exist. Allowing two Callback objects and both reverse tapes gives the stated 16(h+3)(2I+L+8) bound. The evaluator recomputes ancestor forms; it does not retain an exponentially large evaluation tree. + +The Count/Counter allowance 2^20 is deliberately much larger than the fixed source-call inventory. There are five node input-count copies, three derived stock/fibre counts, layout extent triples, context.highs, the driver's row count, directory expected/emitted/outer counters, and the bounded nested primitive counters. Count.product has factor/scan/result and one add copy. These loops process one entry at a time; they do not append a counter per processed row, prefix, digit, matrix entry or operation. The only unbounded nesting is the separately charged recursive frame chain or serialized callback stack. Saved generator continuations have a fixed number of references, labels and encoded word/tape positions per nonrecursive source activation; the same 2^20 allowance covers a conservative serialization. This is a storage inventory, not an implementation of such a continuation compiler. + +Finite fallback permutation snapshots have at most 16256 records of 128 labels. Two simultaneously relevant forms and all 661 role bindings, loop labels and trace metadata fit far below 2^32(Q+1). Fixed-q chart/source/low-class plan caches are instead in F_q: they are independent of input precision and must not silently be called runtime-free Python memory. The atom digit-swap has at most q² bucket LEFT markers; fresh families, role buffers, count tapes and stack tapes fit the additional 2^20 markers. Arena LEFT/RIGHT markers were already counted in arena cells. + +### Root-coupled absorption, with explicit inequalities + +For minimal widths and the selected vocabulary, + + L <= bw+2, I <=591w, h+1 <=1180w, Q <=4096b+16. + +The source-code bound uses 2*28278*N<2^16 q^4096, including both physical views. The index bound follows from the canonical root word I<=log2e+2 and w>=e^(17/10000); for x>=1, log2x/x^(17/10000)<=1/((17/10000)*exp(1)*log(2))<313, so591 is conservative. The displayed history bound is the retained checked root-coupled condition, rounded upward. + +Substituting these bounds into the ledger gives, with considerable slack, + + E <= 2^48(b+597)w² + 2^20(ell(V)+4) + q². + +Here 8P_(h+1) and the callback stacks are quadratic in w; the arena is linear in w; finite form labels are bounded by 2^45(b+1); and all constant LEFT markers are included. More explicitly, replacing L by (b+2)w and h+1 by 1180w, the non-count/non-q² part has nonnegative coefficients and degree at most two in w. It is at most (83066202501+17592241506793*b)w², which is less than 2^48(b+597)w² coefficientwise. Thus the displayed envelope is an exact conservative inequality, not a finite-size extrapolation. + +Every complete active packet has V>=q^(2w); internal frames in fact have V>=q^(128w). For integer w>=1, w²<=4^(w-1), and q²>=4. Also b+597<=q for q>=2^80. Therefore + + 2^48(b+597)w² / V <= 2^48/q <= 2^-32. + +For V>=16, ell(V)+4<=16 sqrt(V), so + + 2^20(ell(V)+4)/V <= 2^24/q^w <= 2^-56. + +Finally q²/V<=1. Hence E<2V. PR2688, with the same minimal vocabulary and history assumptions, gives Delta<2^-130 V for a complete associated packet, so 32Delta<2^-125V. It follows that + + 8V +32Delta +E < (10+2^-125)V, + +and summing the geometric series yields + + (10+2^-125) WN/(WN-1) V_root <11V_root. + +This proves the claimed full logical live-symbol reserve, including numerical words and suspended parents. It does not reuse the historical 14-field parking reserve or claim that the existing source has implemented that sharper physical layout. + +## 7. Explicit stock coefficient and capacity boundary + +Since N=64. Consequently + + k <= 2(4096w+1)log2e+1 <=8195w log2e. + +With w=ceil(e^(17/10000))<=2e^(17/10000), this also gives + + k <=16390 e^(17/10000) log2e. + +These deliberately rounded constants are derived from the new 269241600 row stock. A sharper coefficient can be obtained from log2(32/21), but no historical 6748 coefficient is assumed. Storage closure and stock feasibility do not price the actual numerical execution time; that remains governed by the actual callback and routing implementation rather than a free-operation model. + + +## 8. Evidence and remaining obligations + +The executable checks cover projected ordered coordinates, nonzero remainders, same-bank and cross-bank children, odd half-reset gaps, complete dispatch chronology, repeated frozen-prefix ordinals, independent unused stock, a small completed recursive execution, linear-sign endpoints and traffic, and scheduler depth beyond the native Python recursion limit. Explicit protocol mutations reject omitted or duplicate calls and changed return boundaries. The independent coordinate/origin oracle checks the correct treatment of U/B, all gap placements and whole-packet prefix ordinals; those positive oracle comparisons are not described as injected mutation tests. [VERIFY.json](VERIFY.json) defines the reproducible checks and their exact scope; finite controls support the parametric argument and do not enumerate the selected GL64 payload. + +The code still uses logical dynamically created frame/tape objects. The full live-content inequality is distinct from a proved lowering to a fixed number of physical tapes with charged cursor movements, record markers, frame-bank reuse and erasure. No claim that `Frame.close` physically blanks the arena templates is made. The inherited full-ring algebra and source bindings remain proof dependencies, and no proof-assistant or transition-table verification is supplied. + +The direct next step toward multiplication is to compile and price this now-complete caller in the intended fixed-tape interface, then replace the O(wV) route and leaf routines by implementations satisfying the selected H2 contracts, preserving this whole-call stock and metadata accounting. The ordinary outer borrowing/rounding wrapper, complex supplier and analytic transfer retain their own obligations. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/README.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/README.md new file mode 100644 index 0000000000..7546163285 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/README.md @@ -0,0 +1,76 @@ +# A completed recursive caller for the selected BIT construction + +This package removes the `64 <= n < 128` restriction from the executable caller in [Jose Manuel's PR2697](https://github.com/CrocSwap/integer-mult-bounds/pull/2697). An internal child now runs the same complete selected caller over its whole packet and returns to its suspended parent. Its unused row stock, frozen field directory, generated coefficient program and ordered spectators are passed explicitly. The caller terminates at the existing below-64 leaves. + +This closes a central implementation gap: the earlier executable only handled widths for which every child was already a leaf. The earlier recursive closure note supplied a mathematical recurrence with a completed callee premise; this package supplies that callee in the logical stream implementation and accounts for its nested storage. It also repairs an inherited sign operation whose per-column cost would otherwise grow with atom precision. + +**The multiplication exponent does not change.** The selected conditional value remains κ = 0.001672660197076918. The executable establishes the baseline `p=1` time recurrence under the stated source and root-coupling hypotheses. Its routing and leaf swaps still cost `O(wV)`; it does not establish the stronger selected H2 contracts, a compiler to a fixed number of physical tapes, or the outer multiplication transfer. It is a substantive step on the actual caller, not a new exponent certificate. + +## What is new + +- A decreasing-width dispatcher with explicit ENTER / INVOKE / RETURN boundaries, one complete child invocation across all current high-prefix ordinals, and an iterative scheduler that avoids a Python recursion-depth restriction. +- Exact child geometry across the original head/gap/tail layout, including same-bank children, odd half-resets and remainder peeling at widths above the previous range. +- Separate child stock `U` and spectator `B`. Their product is never used as a substitute for available fresh rows. Each child gets separate numerical arenas and its own serialized source-bound program. +- A sign implementation with linear complete-fibre traffic. In particular, the fixed two-slice retreat does not copy a padded residue counter once per atom. +- A full logical live-symbol ledger for payload, keys, directories, numerical banks, continuations and suspended parents. Under the explicit canonical root-coupling hypotheses in [PROOF.md](PROOF.md), the bound is `< 11 V_root + F_q`, where `F_q` is fixed-q source compilation storage. This is not a Python heap bound or a completed physical tape-space theorem. + +The stock is the compatible selected stock + +``` +K = lcm(28416,28425) |GL64(Fq)| q^(4096(w-1)) + = 269241600 |GL64(Fq)| q^(4096(w-1)). +D(n) = 0 if n < 64, otherwise 1 + D(42 floor(n/64)). +root rows = t K^D(n), t >= 1. +``` + +A child receives exactly `V/(28416 |GL64(Fq)|)` payload symbols. Thus retaining suspended parent states produces a geometric storage sum. The proof derives a sufficient row-capacity exponent `k <= 8195 w log2(e)` and retains the divisibility and outer-padding obligation; merely supplying `q^k` rows does not satisfy the executable contract. + +## Scope and source boundary + +The base is canonical main `7b39515117fe26e75d16c268877391f1bdaa5640`, priority revision 5. The selected result and its scientific inputs remain unchanged. [TASK.json](TASK.json) records the current-main and overlap checkpoints, the explicit user-directed scope refinement and next questions. + +A matching [recursive-boundary claim](https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18957230) by jmbarrancoml appeared at 19:47 UTC, after this task started at 19:19:46 and checked overlap. This is an independent construction and joined logical-reserve argument; exclusive novelty is not claimed. Nick Petalas concurrently completed [PR2743](https://github.com/CrocSwap/integer-mult-bounds/pull/2743), the sharper first-range payload/key result. Our coarse payload allowance is not a claim to that result, and the finer first-range count-storage result [PR2749](https://github.com/CrocSwap/integer-mult-bounds/pull/2749), published during validation, remains separate. + +The runtime import graph actually uses the byte-for-byte [PR2697 export](predecessor/) at `a53fdf4bcbe33c6732f0bec1badc8c023380f9d1`; [PREDECESSOR.json](PREDECESSOR.json) authenticates all 50 files before executable imports. Candidate modules at this package root override only the changed components. No pending source is treated as admitted to the selected frontier. [SOURCES.json](SOURCES.json) pins every external live input, including the inherited profile/stock proofs. [EVIDENCE.json](EVIDENCE.json) authenticates the four retained component-proof/notice files before execution; their separate attribution is preserved. + +The constructor accepts internal widths `n >= 64`; below-64 cases are completed trace leaves, not new root `SelectedNode` entry points. The compatible all-size stock and canonical program/directory form are input hypotheses. The local divisibility guard alone does not certify adequate stock for an arbitrary entire tree. + +## Evidence and reproduction + +Use CPython 3.12, standard library only, from the repository root: + +```sh +python3.12 scripts/research_package.py --package research/selected-bit-recursive-caller +``` + +[VERIFY.json](VERIFY.json) declares the bounded commands. A particular suite can be replayed directly: + +```sh +python3.12 -B research/selected-bit-recursive-caller/verify.py --suite recursion +``` + +The suites have deliberately different claims: + +| Suite | Evidence | +| --- | --- | +| `source` | Full selected provider catalogue and 7,843,392 literal caller events; generated coefficients, global schedule, complete gapped endpoint, and two distinct sampled high fields. | +| `node` | Complete four-family GL2 Boolean-column model including MOVE, COPY, IDLE, bridge, exchange, exact source preservation and scratch cleanup. | +| `recursion` | Independent ordered-layout oracle; actual `peel.run` above the old range; selected descriptor/frame handoffs `256 -> 168 -> 84` with controlled tiny payload consumers; 1,501 scheduler frames; malformed-return, failed-construction and exception cleanup controls. | +| `nested` | Complete two-level physical execution on a separate dimension-2, q=2 toy with all six GL2 low classes. It uses a coordinate-projector root and full conjugated GL2 children, with actual node/driver/trace/layout and stream operations and test-only source/coefficient fixtures. It is not execution of the enormous selected GL64 payload. | +| `controls` | Sign endpoints and counter-cost regression, stale gather/scatter witnesses, bridge/exchange directions, invalid stock, omitted/changed source pins, and exact receipt mutations. | + +No finite model proves all widths. The parametric argument is in [PROOF.md](PROOF.md); the tests independently challenge its geometry, chronology, source binding and cleanup boundaries. The selected-frame check is explicitly a controlled callee fixture, and the q=2 toy is outside the selected odd-prime admission domain. + +Verification is read-only and compares complete typed receipts in [RESULT.json](RESULT.json), including their canonical SHA256 digests. Explicit generation uses `--emit-to NEW_FILE` and refuses to overwrite a file. Assertions are required for independent test code; direct optimized runs are rejected. [VALIDATION.md](VALIDATION.md) records the actual environment, commands and outcomes. + +## Open next questions + +1. **Can this logical caller be compiled to the required fixed tape inventory with the same charges?** The next concrete step is a serialized frame-bank/continuation layout with cursor movement, template cleanup and reuse charged on every return. The full live-content ledger is available; the existing Python tape objects are not that compiler. +2. **Can routing and ordinary leaf swaps satisfy the selected H2 primitive contracts?** Start with the actual `routes.py` and `bitstream.py` paths reached by this caller, preserving complete-prefix order and source ownership. Replacing only the recursive callback cannot remove their `O(wV)` charge. This is the immediate time bottleneck between the baseline recurrence and the stronger selected H2 saving. The baseline can already feed the inherited conditional ordinary-caller bootstrap, once its physical and outer-wrapper premises are supplied. +3. **Can the compatible reserve be supplied by the outer borrowing wrapper?** Implement the stated compatible-row padding and restoration, preserving the `U` coordinate and full metadata ledger. The capacity inequality alone does not establish the wrapper, and the complex supplier and analytic transfer remain separate obligations. + +## Attribution + +David Arias, with substantial OpenAI Codex assistance, including mathematical, implementation and independent-checking subagents. This is not independent human review or a proof-assistant verification. New work is under Apache-2.0. + +Jose Manuel (`jmbarrancoml`) supplied the executable first-range caller and its selected source chain. The complete retained [NOTICE](predecessor/NOTICE.md) credits the selected word, hosting, full-ring normal forms, coefficient grammar and packet contracts. We additionally credit starship-s's PR2731 residual storage, NickPetalas's PR2708 route/key storage and ywz65's PR2688 directory bound. Those component results are not claimed here as new. The earlier mathematical recursive closure and compatible-stock construction remain explicit proof dependencies. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/RESULT.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/RESULT.json new file mode 100644 index 0000000000..75faec7844 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/RESULT.json @@ -0,0 +1,893 @@ +{ + "controls": { + "full_result_sha256": "890b59b04df5cce330e6e7c5c228ec9268d454e5c4ab38d606496a5acd2f7bf3", + "result": { + "bridge_exchange": { + "bridge_columns": 15552, + "exchange_columns": 15552 + }, + "linear_sign": { + "addresses": 3120, + "cases": 36, + "control_scaling": { + "finite_assertion": "control reads+writes+moves <=512V in these five cases", + "measured_family": [ + { + "control_tape_steps": 1035, + "modulus": 3, + "volume": 3 + }, + { + "control_tape_steps": 3371, + "modulus": 9, + "volume": 9 + }, + { + "control_tape_steps": 9879, + "modulus": 27, + "volume": 27 + }, + { + "control_tape_steps": 29308, + "modulus": 81, + "volume": 81 + }, + { + "control_tape_steps": 87075, + "modulus": 243, + "volume": 243 + } + ], + "scope": "all Counter tapes, residue arena, and before/suffix tapes; source/output payload tapes excluded" + }, + "digest": "6ea234c0e8aabd48a6de8b8901bd52ade9705ac41ef53b169fe588ae8b8c5452", + "exact_source_moves": "(6M-8)BS+4", + "host_numeric_decode": false, + "malformed_input_controls": [ + "truncated_input", + "overlong_input", + "non_bit_input" + ], + "moduli": [ + 2, + 3, + 9, + 25 + ], + "residue_width_counter_setups": "3B; no per-slice padded numeral-two counter", + "source_move_bound": "6V", + "status": "PASS_LINEAR_SIGN_INDEPENDENT" + }, + "rejections_counts": { + "cardinality_cases": 20, + "maximum_product_bits": 822, + "rejections": [ + "self_XOR", + "write_private", + "write_copied_source", + "wrong_ERASE_source", + "wrong_ADD_frame", + "node_range_0", + "node_range_1", + "incomplete_stock_1", + "incomplete_stock_191", + "incomplete_stock_193", + "incomplete_stock_188", + "incomplete_high_stock", + "physical_inventory_denominator", + "selected_compatibility_stock" + ], + "runtime_modules": [ + "cardinal_counts.py", + "layout.py", + "packet_engine.py", + "consumer.py", + "peel.py", + "fresh_rows.py", + "control.py", + "driver.py", + "node.py", + "topology.py", + "linear_sign.py", + "recursive_call.py", + "scheduler.py" + ], + "selected_unused_factor": 9475 + }, + "stale_state": { + "stale_family_scatter": { + "correct": 1946, + "source": 1998, + "wrong": 1998 + }, + "stale_low_gather": { + "correct": 1947, + "source": 1962, + "wrong": 1962 + } + }, + "verifier_mutations": { + "before_executable_imports": true, + "rejected": [ + "omitted_source:certificates/selected-result.json", + "omitted_source:research/community-hyperplane599-audit/pr589/bit589/v9/hosted/GLOBAL-TEMPLATE.json.gz", + "omitted_source:research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json", + "omitted_source:research/e8-bit-p111-tuned/tune/EXPECTED.json", + "omitted_source:research/e8-bit-p111-tuned/tune/bitE8mut-p111-tuned.json.gz", + "omitted_source:research/pr589-five-helper-hosting/PROOF.md", + "omitted_source:research/pr589-five-helper-hosting/verify.py", + "omitted_source:research/recursive-parking-boundary/README.md", + "omitted_source:research/selected-bit-local-ring-sweeps/PROOF.md", + "omitted_source:research/selected-bit-recursive-closure/PROOF.md", + "omitted_source:upstream/build/sections/02-streams.tex", + "omitted_CI_input", + "omitted_executable_predecessor", + "omitted_proof_predecessor", + "wrong_live_hash", + "changed_executable_bytes", + "receipt_wrong_type", + "receipt_wrong_value", + "receipt_extra_field", + "receipt_wrong_digest" + ], + "verification_writes_receipts": false + } + } + }, + "nested": { + "full_result_sha256": "d5fea26cf0d2318fe5f8d8f9ebd1be817b715d0a23f524be73f8c432f3900780", + "result": { + "child_fresh_rows": 6, + "complete_addresses": 9216, + "counts": { + "child_stock_checks": 144, + "enter": 1452, + "internal_calls": 12, + "internal_returns": 12, + "residuals": 156, + "return": 1452, + "root_stock_checks": 12 + }, + "domain": "toy q=2, dimension=2, cutoff=2, one family; not selected GL64", + "leaf_unused_rows": 1, + "low_classes": 6, + "output_sha256": "68477c468bd70d3488f9e1afbfa576aab2fa9db44949874ab873d64c22853b46", + "root_normal_forms": "coordinate projectors", + "root_rows": 36, + "root_width": 4, + "tracked_work_erased": 3796717 + } + }, + "node": { + "full_result_sha256": "c3e6e32c0ad818cfed1b920d8dfa9f840f81ae64099e853ffe6b1c18be4f363e", + "result": { + "bank_atoms": 2, + "children": { + "enter": 5712, + "return": 5712 + }, + "dimension": 2, + "erased_tapes": 6406846, + "events": { + "bridge": 4, + "exchange": 2, + "global": 15, + "global_return": 15, + "literal": 864, + "residual": 672 + }, + "families": 4, + "first_sweep_checkpoints": [ + 0, + 1 + ], + "gap": 1, + "input_columns": 15552, + "low_classes": 48, + "payload_sha256": "0a0c46f6fa0b21feebadbdc446afaf66d3e3b37a9136bdc2c6c6338a631b615d", + "residuals": { + "COPY": 96, + "IDLE": 384, + "MOVE": 192 + }, + "width": 1 + } + }, + "recursion": { + "full_result_sha256": "6ab6832821d0ff9d3f71075c45894c2bbdbc6d16d7e47d8bac7e72a7e2ceed9e", + "result": { + "abort_cleanup": { + "child_failure_propagated": true, + "owned_parent_tapes_erased": 2, + "scope": "controlled primitive creates owned output before failing child; real packet engine and scheduler" + }, + "all_size_peel": { + "changed_scalar_rows": { + "128": { + "129": 5 + }, + "129": { + "128": 2 + } + }, + "columns": 2, + "dimension": 64, + "incoming_weights": { + "0": 1, + "128": 5, + "64": 2 + }, + "legacy_columns_one_rejected": true, + "modulus": 9, + "parent_width": 129, + "primitive_counts": { + "add": 3, + "atom_swap": 4, + "sign": 1 + }, + "queried_offsets": [ + 128, + 128, + 128 + ], + "remainder": 1, + "scope": "actual peel.run and incoming callback; independent scalar opcode interpreter; no dense payload" + }, + "construction_failure": { + "copied_program_erased": true, + "failed_fresh_banks_erased": 2, + "parent_program_unchanged": true + }, + "frame_handoff": { + "complete_selected_GL64_payload_executed": false, + "controlled_payload_bits": 23, + "depths": 2, + "handoffs": [ + { + "before": 2, + "depth": 1, + "gap": "5*3^176", + "prefixes": 2, + "stock": 11, + "suffix": 3, + "width": 168 + }, + { + "before": 2, + "depth": 2, + "gap": "5*3^344", + "prefixes": 2, + "stock": 11, + "suffix": 3, + "width": 84 + } + ], + "repeated_call_recipe_cache_growth": 0, + "return_order": [ + 2, + 1 + ], + "sampled_old_prefixes": 2, + "scope": "real selected constructors, Callback.extend, Frame and directory handoff; controlled child consumer only", + "selected_node_constructions": 5, + "shared_topology_instances": 1, + "source_rank": 42, + "source_request": 27825, + "widths": [ + 256, + 168, + 84 + ] + }, + "frame_mutations": [ + { + "check_kind": "independent preserved-input oracle", + "closed_frames": 2, + "mutation": "source_bit", + "rejection": "independent checker: frozen source bytes changed" + }, + { + "check_kind": "independent preserved-input oracle", + "closed_frames": 2, + "mutation": "directory_bit", + "rejection": "independent checker: frozen directory bytes changed" + }, + { + "check_kind": "runtime head contract", + "closed_frames": 2, + "mutation": "output_head", + "rejection": "completed recursive return restores caller heads" + } + ], + "layouts": { + "cases": 136, + "digest": "b25c5037bd2b008d4424b257327e89d43a9131964978a452dd27f5121ed5d4af", + "moduli": [ + 3, + 9 + ], + "rejected_overlapping_or_noncontiguous_chunks": 24, + "spectators": [ + 2, + 5, + 3 + ] + }, + "lifecycle": { + "normal_owned_return": true, + "rejected": [ + "missing_invoke", + "duplicate_invoke", + "missing_return", + "metadata_mutation", + "aliased_output", + "aliased_metadata_mutation", + "width_mutation" + ] + }, + "status": "PASS_RECURSIVE_JUNCTIONS", + "traces": [ + { + "boundaries": [ + [ + "unit", + 1, + true, + 0, + false + ], + [ + "pair", + 2, + false, + 0, + false + ], + [ + "unit", + 1, + true, + 0, + false + ] + ], + "events": { + "add": 12, + "atom_swap": 16, + "enter": 3, + "return": 3, + "sign": 4 + }, + "kind": "pair_head", + "parent_width": 128 + }, + { + "boundaries": [ + [ + "unit", + 1, + true, + 0, + false + ], + [ + "pair", + 2, + false, + 64, + true + ], + [ + "unit", + 1, + true, + 0, + false + ] + ], + "events": { + "add": 12, + "atom_swap": 16, + "enter": 3, + "return": 3, + "sign": 4 + }, + "kind": "pair_tail", + "parent_width": 128 + }, + { + "boundaries": [ + [ + "unit", + 2, + false, + 0, + false + ] + ], + "events": { + "add": 6, + "atom_swap": 8, + "enter": 1, + "return": 1, + "sign": 2 + }, + "kind": "unit_cross", + "parent_width": 128 + }, + { + "events": [ + "enter", + "invoke", + "return" + ], + "kind": "good", + "parent_width": 128, + "width": 84 + }, + { + "boundaries": [ + [ + "unit", + 32, + true, + 0, + false + ], + [ + "pair", + 64, + false, + 0, + false + ], + [ + "unit", + 32, + true, + 0, + false + ] + ], + "events": { + "add": 192, + "atom_swap": 256, + "enter": 3, + "invoke": 1, + "return": 3, + "sign": 64 + }, + "kind": "pair_head", + "parent_width": 4096 + }, + { + "boundaries": [ + [ + "unit", + 32, + true, + 0, + false + ], + [ + "pair", + 64, + false, + 64, + true + ], + [ + "unit", + 32, + true, + 0, + false + ] + ], + "events": { + "add": 192, + "atom_swap": 256, + "enter": 3, + "invoke": 1, + "return": 3, + "sign": 64 + }, + "kind": "pair_tail", + "parent_width": 4096 + }, + { + "boundaries": [ + [ + "unit", + 64, + false, + 0, + false + ] + ], + "events": { + "enter": 1, + "invoke": 1, + "return": 1 + }, + "kind": "unit_cross", + "parent_width": 4096 + }, + { + "events": [ + "enter", + "invoke", + "return" + ], + "kind": "good", + "parent_width": 4096, + "width": 2688 + }, + { + "boundaries": [ + [ + "unit", + 64, + true, + 0, + false + ], + [ + "pair", + 128, + false, + 0, + false + ], + [ + "unit", + 64, + true, + 0, + false + ] + ], + "events": { + "enter": 3, + "invoke": 3, + "return": 3 + }, + "kind": "pair_head", + "parent_width": 8192 + }, + { + "boundaries": [ + [ + "unit", + 64, + true, + 0, + false + ], + [ + "pair", + 128, + false, + 64, + true + ], + [ + "unit", + 64, + true, + 0, + false + ] + ], + "events": { + "enter": 3, + "invoke": 3, + "return": 3 + }, + "kind": "pair_tail", + "parent_width": 8192 + }, + { + "boundaries": [ + [ + "unit", + 128, + false, + 0, + false + ] + ], + "events": { + "enter": 1, + "invoke": 1, + "return": 1 + }, + "kind": "unit_cross", + "parent_width": 8192 + }, + { + "events": [ + "enter", + "invoke", + "return" + ], + "kind": "good", + "parent_width": 8192, + "width": 5376 + } + ], + "trampoline": { + "closed_after_failure": 1101, + "completed_frames": 1501, + "host_recursion_limit_unchanged": true + } + } + }, + "source": { + "full_result_sha256": "04143916807402150bb2a61a8da44720a951742bc54e4b667e66c7ad6bf54fd7", + "result": { + "gapped_endpoint": { + "bank_atoms": 3, + "before": 2, + "bits": 5832, + "children": { + "enter": 20, + "return": 20 + }, + "core_atoms": 2, + "erased_tapes": 1145684, + "gap": 2, + "marker": [ + 1234, + 2720 + ], + "payload_sha256": "134dda6cf3b1f7ed605ca940db6326b4a1d059a5e81165effa5c403e1983a78a", + "peel_pairs": 1, + "suffix": 2 + }, + "gapped_extents": { + "gap": 5, + "geometry_cases": 36, + "widths": [ + 64, + 65, + 95, + 127 + ] + }, + "generated_peel": { + "ancestor_rank": 5, + "columns": 130, + "frozen_fields": 1, + "head64_to_tail0": 8, + "parent_atoms": 65, + "peel_scalars": [ + 8, + 1, + 8 + ], + "root_atoms": 832, + "source_code_bits": 6507, + "tail0_to_head64": 8, + "wrong_offset_weight": 2 + }, + "global_scalar": { + "bridge_shears": 18, + "family_XOR_actions": 63936, + "global_events": 29, + "omission_controls": 18, + "terminal_family_pairs": 14208 + }, + "sampled_high_packet": { + "bits": 39366, + "children": { + "enter": 1, + "return": 1 + }, + "complete_high_cube": false, + "dimension": 2, + "erased_tapes": 464279, + "gap": 3, + "high_prefixes": 2, + "payload_sha256": "b7fa73bbb6e282d63e6ea9fac8a2443c6357d015d34c65ecf0e5829af68bfed8", + "width": 2 + }, + "selected_consumers": [ + { + "callbacks": [ + "adapter", + "child" + ], + "code_bits": 6507, + "common": true, + "full_payload_executed": false, + "kind": "MOVE", + "rank": 1, + "request": 0 + }, + { + "callbacks": [ + "adapter", + "child" + ], + "code_bits": 6507, + "common": false, + "full_payload_executed": false, + "kind": "IDLE", + "rank": 42, + "request": 27825 + } + ], + "selected_sources": { + "consumer_binding_sha256": "e59279f482edde48fb08773e32c429acb369eaf33a723034d083cc0577c714c6", + "literal_counts": { + "0": 838368, + "1": 6999840, + "2": 2592, + "3": 2592 + }, + "literal_events": 7843392, + "literal_source_sha256": "ea44aa047a2a9cf034de8b56b2166c49cf2dbdf9cd9ed6a20299a4f2b05ef09a", + "local_certificates": { + "forward": { + "copies": 9, + "profile": { + "1": 1323, + "2": 1342, + "3": 79, + "4": 44, + "5": 102, + "6": 11, + "7": 19 + }, + "records": 27234, + "symbolic_columns": 661 + }, + "reverse": { + "copies": 9, + "profile": { + "1": 1323, + "2": 1342, + "3": 79, + "4": 44, + "5": 102, + "6": 11, + "7": 19 + }, + "records": 27234, + "symbolic_columns": 661 + } + }, + "ownership": { + "calls": 288, + "distinct_slot_permutations": 14, + "first_five_helper": { + "ambient_axes": [ + [ + 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 + ] + ], + "children": [ + 4, + 4, + 4, + 4, + 4 + ], + "family": 666, + "pair": 0, + "replica": 0, + "roles": [ + 232, + 233, + 234, + 235, + 236 + ], + "stage": 2 + }, + "hosted_occurrences": 126432, + "idle_remainder_profile": { + "2": 13920, + "4": 14208, + "42": 288, + "6": 14208, + "7": 21312 + }, + "max_helpers_per_family": { + "0": 3, + "1": 3, + "2": 5, + "3": 5, + "4": 5, + "5": 5, + "6": 3, + "7": 5, + "8": 3 + } + }, + "provider": { + "base_labels": 541, + "binding_sha256": "f5a4fb124709adc4b56376a3146e3609e91c0f4d3ed1931a61785a5d99bf8ee7", + "canonical_ERASE_guards": 81, + "canonical_requests": 28278, + "chart_labels": 1235, + "full_paid_requests": 904896, + "rank_histogram": { + "1": 381024, + "2": 400416, + "3": 22752, + "4": 26880, + "42": 288, + "5": 29376, + "6": 17376, + "7": 26784 + }, + "replicas": 32, + "request_kinds": { + "COPY": 81, + "IDLE": 1998, + "MOVE": 26199 + } + }, + "split_basis_ranks": { + "1": 120, + "2": 182, + "3": 77, + "4": 41, + "42": 1, + "5": 85, + "6": 13, + "7": 22 + } + } + } + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/SOURCES.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/SOURCES.json new file mode 100644 index 0000000000..ff8c8e3617 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/SOURCES.json @@ -0,0 +1,84 @@ +{ + "schema_version": 1, + "base_commit": "7b39515117fe26e75d16c268877391f1bdaa5640", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "input", + "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", + "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "889b95d936746df124872133ae1e7cc339adcb92", + "sha256": "7d185cd8c2af35988d638d969748ad7b670f902606444dbfc748e4402c340df6" + }, + { + "path": "research/pr589-five-helper-hosting/verify.py", + "usage": "input", + "git_blob": "dbc71f56bb4205ebe378ada1f9f4ea88630d1d39", + "sha256": "cf90e19ae9991b0698be03d395a8cc29061ecb307eb7fea19adfb2d23c25a367" + }, + { + "path": "research/pr589-five-helper-hosting/PROOF.md", + "usage": "input", + "git_blob": "bbd3f12b9a32b3ad3cba85a2d5a1b3054214fa02", + "sha256": "59cae781bfbe1a01ed9e66a8efeeb5a2b995e5ecdf908586b23ecc39f2b8d647" + }, + { + "path": "research/e8-bit-p111-tuned/tune/bitE8mut-p111-tuned.json.gz", + "usage": "input", + "git_blob": "85a4499bf9e4911a705d50567a2c2ef6cf23739a", + "sha256": "e3e301e62bc2b41dbf1ceac0acf3d35824ebeab1848c5a2142d4577b109da52f" + }, + { + "path": "research/community-hyperplane599-audit/pr589/bit589/v9/hosted/GLOBAL-TEMPLATE.json.gz", + "usage": "input", + "git_blob": "9eafb8776cbf78c72124f833534469ddfa5e98ec", + "sha256": "0357b7cfbd7c29b4983982baf153c8a9f1e1e412690cd7fa9fc3d23d7963b20f" + }, + { + "path": "research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json", + "usage": "input", + "git_blob": "44006542202ca6037533a754f0bcd00549d7e088", + "sha256": "0058c491d839142aa99ef86a5ec697ce99857632228531512ea3fa74fb24d734" + }, + { + "path": "research/recursive-parking-boundary/README.md", + "usage": "input", + "git_blob": "251f335ebaccc11d69393ee7aeb5a2e84526d0bb", + "sha256": "491aa208391ee4c2936510b1a5c5c018dd5509d9a0e88687c72ab8406cd77b18" + }, + { + "path": "upstream/build/sections/02-streams.tex", + "usage": "input", + "git_blob": "088fceea1867abc76271d7efe7532b779fee9039", + "sha256": "606c80db61cad13aa0c3b6060dc4b88dbbe7ac60cdd831aa93f28d908fd09dab" + }, + { + "path": "research/e8-bit-p111-tuned/tune/EXPECTED.json", + "usage": "input", + "git_blob": "e293ddc557742637f9f679f083a1a282d87b1b13", + "sha256": "b9f0e5ca038abe837b0007c8fe006f366a6f02009244ac57705a8a200e2301f4" + }, + { + "path": "research/selected-bit-local-ring-sweeps/PROOF.md", + "usage": "input", + "git_blob": "4330de85dd9862ed15d84ab917887d249753df99", + "sha256": "846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7" + }, + { + "path": "research/selected-bit-recursive-closure/PROOF.md", + "usage": "input", + "git_blob": "6c410cab5713979214a45835091fbeb9ee9b8531", + "sha256": "74cc8de20f21acb5123fe2d20996fe0925ea6e51b3dec633bd5221fb719b3344" + } + ], + "predecessor": { + "manifest": "PREDECESSOR.json", + "head": "a53fdf4bcbe33c6732f0bec1badc8c023380f9d1", + "scope": "Exact executable source export; authenticate every file before import. See retained NOTICE and provenance chain." + }, + "proof_exports": "EVIDENCE.json" +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/TASK.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/TASK.json new file mode 100644 index 0000000000..d70ad31727 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/TASK.json @@ -0,0 +1,150 @@ +{ + "schema_version": 1, + "task_id": "selected-stock-envelope", + "priority_revision": 5, + "base_commit": "7b39515117fe26e75d16c268877391f1bdaa5640", + "original_card": { + "id": "selected-stock-envelope", + "question": "What explicit uniform stock envelope does the actual selected stopped producer supply at one bootstrap stage?", + "starting_points": [ + "research/selected-bootstrap-stock-audit/README.md", + "research/bootstrap-cutoff-time-space-split/README.md", + "certificates/selected-result.json", + "docs/research/community-efficient1000-review.md" + ], + "methods": [ + "Derive a source-bound reserve recurrence at the actual selected atom widths, separating parent stock from completed inner borrowing.", + "Find an exact missing implication or counterexample to a proposed selected-stage stock envelope." + ], + "acceptance_gate": "Bind every coefficient and depth factor to the selected producer and state the width domain. Compare a proved envelope with the sufficient cutoff guard; a large numerical headroom or a historical m=120 coefficient is not a selected m=73 proof.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read #1956/#1965/#1990 in the batch review and the stock-audit source boundary. Its actual selected coefficient remains uncomputed.", + "scope": "Source-bound orientation only. Read the named package and review before relying on its local evidence; this command is not its replay or supplier admission." + }, + "first_experiment": "Choose one of the fourteen recorded stages, pin its producer, and derive the parent reserve and depth coefficient. Stop with a precise source-level missing lemma if that coefficient cannot yet be bounded; do not rerun the already checked headroom arithmetic as a new result.", + "bottleneck_link": "This reduces a concrete inherited implementation obligation without confusing unchanged kappa arithmetic with a completed theorem.", + "allowed_variations": [ + "One stage or one explicit reserve/depth implication.", + "An independently checked same-domain proof repair, retaining all remaining assumptions." + ], + "scope_change_triggers": [ + "Importing the historical 57604 or 252 allowance without a selected-producer binding.", + "Calling a conditional fit lemma a full outer-proof adoption." + ], + "overlap_terms": [ + "selected stock", + "stock envelope", + "bootstrap cutoff", + "1956", + "1965", + "1990" + ] + }, + "scope_status": "refined", + "actual_scope": "Implement the selected BIT whole-packet caller at every internal width, with recursive child return, separate compatible stock, and a full logical live-symbol reserve. Establish the baseline p=1 recurrence; retain fixed-tape lowering, stronger H2 time and outer-transfer obligations.", + "scope_change_reason": "The explicit user asks for a central implementation bottleneck. PR2697 stops at 64 <= n < 128; larger recursive children and their storage are the concrete missing implication.", + "bottleneck_link": "Replace an assumed completed recursive callee by an executable decreasing-width caller. This addresses the all-size BIT producer used by ordinary multiplication, not a local tariff or hypothetical histogram.", + "budget_minutes": 120, + "stop_rule": "Complete the recursive width/field/stock induction, implement and check the changed stream boundaries, and state the exact remaining time/outer-transfer assumptions; no substitute peripheral result.", + "outcome": "completed", + "evidence": "Source-bound all-size implementation and endpoint/stock/reserve proof; exact selected catalogue and 7843392 literal events checked, complete first-range GL2 payload replay, recursive layout/descriptor/exception checks, and a separate full two-level physical toy. See RESULT.json and VALIDATION.md for exact executed suites and limitations.", + "author": "David Arias", + "ai_assistance": "Substantial OpenAI Codex assistance, including mathematical and implementation subagents; no independent human review.", + "open_questions": [ + { + "question": "Compile the logical recursive caller to the intended fixed number of physical tapes.", + "why_it_matters": "The full live-content reserve is not a physical tape compiler or a movement-time proof.", + "first_step": "Serialize frame banks and continuations, then price cursor movement, template erasure and reuse across one recursive return.", + "blocked_by": "No implementation of that physical lowering is included." + }, + { + "question": "Replace O(wV) owner routing and ordinary leaf swaps with implementations meeting selected H2.", + "why_it_matters": "The completed caller currently supports only p=1 and does not improve the multiplication exponent.", + "first_step": "Price and improve the actual native routes.py and bitstream.py paths while preserving the complete source-bound prefix packet.", + "blocked_by": "The stronger route and leaf primitive contracts are still open." + }, + { + "question": "Supply compatible K-power stock through the outer borrowing and padding wrapper.", + "why_it_matters": "A q-ary capacity bound alone does not give the required divisible fresh rows or their return.", + "first_step": "Implement padding to a compatible multiple, restore it and propagate the full metadata reserve through the wrapper.", + "blocked_by": "The wrapper, complex supplier and full analytic transfer are outside this package." + } + ], + "freshness": { + "started_utc": "2026-10-15T19:19:46Z", + "start_main": "7b39515117fe26e75d16c268877391f1bdaa5640", + "latest_main": "63a279f5790872996a13f0e9efdae35818171b48", + "checked_utc": "2026-10-15T20:13:28Z", + "priority_revision": 5, + "guidance_changed": false, + "selected_record_changed": false, + "live_inputs_changed": false, + "decision": "Continue the isolated all-size caller. Read newly integrated control-uniformity and body-stock audits and efficient1300 review: they retain the recursive payload-dispatch/physical-caller premises and do not close this implementation gap. Preserve exact scientific base and input pins.", + "intermediate_main": "7ef5f7150476fdf995b286b9cdbed262c631939c" + }, + "overlap": { + "initial_coverage": { + "open_prs": 752, + "discussion_records": 1368, + "complete_pagination": true, + "warnings": [] + }, + "final_coverage": { + "open_prs": 727, + "discussion_records": 1382, + "local_records": 1840, + "open_prs_fetched_at": "2026-10-15T19:56:29.123108+00:00", + "discussions_fetched_at": "2026-10-15T19:59:14.008528+00:00", + "complete_pagination": true, + "warnings": [] + }, + "terms": [ + "selected-bit-recursive", + "all-size", + "recursive caller", + "selected-bit-node", + "2319" + ], + "predecessor_head_rechecked": "a53fdf4bcbe33c6732f0bec1badc8c023380f9d1", + "new_related_result": { + "pr": 2743, + "head": "c1e8065671f4f1854c5508f4bb18b85851074547", + "scope": "Sharp first-range payload/key content only; it explicitly retains larger recursion and total metadata reserve. Credit Nick Petalas; our8V is a coarse allowance, not a competing sharp first-node result." + }, + "parallel_claim": { + "url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18957230", + "author": "jmbarrancoml", + "announced_utc": "2026-10-15T19:47:00Z", + "scope": "Larger-child whole-packet boundary, exact U/source fields, same-bank/gap layout and completed return.", + "decision": "This matching claim appeared after our19:19:46 start and initial overlap pass. Continue as an explicitly independent construction with the joined all-size logical reserve, sign repair and separate tests. Do not claim exclusive novelty or priority; the pending parallel implementation remains provisional." + }, + "finer_count_claim": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18957024", + "limitations": "Metadata searches are not novelty certificates. Cached full PR/discussion records were filtered and relevant current discussions read directly. No public coordination messages were posted under the donor restriction.", + "publication_check": { + "checked_utc": "2026-10-15T20:13:28Z", + "discussion_updated_at": "2026-10-15T20:02:17Z", + "recursive_claim_still_pending": true, + "new_finer_count_result": { + "pr": 2749, + "head": "a18ba3bbfb549af66488a890edcb4a3744de90a3", + "scope": "Completed first-range cardinality/countdown storage component; sharper than our coarse allowance. Not imported as a proof dependency. Larger recursion, numerical/control storage and total reserve remain open in that submission." + } + } + }, + "validation": { + "command": "python3.12 -B scripts/research_package.py --package research/selected-bit-recursive-caller", + "python": "3.12.15", + "platform": "macOS27.0.1 arm64", + "suites": 5, + "exit_code": 0, + "seconds": 520.413, + "read_only_package_files": 84, + "changed_paths": [] + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/VALIDATION.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/VALIDATION.md new file mode 100644 index 0000000000..d91680665a --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/VALIDATION.md @@ -0,0 +1,56 @@ +# Validation record + +Scientific base: canonical main `7b39515117fe26e75d16c268877391f1bdaa5640`. +Fresh main `63a279f5790872996a13f0e9efdae35818171b48` was checked before submission; +guidance, priority revision 5, selected record and every live scientific input +were unchanged. New integrated body-stock and control-uniformity results were +read; both retain the missing caller/physical premises addressed here. + +Environment: local macOS arm64, CPython 3.12.15, standard library only. +Initial development also used CPython 3.14.7. No Python timing is used as a +Turing-machine complexity measurement. + +Author-side checks already passed: + +- Complete selected source catalogue and 7,843,392 literal events. +- Complete first-range four-family GL2 model: 15,552 Boolean columns, 672 + residual calls and 5,712 matched leaf brackets; 344 seconds under 3.12.15. +- Complete recursive dimension-2 toy: 9,216 exact origins, twelve real internal + returns, 156 residual calls, all six GL2 child low classes and exact remaining + row stock 6/1. Root residuals are coordinate projectors; children use the full + conjugated good/fallback normal forms. Approximately 82–94 seconds. +- Source/receipt mutation controls, sign endpoint and counter traffic checks, + stale-state witnesses, bridge/exchange directions and stock rejection. +- Large-width ordered-layout, selected descriptor/frame, failed-constructor, + aborted-child and 1,501-frame scheduler tests. Selected Frame payloads are + controlled test consumers, not a full selected GL64 execution. + +The final registered read-only replay **passed all five suites** in 520.413 +seconds, with exit status 0: + +```sh +python3.12 -B scripts/research_package.py --package research/selected-bit-recursive-caller +``` + +It emitted `PASS_SELECTED_BIT_RECURSIVE_CALLER` for source, node, recursion, +nested and controls, followed by `PASS_REGISTERED_RESEARCH_PACKAGE`. +A separate before/after SHA256 inventory covered all 84 then-present package +files: no path or byte changed. The full-node suite took 333.388 seconds; the +nested suite took 82.41 seconds. Final edits after replay only record validation, +upstream freshness and the newly published parallel PR2749; executable files and +retained receipts are unchanged. + +Additional direct CLI controls rejected optimized execution and refused to +overwrite an existing receipt. Metadata/source pins and `git diff --check` +also passed. The shared-topology test constructs five selected nodes with one +source topology and verifies zero repeated recipe/call cache growth. + +The final direct Discussion2319 check found the matching 19:47 recursive claim +still pending and the narrower first-range count component published as PR2749 +at `a18ba3bbfb549af66488a890edcb4a3744de90a3`. Both are credited in TASK/README; +no public coordination post was made. +The selected cold replay is not required or claimed: no selected artifact, +frontier or predecessor bytes were changed. No fixed-tape compiler, full GL64 +payload execution, proof-assistant verification, human review or new κ is +claimed. The optional full-conjugated outer toy was abandoned as too slow and +is not part of the retained executable or evidence. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/VERIFY.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/VERIFY.json new file mode 100644 index 0000000000..b6072f66c1 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/VERIFY.json @@ -0,0 +1,76 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "certificates/selected-result.json", + "research/community-hyperplane599-audit/pr589/bit589/v9/hosted/GLOBAL-TEMPLATE.json.gz", + "research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json", + "research/e8-bit-p111-tuned/tune/EXPECTED.json", + "research/e8-bit-p111-tuned/tune/bitE8mut-p111-tuned.json.gz", + "research/pr589-five-helper-hosting/PROOF.md", + "research/pr589-five-helper-hosting/verify.py", + "research/recursive-parking-boundary/README.md", + "research/selected-bit-local-ring-sweeps/PROOF.md", + "research/selected-bit-recursive-closure/PROOF.md", + "upstream/build/sections/02-streams.tex" + ], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--suite", + "source" + ], + "timeout_seconds": 180, + "checks": "Full selected catalogue, all literal global events, gapped and sampled high-field endpoint checks" + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--suite", + "node" + ], + "timeout_seconds": 600, + "checks": "Complete GL2 first-range Boolean column replay including COPY, IDLE, bridge and exchange" + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--suite", + "recursion" + ], + "timeout_seconds": 60, + "checks": "Independent child layouts, all-size peel, selected descriptor/frame handoff, deep scheduler and rejected-return controls" + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--suite", + "nested" + ], + "timeout_seconds": 300, + "checks": "Complete two-level physical GL2 toy execution with independent address provenance" + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--suite", + "controls" + ], + "timeout_seconds": 60, + "checks": "Linear sign cost and malformed inputs, stale-state witnesses, native bridge/exchange, source and receipt mutation controls" + } + ] +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/bootstrap.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/bootstrap.py new file mode 100644 index 0000000000..448c9b3a86 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/bootstrap.py @@ -0,0 +1,11 @@ +"""Resolve the exact exported predecessor, with candidate modules first.""" +from pathlib import Path +import sys +ROOT=Path(__file__).resolve().parent +for path in (ROOT/'predecessor'/'vendor', ROOT/'predecessor', ROOT): + path=str(path) + if path in sys.path: sys.path.remove(path) + sys.path.insert(0,path) + +import sources +sources.ROOT=ROOT.parents[1] diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_layout.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_layout.py new file mode 100644 index 0000000000..be59d614d2 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_layout.py @@ -0,0 +1,147 @@ +"""Independent gap, peel and generated-weight endpoint checks.""" +from hashlib import sha256 +from itertools import product +import sys +from time import monotonic + +from cardinal_counts import Count +from catalogue import Catalogue, Specifications +from check_runtime import Tracker, destination +from check_support import audit, bits, inspect_count, no_decode +from consumer import IncomingWeights +from directory import Context +from layout import Layout +import model +from numeric import Geometry +import oracle +import peel +from plan import Plan +from records import Fields, Program, Tape +from words import Arena, Ring, need + + +def extents(): + arena,indices=Arena(5),Arena(11) + mod=arena.input(9);ring=Ring(mod) + columns,depth=indices.input(1),indices.input(0) + before,gap,suffix=Count.literal(2),Count.literal(5),Count.literal(7) + checks=0 + for n in (64,65,95,127): + size=indices.input(n) + geometry=Geometry(Plan(64,1,True,()),indices,columns,depth,0,object()) + layout=Layout(geometry,size,ring,3,before,gap,suffix) + for a,b in ((0,1),(0,127),(63,64),(64,65),(126,127)): + first,second=indices.input(a),indices.input(b) + with no_decode():result=layout.extents(first,second) + x=a if a<64 else a+2*(n-64) + y=b if b<64 else b+2*(n-64) + expected=[2*9**x*(5 if x>=n else 1),9**(y-x-1)*(5 if x=n else 1),7*9**(2*n-1-x)*(5 if x=3 guard. + self.q,self.dimension,self.requests=2,2,2 + self.radices=(3,2) + self.size,self.limit,self.bits=6,24,5 + + +class Catalogue: + def __init__(self): + self.codes=ToyCodes() + self.requests=(Request("MOVE",0,0),Request("MOVE",1,0)) + + def low_classes(self): + for ordinal in range(6):yield self.codes.unrank(ordinal) + + +class Topology: + families=replicas=1 + schedule=({"kind":"local_cover_sweep","stage":0},) + + def __init__(self,catalogue):self.catalogue=catalogue + + def call(self,stage,replica): + need(stage==replica==0,"toy single selected sweep") + return Call(0,0,(Owner(0,I),),(0,),(2,), + ((0,0,0,1,1,0),(0,0,1,2,1,0)),(0,1),False) + + @staticmethod + def matrix(chart):return chart + + +class UnitIncoming: + """The only nonzero coefficient over F2 is one, for every frozen prefix.""" + def __init__(self,context):self.context=context + def weight(self,index):return self.context.arena.copy(self.context.ring.one) + def coefficient(self,prefix,request): + need(request.kind=="incoming","toy incoming request") + return self.weight(request.coordinate) + + +class Consumer: + recursive=True + + def __init__(self,context,indices,program,size,depth,catalogue,topology, + incoming,plans,tracker,counters,root_axes=False,root_level=False): + self.context,self.indices,self.program=context,indices,program + self.size,self.depth=size,depth + self.catalogue,self.topology,self.incoming=catalogue,topology,incoming + self.plans,self.tracker,self.counters=plans,tracker,counters + self.root_axes=root_axes + self.root_level=root_level + + def apply(self,source,identifier,common,low,old_directory,old_count, + before,gap,suffix,observe=None,child_stock=None,child_before=None): + need(common and identifier in (0,1),"toy bound MOVE source") + context,indices=self.context,self.indices + expected_stock=Count.literal(6 if self.root_level else 1) + try: + need(child_stock is not None and expected_stock.equals(child_stock), + "nested model exact independent unused stock") + self.counters["root_stock_checks" if self.root_level else "child_stock_checks"]+=1 + finally:expected_stock.close() + plan,constants=self.plans[(identifier,low)] + if self.root_axes:plan=Plan(2,1,True,()) + code=context.codes.encode(identifier,common,low) + directory,prefixes=produce(old_directory,self.depth,old_count,code,context) + divisor,one=indices.literal(2),indices.literal(1) + columns,remainder=Unsigned(indices).divmod(self.size,divisor) + indices.free_many(divisor,remainder) + geometry=Geometry(plan,indices,columns,self.depth,code,self.program) + # A checker-only scale reduction makes width two an actual internal + # call. Production Geometry's cutoff remains exactly64. + indices.free(geometry.leaf_cutoff) + geometry.leaf_cutoff=indices.literal(2) + fields=geometry.plus(self.depth,one);indices.free(one) + layout=Layout(geometry,self.size,context.ring,context.q,before,gap,suffix) + + def coefficient(prefix,request): + # At fixed q=2,w=1 all high fields are zero and all unit weights + # are one. These finite coefficients were compiled beforehand. + if request.kind=="child":return context.arena.copy(context.ring.one) + key=(request.reference,request.reverse_adapter) + return context.arena.literal(constants[key]) + + def invoke(current,event): + self.counters["internal_calls"]+=1 + need(child_stock is not None and child_before is not None,"toy separate unused stock") + extents=layout.child_extents(event.first,event.second,event.width,before=child_before) + child_program=object() + child=Consumer(context,indices,child_program,event.width,event.depth, + self.catalogue,self.topology,self.incoming,self.plans, + self.tracker,self.counters) + node=Node(context,indices,child_program,event.width,event.depth, + self.topology,child,self.incoming) + frozen=bytes(directory.cells) + try: + result=yield Invocation(node.run_generator(current,directory,prefixes, + child_stock,*extents)) + need(bytes(directory.cells)==frozen,"toy frozen parent directory preserved") + need(current.head==result.head==directory.head==1,"toy complete child heads") + self.counters["internal_returns"]+=1 + return result + finally: + for extent in extents:extent.close() + + def boundary(kind):self.counters[kind]+=1 + try: + self.counters["residuals"]+=1 + # Two direct coordinate-projector normal forms keep the outer + # fixture economical. Every real internal child still executes + # all 12 conjugated GL2 good/fallback normal forms unchanged. + if self.root_axes: + first=geometry.raw.times_small(columns,identifier) + second=geometry.raw.times_small(columns,3-identifier) + events=child_trace(geometry,first,second,indices.copy(columns),"good") + else:events=execute(geometry) + return (yield from packet_engine.run_generator(source,events,layout, + directory,prefixes,fields,coefficient,factory=self.tracker.payload, + observe=boundary,invoke=invoke)) + finally: + layout.close();geometry.close();indices.free_many(columns,fields) + directory.clear();prefixes.close();old_directory.rewind() + + +def compile_coefficients(catalogue,context,indices,incoming): + """Fixed 12-member toy source table; host decoding occurs only here.""" + plans={} + ring=context.ring + matrices=Matrices(ring) + for low in catalogue.low_classes(): + for identifier in (0,1): + prepared=oracle.multiply(low,oracle.reduce_rational(I if identifier==0 else S,2),2) + projector=oracle.multiply([[row[0]] for row in prepared], + oracle.inverse(prepared,2)[:1],2) + good=projector[0][0]!=0 + plan=compile_plan(projector,1,2,good) + encoded=matrices.constants(projector) + form=good_form(encoded,1,ring) if good else fallback_form(encoded,ring) + columns,depth=indices.literal(1),indices.literal(0) + page=Page(plan,form,ring,indices,columns,incoming.weight,depth,0,object()) + constants={} + for command in plan.commands: + if command.kind!="add":continue + for reverse in (False,True): + value=page.coefficient(command.reference,depth,reverse) + constants[(command.reference,reverse)]=value.inspect() + context.arena.free(value) + page.close();matrices.free(encoded);indices.free_many(columns,depth) + plans[(identifier,low)]=(plan,constants) + return plans + + +def run(): + start=monotonic() + catalogue=Catalogue();topology=Topology(catalogue) + arena,indices=Arena(3),Arena(8) + modulus=arena.input(2);ring=Ring(modulus);context=Context(ring,catalogue.codes) + incoming=UnitIncoming(context) + plans=compile_coefficients(catalogue,context,indices,incoming) + size,depth=indices.input(4),indices.input(0) + program=object();tracker=Tracker();counters=Counter() + consumer=Consumer(context,indices,program,size,depth,catalogue,topology, + incoming,plans,tracker,counters,root_axes=True,root_level=True) + node=Node(context,indices,program,size,depth,topology,consumer,incoming) + source=tracker.source(36*256,linear=False);original=bytes(source.cells) + old=Tape();old_count=Count.literal(1);rows=Count.literal(36) + before,gap,suffix=Count.literal(1),Count.literal(1),Count.literal(1) + with tracker.install(), no_decode(): + output=node.run(source,old,old_count,rows,before,gap,suffix) + try: + need(bytes(source.cells)==original,"nested model read-only source") + need(source.head==output.head==old.head==1,"nested model restored heads") + for address in range(36*256): + wanted=destination(address,4,2,(1,1,1,1)) + need(output.origins.get(wanted+1)==address,"nested model exact complete F endpoint") + need(len(output.origins)==36*256,"nested model exact output extent") + need(counters["internal_calls"]==counters["internal_returns"]>0, + "nested model actual internal returns") + need(counters["internal_calls"]==12 and counters["residuals"]==156 + and counters["root_stock_checks"]==12 and counters["child_stock_checks"]==144, + "complete two-level GL2 source and stock coverage") + need(counters["enter"]==counters["return"],"nested model all child brackets close") + need(tracker.live=={source,output},"nested model all tracked work erased") + record={"domain":"toy q=2, dimension=2, cutoff=2, one family; not selected GL64", + "root_normal_forms":"coordinate projectors", + "root_width":4,"root_rows":36,"complete_addresses":36*256, + "child_fresh_rows":6,"leaf_unused_rows":1, + "low_classes":6,"counts":dict(sorted(counters.items())), + "output_sha256":sha256(bytes(output.cells)).hexdigest(), + "tracked_work_erased":tracker.erased} + finally: + output.clear();source.clear();old.clear() + for value in (old_count,rows,before,gap,suffix):value.close() + indices.free_many(size,depth);context.close();ring.close();arena.free(modulus) + need(not indices.live and not arena.live,"nested model numerical restoration") + print("nested model completed in %.2fs"%(monotonic()-start),flush=True) + return record + + +if __name__=="__main__": + import json + print(json.dumps(run(),sort_keys=True)) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_recursion.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_recursion.py new file mode 100644 index 0000000000..8f36c88e19 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_recursion.py @@ -0,0 +1,544 @@ +"""Independent layout, lifecycle and real-frame junction checks. + +The frame test patches only SelectedNode.run_generator with a tiny controlled +consumer. It exercises the real descriptor/Frame/old-directory handoff and +return, not the unmaterialized complete selected GL64 payload or its endpoint. +""" +from collections import Counter +from dataclasses import replace +from hashlib import sha256 +import json +from pathlib import Path +import sys +from types import SimpleNamespace + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import bootstrap +from cardinal_counts import Count +from catalogue import Catalogue, Specifications +from check_support import audit, bits, inspect_count, no_decode +from directory import Context, append_tape +from layout import Layout +import node +from numeric import Geometry +import oracle +import model +from packet import read_prefix +import packet_engine +import peel +from records import Fields, Program, Tape +import recursive_call +from recursive_call import child_call +from scheduler import Invocation, complete +from trace import Event, child, pair_command +from words import Arena, BLANK, RIGHT, Ring + + +def expected_extents(n, dimension, modulus, first, second, width, before, gap, suffix): + core = dimension * (n // dimension) + def physical(i): + return i if i < core else i + 2 * (n - core) + a, b = physical(first), physical(second) + assert physical(first + width - 1) == a + width - 1 + assert physical(second + width - 1) == b + width - 1 + assert a + width <= n or a >= n + assert b + width <= n or b >= n + result = [before * modulus ** a, modulus ** (b - a - width), + suffix * modulus ** (2 * n - b - width)] + result[0 if a >= n else 2 if b + width <= n else 1] *= gap + return tuple(result) + + +def layout_case(n, dimension, modulus, chunk, invalid=False): + indices = Arena(max(9, (4 * n).bit_length() + 1)) + residues = Arena(modulus.bit_length() + 1) + m = residues.input(modulus); ring = Ring(m) + size, columns, zero = (indices.input(v) for v in (n, n // dimension, 0)) + geometry = Geometry(SimpleNamespace(dimension=dimension), indices, columns, zero, 0, zero) + before, gap, suffix = (Count.literal(v) for v in (2, 5, 3)) + layout = Layout(geometry, size, ring, 3, before, gap, suffix) + first, second, width = (indices.input(v) for v in chunk) + output = None + try: + try: + with no_decode(): + output = layout.child_extents(first, second, width, before=before) + except ValueError: + if invalid: + return None + raise + assert not invalid, 'invalid projected child accepted' + result = tuple(inspect_count(v) for v in output) + assert result == expected_extents(n, dimension, modulus, *chunk, 2, 5, 3) + assert result[0] * modulus ** (2 * chunk[2]) * result[1] * result[2] == 30 * modulus ** (2 * n) + return result + finally: + if output is not None: + for value in output: value.close() + layout.close(); geometry.close() + indices.free_many(size, columns, zero, first, second, width) + ring.close(); residues.free(m) + for value in (before, gap, suffix): value.close() + audit(indices); audit(residues) + + +def layouts(): + digest = sha256(); count = invalid = 0 + for dimension, sizes in ((2, (4, 5, 6, 7)), (64, (64, 65, 128, 129, 191, 192, 193, 257))): + for n in sizes: + f = n // dimension; rank = min(42, dimension - 1) + chunks = [(0, (2 * dimension - rank) * f, rank * f)] + chunks += [(i * f, k * f, f) for i, k in ((0, 1), (0, dimension), (dimension, 2 * dimension - 1))] + if f // 2: + chunks += [(k * f, (k + 1) * f - f // 2, f // 2) for k in (1, dimension + 1)] + for modulus in (3, 9): + for chunk in chunks: + result = layout_case(n, dimension, modulus, chunk) + digest.update(json.dumps([n, dimension, modulus, chunk, result]).encode()); count += 1 + core = dimension * f + for chunk in ((0, 1, 2), (core - 1, core + 2, 2)): + layout_case(n, dimension, 3, chunk, invalid=True); invalid += 1 + return {'cases':count, 'rejected_overlapping_or_noncontiguous_chunks':invalid, + 'moduli':[3,9], 'spectators':[2,5,3], 'digest':digest.hexdigest()} + + +def traces(): + result = [] + for n in (128, 4096, 8192): + indices = Arena((4 * n).bit_length() + 1) + columns, depth = indices.input(n // 64), indices.input(3) + program = object() + page = Geometry(SimpleNamespace(dimension=64), indices, columns, depth, 17, program) + for label, target, source in (('pair_head',0,1), ('pair_tail',64,65), ('unit_cross',0,64)): + kind = 'unit' if label == 'unit_cross' else 'pair' + command = SimpleNamespace(target=target, source=source, reference=SimpleNamespace(kind=kind)) + generator = pair_command(page, command) + counts = Counter(); boundaries = [] + with no_decode(): + for event in generator: + counts[event.kind] += 1 + if event.kind == 'enter': + boundaries.append([event.child_kind, inspect_count(event.width), event.half, + event.field, event.reverse]) + f = n // 64 + expected = 1 if target < 64 <= source else 3 + assert counts['enter'] == counts['return'] == expected + assert counts['invoke'] == (int(f >= 64) + (2 * int(f // 2 >= 64) if expected == 3 else 0)) + result.append({'parent_width':n, 'kind':label, 'events':dict(counts), 'boundaries':boundaries}) + generator = child(page, indices.zero(), indices.input(86 * (n // 64)), + indices.input(42 * (n // 64)), 'good') + with no_decode(): + kinds = [event.kind for event in generator] + assert kinds == ['enter', 'invoke', 'return'] + result.append({'parent_width':n, 'kind':'good', 'events':kinds, 'width':42*(n//64)}) + page.close(); indices.free_many(columns, depth); audit(indices) + return result + + +def trampoline(): + entered = []; returned = []; closed = [] + def descend(depth, fail=False): + entered.append(depth) + try: + if depth: + value = yield Invocation(descend(depth - 1, fail)) + else: + if fail: raise ValueError('deliberate deepest controlled failure') + value = 0 + returned.append(depth) + return value + 1 + finally: + closed.append(depth) + assert complete(descend(1500)) == 1501 + assert entered == list(range(1500, -1, -1)) + assert returned == closed == list(range(1501)) + entered.clear(); returned.clear(); closed.clear() + try: + complete(descend(1100, True)) + except ValueError as error: + assert str(error) == 'deliberate deepest controlled failure' + else: + raise AssertionError('deep child failure was swallowed') + assert closed == list(range(1101)) and not returned + def illegal(): + yield 'non-invocation suspension' + try: complete(illegal()) + except ValueError: pass + else: raise AssertionError('untyped suspension accepted') + return {'completed_frames':1501, 'closed_after_failure':1101, 'host_recursion_limit_unchanged':True} + + +def lifecycle(): + indices = Arena(10); columns, depth = indices.input(2), indices.zero() + program = object(); page = Geometry(SimpleNamespace(dimension=64), indices, columns, depth, 3, program) + layout = SimpleNamespace(geometry=page, fibre=lambda:Count.literal(1)) + one = Count.literal(1); fields = indices.zero(); directory = Tape() + source = Tape(); source.append(1); source.rewind() + words = [indices.input(v) for v in (0,172,84,1)] + base = Event('enter', words[0], words[1], width=words[2], depth=words[3], + child_kind='good', source_code=3, parent_identity=program) + invoke_count = [] + def consumer(current, event): + invoke_count.append(event.child_kind) + if mode == 'aliased_output': + if False: yield + return current + output = Tape(); append_tape(current, output); output.rewind() + if False: yield + return output + def events(mode): + yield base + if mode != 'missing_invoke': yield replace(base, kind='invoke') + if mode == 'duplicate_invoke': yield replace(base, kind='invoke') + if mode == 'width_mutation': + page.raw.increment_in_place(base.width) + if mode == 'aliased_metadata_mutation': + base.field = 1 + if mode != 'missing_return': + yield replace(base, kind='return', field=1 if mode == 'metadata_mutation' else base.field) + rejected = [] + for mode in ('normal','missing_invoke','duplicate_invoke','missing_return','metadata_mutation', + 'aliased_output','aliased_metadata_mutation','width_mutation'): + base.field = 0 + original = bytes(source.cells); output = None + try: + with no_decode(): + output = packet_engine.run(source,events(mode),layout,directory,one,fields,None,invoke=consumer) + assert mode == 'normal', 'malformed recursive lifetime accepted: ' + mode + assert bits(output) == bytes([1]) and output is not source + except ValueError: + assert mode != 'normal' + rejected.append(mode) + finally: + if output is not None and output is not source: output.clear() + assert bytes(source.cells) == original and source.head == directory.head == 1 + source.clear(); directory.clear(); one.close(); page.close() + indices.free_many(columns, depth, fields, *words); audit(indices) + return {'normal_owned_return':True, 'rejected':rejected} + + +def abort_cleanup(): + """A child exception must erase the parent's already-created output.""" + indices = Arena(10); columns, level = indices.input(1), indices.zero() + identity = object() + geometry = Geometry(SimpleNamespace(dimension=64),indices,columns,level,0,identity) + layout = SimpleNamespace(geometry=geometry,fibre=lambda:Count.literal(1)) + source = Tape(); source.append(1); source.rewind() + directory = Tape(); prefixes = Count.literal(1); fields = Count.literal(0) + operands = [indices.input(v) for v in (0,64,64,1)] + boundary = Event('enter',operands[0],operands[1],width=operands[2],depth=operands[3], + parent_identity=identity,child_kind='good') + created = [] + class Captured(Tape): + def __init__(self): + super().__init__(); created.append(self) + def events(): + yield Event('sign',operands[0]) + yield boundary + yield replace(boundary,kind='invoke') + yield replace(boundary,kind='return') + def fail(current,event): + if False: yield + raise ValueError('controlled failed child') + original_action = packet_engine.action + packet_engine.action = lambda local,event,layout,coefficient,factory:local + try: + try: + complete(packet_engine.run_generator(source,events(),layout,directory,prefixes,fields, + None,factory=Captured,invoke=fail)) + except ValueError as error: assert str(error) == 'controlled failed child' + else: raise AssertionError('child exception swallowed') + assert created and all(not bits(tape) and tape.head==1 for tape in created) + assert bits(source)==bytes([1]) and source.head==directory.head==1 + finally: + packet_engine.action=original_action + source.clear();directory.clear();prefixes.close();fields.close();geometry.close() + indices.free_many(columns,level,*operands) + audit(indices) + return {'child_failure_propagated':True,'owned_parent_tapes_erased':len(created), + 'scope':'controlled primitive creates owned output before failing child; real packet engine and scheduler'} + + +def construction_failure(): + """Failed construction cannot leave a frame that the caller cannot own.""" + indices,arena=Arena(10),Arena(3) + modulus=arena.input(3);ring=Ring(modulus) + context=Context(ring,SimpleNamespace(q=3,dimension=64,bits=2)) + program=Program.fixture(indices,arena,256,2,[],2) + width,depth=indices.input(168),indices.input(1) + parent=SimpleNamespace(context=context,indices=indices,specifications=SimpleNamespace(catalogue=object())) + event=SimpleNamespace(width=width,depth=depth) + banks=[];programs=[] + original_arena,original_program,original_node=recursive_call.Arena,recursive_call.Program,node.SelectedNode + def bank(*args,**kwargs): + result=original_arena(*args,**kwargs);banks.append(result);return result + def copied_program(*args,**kwargs): + result=original_program(*args,**kwargs);programs.append(result);return result + def reject_constructor(child_context,child_indices,*args): + child_context.arena.zero();child_indices.zero() + raise ValueError('injected child construction failure') + recursive_call.Arena,recursive_call.Program,node.SelectedNode=bank,copied_program,reject_constructor + saved=bytes(program.tape.cells) + try: + try: + with no_decode(): recursive_call.Frame(parent,program,event) + except ValueError as error: assert str(error)=='injected child construction failure' + else: raise AssertionError('constructor injection was not reached') + assert len(banks)==2 and len(programs)==1 + for value in banks:audit(value) + assert not bits(programs[0].tape) + assert bytes(program.tape.cells)==saved and program.tape.head==1 + finally: + recursive_call.Arena,recursive_call.Program,node.SelectedNode=original_arena,original_program,original_node + program.tape.clear();indices.free_many(width,depth);context.close();ring.close();arena.free(modulus) + audit(indices);audit(arena) + return {'failed_fresh_banks_erased':2,'copied_program_erased':True,'parent_program_unchanged':True} + + +def all_size_peel(): + """Lower actual peel.run to independent scalar rows, without dense bits.""" + indices,arena=Arena(10),Arena(5) + modulus=arena.input(9);ring=Ring(modulus) + context=SimpleNamespace(dimension=64,q=3,ring=ring,arena=arena) + size,depth=indices.input(129),indices.zero() + values=[1]*129;values[64]=2;values[128]=5 + incoming=model.Incoming(context,indices,values) + source,old=Tape(),Tape() + old_count,stock,before,gap,suffix=(Count.literal(v) for v in (1,7,2,5,3)) + original_run=packet_engine.run + def collect(force_legacy_columns): + rows=[{i:1} for i in range(258)] + coordinates=[];counts=Counter();positions=set() + def scalar(source_arg,events,layout,directory,prefixes,fields,coefficient,**kwargs): + assert source_arg is source and directory is old + assert inspect_count(layout.geometry.columns)==2 and not layout.embedded + assert [inspect_count(x) for x in (layout.before,layout.gap,layout.suffix)]==[14,5,3] + if force_legacy_columns: + replacement=indices.literal(1);column_word=layout.geometry.columns + while replacement.read()!=RIGHT: + column_word.write(replacement.read());column_word.step(1);replacement.step(1) + column_word.rewind();replacement.rewind();indices.free(replacement) + try: + for event in events: + first=inspect_count(event.first);positions.add(first);counts[event.kind]+=1 + if event.kind=='sign': + rows[first]={j:(-value)%9 for j,value in rows[first].items()} + else: + second=inspect_count(event.second);positions.add(second) + if event.kind=='atom_swap': rows[first],rows[second]=rows[second],rows[first] + else: + assert event.kind=='add' + coordinates.append(inspect_count(event.request.coordinate)) + value=coefficient(old,event.request);scalar_value=inspect_count(value);arena.free(value) + for j,entry in rows[second].items():rows[first][j]=(rows[first].get(j,0)+scalar_value*entry)%9 + rows[first]={j:value for j,value in rows[first].items() if value} + finally:events.close() + return source + packet_engine.run=scalar + with no_decode(): + assert peel.run(source,context,indices,size,depth,object(),old,old_count, + stock,before,gap,suffix,incoming) is source + return rows,coordinates,counts,positions + try: + actual,coordinates,counts,positions=collect(False) + expected=[{i:1} for i in range(258)];expected[128]={129:5};expected[129]={128:2} + assert actual==expected and coordinates==[128]*3 and positions=={128,129} + assert counts=={'atom_swap':4,'add':3,'sign':1} + legacy,legacy_coordinates,legacy_counts,_=collect(True) + assert legacy!=expected and legacy_coordinates[0]==64 and legacy_counts['sign']==65 + finally: + packet_engine.run=original_run + incoming.close();source.clear();old.clear() + for value in (old_count,stock,before,gap,suffix):value.close() + indices.free_many(size,depth);ring.close();arena.free(modulus) + audit(indices);audit(arena) + return {'parent_width':129,'dimension':64,'columns':2,'remainder':1,'modulus':9, + 'incoming_weights':{'0':1,'64':2,'128':5},'queried_offsets':coordinates, + 'changed_scalar_rows':{'128':{'129':5},'129':{'128':2}}, + 'primitive_counts':dict(counts),'legacy_columns_one_rejected':True, + 'scope':'actual peel.run and incoming callback; independent scalar opcode interpreter; no dense payload'} + + +def frame_handoff(catalogue=None, mutation=None): + catalogue = Catalogue(3) if catalogue is None else catalogue + specifications = Specifications(catalogue) + identifier = next(i for i,r in enumerate(catalogue.requests) if r.base.rank == 42) + template = catalogue.template_for(identifier, True) + low = tuple(map(tuple, oracle.inverse(oracle.reduce_rational(template.preparation, 3), 3))) + spec = specifications.bind(identifier, True, low) + assert spec.good and spec.template.rank == 42 + indices, arena = Arena(10), Arena(3) + modulus = arena.input(3); ring = Ring(modulus); context = Context(ring, catalogue.codes) + size, depth = indices.input(256), indices.zero() + program = Program.fixture(indices, arena, 256, 2, [], catalogue.codes.bits) + root_node=node.SelectedNode(context,indices,program,size,depth,catalogue,specifications) + parent=root_node.consumer + # Exercise repeated actual construction: these source caches must not + # acquire one new self key for every completed recursive frame. + common_topology=root_node.topology + common_call=common_topology.call(0,0) + cache_sizes=(type(common_topology).call.cache_info().currsize, + type(common_topology).recipe.cache_info().currsize) + extra_nodes=[node.SelectedNode(context,indices,program,size,depth,catalogue,specifications) + for _ in range(2)] + for repeated in extra_nodes: + assert repeated.topology is common_topology + assert repeated.topology.call(0,0) is common_call + zero_high = [[0] * 64 for _ in range(64)] + field = Fields.fixture(indices, arena, [(spec.code, zero_high)], catalogue.codes.bits) + directory = Tape(); append_tape(field.tape,directory); append_tape(field.tape,directory); directory.rewind() + field.tape.clear() + prefixes, stock, before, gap, suffix = (Count.literal(v) for v in (2,11,2,5,3)) + fields = indices.input(1) + source = Tape() + original_payload = bytes((i * 7 ^ i // 3) & 1 for i in range(23)) + for bit in original_payload: source.append(bit) + source.rewind() + original_program, original_directory = bytes(program.tape.cells), bytes(directory.cells) + frames = []; handoffs = []; returned = []; outputs = []; injected = [] + protected_indices, protected_residues = set(indices.live), set(arena.live) + original_run = node.SelectedNode.run_generator + + def controlled_run(self, current, old, count, unused, b, g, s, observe=None): + # Test instrumentation reads encoded values; production code stays + # under no_decode and never sees these Python integers. + level, width = inspect_count(self.depth), inspect_count(self.parent_size) + frames.append(self) + assert self.topology is common_topology + assert self.topology.call(0,0) is common_call + assert self.indices is not indices and self.context.arena is not arena + assert unused is stock and inspect_count(unused) == 11 and inspect_count(count) == 2 + assert level in (1,2) and width == {1:168,2:84}[level] + root_size, root_unit, root_depth = self.program.root() + assert (inspect_count(root_size),inspect_count(root_unit),inspect_count(root_depth)) == (256,2,level) + self.indices.free_many(root_size,root_depth); self.context.arena.free(root_unit) + slot = self.indices.input(level) + metadata, previous, generated = self.program.step(slot) + assert metadata == (0,spec.code,42,0,0,0) + assert (inspect_count(previous),inspect_count(generated)) == ({1:256,2:168}[level],width) + self.indices.free_many(slot,previous,generated) + # Every original physical prefix remains present in the same order. + old.rewind() + for _ in range(2): + saved = read_prefix(old,self.depth) + assert bits(saved) == bits(directory)[:len(bits(directory))//2] * level + saved.clear() + assert old.read() == BLANK # Exactly two complete physical prefixes. + old.rewind() + power = {1:176,2:344}[level] + assert tuple(inspect_count(x) for x in (b,g,s)) == (2,5*3**power,3) + handoffs.append({'depth':level,'width':width,'prefixes':2,'stock':11, + 'before':2,'gap':'5*3^'+str(power),'suffix':3}) + original = bytes(current.cells) + if level == 1: + new_directory = Tape(); old.rewind() + new_field = Fields.fixture(self.indices,self.context.arena,[(spec.code,zero_high)],catalogue.codes.bits) + for _ in range(2): + old_prefix = read_prefix(old,self.depth) + append_tape(old_prefix,new_directory); append_tape(new_field.tape,new_directory) + old_prefix.clear() + old.rewind(); new_directory.rewind(); new_field.tape.clear() + child_fields = self.indices.input(2) + cb,cg,cs = (Count(x) for x in (b,g,s)) + try: + transformed = yield from invoke(self.consumer,current,new_directory,count,child_fields,unused,cb,cg,cs) + output = Tape(); outputs.append(output) + transformed.rewind() + while transformed.read() in (0,1): + output.append(1-transformed.read()); transformed.step(1) + transformed.rewind(); transformed.clear(); output.rewind() + finally: + self.indices.free(child_fields); new_directory.clear() + for value in (cb,cg,cs):value.close() + else: + # Deliberately tiny controlled permutation, not selected BIT. + values = bits(current); output = Tape(); outputs.append(output) + for bit in reversed(values): output.append(bit) + output.rewind() + assert bytes(current.cells) == original and current.head == old.head == self.program.tape.head == 1 + if level == 2 and mutation is not None: + injected.append(mutation) + if mutation == 'source_bit': current.cells[1] ^= 1 + elif mutation == 'directory_bit': old.cells[1] ^= 1 + elif mutation == 'output_head': output.step(1) + else: raise AssertionError('unknown fixture mutation') + returned.append(level) + return output + + def invoke(owner,current,old,count,field_count,unused,b,g,s): + local_indices=owner.indices; n=inspect_count(owner.parent_size); f=n//64 + columns=local_indices.input(f) + geometry=Geometry(SimpleNamespace(dimension=64),local_indices,columns,owner.depth,spec.code,owner.program) + leading=Count.product(unused,b) + layout=Layout(geometry,owner.parent_size,owner.context.ring,3,leading,g,s) + operands=[local_indices.input(v) for v in (0,86*f,42*f,inspect_count(owner.depth)+1)] + event=Event('invoke',operands[0],operands[1],width=operands[2],depth=operands[3], + child_kind='good',source_code=spec.code,parent_identity=owner.program) + saved_source, saved_directory = bytes(current.cells), bytes(old.cells) + try: + result = yield from child_call(owner,current,event,layout,old,count,field_count,unused,b) + assert bytes(current.cells) == saved_source, 'independent checker: frozen source bytes changed' + assert bytes(old.cells) == saved_directory, 'independent checker: frozen directory bytes changed' + return result + finally: + layout.close();geometry.close();leading.close();local_indices.free_many(columns,*operands) + + node.SelectedNode.run_generator=controlled_run + rejection = None + try: + with no_decode(): + output=complete(invoke(parent,source,directory,prefixes,fields,stock,before,gap,suffix)) + assert bits(output) == bytes(1-bit for bit in reversed(original_payload)) + assert bytes(source.cells)[1:] == original_payload + assert bytes(directory.cells)==original_directory and bytes(program.tape.cells)==original_program + assert source.head==output.head==directory.head==program.tape.head==1 + assert returned == [2,1] + assert mutation is None, 'injected return corruption escaped the checker' + assert indices.live==protected_indices and arena.live==protected_residues + for frame in frames: + audit(frame.indices); audit(frame.context.arena) + assert not bits(frame.program.tape) + output.clear() + except (ValueError, AssertionError) as error: + if mutation is None or injected != [mutation]: raise + rejection = str(error) + expected = {'source_bit':'independent checker: frozen source bytes changed', + 'directory_bit':'independent checker: frozen directory bytes changed', + 'output_head':'completed recursive return restores caller heads'}[mutation] + assert rejection == expected + finally: + node.SelectedNode.run_generator=original_run + for output in outputs: output.clear() + source.clear();directory.clear();program.tape.clear() + for value in (prefixes,stock,before,gap,suffix):value.close() + indices.free_many(size,depth,fields);context.close();ring.close();arena.free(modulus) + audit(indices);audit(arena) + assert (type(common_topology).call.cache_info().currsize, + type(common_topology).recipe.cache_info().currsize)==cache_sizes + for frame in frames: + audit(frame.indices); audit(frame.context.arena) + assert not bits(frame.program.tape) + if mutation is not None: + return {'mutation':mutation,'rejection':rejection,'closed_frames':len(frames), + 'check_kind':'runtime head contract' if mutation=='output_head' else 'independent preserved-input oracle'} + return {'source_request':identifier,'source_rank':42,'depths':2,'widths':[256,168,84], + 'selected_node_constructions':3+len(frames),'shared_topology_instances':1, + 'repeated_call_recipe_cache_growth':0, + 'sampled_old_prefixes':2,'controlled_payload_bits':23, + 'handoffs':handoffs,'return_order':returned, + 'scope':'real selected constructors, Callback.extend, Frame and directory handoff; controlled child consumer only', + 'complete_selected_GL64_payload_executed':False} + + +def run(catalogue=None): + catalogue = Catalogue(3) if catalogue is None else catalogue + return {'status':'PASS_RECURSIVE_JUNCTIONS','layouts':layouts(),'traces':traces(), + 'trampoline':trampoline(),'lifecycle':lifecycle(),'frame_handoff':frame_handoff(catalogue), + 'abort_cleanup':abort_cleanup(),'construction_failure':construction_failure(), + 'all_size_peel':all_size_peel(), + 'frame_mutations':[frame_handoff(catalogue, mutation) + for mutation in ('source_bit','directory_bit','output_head')]} + + +if __name__ == '__main__': + print(json.dumps(run(),indent=2)) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_runtime.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_runtime.py new file mode 100644 index 0000000000..fe355a7034 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/check_runtime.py @@ -0,0 +1,181 @@ +"""Complete Boolean model with linear provenance attached by the checker.""" +from collections import Counter, deque +from contextlib import contextmanager +from hashlib import sha256 +import sys +from time import monotonic + +import bitstream +import cardinality +from cardinal_counts import Count +from check_support import audit, bits, no_decode +import counts +from directory import Context +import driver +import fresh_rows +import model +import linear_sign +import node +import packet +import packet_engine +from records import Tape +import stream +from words import Arena, BLANK, LEFT, ONE, Ring, ZERO, need + + +class Tracker: + def __init__(self): + self.last=None;self.recent=deque(maxlen=2);self.xor=False + self.live=set();self.erased=0;state=self + class Control(Tape): + def __init__(self): + super().__init__();state.live.add(self) + + def clear(self): + super().clear() + need(self.head==1 and not bits(self),"erased node control work") + if self in state.live:state.live.remove(self);state.erased+=1 + + class Payload(Tape): + def __init__(self): + super().__init__();self.origins={};state.live.add(self) + + def read(self): + value=super().read() + if self.head in self.origins: + state.last=self.origins[self.head];state.recent.append(state.last) + return value + + def write(self,value): + super().write(value) + if value==BLANK:self.origins.pop(self.head,None) + elif value in (ZERO,ONE): + if state.xor: + need(len(state.recent)==2,"two observed Boolean XOR operands") + self.origins[self.head]=state.recent[0]^state.recent[1] + elif state.last is not None:self.origins[self.head]=state.last + + def clear(self): + super().clear() + need(self.head==1 and not self.origins and not bits(self),"erased node payload work") + if self in state.live:state.live.remove(self);state.erased+=1 + self.payload,self.control=Payload,Control + + def source(self,length,linear=True): + tape=self.payload() + for i in range(length):tape.append(((i*13)^(i>>3)^(i>>7)^0x53)&1) + tape.origins={i+1:(1<= 2^80`, `1 <= m <= 64`, `w,n,C >= 1`, and `h >= 0` be integers. +There are `C` old physical positions, including repeated or empty tuples, +`h` frozen fields per position, and one new field. Fix one vocabulary of +`1 <= R0 <= 28278` requests, and use its same minimal code width for all +frozen and current fields. Define + +``` +N = product_(k=0)^(m-1) (q^m-q^k), +B = bitlength(2 R0 N-1), L = bitlength(q^w)+1, +H = q^(m²(w-1)), J = B + m²(L+1) + 2. +``` + +For a source-correct GL interpretation, q must additionally be an odd prime +and the predecessor's other source premises must hold. The storage inequality +itself only uses the stated integer inequalities, so it does not establish +primality or source correctness by checking a large integer fixture. + +The unchanged `append_finite` emits B bits and `WORD_END`; `append_word` +emits L bits and `WORD_END`; each field then emits `RECORD_END`. Thus J is +the exact field extent derived in PR2590. `directory.produce` emits every +old position and every high key exactly once. Counting the tape's initial +`LEFT` cell as well, the occupied directory extent is exactly + +``` +D = 1 + C H (h+1) J. +``` + +There is no allocated trailing blank cell in the retained `Tape.cells`. +This is a count of its fixed-alphabet symbols, not Python object overhead. + +Let each complete Boolean fibre have R bits and impose + +``` +R >= q^(2nw), 17(h+1) <= 20051 w. +``` + +The packet payload is `V = C H R` bits. In particular it includes the entire +body, unused stock and suffix spectators of the predecessor's complete-fibre +contract. R is not just the small slice modified by one local operation. +The depth inequality follows from PR2569's retained coupling +`w=ceil(e^(17/10000))`, `2^(h+1)<=8e²`: taking logarithms gives +`h+1 <= 3+(20000/17)log2(w) <= (20051/17)w`. It is a sufficient envelope, +not a claim that every pair satisfying it is realized by a caller. + +## Uniform numerical inequality + +Write `ell=bitlength(q)`, so ell>=81 and `2^(ell-1)<=q<2^ell`. +Since `2R0<2^16` and `N=81` and `8211<108*81`. Because +`CH(h+1)>=1`, the leading LEFT cell can be absorbed without dropping it: + +``` +D <= CH(h+1)(J+1) < 8300 CH(h+1)w ell. +``` + +For integers w>=1 and q>=3, `w<=q^(w-1)`: it holds at one and induction +uses `w+1<=q w`. Therefore + +``` +D/V < (8300*20051/17) ell * w²/q^(2nw) + <= (8300*20051/17) ell/q². +``` + +The sequence `ell/2^(2(ell-1))` decreases for positive integer ell, since +the ratio of successive terms is `(ell+1)/(4ell)<1`. Hence + +``` +ell/q² <= 81/2^160, +8300*20051*81 < 17*2^30, +D < 2^-130 V. +``` + +This proves the all-input statement. The strict constant is convenient and +not asserted optimal. No numerical logarithm, enormous high-cube materialization, +sampling assumption or empirical asymptotic fit is used in the proof. + +## Physical encoding and use in a caller ledger + +The retained record machine has symbols 0 through 13. A fixed four-bit +encoding therefore occupies exactly `4D` bits for this directory. Consequently + +``` +4D < 2^-128 V, 5D < 2^-127 V, 20D < 2^-125 V. +``` + +The last two inequalities bound the **directory term** `5D` in the +predecessor's parking formula, in symbol cells and in the four-bit encoding. +They do not include separately mentioned role markers or other caller state. +The smaller directory-only allowance is a constructive storage upper bound; +it is not a runtime bound or an admission of the old literal reserve constants. + +For any nonempty finite collection of simultaneously live directories satisfying the +same premises separately, summing gives `sum D_i < 2^-130 sum V_i`, with the +analogous encoded and parking bounds. In particular a live parent and returned +child directory must both be counted. There is no conclusion here that +`sum V_i` equals one current packet, is bounded by the root payload, or follows +the old `V+4v`/`5V+19v` expressions without a new caller occupancy argument. + +The caller must still supply those live volumes and lifetimes; route buckets, +odometer and cardinality tapes, control headers, child-private workspace, owned +and borrowed dirty buffers, and restoration state have separate bills. The +finite source executions below validate directory serialization, not those +global peak or numeric reserve obligations. No directory is free. + +## Boundaries and evidence + +The verifier executes the unchanged producer on complete small high cubes, +repeated/empty old tuples and the selected m=64/w=1 format. An independent +literal serializer checks every returned symbol, the exact J/D formulas, +the LEFT cell and physical multiplicities. Large-q checks use arithmetic +only; the source's fixed-q compiler is not executed at astronomical q. + +The countermodels keep the distinctions effective: tiny q, a header-only +fibre, unbounded frozen depth, or arbitrary padding of the supposedly minimal +code can defeat the numerical fraction. Dropping delimiters or the LEFT cell +understates actual serialized storage. These examples do not refute PR2569, +whose complete-body/root-coupling and fixed-format premises are retained. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2708-README.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2708-README.md new file mode 100644 index 0000000000..79b8742f32 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2708-README.md @@ -0,0 +1,114 @@ +# Sharp live payload/key storage for the selected BIT owner route + +This closes one storage component of Jose Manuel's pending [PR2697](https://github.com/CrocSwap/integer-mult-bounds/pull/2697), pinned at `a53fdf4bcbe33c6732f0bec1badc8c023380f9d1`. Its complete first-node caller leaves route temporaries as `O_q(v)+O(V/W)` and total numerical reserve open. Here the unchanged `route_packet` has an exact live-content peak, including its borrowed input: + +```text +w > 1: 2v + 3H(R+J) +w = 1: 2v + 2HR + HJ +``` + +These are proved for the source routine's well-formed successful runs. Eight complete small fixtures attain the formulas when executing that same routine. This is a component certificate and a scoped caller corollary. It does not establish a total reserve, admit a supplier or change kappa. + +Coordination: [Discussion2319 claim](https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18954841). Base main `b5ea56e0a5ac4552166253b1fa4be0753bb38c30`, priority revision 5. The selected record remains unchanged. + +## Contract and counted storage + +Let q be an odd prime, d the fixed matrix dimension, w a positive payload precision, and `cap=q^(w-1)`. Set + +```text +H = cap^(d*d) complete high matrices per old prefix +C >= 1 physical old-prefix count, repetitions retained +R >= 1 payload symbols in one high-matrix fibre +t = HR one complete high cube +v = CHR one packet +J = d*d*(ell+1) serialized route key +``` + +Here ell is the actual residue arena's fixed binary word length, including its supplied padding. Each of the d*d key words contributes ell binary symbols and one WORD_END delimiter. No minimal encoding assumption is needed. The compiled route must act bijectively on the complete high cube and satisfy the retained source context/word-margin contracts. Every factory invocation creates a fresh, distinct, initially empty tape. The input is exactly v contiguous binary payload symbols and is retained unchanged. + +The count is the number of simultaneously nonblank payload and embedded-key symbols on route tapes, excluding each tape's LEFT marker. Cleared symbols cease to contribute even if the Python bytearray remains allocated. Numerical arena words, counters, context, fixed compilation, tape markers, provenance dictionaries and other Python heap capacity are excluded. This is deliberately narrower than occupied tape volume or process memory. The source's exact abstract tape semantics and ordinary ownership discipline are premises. + +## Lifetime proof + +Write `K=H(R+J)=t+HJ` for one decorated cube. Its content has a fixed length independent of key values, bucket balance, route chart or input bits. + +In `partition`, the current decorated cube retains K symbols. During bucket filling, the two buckets have combined content at most K; the separate key scratch has at most J symbols and the following output is empty. Thus the total is at most `2K+J <= 3K`, since H and R are positive. During bucket concatenation the key scratch has been cleared, while the buckets, current input and growing following output contribute at most 3K. At the final appended output symbol they contribute exactly 3K. The buckets are only cleared in `partition`'s finally block. Clearing current occurs later in `route_cube`, after partition returns. + +During decoration, `route_cube` has at most K decorated symbols, plus numerical scratch excluded above. During key stripping it retains the decorated input and grows a pure output of size at most t, giving at most `K+t <= 3K`. A partition therefore determines its sharp internal peak when cap>1. There is at least one partition because d>=1, ell>=2 and cap>1. If cap=1 there are no partitions, H=1, and the sharp internal peak is K+t at completion of key stripping. + +For old prefix p, numbered 0 through C-1, `route_packet` retains its original v-symbol input, the already completed outer output of length pt, and a separate local cube of length t while `route_cube` runs. Consequently for cap>1 its peak is + +```text +v + pt + t + 3K <= 2v + 3K. +``` + +Equality occurs in the final partition of the final old prefix, before any bucket or current cleanup. The copy from the returned pure cube into the outer output has at most `v+pt+3t <= 2v+2t`, below that peak. For cap=1, replace 3K by K+t and obtain `2v+K+t = 2v+2t+HJ`, attained at the final prefix's key-stripping completion. The final result and borrowed source each have size v; all other counted content is cleared. + +This proves both universal equalities for the fixed routine, rather than a lower bound for every possible routing algorithm. Different disposal timing or a different route can change the result. + +## Consequence for the caller's gather/route/return/scatter phases + +In PR2697, let N be the number of low GL classes, W the number of family streams, `V=WNv`, and r the number of staged roles. Its stated selected values are W=28416 and r=661. Treat these as the caller's authenticated geometry; this package does not replay the full selected catalogue or node. + +When the last role is gathered and routed, r-1 completed packets remain alongside the route input. During inverse routing, all r staged packets remain, but one is already included in the route's borrowed-input charge. Thus both phases are bounded by + +```text +(r+1)v + 3H(R+J). +``` + +Scatter has a different overlap. All r staged packets and the returned packet of size v survive while `selection.scatter` builds a replacement whole family of size Nv. The old family is already counted among the W live families and is cleared only after scatter returns. Hence gather, routing, return and scatter, apart from the retained source/peeled/family streams, are bounded by + +```text +(r+1)v + max(Nv, 3H(R+J)). +``` + +`Node.run` retains at most 3V in protected input, peeled output and live family streams during those phases. Final merge can add a full V before cleanup. A joint bound for these phases and final merge is therefore + +```text +max(4V, 3V + 662v + max(Nv, 3H(R+J))). +``` + +This excludes literal local-word execution, COPY, residual/primitive interiors, peel interiors, directory production, counters and numerical/control storage. In particular COPY can briefly retain 661 roles, a cloned input and a returned private packet, 663v before residual-internal work. The displayed phase bound must not be applied to that interval. No historical `5V+19v` reserve or complete-node allocation is imported. + +## Replay and evidence + +Use Python 3.12 with only the standard library: + +```sh +python3.12 scripts/research_package.py --package research/selected-route-live-volume --check-only +python3.12 scripts/research_package.py --package research/selected-route-live-volume +python3.12 -I -O -B research/selected-route-live-volume/verify.py +``` + +`SNAPSHOTS.json` records exact PR2697 paths, Git blobs and SHA256 hashes. The verifier checks all 16 snapshots before importing any retained code. Twelve required runtime modules are retained byte-for-byte, together with the caller proof, driver, node and attribution notice. These runtime bytes came through PR2569; their inherited notices and dependencies are preserved. The new checker changes no source file or route operation. It supplies a measuring Tape factory and temporarily replaces only the route's private key-tape constructor. + +The eight fixtures use q=3 or 5, d=1 or 2, w=1 through 3, C=1 through 3 and R=1 through 5. Each exercises the complete declared high cube, up to 625 matrices. The 1,298 Boolean positions carry independent origin labels through actual copy operations. A separate integer modular-multiplication oracle checks every output origin and bit. Both partitioned and nonpartitioned cases attain the proof's exact peak. A direct scan of every retained measuring tape independently counts the first attained peak, and the exit census checks source preservation, head reset and cleared temporaries. + +Seventeen behavioral checks reject input/output-only budgets and premature current/bucket disposal budgets for all eight fixtures, then exercise a nonbinary payload failure with preserved borrowed input and erased owned payload buffers. Seven integrity groups cover a Git-free optimized replay, corrupt route/record/driver snapshots, a bool-for-integer receipt mutation, overwrite refusal and internal-output refusal. The receipt is checked with exact type-sensitive JSON comparison. To regenerate, use `--write-result` with a new path outside the package and compare it with RESULT.json. + +Validation passed on macOS arm64 with CPython 3.12.15 through the registered launcher and its seven integrity groups, and on CPython 3.14.8 with optimized assertions disabled and warnings treated as errors. The six repository replay-selection tests passed. Separate internal proof/source review also passed the optimized replay, integrity checks and exact source comparisons; no independent human review is claimed. + +The general theorem is the written lifetime proof. The tests are finite implementation evidence, including arbitrary Boolean origins on small cubes. They do not execute the enormous selected GL64 domain or prove the inherited native/compiler semantics. ValueError cleanup is checked for contiguous tapes without internal BLANK holes. Arbitrary exception cleanup and numerical scratch cleanup on malformed inputs are not claimed. + +## Verification design and deviations + +Build the Lever led to a retained-source replay and literal write counter instead of a hand-counted receipt. Prove It Works led to exact permutation/origin checks and an independent peak census on the actual route. No production code is changed. + +Power of Ten inspection covers the new verifier, tracker and integrity command. There is no recursion. New fixture execution is fixed at eight contexts with at most 625 high matrices, 3 prefixes and 5 fibre symbols. The receipt comparator stops after 20,000 nodes; integrity subprocesses have 90-second timeouts; registered commands have finite 120-second timeouts. New functions remain below 60 physical lines. Executable contracts remain enabled under -O. Syntax validation and warning-as-error replays are run; no separate static type checker or linter is installed. + +Rule 3, memory allocation: Python and the retained tape interpreter allocate during execution. Scope is this finite offline verifier. The fixed fixture list bounds all tapes, keys and origin dictionaries; the tracker retains cleared tapes for the independent census, so its own memory must never be used as the theorem's storage measure. Each successful fixture closes its arena and clears source/result. Follow-up if extending the domains is to calculate a new allocation cap before changing the fixed fixtures. + +Rules 8/9, instrumentation: the inherited factory interface and one temporary routes.Tape replacement provide two explicit measuring-constructor targets. The context manager restores the original target on every exit. This is checker-only instrumentation, with bounded targets and no dynamic code evaluation. Follow-up for production use would be an explicit upstream observer interface, outside this component's scope. + +Frozen predecessor code retains tape-terminated loops, dynamic Python allocation and methods exceeding one page. Rewriting them would destroy the byte-exact subject of this audit. Their execution is bounded here by the finite complete cubes, fixed word lengths and registered timeouts; no repository-wide Power of Ten compliance is asserted. + +## Open next questions + +1. What explicit reserve covers the residual and primitive interiors alongside this caller phase bound? Start with one PR2697 residual ENTER/RETURN, retaining its input, output and the 661 role buffers. Missing lifetime bounds for its directories, counts, coefficient pages and leaf work still block total reserve admission. +2. Can early bucket disposal or avoiding a local cube reduce this routine's peak without changing its complete-fibre semantics? First propose a changed literal ownership schedule and check it against the same origin and peak tests. This is an optimization opportunity, not needed to retain the present audit. A new route requires its own proof and source pin. + +## Credit and scope history + +Nick Petalas prepared this component audit. Jose Manuel/jmbarrancoml supplied PR2697's first-node caller and PR2569's source packets, routes and selected lineage. ywz65 supplied PR2590's cubic setup correction and PR2688's separate directory-storage component. The retained NOTICE.md credits the stream and tape framework, Douglas Colkitt, the selected hosting/word contributors and the source527/compiler lineage. Their construction and code are not claimed as new here. New work follows the repository's Apache-2.0 license. + +This follows the live total-live-volume handoff rather than the task picker's initial complex-mechanism suggestions. TASK.json declares a changed scope from the selected-stock-envelope card's complete stage recurrence to one actual pending caller component. PR2688 handles a different component. No family expansion, formal-kernel or independent human verification, full supplier replay, selected cold replay or new exponent is claimed. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2731-README.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2731-README.md new file mode 100644 index 0000000000..ac5b826f9c --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/evidence/pr2731-README.md @@ -0,0 +1,180 @@ +# Sharp payload storage for the selected BIT residual engine + +PR2697 leaves residual and primitive temporaries as an asymptotic term in its +first-node storage ledger. For its unchanged completed-leaf implementation, +**the sharp live payload bound, including the borrowed input, is `3v + 3R`**. +Here `R` is one complete prefix fibre and `v = P R` is the packet containing +`P >= 1` fibres. This closes one storage component, not the total caller reserve. + +The source is Jose Manuel/jmbarrancoml's [PR2697](https://github.com/CrocSwap/integer-mult-bounds/pull/2697) +at `a53fdf4bcbe33c6732f0bec1badc8c023380f9d1`. +[SNAPSHOTS.json](SNAPSHOTS.json) authenticates the 22 unchanged source exports. +The [Discussion2319 claim](https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18955184) +takes the residual-lifetime handoff after Nick Petalas's +[PR2708 route bound](https://github.com/CrocSwap/integer-mult-bounds/pull/2708). +ywz65's [PR2688 directory bound](https://github.com/CrocSwap/integer-mult-bounds/pull/2688) +is another complementary component. Neither result is reproduced or claimed anew. + +## Contract and metric + +Count nonblank Boolean payload cells on distinct tapes. Reading a cell does not +erase it. Keep borrowed input cells in the count until the routine returns. +Exclude LEFT markers, prefix directories and fields, numerical/controller/count +tapes, and allocated Python backing capacity. Thus this is not a count of all +physical tape cells or host memory. + +Assume `q` is a fixed odd prime, `M = q^w`, `w >= 1`, `P >= 1`, and `R > 0`. +The input is a complete packet of equally sized fibres. Each fibre includes all +positive before/gap/suffix multiplicities and the full body domain supplied by +[Layout](vendor/layout.py). The trace is valid and completes successfully using +the pinned ADD, atom-swap and sign primitives and below-cutoff completed leaves. +Coefficient and observation callbacks allocate no payload tapes. Larger +recursive calls and arbitrary exception-path cleanup are outside this contract. + +## Lifetime proof + +### Primitive interiors + +The primitives preserve their borrowed source of `R` cells and return a new +`R`-cell output. Their bucket reads do not erase bucket content. + +* [ADD](vendor/vendor/stream.py) partitions the source into two buckets whose + combined size is `R`. Both buckets survive until the full output is written. + Its exact peak, including source, is `3R`. +* A single digit swap or complement has the same `3R` peak. In a + [multi-digit atom swap](vendor/vendor/bitstream.py), a later digit pass also + retains the original source while its current intermediate, buckets and next + output coexist. Its exact peak is `4R`. A one-digit atom swap needs `3R`. +* A sign first complements every digit, then calls `translate_one` before + clearing the complemented intermediate. During translation, the original + source, complemented current, translation buckets and complete output all + coexist. Its exact peak is `4R`, including when `w = 1`. + +All these counts are independent of the payload values. Empty bucket partitions +can change which bucket owns a cell, but not the combined bucket length. + +### Packet accumulation + +In [packet_engine.run](vendor/packet_engine.py), the first primitive uses the +borrowed input itself as `current`. After a primitive completes, `current` is a +new full packet. The original borrowed packet remains unchanged. The previous +owned `current` is cleared only after the next complete packet has been written. + +During the last fibre of a later primitive, the retained objects have sizes: + +| Object | Payload cells | +| --- | ---: | +| Original borrowed source | `v` | +| Distinct current packet | `v` | +| Previously completed fibres in the next output | `(P - 1)R` | +| Local source, intermediate, buckets and primitive output | at most `4R` | + +Their sum is `3v + 3R`. Earlier fibres have a smaller accumulated output. +After the primitive returns, copying its result to the packet output retains +only the local source and result, so that phase needs at most `3v + 2R`. +Cleanup and packet replacement cannot increase either bound. + +More precisely, numbering payload primitives from zero, their exact peaks are: + +| Primitive | First primitive | Any later primitive | +| --- | ---: | ---: | +| ADD or one-digit atom swap | `2v + 2R` | `3v + 2R` | +| Sign or multi-digit atom swap | `2v + 3R` | `3v + 3R` | + +An empty trace returns the source alias and has peak `v`. Entry/return records +allocate no payload. Every nonempty [completed leaf](vendor/vendor/trace.py) +contains a sign after earlier primitives. Consequently any trace containing +such a leaf attains `3v + 3R`; the result is not just an upper bound. + +This is a source-level lifetime proof for the stated contract. The finite checks +below corroborate the proof and instrument coverage; they do not replace it. + +## Retained-role corollary + +Let `K` distinct staged packets of size `v` remain live during a local call, +including any existing private packet. Count aliases by tape identity. +In [Driver.local](vendor/driver.py): + +* MOVE passes one of those packets as the engine's borrowed input. The staged + packets plus residual therefore need at most `(K + 2)v + 3R`. +* COPY first makes a distinct clone while all `K` staged packets remain live. + That clone is the engine's borrowed input. The bound is `(K + 3)v + 3R`. + The clone is cleared after return; the returned private packet remains until + its matching ERASE. + +For the source's 661 ordinary roles and at most one private role, both cases +are bounded by `664v + 3R`. This counts staged roles and the active residual +only. It does not include protected input, whole-family storage, directories, +routes, scatter output, peel/merge work, control tapes or markers. The corollary +is derived from source ownership and chronology; this checker does not execute +the full `Driver.local` schedule or certify its total reserve. + +## Reproduction and evidence + +From the repository root, with standard-library Python 3.12: + +```sh +python3.12 scripts/research_package.py --package research/selected-residual-live-volume --check-only +python3.12 scripts/research_package.py --package research/selected-residual-live-volume +python3.12 -B -O research/selected-residual-live-volume/verify.py +``` + +[verify.py](verify.py) authenticates sources before imports, instruments the +unchanged allocation/read/write paths, and checks a direct tape census against +the running meter. Instrumentation is restored in `finally`; it changes no +transform, cleanup order or allocation policy. Origin tags track every input +cell through actual copy operations. Expected address permutations use separate +ordinary modular arithmetic, and actual Boolean values are checked too. +Allocation-site classification is bound to the frozen source lines, not a +promise of compatibility with future versions. + +[RESULT.json](RESULT.json) records 17 fixtures and 231 primitive events. The +fixtures include an empty alias case, ADD/swap/sign over moduli 3 and 9 with +one and two prefixes, nontrivial spectators and gaps, an embedded layout, and +complete good/fallback traces with 1 and 19 child returns. The final fixture +rejects a missing child return. Positive fixtures cover 10,701 input cells with +individual origin tracking; these are complete small declared domains, not +selected GL64 execution or a complete high-header census. + +A sharp fixture has `P = 2`, `R = 972`, `v = 1944` and measured peak **8748**. +At that cut the census identifies both full packets, the partial next output, +local source, primitive intermediate, buckets and primitive output. Budgets +that omit the borrowed source or prematurely discard `current` give 6804; +omitting bucket/output overlap gives 7776. All are rejected by the actual census. +Source-byte mutation, incomplete manifests and borrowed-input mutation are also +rejected. Default replay compares the exact typed receipt and does not rewrite +it; `--write-result` refuses an existing result file. + +The registered replay and the standalone checker serve different provenance +roles. The runner validates historical catalogue provenance at the pinned Git +base. Standalone replay authenticates the frozen manifest and scientific source +exports plus the explicitly declared live selected-record input. Full Git +history is needed for the runner's historical provenance check, not for the +standalone scientific replay. + +## Open next questions + +Can the complete first-node caller fit a numerical reserve? Join this residual +component with the route and directory components at their actual overlapping +lifetimes, then include protected/family copies, count/controller tapes, markers +and disposal. A source-matched event ledger is the feasible first step, not +another independent maximum added blindly to all others. Larger recursive +returns remain a separate blocker. [TASK.json](TASK.json) records this handoff. + +Stop this contribution at the component result. It does not justify a larger +construction campaign by itself. No new supplier, kappa, selected-frontier +change, full selected cold replay, full GL64 execution, formal-kernel proof or +independent human review is claimed. The finite coefficient fixtures use small +explicit projectors rather than selected 64-dimensional callbacks. Numerical +storage, markers and arbitrary error-path cleanup remain unverified. + +## Credit + +Jose Manuel/jmbarrancoml supplies the unchanged PR2697 engine and first-node +caller. [vendor/NOTICE.md](vendor/NOTICE.md) retains its full stream, selected-word, +normal-form, controller, hosting and audit lineage. Nick Petalas supplies the +complementary route result and explicit residual-lifetime handoff; ywz65 supplies +the directory and earlier primitive/setup audits. + +New proof, checker and evidence prepared by starship-s with substantial Hermes +(`gpt-6-astra-900k`) and Codex (`gpt-6-astra`, max effort) assistance. Apache-2.0. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/layout.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/layout.py new file mode 100644 index 0000000000..aa554b14fe --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/layout.py @@ -0,0 +1,123 @@ +"""Binary two-bank layout with an independent complete intervening gap.""" +from cardinal_counts import Count, positive +from cardinality import multiply_atom_power +from words import need + + +class Layout: + def __init__(self,geometry,parent_size,ring,q,before,gap,suffix,embedded=True): + for value in (before,gap,suffix):positive(value) + self.geometry,self.ring,self.q=geometry,ring,q + self.before,self.gap,self.suffix=before,gap,suffix + self.parent_size,self.embedded=parent_size,embedded + self.core=geometry.raw.times_small(geometry.columns,geometry.plan.dimension) + remaining=geometry.raw.subtract_exact(parent_size,self.core) + self.extra=geometry.raw.times_small(remaining,2) + geometry.index.free(remaining) + self.total=geometry.raw.times_small(parent_size,2) + + def physical(self,position): + if not self.embedded or self.geometry.raw.compare(position,self.core)<0: + return self.geometry.index.copy(position) + return self.geometry.plus(position,self.extra) + + def extents(self,first,second=None): + g=self.geometry + a=self.physical(first) + b=self.physical(second) if second is not None else None + if b is not None:need(g.raw.compare(a,b)<0,"ordered physical body atoms") + last=a if b is None else b + pre,tail=Count(self.before),Count(self.suffix) + multiply_atom_power(pre,a,self.ring,self.q) + after=g.raw.subtract_exact(self.total,last) + count=g.raw.subtract_exact(after,g.one) + multiply_atom_power(tail,count,self.ring,self.q) + g.index.free_many(after,count) + if g.raw.compare(a,self.parent_size)>=0: + enlarged=Count.product(pre,self.gap);pre.close();pre=enlarged + if g.raw.compare(last,self.parent_size)<0: + enlarged=Count.product(tail,self.gap);tail.close();tail=enlarged + values=[pre] + if b is not None: + distance=g.raw.subtract_exact(b,a) + count=g.raw.subtract_exact(distance,g.one) + middle=Count.literal(1) + multiply_atom_power(middle,count,self.ring,self.q) + if g.raw.compare(a,self.parent_size)<0 and g.raw.compare(b,self.parent_size)>=0: + enlarged=Count.product(middle,self.gap);middle.close();middle=enlarged + values.append(middle) + g.index.free_many(distance,count,b) + values.append(tail);g.index.free(a) + result=[value.marginal() for value in values] + for value in values:value.close() + return result + + def fibre(self): + value=Count.product(self.before,self.gap) + multiply_atom_power(value,self.total,self.ring,self.q) + result=Count.product(value,self.suffix) + value.close() + return result + + def close(self): + self.geometry.index.free_many(self.core,self.extra,self.total) + + def child_extents(self, first, second, width, *, before): + """Return B', G', S' for two complete, disjoint child chunks. + + Source order is [U][B][head M^n][G][tail M^n][S]. U is returned + separately to the caller and must not be absorbed in `before`. + The projected order is [U][B'][chunk M^c][G'][chunk M^c][S']. + """ + positive(before) + g = self.geometry + need(not width.zero(), "positive recursive child width") + a, b = self.physical(first), self.physical(second) + a_end, b_end = g.plus(a, width), g.plus(b, width) + last_offset = g.raw.subtract_exact(width, g.one) + first_last = g.plus(first, last_offset) + second_last = g.plus(second, last_offset) + mapped_first_last = self.physical(first_last) + mapped_second_last = self.physical(second_last) + expected_first_last = g.raw.subtract_exact(a_end, g.one) + expected_second_last = g.raw.subtract_exact(b_end, g.one) + words = (a,b,a_end,b_end,last_offset,first_last,second_last, + mapped_first_last,mapped_second_last, + expected_first_last,expected_second_last) + values = [] + try: + need(g.raw.compare(a,b)<0 and g.raw.compare(a_end,b)<=0, + "ordered disjoint recursive child chunks") + need(g.raw.compare(b_end,self.total)<=0, + "recursive child lies in the complete body") + need(g.raw.compare(mapped_first_last,expected_first_last)==0 + and g.raw.compare(mapped_second_last,expected_second_last)==0, + "each recursive child chunk is physically contiguous") + for start,end in ((a,a_end),(b,b_end)): + need(g.raw.compare(start,self.parent_size)>=0 + or g.raw.compare(end,self.parent_size)<=0, + "recursive chunk does not cross the original gap") + + pre, middle, tail = Count(before), Count.literal(1), Count(self.suffix) + values = [pre,middle,tail] + multiply_atom_power(pre,a,self.ring,self.q) + between = g.raw.subtract_exact(b,a_end) + after = g.raw.subtract_exact(self.total,b_end) + try: + multiply_atom_power(middle,between,self.ring,self.q) + multiply_atom_power(tail,after,self.ring,self.q) + finally: + g.index.free_many(between,after) + + # Exactly one of these three complete spectator regions contains + # the parent's external gap; it is multiplied in exactly once. + gap_region = (0 if g.raw.compare(a,self.parent_size)>=0 else + 2 if g.raw.compare(b_end,self.parent_size)<=0 else 1) + enlarged = Count.product(values[gap_region],self.gap) + values[gap_region].close() + values[gap_region] = enlarged + return [value.marginal() for value in values] + finally: + for value in values: + value.close() + g.index.free_many(*words) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/linear_sign.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/linear_sign.py new file mode 100644 index 0000000000..6a6e5c02f2 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/linear_sign.py @@ -0,0 +1,82 @@ +"""Linear-traffic address negation on complete atom fibres. + +The source shape is [before][M][suffix], M = ring.modulus. No atom value +or spectator cardinality is decoded into host control. Each nonzero atom +slice is copied forwards, while slice starts are visited in reverse order. +""" +from bitstream import copy_bits +from records import Tape +from stream import Counter, positive_extent +from words import BLANK, need + + +def move_slices(source, count, suffix, direction): + """Move count complete slices by charged unit head movements.""" + blocks = Counter(count) + try: + while not blocks.finished: + bits = Counter(suffix) + try: + while not bits.finished: + source.step(direction) + bits.decrement() + finally: + bits.close() + blocks.decrement() + finally: + blocks.close() + + +def sign_address(source, ring, q, before, suffix): + """Pull back x -> -x mod M, preserving source and resetting both heads. + + q is retained for the old public signature; the permutation needs only + M >= 2. Source-head moves, including the final rewind, are at most 6V, + where V = before*M*suffix. Numerical counter setup has its usual + amortized binary-counting charge and is not hidden in this move bound. + """ + del q + positive_extent(before) + positive_extent(suffix) + two = ring.arena.literal(2) + leading = ring.raw.subtract_exact(ring.modulus, two) + nonzero = ring.raw.subtract_exact(ring.modulus, ring.one) + output = Tape() + outer = Counter(before) + try: + while not outer.finished: + # Preserve the zero slice, then reach the final nonzero slice. + copy_bits(source, output, suffix) + move_slices(source, leading, suffix, 1) + remaining = Counter(nonzero) + try: + while not remaining.finished: + copy_bits(source, output, suffix) + remaining.decrement() + if not remaining.finished: + # Two is finite control. Copying a padded residue word + # for this count once per atom would cost O(V log M) + # when suffix=1. + for _ in range(2): + backwards=Counter(suffix) + try: + while not backwards.finished: + source.step(-1) + backwards.decrement() + finally:backwards.close() + finally: + remaining.close() + # We finished just after slice 1; advance to the next outer row. + move_slices(source, leading, suffix, 1) + outer.decrement() + need(source.read() == BLANK, "complete linear sign input") + source.rewind() + output.rewind() + return output + except ValueError: + output.clear() + raise + finally: + source.rewind() + outer.close() + ring.arena.free_many(two, leading, nonzero) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/node.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/node.py new file mode 100644 index 0000000000..28c98a3573 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/node.py @@ -0,0 +1,88 @@ +"""Complete internal node: peel, fresh rows, recursive caller and return.""" +from cardinal_counts import Count, positive +from cardinality import multiply_atom_power +from consumer import Consumer, IncomingWeights +from driver import Driver +import fresh_rows +from packet import read_prefix +import peel +from plan import Request +from topology import SelectedTopology +from words import Unsigned, need +from scheduler import complete + + +def selected_topology(catalogue): + """One immutable source table per catalogue, shared by every frame. + + The retained topology's recipe/call caches include its identity in their + keys. Recreating that identity per child would retain source-table copies + after those children returned. Keep the single owner on the fixed-q + catalogue instead of introducing another global frame-keyed cache. + """ + result=getattr(catalogue,"_recursive_caller_topology",None) + if result is None: + result=SelectedTopology(catalogue) + catalogue._recursive_caller_topology=result + need(result.catalogue is catalogue,"selected topology belongs to its fixed source") + return result + + +class Node: + def __init__(self,context,indices,program,parent_size,depth,topology,consumer,incoming,stock_multiple=1): + self.context,self.indices,self.program=context,indices,program + self.parent_size,self.depth=parent_size,depth + self.topology,self.consumer,self.incoming=topology,consumer,incoming + self.stock_multiple=stock_multiple + raw=Unsigned(indices);dimension,one=indices.literal(context.dimension),indices.literal(1) + columns,remainder=raw.divmod(parent_size,dimension) + valid=not columns.zero() + indices.free_many(dimension,one,columns,remainder) + need(valid,"complete internal node width") + + def run(self,*args,**kwargs): + return complete(self.run_generator(*args,**kwargs)) + + def run_generator(self,source,old_directory,old_count,row_count,before,gap,suffix,observe=None): + old_count,row_count,before,gap,suffix=(Count(value) for value in (old_count,row_count,before,gap,suffix)) + for value in (old_count,row_count,before,gap,suffix):positive(value) + context,indices=self.context,self.indices + unused=leading=fibre=None;peeled=None;families={} + try: + old_directory.rewind();first=read_prefix(old_directory,self.depth);old_directory.rewind() + zero=indices.zero() + try: + value=self.incoming.coefficient(first,Request("incoming",zero)) + context.arena.free(value) + finally:first.clear();indices.free(zero) + unused=fresh_rows.quotient(row_count,context,self.topology.families) + stock=Count(unused) + try:need(stock.divide_small(self.stock_multiple)==0,"selected compatible unused stock factor") + finally:stock.close() + leading=Count.product(unused,before) + fibre=Count.product(leading,gap) + total=Unsigned(indices).times_small(self.parent_size,2) + multiply_atom_power(fibre,total,context.ring,context.q);indices.free(total) + following=Count.product(fibre,suffix);fibre.close();fibre=following + peeled=peel.run(source,context,indices,self.parent_size,self.depth,self.program, + old_directory,old_count,row_count,before,gap,suffix,self.incoming) + families=fresh_rows.split(peeled,context,self.topology.families,old_count,fibre) + driver=Driver(context,self.topology,self.consumer,old_directory,old_count,leading,gap,suffix,fibre,observe,child_stock=unused,child_before=before) + yield from driver.global_word(families) + return fresh_rows.merge(families,context,self.topology.families,old_count,fibre) + finally: + for tape in families.values():tape.clear() + if peeled is not None and peeled is not source:peeled.clear() + for value in (unused,leading,fibre,old_count,row_count,before,gap,suffix): + if value is not None:value.close() + source.rewind();old_directory.rewind() + + +class SelectedNode(Node): + def __init__(self,context,indices,program,parent_size,depth,catalogue,specifications): + need(context.dimension==64 and context.codes is catalogue.codes and + specifications.catalogue is catalogue,"one source-bound selected node") + topology=selected_topology(catalogue) + consumer=Consumer(context,indices,program,specifications,parent_size,depth) + incoming=IncomingWeights(context,indices,program,specifications,parent_size,depth) + super().__init__(context,indices,program,parent_size,depth,topology,consumer,incoming,9475) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/packet_engine.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/packet_engine.py new file mode 100644 index 0000000000..72543f684f --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/packet_engine.py @@ -0,0 +1,98 @@ +"""Shared trace on complete prefixes, with the caller's full two-bank layout.""" +from bitstream import copy_bits +from packet import read_prefix +from records import Tape +from stream import Counter +from stream_runner import action +from words import BLANK, need +from scheduler import Invocation, complete + + +def run_generator(source,events,layout,directory,prefix_count,field_count,coefficient,factory=Tape,observe=None,invoke=None): + fibre=layout.fibre() + current,active=source,None + boundary_words=[] + boundary_labels=None + returned=False + internal=invoked=False + try: + for event in events: + if event.kind=="enter": + need(active is None and event.parent_identity is layout.geometry.parent_identity, + "one whole-packet completed child") + active=event + boundary_labels=(event.child_kind,event.field,event.reverse,event.half, + event.source_code,event.parent_identity) + boundary_words=[layout.geometry.index.copy(getattr(event,name)) + for name in ("first","second","width","depth")] + internal=layout.geometry.raw.compare(event.width,layout.geometry.leaf_cutoff)>=0 + invoked=False + if observe is not None:observe("enter") + continue + if event.kind=="return": + need(active is not None and boundary_labels== + (event.child_kind,event.field,event.reverse,event.half, + event.source_code,event.parent_identity), + "same completed child returns") + for saved,name in zip(boundary_words,("first","second","width","depth")): + need(layout.geometry.raw.compare(saved,getattr(event,name))==0,"restored child geometry") + need(invoked==internal,"exactly one internal invocation before return") + layout.geometry.index.free_many(*boundary_words);boundary_words=[] + active=None + boundary_labels=None + if observe is not None:observe("return") + continue + if event.kind=="invoke": + need(active is not None and internal and not invoked and invoke is not None, + "exactly one bound recursive child consumer") + need(boundary_labels==(event.child_kind,event.field,event.reverse,event.half, + event.source_code,event.parent_identity), + "invoke matches entered child") + for saved,name in zip(boundary_words,("first","second","width","depth")): + need(layout.geometry.raw.compare(saved,getattr(event,name))==0, + "invoke has the entered child geometry") + following=yield Invocation(invoke(current,event)) + need(following is not current,"recursive child returns its owned output") + if current is not source:current.clear() + current=following + invoked=True + continue + need(active is None or not internal,"internal body is exclusively a whole-packet invocation") + output,prefixes=factory(),Counter(prefix_count) + directory.rewind() + try: + need(not prefixes.finished,"nonempty complete prefix packet") + while not prefixes.finished: + fields=read_prefix(directory,field_count) + local,changed=factory(),None + try: + copy_bits(current,local,fibre);local.rewind() + changed=action(local,event,layout,lambda request:coefficient(fields,request),factory) + copy_bits(changed,output,fibre) + need(changed.read()==BLANK,"complete changed prefix fibre") + finally: + if changed is not None and changed is not local:changed.clear() + local.clear();fields.clear() + prefixes.decrement() + need(current.read()==directory.read()==BLANK,"complete shared packet and directory") + current.rewind();directory.rewind() + if current is not source:current.clear() + output.rewind();current=output + except ValueError: + output.clear() + raise + finally:prefixes.close() + need(active is None,"complete child lifetime") + returned=True + return current + finally: + # A deeper failure closes suspended parents with GeneratorExit. Owned + # output must be erased on that path as well as ordinary ValueError. + if not returned and current is not source:current.clear() + fibre.close();directory.rewind();source.rewind() + if boundary_words:layout.geometry.index.free_many(*boundary_words) + events.close() + + +def run(*args,**kwargs): + return complete(run_generator(*args,**kwargs)) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/peel.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/peel.py new file mode 100644 index 0000000000..38502515af --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/peel.py @@ -0,0 +1,46 @@ +"""Peel the last n-m head atoms using original incoming weight offsets.""" +from cardinal_counts import Count +from layout import Layout +from numeric import Geometry +import packet_engine +from plan import Plan, Request +from trace import primitive +from words import Unsigned, need + + +def events(geometry,parent_size): + raw,index=geometry.raw,geometry.index + coordinate=raw.times_small(geometry.columns,geometry.plan.dimension) + total=raw.times_small(parent_size,2) + last=raw.subtract_exact(total,geometry.one) + index.free(total) + try: + while raw.compare(coordinate,parent_size)<0: + right=raw.subtract_exact(last,coordinate) + try: + for stage in range(8): + a,b=index.copy(coordinate),index.copy(right) + if stage in (0,2,4,6):yield from primitive("atom_swap",a,b,None,geometry) + elif stage==7: + index.free(a);yield from primitive("sign",b,None,None,geometry) + else: + request=Request("incoming",index.copy(coordinate),negative_inverse=stage==3) + yield from primitive("add",b,a,request,geometry) + finally:index.free(right) + raw.increment_in_place(coordinate) + finally:index.free_many(coordinate,last) + + +def run(source,context,indices,parent_size,depth,program,old_directory,old_count, + fresh_rows,before,gap,suffix,incoming): + divisor=indices.literal(context.dimension) + columns,remainder=Unsigned(indices).divmod(parent_size,divisor) + indices.free_many(divisor,remainder) + geometry=Geometry(Plan(context.dimension,1,True,()),indices,columns,depth,0,program) + leading=Count.product(fresh_rows,before) + layout=Layout(geometry,parent_size,context.ring,context.q,leading,gap,suffix,embedded=False) + try: + return packet_engine.run(source,events(geometry,parent_size),layout,old_directory, + old_count,depth,incoming.coefficient) + finally: + layout.close();leading.close();geometry.close();indices.free(columns) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/NOTICE.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/NOTICE.md new file mode 100644 index 0000000000..ef9f81510d --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/NOTICE.md @@ -0,0 +1,49 @@ +# Attribution + +Jose Manuel (`jmbarrancoml`) prepared the full first-range caller, gap/peel +integration, source catalogue binding and checks with substantial OpenAI Codex +assistance. New work uses Apache-2.0. We claim no independent human review +or new formal-kernel verification of this package. + +We credit OpenAI's retained framework and Douglas Colkitt for the stream, +interchange and tape contracts. The selected word/hosting lineage includes +DreamingOfClouds' PR589 tuning on eumemic's PR555 word, Dugongue's PR541/548, +rohanarun's PR542, eumemic's PR490 whole-owner argument and alephnan's PR1627 +literal reader and chronological hosting proof. + +The source527 contributors supplied the normal forms and weighted leaf +factorization. commdata2338 supplied PR2160's selected good form, PR2188's +mixed descriptor grammar, PR1379's parking boundary and PR2332's selected +table/global-slot binding. Ross Richardson supplied PR2159's full-ring fallback +topology and covariance. Jose Manuel's PR2157/2171/2195/2207/2234 and +PR2310/2364/2405/2449/2501/2569 supply the selected chart, controlled stream, +generated grammar, canonical-prefix, completed residual and source-route +predecessors. PR2195 supplies the ring/GL hosting lift and terminal gauge +calculation recalled in our proof. We do not claim new versions of those +algebraic identities. + +We retain 25 files from PR2569 at +`0b116cb34f27a4b064f0d8dd65549ea5705cf9c0`, including its 16 unchanged PR2501 +runtime/compiler dependencies. SOURCES.json lists their original paths, +Git blobs and SHA256 hashes. We retain their bytes and source comments. +We adapt PR2234's provider enumeration in catalogue.py and preserve its +ordered request digest. Our test-only model and observers adapt predecessor +finite expectation and origin-column patterns. The oracle module serves +fixed-q source compilation and finite expectations; we do not use it to +decode runtime high fields or execute payload permutations. + +We credit ywz65's PR2475 for conditional whole-call staging and PR2545 for its +separate buffer-residency completion. Ross Richardson's PR2519 gives a +separate one-buffer R439 adapter and relative-chart packet identity. We do +not adopt those numerical workspace constants. commdata2338's PR2386/2399 +sharpen request counts and completed leaf/header substitution. + +We credit ywz65's completed PR2566 audit of AtomSwap/Sign cost and ownership, +and PR2590 for the cubic radix-reconstruction term in directory setup. We +use PR2569's corrected proof at +`898ff36fe2cd05f733de6b26c88a4c4741b06237`; its runtime bytes match our earlier +pin. We preserve the canonical-input hypothesis and charge returned directory +and Count disposal outside the audited producer interval. + +We leave larger recursive return, numerical reserve admission and full +multiplication transfer open. We retain the selected frontier. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/PROOF.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/PROOF.md new file mode 100644 index 0000000000..a4746d1786 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/PROOF.md @@ -0,0 +1,351 @@ +# First internal selected BIT node + +Jose Manuel (`jmbarrancoml`), with substantial OpenAI Codex assistance. +We work in the retained stream model and use the pinned written predecessor +refinements. Maintainer admission and formal-kernel verification remain open. + +## Statement and input contract + +Fix an odd prime q, m=64, w>=1 and M=q^w. Put + + N=|GL_64(F_q)|, H=q^(4096(w-1)), W=28416, P=28425, + lcm(W,P)=269241600, lcm(W,P)/W=9475. + +Choose 64<=n<128 and delta=n-64. Supply a well-formed generated parent program +of final width n and depth h, using this package's complete fixed-q source +vocabulary from its creation. Supply its C>=1 physical frozen prefixes in +their original order, including repetitions. Each prefix contains exactly h +raw fields and determines incoming units A_0,...,A_(n-1) in Z/M. +The parent grammar reads these frozen fields only. In particular, the incoming +weights do not depend on the new family, current low/high header, unused row +coordinate, body address or external spectators. + +Supply fresh row cardinality K, a positive multiple of 269241600*N*H, and +positive cardinalities B,G,S. Use canonical unbounded binary cardinalities +and index/residue words with the retained margin/encoding contracts. Set +U=K/(W*N*H), so 9475 divides U. Use the following physical input order: + + [old prefix][K fresh rows][B][H_n][G][D_n][S]. + +We interpret fresh rows lexicographically as +`[family][low GL class][raw high matrix][U]`. We use the incoming ordinal +without identifying or discarding repeated frozen prefixes. A caller may +supply arbitrary dirty, correlated payload bits. The original input, parent +program and frozen directory remain read-only; the node owns fresh output, +staging, private and arithmetic work. + +**Refinement proposition.** Under the source identities and primitive +refinements pinned in SOURCES.json, we construct a finite stream program for +this node whose output, at each frozen prefix, has address permutation + + H_i' = A_i D_(n-1-i), + D_(n-1-i)' = A_i^-1 H_i (0<=i (A^-1 H,C0 D)`. In the original coordinates we obtain + + v=P(C0 D-A^-1 H), + T_A(P)(H,D)=(H+A v,D-C0 v). + +For an idempotent P, direct multiplication gives `T_A(P)^2=I`. For nested +idempotents P,Q with PQ=QP=P, we obtain +`T_A(P) T_A(Q)=T_A(Q-P)`; for PQ=QP=0 we obtain `T_A(P+Q)`. +These are polynomial matrix identities over a commutative ring. We require +neither a field nor symmetry after conjugation. The selected rational base +projectors and owner charts have dyadic entries, so their authenticated +identities specialize to Z/M for odd q. For each raw invertible header g, +simultaneous conjugation by g preserves nesting and disjointness. We use +the source's same fixed charts and support identities in that conjugation. + +Reduction modulo q identifies invertible raw matrices with the disjoint +union of N low classes, each with H high matrices. Right multiplication by +an invertible owner chart sigma permutes this full set; at a fixed common +low it permutes the complete matching high fibres. The route refinement +implements that permutation. Distinct source charts remain distinct modulo q +by their disjoint nonzero support columns, so the within-invocation ownership +argument also survives this extension. + +The local symbolic-column proof uses XOR on Boolean functions and these +address permutations. Its cancellation, dirty-helper independence and +transported-source identities therefore hold on the finite address set over +Z/M. The hosting chronology only uses those complete-call identities and +the disjoint-projector products above. This gives the ring/GL version of +the retained argument, with the same frozen A throughout a physical prefix. + +## Source catalogue and caller geometry + +We adapt PR2234's provider enumeration, preserving its ordered record digest +`f5a4fb124709adc4b56376a3146e3609e91c0f4d3ed1931a61785a5d99bf8ee7`. +We enumerate 28278 canonical requests: 26199 MOVE, 81 COPY and 1998 IDLE. +With 32 replicas we obtain 904896 paid requests. We retain 541 base labels, +1235 chart labels and 81 canonical transported ERASE guards. We bind each +MOVE/COPY to its literal position, stage, role, source family and chart. +For COPY we reserve canonical family 28416 as private metadata; we use the +call's actual owner family for the payload source. + +We compile the fixed vocabulary from (q,request,view,low). At q=3 we need 6507 +bits per code. Authors of older two-request fixtures used 6494 bits; we do not reinterpret +those encoded programs. Low-class enumeration, rational matrix compilation +and specification caches depend only on q and fixed source labels. Runtime +precision, raw high fields, parent widths and incoming coefficients remain +on tapes. Lazy fixed-q compilation implements a finite table, with no claim +of a small practical table. + +For local calls we gather a native owner header g and route d=g sigma into +common coordinates. We then compile the base projector with chart I and +preparation B0. The actual projector is d P0 d^-1. We do not apply sigma +again. For native idle requests we retain the actual family chart A_port and +preparation A_port B0. Those requests require the native view. The source +checker binds both views to the actual coefficient/serialized-child consumer; +the proofs use the inherited source and normal-form refinements. + +We obtain paid ranks at most 42. Since floor(n/64)=1, we use child width equal +to the rank in the good branch, and width one in the fallback branch. +We expand them through PR2501's completed leaves. We introduce no opaque +recursive callee in this range. + +## Original-offset peel and independent gap + +Before decoding fresh rows, we apply the weighted exchange on each pair + + (head coordinate 64+i, tail coordinate delta-1-i), 0<=i=n else1), + middle = M^(b-a-1) * (G if a=0 +we use K_s on X and K_s-P_t on Y. Thus level 8 has gauges I_64 and I_64-P_t. +Conjugate these by the native raw g and apply T_A. After the terminal family +exchange, the original X label has final gauge T_A(I-gP_tg^-1), while the +original Y label has T_A(I). The source scalar identity restores their +decoded values. Relative to the initial gauges, the physical endpoints are + + X: T_A(I-gP_tg^-1) T_A(gP_tg^-1)=T_A(I)=F_A, + Y: T_A(I) T_A(0)=F_A. + +We use PR2195's explicit gauge convention here. Applying another body +exchange after the family exchange would change this endpoint. + +More explicitly, decode a physical function by `c_i=f_i compose Gamma_i`. +MOVE and idle preserve c_i; an aligned ADD performs decoded XOR. The complete +scalar schedule returns c_i, hence +`f_i_out=f_i_in compose Gamma_i_in compose inverse(Gamma_i_out)`. +The complementary factors in the X calculation commute, so either displayed +order gives F_A. We carry the frame label with each exchanged family value. + +## Complete charge and ownership ledger + +Let v=C H R be one staged packet volume, with +`R=UBGS M^(2n)` and V=W N v. Let I be the supplied index-word extent and D +the serialized current directory size. Before using root coupling, retain + + D=O_q(CH(h+1)(w+1)), + T_directory_setup=O_q(w^3+w log(C+1)), + T_route=O_q(Jv+CH(poly(w)+J^2)), J=O_q(w). + +We use ywz65's PR2590 correction for the cubic setup term. Each fresh radix +traversal performs w full-width unsigned divisions. For canonical counts, +`w^2<=q^w<=qH` and `log2(C+1)<=C` absorb setup into D. We charge the output +directory/Count disposal separately. If an h countdown uses padded index +extent I, retain its scans until the root coupling gives I=O(w). + +For arbitrary B,G,S,U we form products through binary doubling/addition. +Their setup costs a fixed polynomial in the bit lengths of those factors +and the index/residue words. Positive complete multiplicities absorb the +cardinality terms; the factor `M^(2n)` absorbs fixed precision polynomials. +For fresh-row division we count 4096(w-1) small divisions, their actual quotient +lengths and the cubic radix reconstruction. We count the context's initial +H production even though the API receives a context. Its immutable q-only +compilation and source parsing contribute a finite q-dependent constant. + +Under the retained generated-root coupling + + w=ceil(e^(17/10000)), n<=e, 2^(h+1)<=8e^2, + +we have h=O(log w), I=O(log e)=O(w), and D=O_q(v). The inherited coefficient +allowance `O_q(e^3 w^3)` per source site is at most a fixed polynomial in w +(the retained coarse bound is w^1800). For n>=64 the complete body fibre +`q^(2nw)` absorbs that polynomial. This also pays repeated prefix reads, +normal-form preparation and restored program scans. For unrelated arbitrary +h or padded index words we claim the unabsorbed ledger, not this bound. + +| Component | Complete charge and status | +| --- | --- | +| Retained ADD, atom swap, sign and leaf expansion | Written primitive bounds, with independent PR2566 audit: ADD O_q(v), swaps/signs O_q(wv), including preparation, count reads, suffix and cleanup. The first-range traces have fixed-q many events. | +| Original-offset peel | At most 63 weighted pairs on volume V; we count coefficient work and all 8 primitives per pair, giving O_q((n+w)V) in this bounded range. | +| Fresh-row split/merge, clones, native XOR and final family return | A fixed-q number of complete sequential passes, plus the binary setup above. We count both temporary output and disposal of the replaced stream. | +| Owner gather/route/inverse/scatter and directories | A fixed-q number of charged routes and full family scans, including decoration, keys, directory production and erasure. Hence O_q(wV) under coupling. | +| Local staging and live storage | We retain the protected input, peeled output when present, all W live families, 661 role packets, one private packet, transient primitive/scatter outputs, directories and arithmetic words. We bound their sum by C_q V under coupling. | +| Completed children and return | All children fit the completed below64 leaves. We count their full bodies, metadata preparation, reset and erasure, with no unpaid recursive call. | +| Larger recursion and numerical reserve | Unknown for this implementation. We do not reuse the older V+4v or 5V+19v parking constants. | + +The numbers of stages, replicas, local events, low classes and finite labels +depend only on q and the fixed source. Summing these complete charges gives +`C_q V(n+w)` time and `C_q V` occupied work for this first-range node. We +include the potentially huge fixed-q compiler in C_q. We do not present these +constants as practical or as numerical reserve admission. The implementation +retains the original input and erases replaced owned streams; adding the +protected input only changes this displayed constant. + +For this per-role implementation we use the following exact invocation counts: + +| Operation | Count | +| --- | --- | +| Local MOVE / COPY residuals |838368N /2592N | +| Native idle residuals |63936N | +| Local XORs |6999840N | +| Local gather and local scatter |190368N each | +| Idle gather and idle scatter |63936N each | +| Owner/common routes |380736N | +| Whole-family bridge XORs |63936 | +| Terminal handle exchanges |14208 | + +We therefore pay for 508608N full-family gather/scatter scans. PR2475's +coalesced scan count does not apply to this implementation. Before absorption, +we bound source/peeled/family/merged copies by 4V, staged/private work by +662v, route/residual/scatter temporaries by O_q(v)+O(V/W), and retain D plus +the old directory, numerical pages and canonical counters. This inventory +accounts for temporary copies as well as live logical data. + +## Evidence boundaries and further obligations + +We authenticate the entire selected catalogue, literal controller and hosting +sources. We probe actual selected common/native coefficient junctions and +check 130 address columns for a generated width 65 remainder whose last weight +differs from weight 0. We execute complete Boolean endpoints in a separate +four-family GL2 model and in a gapped three-atom model, using actual source +routes, bit primitives and expanded leaves. We check linear origins for +arbitrary dirty input columns, including COPY and ADD. We separately execute +two distinct high fields at w=2; that test samples the high cube. + +We leave full GL64 Boolean payload execution open. The mathematical claim +uses the stated source/primitive refinements; the finite executions check +specific implementation implications. Larger recursive parking, a numerical +reserve inequality, complex-side transfer and formal compilation remain +separate obligations. We leave the selected exponent unchanged. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/README.md b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/README.md new file mode 100644 index 0000000000..988ff62202 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/README.md @@ -0,0 +1,81 @@ +# Complete selected BIT node for 64 <= n < 128 + +We construct the first internal selected BIT node from actual source packets +and completed below64 leaves. We include the original-weight remainder peel, +fresh-row decoding, the complete local/idle/bridge/exchange caller, an +independent external gap and return to the original row order. + +In [PROOF.md](PROOF.md) we prove the scoped stream refinement under the pinned +predecessor contracts: arbitrary dirty payloads return with weighted reversal +F_A, unchanged row/spectator coordinates and cleared owned work. Under the +retained root coupling we construct a complete `C_q V(n+w)` time bound. +We leave numerical reserve admission, larger recursion and full transfer open. +We claim no new exponent or formal-kernel verification. + +The caller completes the handoff from +[PR2569](https://github.com/CrocSwap/integer-mult-bounds/pull/2569) and the +conditional whole-call staging interface in +[PR2475](https://github.com/CrocSwap/integer-mult-bounds/pull/2475). +We preserve PR2234's full 28278-request vocabulary, the selected logical +denominator W=28416 and compatible unused-row factor 9475. We use a common +view after local routing and the native family chart for idle requests. + +Within a local invocation we scatter repeated-family roles into the latest +family state. We finish one common low before gathering the next. Both +requirements matter: repeated faulty sweeps can cancel at the final endpoint, +so we check the first sweep and retain separate lost-update witnesses. + +## Evidence and reproduction + +We retain exact receipts in [RESULT.json](RESULT.json), source pins in +[SOURCES.json](SOURCES.json) and registered commands in [VERIFY.json](VERIFY.json). +Run from repository root with standard-library Python 3.12 and full Git history: + +```sh +python3.12 scripts/research_package.py --package research/selected-bit-node --check-only +python3.12 scripts/research_package.py --package research/selected-bit-node +``` + +| Evidence | Scope | +| --- | --- | +| Selected catalogue and 7843392 literal events |28278 canonical requests, 904896 replicated paid requests, 288 local calls, 541 split bases and retained chronological ownership certificates. | +| Actual selected consumer probes | Common MOVE and native IDLE coefficient/child junctions; no full GL64 payload execution. | +| Selected generated width 65 peel |130 address columns; original A64=8 versus A0=2, unchanged frozen fields/program and no new field. | +| Complete four-family GL2 node |31104 independent Boolean input columns, 672 residuals, 5712 completed child entries/returns, COPY/ERASE and first-sweep checkpoints. | +| Complete gapped peel and core |43740 Boolean bits with gap 5 and nontrivial before/suffix factors; all origins and marker 39125→43689. | +| Two high fields at width 2 |39366 Boolean bits through one shared child interval; sampled high cube. | +| Controls under Python `-O` | Lost updates, reversed Y bridge, family-only exchange, 16 frame/range/stock rejections and cardinality products through 822 bits. | + +We use the actual stream operations in the complete small models. We use +independent address formulas and Boolean origin columns only as expectations. +Finite execution does not replace the quantified proof or constitute full +selected GL64 payload execution. A slower machine may exceed the bounded +generic replay budget; each command declares its limit. + +## Open next questions + +We record the revision 5 expansion decision in [TASK.json](TASK.json) and the +[existing claim](https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18951991). +Before expanding to a larger child, identify its complete live parent state, +including 661 staged roles and directories, and derive its parking/return bill. +That would connect this first-range node to all-size recursion; recursive +workspace and numerical reserve admission remain the blockers. + +For numerical admission, derive simultaneous live volumes for this caller +before substituting them into a reserve inequality. The old four-buffer +constants do not cover this implementation. At the final overlap checkpoint, +ywz65's pending [PR2688](https://github.com/CrocSwap/integer-mult-bounds/pull/2688) +supplies a directory-only allowance under its large-q premises. Check that +component before deriving the remaining caller/routing/child budget. +For formal compilation, begin +with the latest-family scatter and chronological low-sweep invariants in an +operational stream model. TASK.json gives the first steps and blockers. + +## Credit + +Jose Manuel (`jmbarrancoml`) prepared this contribution with substantial OpenAI +Codex assistance. New work uses Apache-2.0. We retain 25 predecessor files +byte-for-byte and record their origins in SOURCES.json. We credit ywz65's +primitive audit PR2566 and cubic directory-setup correction PR2590, along +with the selected source, grammar and caller contributors in +[NOTICE.md](NOTICE.md). The pending packages retain their separate review status. diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/RESULT.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/RESULT.json new file mode 100644 index 0000000000..7b7dfe0eab --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/RESULT.json @@ -0,0 +1,61 @@ +{ + "environment":{"python":"CPython 3.12.13","platform":"Darwin 25.5.0 arm64","dependencies":"standard library","scope":"Local author checks; full selected source/control census and complete small Boolean models, with selected coefficient probes and sampled high fields. No full GL64 payload execution."}, + "source":{ + "full_result_sha256":"0f9a58f98d24c7cdacb62952fba6b935bcf7391f7dad7442edfd640af5ea663e", + "result":{ + "gapped_endpoint":{"bank_atoms":3,"before":6,"bits":43740,"children":{"enter":20,"return":20},"core_atoms":2,"erased_tapes":9177171,"gap":5,"marker":[39125,43689],"payload_sha256":"6a09c7134287cc0149ab28e2d15c5ba728ef464c562f3ad0db8f0608f01322d5","peel_pairs":1,"suffix":2}, + "gapped_extents":{"gap":5,"geometry_cases":36,"widths":[64,65,95,127]}, + "generated_peel":{"ancestor_rank":5,"columns":130,"frozen_fields":1,"head64_to_tail0":8,"parent_atoms":65,"peel_scalars":[8,1,8],"root_atoms":832,"source_code_bits":6507,"tail0_to_head64":8,"wrong_offset_weight":2}, + "global_scalar":{"bridge_shears":18,"family_XOR_actions":63936,"global_events":29,"omission_controls":18,"terminal_family_pairs":14208}, + "sampled_high_packet":{"bits":39366,"children":{"enter":1,"return":1},"complete_high_cube":false,"dimension":2,"erased_tapes":372459,"gap":3,"high_prefixes":2,"payload_sha256":"b7fa73bbb6e282d63e6ea9fac8a2443c6357d015d34c65ecf0e5829af68bfed8","width":2}, + "selected_consumers":[ + {"callbacks":["adapter","child"],"code_bits":6507,"common":true,"full_payload_executed":false,"kind":"MOVE","rank":1,"request":0}, + {"callbacks":["adapter","child"],"code_bits":6507,"common":false,"full_payload_executed":false,"kind":"IDLE","rank":42,"request":27825} + ], + "selected_sources":{ + "consumer_binding_sha256":"e59279f482edde48fb08773e32c429acb369eaf33a723034d083cc0577c714c6", + "literal_counts":{"0":838368,"1":6999840,"2":2592,"3":2592}, + "literal_events":7843392, + "literal_source_sha256":"ea44aa047a2a9cf034de8b56b2166c49cf2dbdf9cd9ed6a20299a4f2b05ef09a", + "local_certificates":{ + "forward":{"copies":9,"profile":{"1":1323,"2":1342,"3":79,"4":44,"5":102,"6":11,"7":19},"records":27234,"symbolic_columns":661}, + "reverse":{"copies":9,"profile":{"1":1323,"2":1342,"3":79,"4":44,"5":102,"6":11,"7":19},"records":27234,"symbolic_columns":661} + }, + "ownership":{ + "calls":288,"distinct_slot_permutations":14, + "first_five_helper":{"ambient_axes":[[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]],"children":[4,4,4,4,4],"family":666,"pair":0,"replica":0,"roles":[232,233,234,235,236],"stage":2}, + "hosted_occurrences":126432,"idle_remainder_profile":{"2":13920,"4":14208,"6":14208,"7":21312,"42":288}, + "max_helpers_per_family":{"0":3,"1":3,"2":5,"3":5,"4":5,"5":5,"6":3,"7":5,"8":3} + }, + "provider":{ + "base_labels":541,"binding_sha256":"f5a4fb124709adc4b56376a3146e3609e91c0f4d3ed1931a61785a5d99bf8ee7","canonical_ERASE_guards":81, + "canonical_requests":28278,"chart_labels":1235,"full_paid_requests":904896, + "rank_histogram":{"1":381024,"2":400416,"3":22752,"4":26880,"5":29376,"6":17376,"7":26784,"42":288}, + "replicas":32,"request_kinds":{"COPY":81,"IDLE":1998,"MOVE":26199} + }, + "split_basis_ranks":{"1":120,"2":182,"3":77,"4":41,"5":85,"6":13,"7":22,"42":1} + } + } + }, + "node":{ + "full_result_sha256":"8fc9ebd9c9e43aa95343a9590c70bf548467a7d5b67267e2a92a2215bd707452", + "result":{ + "dimension":2,"width":1,"bank_atoms":2,"families":4,"low_classes":48,"gap":2,"input_columns":31104,"first_sweep_checkpoints":[0,1], + "residuals":{"MOVE":192,"COPY":96,"IDLE":384},"children":{"enter":5712,"return":5712}, + "events":{"bridge":4,"exchange":2,"global":15,"global_return":15,"literal":864,"residual":672}, + "erased_tapes":10012294,"payload_sha256":"5035a339800d38d3c2436548e89fc08db368266d4d6065a2adaf491052975af4" + } + }, + "controls":{ + "full_result_sha256":"bf0e719ad640a1df6f9543dace731e1585fd36e392e745c0485c57744da95c83", + "result":{ + "bridge_exchange":{"bridge_columns":15552,"exchange_columns":15552}, + "rejections_counts":{ + "cardinality_cases":20,"maximum_product_bits":822, + "rejections":["self_XOR","write_private","write_copied_source","wrong_ERASE_source","wrong_ADD_frame","node_range_0","node_range_1","node_range_4","node_range_5","incomplete_stock_1","incomplete_stock_191","incomplete_stock_193","incomplete_stock_188","incomplete_high_stock","physical_inventory_denominator","selected_compatibility_stock"], + "runtime_modules":["cardinal_counts.py","layout.py","packet_engine.py","consumer.py","peel.py","fresh_rows.py","control.py","driver.py","node.py","topology.py"],"selected_unused_factor":9475 + }, + "stale_state":{"stale_family_scatter":{"correct":1946,"source":1998,"wrong":1998},"stale_low_gather":{"correct":1947,"source":1962,"wrong":1962}} + } + } +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/SOURCES.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/SOURCES.json new file mode 100644 index 0000000000..4fef1a4d6c --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/SOURCES.json @@ -0,0 +1,58 @@ +{ + "schema_version":1, + "base_commit":"b4560d9e7216f72b73c5aa940ac099c05e33ccf9", + "files":[ + {"path":"certificates/selected-result.json","usage":"provenance","git_blob":"ae6a99f28aa468649eb66a361e764d769363bf11","sha256":"10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32"}, + {"path":"docs/research/agent-task-catalog.json","usage":"provenance","git_blob":"889b95d936746df124872133ae1e7cc339adcb92","sha256":"7d185cd8c2af35988d638d969748ad7b670f902606444dbfc748e4402c340df6"}, + {"path":"research/pr589-five-helper-hosting/verify.py","usage":"input","git_blob":"dbc71f56bb4205ebe378ada1f9f4ea88630d1d39","sha256":"cf90e19ae9991b0698be03d395a8cc29061ecb307eb7fea19adfb2d23c25a367"}, + {"path":"research/pr589-five-helper-hosting/PROOF.md","usage":"input","git_blob":"bbd3f12b9a32b3ad3cba85a2d5a1b3054214fa02","sha256":"59cae781bfbe1a01ed9e66a8efeeb5a2b995e5ecdf908586b23ecc39f2b8d647"}, + {"path":"research/e8-bit-p111-tuned/tune/bitE8mut-p111-tuned.json.gz","usage":"input","git_blob":"85a4499bf9e4911a705d50567a2c2ef6cf23739a","sha256":"e3e301e62bc2b41dbf1ceac0acf3d35824ebeab1848c5a2142d4577b109da52f"}, + {"path":"research/community-hyperplane599-audit/pr589/bit589/v9/hosted/GLOBAL-TEMPLATE.json.gz","usage":"input","git_blob":"9eafb8776cbf78c72124f833534469ddfa5e98ec","sha256":"0357b7cfbd7c29b4983982baf153c8a9f1e1e412690cd7fa9fc3d23d7963b20f"}, + {"path":"research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json","usage":"input","git_blob":"44006542202ca6037533a754f0bcd00549d7e088","sha256":"0058c491d839142aa99ef86a5ec697ce99857632228531512ea3fa74fb24d734"}, + {"path":"research/recursive-parking-boundary/README.md","usage":"input","git_blob":"251f335ebaccc11d69393ee7aeb5a2e84526d0bb","sha256":"491aa208391ee4c2936510b1a5c5c018dd5509d9a0e88687c72ab8406cd77b18"}, + {"path":"upstream/build/sections/02-streams.tex","usage":"input","git_blob":"088fceea1867abc76271d7efe7532b779fee9039","sha256":"606c80db61cad13aa0c3b6060dc4b88dbbe7ac60cdd831aa93f28d908fd09dab"}, + {"path":"research/e8-bit-p111-tuned/tune/EXPECTED.json","usage":"input","git_blob":"e293ddc557742637f9f679f083a1a282d87b1b13","sha256":"b9f0e5ca038abe837b0007c8fe006f366a6f02009244ac57705a8a200e2301f4"} + ], + "vendor_source":{"pr":2569,"commit":"0b116cb34f27a4b064f0d8dd65549ea5705cf9c0","unchanged":true,"proof_correction":"898ff36fe2cd05f733de6b26c88a4c4741b06237"}, + "vendor_files":[ + {"name":"binding.py","source_path":"research/selected-source-packets/binding.py","git_blob":"21a5a21220a18ab62a19ac403a9944bc3a8665c8","sha256":"20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b"}, + {"name":"bitstream.py","source_path":"research/selected-source-packets/vendor/bitstream.py","git_blob":"4d1fd4abb0f2aabe833e5cbc9efb51039739e7ca","sha256":"f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783"}, + {"name":"cardinality.py","source_path":"research/selected-source-packets/vendor/cardinality.py","git_blob":"b8ba857e32c5903408e1e61ff916300848b4a208","sha256":"505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22"}, + {"name":"check_support.py","source_path":"research/selected-source-packets/check_support.py","git_blob":"e1f961df9fa3a441fc5b600d1288a8d038eca51e","sha256":"d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964"}, + {"name":"children.py","source_path":"research/selected-source-packets/vendor/children.py","git_blob":"ce4935f838516e2b08d13bec767cb803786fbc6b","sha256":"a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6"}, + {"name":"controller.py","source_path":"research/selected-source-packets/vendor/controller.py","git_blob":"c631a9e77fbcccf0e8f448adc22978728aed7b60","sha256":"fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c"}, + {"name":"counts.py","source_path":"research/selected-source-packets/counts.py","git_blob":"81b48940ce222290a40d4fb349ce827f4788469d","sha256":"00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069"}, + {"name":"directory.py","source_path":"research/selected-source-packets/directory.py","git_blob":"c74cacf5ce809c0561d374f137a52df0992b4226","sha256":"4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7"}, + {"name":"episode.py","source_path":"research/selected-source-packets/episode.py","git_blob":"30d11ff4f333813855d36da3eb5a1ab0e154bafe","sha256":"38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff"}, + {"name":"forms.py","source_path":"research/selected-source-packets/vendor/forms.py","git_blob":"6667c0b772a63f0059c7caffec63e0d919a92398","sha256":"1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4"}, + {"name":"low_codes.py","source_path":"research/selected-source-packets/low_codes.py","git_blob":"737edfc4a10f4b7b3b97a7cef4b40864efd806e6","sha256":"f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87"}, + {"name":"matrices.py","source_path":"research/selected-source-packets/vendor/matrices.py","git_blob":"5d497353efbb9eeaaf4facd96ab40ffb0f3aa20d","sha256":"00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459"}, + {"name":"numeric.py","source_path":"research/selected-source-packets/vendor/numeric.py","git_blob":"6d4ebca8398008375b8f4762d1a9f1514e8c2611","sha256":"7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514"}, + {"name":"oracle.py","source_path":"research/selected-source-packets/vendor/oracle.py","git_blob":"244f131466698a3ace10b657242fe1f65c07fd1f","sha256":"7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67"}, + {"name":"packet.py","source_path":"research/selected-source-packets/vendor/packet.py","git_blob":"ebc9b616514412b80c56d523776e6ba5d6766453","sha256":"970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5"}, + {"name":"plan.py","source_path":"research/selected-source-packets/vendor/plan.py","git_blob":"48255d5454308c07635fae4e7eb4873b0bd2a4f8","sha256":"d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3"}, + {"name":"records.py","source_path":"research/selected-source-packets/vendor/records.py","git_blob":"4f00467a0ff580954ad2fd0c7380240c753ddef3","sha256":"0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372"}, + {"name":"residual.py","source_path":"research/selected-source-packets/residual.py","git_blob":"3d070d2539a529f3b14ecb086a92a3db056229fe","sha256":"8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df"}, + {"name":"routes.py","source_path":"research/selected-source-packets/routes.py","git_blob":"35531201dc349a811dfabc6f1f6e64697d665194","sha256":"ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada"}, + {"name":"selection.py","source_path":"research/selected-source-packets/selection.py","git_blob":"2c28f1aaec104a75c4e6c170b3e6a60300ee6700","sha256":"bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b"}, + {"name":"sources.py","source_path":"research/selected-source-packets/vendor/sources.py","git_blob":"16d5e7e6a28018f1e2d76d61efe2d54f6a6941d4","sha256":"f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62"}, + {"name":"stream.py","source_path":"research/selected-source-packets/vendor/stream.py","git_blob":"5e5a4bb0f98971447043e25d4dd6991bfc070389","sha256":"c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5"}, + {"name":"stream_runner.py","source_path":"research/selected-source-packets/vendor/stream_runner.py","git_blob":"efff281d4c4be5c1378e31404fbcc634fe4ade59","sha256":"751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249"}, + {"name":"trace.py","source_path":"research/selected-source-packets/vendor/trace.py","git_blob":"bb845a90f5bcf006e683e581e385936208f6a1f4","sha256":"c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984"}, + {"name":"words.py","source_path":"research/selected-source-packets/vendor/words.py","git_blob":"8d4ba37e2778acb35b34e0719df2caf138fbeb50","sha256":"5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9"} + ], + "proof_dependencies":[ + {"pr":2195,"head":"3a1cf78a1ba6322129e42d80c50d21765524d612","path":"research/selected-bit-local-ring-sweeps/PROOF.md","git_blob":"4330de85dd9862ed15d84ab917887d249753df99","sha256":"846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7","role":"Ring/GL hosting lift, frozen weighted common frames and explicit terminal endpoint gauges."}, + {"pr":2234,"head":"d047ef86fbc5b1614d3d8e2b8d3441413beab73f","role":"Original full provider catalogue and selected caller/reserve interface; catalogue.py adapts its enumeration."}, + {"pr":2310,"head":"a5258f548bfb6da71c3b72733fbbd2fb4995c929","role":"Generated grammar, coefficient and root-coupled control allowance."}, + {"pr":2332,"head":"0ee2ca645f3b04e1e4df1e1055b6f9aab09eaa95","role":"Selected source table and original global field slots."}, + {"pr":2475,"head":"4d536232f392d7df44e716f6d6099f459e4d9035","role":"Conditional whole-call staging and transported private lifetime."}, + {"pr":2501,"head":"52a995b9d7f3e008c252770a5f47fde67a7cb37a","role":"Completed selected residual and below64 leaves; retained dependencies through PR2569."}, + {"pr":2519,"head":"fe9ca26c8df754ccadbb3df89c721dad3b497b48","role":"Separate one-buffer R439 adapter and relative-chart identity."}, + {"pr":2545,"head":"8b82afa62da2647a0022775bdc2e19f7f4b3ac6e","role":"Separate whole-call buffer-residency completion; no adoption of its numerical allocation."}, + {"pr":2566,"head":"bfe8317a38f03a5693470e873b29101f3f7a55e4","role":"ywz65 complete primitive cost and ownership audit."}, + {"pr":2569,"head":"898ff36fe2cd05f733de6b26c88a4c4741b06237","role":"Source-directory and route refinement with corrected setup bill; runtime bytes unchanged from pinned0b116cb3."}, + {"pr":2590,"head":"8803e0ced7d5cc8a6db1b11157742f70981f4f42","role":"ywz65 cubic cardinality setup correction and canonical-input directory bound; charge returned-output disposal separately."} + ], + "scope":"Authenticate live main inputs and25 unchanged predecessor files before source imports. Pending mathematical dependencies remain subject to review." +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/TASK.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/TASK.json new file mode 100644 index 0000000000..eb2ce7cc00 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/TASK.json @@ -0,0 +1,48 @@ +{ + "schema_version":1, + "task_id":"uniform-transfer-audit", + "priority_revision":5, + "base_commit":"b4560d9e7216f72b73c5aa940ac099c05e33ccf9", + "original_card":{ + "id":"uniform-transfer-audit", + "question":"Can one exact all-size/compiler, precision, hosting or restoration implication be proved or falsified?", + "starting_points":["certificates/selected-result.json","docs/audit.md"], + "methods":["Prove one missing implication with explicit quantified hypotheses.","Find an exact counterexample at the claimed interface boundary."], + "acceptance_gate":"Identify the proposition and what would change downstream; do not equate a finite replay with a universal proof.", + "first_step":{"command":["python3","-B","scripts/research_baseline.py"],"expected":"PASS_RESEARCH_BASELINE_BINDINGS_ONLY","inspect":"Read the selected review scope and choose one exact all-size or precision implication.","scope":"Positive control / source-bound orientation only; this is not a new construction or full cold replay."}, + "first_experiment":"Write its quantified inputs and conclusion; find a missing hypothesis or construct a minimal exact adversarial instance.", + "bottleneck_link":"Finite supplier improvements are useful only under the retained transfer obligations.", + "allowed_variations":["Choose one tape, precision, hosting or restoration lemma."], + "scope_change_triggers":["Replacing a quantified obligation with another finite smoke test."], + "overlap_terms":["uniform transfer","all-size","precision"] + }, + "scope_status":"refined", + "actual_scope":"Complete the selected BIT node for 64<=n<128 from actual source packets and completed below64 leaves, including original-offset peel, arbitrary external gap, complete local/idle/bridge/exchange caller, row return and scratch disposal.", + "scope_change_reason":"PR2569 leaves the complete selected caller open after constructing its source boundary. We take that concrete handoff and close the first internal width range. The written refinement quantifies over precision and dirty payloads; finite checks exercise separate source and implementation implications.", + "bottleneck_link":"A selected residual with produced source fields still needs a caller that preserves owner chronology, fresh-row multiplicities, spectators and transported private work. This node supplies that missing first-range composition. Larger recursive admission remains open.", + "budget_minutes":240, + "stop_rule":"Complete this bounded node and its charged proof, or publish a failed endpoint/source/return obligation. Reassess the family expansion gate before implementing larger recursive children.", + "outcome":"completed", + "evidence":"PROOF.md states the quantified first-range refinement and complete asymptotic ledger. RESULT.json separates full selected source/literal checks, actual selected coefficient probes, complete small Boolean nodes, sampled high fields and mutation controls.", + "author":"Jose Manuel (jmbarrancoml)", + "ai_assistance":"Substantial OpenAI Codex assistance in mathematical analysis, source investigation, implementation, checking and writing. We claim neither independent human review nor new formal-kernel verification.", + "discussion":"https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18951991", + "freshness":{"canonical_main":"b5ea56e0a5ac4552166253b1fa4be0753bb38c30","upstream_checked_utc":"2026-10-15T17:40:10Z","overlap_checked_utc":"2026-10-15T17:28:53Z","coverage":"782 open PRs, 1320 Discussion/comment/reply records and 1690 local records; complete pagination, all 1908 matches saved and no warnings. Supplemental live reads through 17:40:10UTC confirmed unchanged main and PR2688, no new comments in2319/2304 and no competing new node PR. PR2688 supplies a complementary directory-only reserve component. Searches exclude arbitrary code diffs and do not establish novelty.","compatibility":"We fast-forwarded the task branch to this canonical main. Priority remains5; source pins and selected frontier remain unchanged. TASK/SOURCES retain b4560d9e as exact historical provenance. The navigation correction concerns R439 semantic-D evidence."}, + "concurrent_work":[ + {"pr":2688,"author":"ywz65","head":"1b9e1ed8793ffdde3c4b115641f0e644a9289923","relation":"Pending directory-only numerical storage allowance under large-q/root-depth/body/minimal-code premises. It excludes total caller lifetimes, routing/controller/count tapes and child workspace; we retain those total reserve obligations."} + ], + "expansion_gate":{ + "decision":"Continue this first-node acceptance-gap repair; reassess before larger recursion.", + "record":"https://github.com/CrocSwap/integer-mult-bounds/discussions/2319#discussioncomment-18951991", + "evidence_status":"Selected finite construction is reviewed conditional evidence. New source/residual dependencies and this package remain pending author-checked constructions; PR2566 and PR2590 provide separate independent cost audits. At the final checkpoint PR2688 adds a pending directory-only allowance without changing the total caller reserve obligation.", + "boundary":"Read-only incoming generated program/frozen fields and complete fresh rows; arbitrary dirty payload. Return F_A in original row/spectator order and erase owned work. See PROOF.md for quantified hypotheses and read sets.", + "cost_ledger":"Retained primitive/source bounds plus a constructive complete first-node C_q V(n+w) upper bound under root coupling. Total numerical reserve constants, larger recursive parking and full transfer remain unknown.", + "decision_value":"Close the full first-node consumer without deferring peel, routes or cleanup. Pending QQ16/P104 profile changes have separate endpoint/retention/hosting budgets; local node completion does not admit a new supplier.", + "bounded_test":"Full source census, complete generic Boolean execution, actual selected generated peel and source junctions, with lost-update/stock/frame controls. Stop on a failed implication or complete this package." + }, + "open_questions":[ + {"question":"Can a larger selected child use this node while its parent directories and staged roles remain live?","why_it_matters":"The first-range node closes the below64 callee chain; all-size recursion needs nested row production and a charged parent return.","first_step":"At a new expansion gate, fix one smallest above-range parent and list the live payload, 661-role staging, directories and program at each child entry and return.","blocked_by":"Recursive parking/return construction and numerical reserve admission."}, + {"question":"Can a numerical workspace constant admit this complete caller?","why_it_matters":"Our asymptotic bound counts 661 staged roles and directories; older four-buffer constants do not apply unchanged.","first_step":"Check PR2688's directory-only component, derive the remaining simultaneous live volumes including output disposal, then substitute the total into the selected reserve inequality.","blocked_by":"A complete live-volume certificate and the applicable pending reserve contract."}, + {"question":"Can a formal stream-machine compiler check this node refinement?","why_it_matters":"Written proofs and finite Boolean executions do not establish formal-kernel acceptance.","first_step":"Formalize the latest-family scatter and chronological low-sweep invariants over the pinned stream primitives.","blocked_by":"Operational compiler model and formalized predecessor refinements."} + ] +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/VERIFY.json b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/VERIFY.json new file mode 100644 index 0000000000..69c7ad75ab --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/VERIFY.json @@ -0,0 +1,21 @@ +{ + "schema_version":1, + "status":"ready", + "python":"3.12", + "requirements":[], + "inputs":[ + "research/pr589-five-helper-hosting/verify.py", + "research/pr589-five-helper-hosting/PROOF.md", + "research/e8-bit-p111-tuned/tune/bitE8mut-p111-tuned.json.gz", + "research/community-hyperplane599-audit/pr589/bit589/v9/hosted/GLOBAL-TEMPLATE.json.gz", + "research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json", + "research/e8-bit-p111-tuned/tune/EXPECTED.json", + "research/recursive-parking-boundary/README.md", + "upstream/build/sections/02-streams.tex" + ], + "commands":[ + {"argv":["{python}","-I","-B","{package}/verify.py","--suite","source"],"timeout_seconds":400,"checks":"Authenticate inputs and full selected source/literal bindings; check actual consumer junctions and generated peel; execute complete gapped Boolean endpoint and sampled multi-high packet."}, + {"argv":["{python}","-I","-B","{package}/verify.py","--suite","node"],"timeout_seconds":600,"checks":"Execute complete four-family GL2 node on31104 independent Boolean columns, with intermediate alias-sweep endpoints, actual leaves, private lifetimes and cleanup."}, + {"argv":["{python}","-I","-O","-B","{package}/verify.py","--suite","controls"],"timeout_seconds":200,"checks":"With assertions disabled, witness both stale-state failures, reversed Y bridge and family exchange; reject frame/range/stock faults and check arbitrary-width cardinalities."} + ] +} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/cardinal_counts.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/cardinal_counts.py new file mode 100644 index 0000000000..6a14feac45 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/cardinal_counts.py @@ -0,0 +1,55 @@ +"""Separate unbounded tapes for products of arbitrary spectator cardinalities.""" +from counts import Count as RetainedCount +from words import LEFT, ONE, RIGHT, ZERO, need + + +class Count(RetainedCount): + def zero(self): + self.rewind() + result=self.read()==ZERO + self.step(1) + result=result and self.read()==RIGHT + self.rewind() + return result + + def add(self,other): + source=Count(other) + self.rewind();source.rewind() + carry=0;left_done=False + try: + while True: + if not left_done and self.read()==RIGHT:left_done=True + right_done=source.read()==RIGHT + if left_done and right_done and not carry:break + a=ZERO if left_done else self.read() + b=ZERO if right_done else source.read() + need(a in (ZERO,ONE) and b in (ZERO,ONE),"binary cardinality sum") + total=a+b+carry + self.tape.write(total&1);carry=total>>1 + self.step(1) + if not right_done:source.step(1) + self.tape.write(RIGHT) + self.normalize() + finally:source.close() + + @classmethod + def product(cls,left,right): + factor,scan,result=cls(left),cls(right),cls.literal(0) + scan.msb() + try: + while scan.read()!=LEFT: + result.multiply_small(2) + if scan.read()==ONE:result.add(factor) + else:need(scan.read()==ZERO,"binary multiplier digit") + scan.step(-1) + scan.step(1) + return result + except ValueError: + result.close() + raise + finally: + factor.close();scan.close() + + +def positive(value): + need(isinstance(value,Count) and not value.zero(),"independent positive cardinality tape") diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/catalogue.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/catalogue.py new file mode 100644 index 0000000000..0efc0575a7 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/catalogue.py @@ -0,0 +1,268 @@ +"""Fixed selected request compilation, adapted from pinned PR2234 provider.py. + +Only q, rational labels and low classes enter these compilation routines. +Runtime precision, high matrices, widths and coefficients remain on tapes. +""" +from collections import Counter, defaultdict +from dataclasses import dataclass +from fractions import Fraction as F +from functools import cached_property, lru_cache +from hashlib import sha256 +import importlib.util +import json + +from binding import split_basis +from low_codes import LowCodes +import oracle +from plan import compile_plan +from sources import ROOT, Template, compile_specification, identity, product +from words import need + + +def canonical(value): + return json.dumps(value,sort_keys=True,separators=(",",":")) + + +@dataclass(frozen=True) +class Base: + kind: str + data: tuple + rank: int + + @cached_property + def key(self): + values=[[str(x) for x in row] for row in self.data] if self.kind=="local" else self.data + return sha256(canonical([self.kind,self.rank,values]).encode()).hexdigest() + + @lru_cache(None) + def matrix(self): + out=[[F(0)]*64 for _ in range(64)] + if self.kind=="local": + for i,row in enumerate(self.data):out[i][:8]=row + else: + need(self.kind=="idle" and len(set(self.data))==self.rank,"fixed idle base") + for i in self.data:out[i][i]=F(1) + return tuple(map(tuple,out)) + + @lru_cache(None) + def basis(self,q): + return split_basis(self.matrix(),self.rank,q) + + +@dataclass(frozen=True) +class Chart: + kind: str + port: int = -1 + stage: int = -1 + axes: tuple = () + + @property + def key(self):return (self.kind,self.port,self.stage,self.axes) + + +@dataclass(frozen=True) +class Request: + kind: str + stage: int + position: int + role: int + family: int + old_frame: int + new_frame: int + base: Base + chart: Chart + header_space: str + source_chart: object = None + + def record(self): + return [self.kind,self.stage,self.position,self.role,self.family, + self.old_frame,self.new_frame,self.base.key,self.base.rank, + self.chart.key,self.header_space,self.source_chart.key if self.source_chart else None] + + +class Catalogue: + dimension=64 + replicas=32 + families=28416 + private=661 + replica_stride=888 + + def __init__(self,q): + self.q=q + path=ROOT/"research/pr589-five-helper-hosting/verify.py" + spec=importlib.util.spec_from_file_location("retained_selected_node_source",path) + self.old=importlib.util.module_from_spec(spec);spec.loader.exec_module(self.old) + self.word,self.template,self.geometry=(self.old.read(p) for p in + (self.old.WORD,self.old.HOST,self.old.GEO)) + rows=[self.old.projection([self.word["lines"][i] for i in frame]) for frame in self.word["frames"]] + self.projectors=[p for p,_ in rows];self.dimensions=[r for _,r in rows] + self.idles={event["idx"]:event for event in self.template["schedule"] if event["kind"]=="idle"} + self.requests=[];self.bases={};self.charts=set();self.erase_guards=[] + self._bind() + self.codes=LowCodes(q,64,len(self.requests)) + self.identifiers={self.semantic_key(request):i for i,request in enumerate(self.requests)} + need(len(self.identifiers)==len(self.requests),"unique full catalogue request identifiers") + + @staticmethod + def semantic_key(request): + return (request.kind,request.stage,request.role if request.kind=="IDLE" else request.position) + + def base(self,a,b): + lo,hi=(a,b) if self.dimensions[a]<=self.dimensions[b] else (b,a) + value=Base("local",self.old.sub(self.projectors[hi],self.projectors[lo]), + self.dimensions[hi]-self.dimensions[lo]) + return self.bases.setdefault(value.key,value) + + def pending(self,child):return tuple(self.old.pending_axes(self.idles[child])) + + def owner_chart(self,call,role): + family,route=call["owners"][role] + if route[0]=="data":return Chart("data",route[2],route[1]) + need(route[0]=="hosted","selected owner route kind") + _,child,offset,width=route + axes=self.pending(child)[offset:offset+width] + need(len(axes)==8,"complete selected helper support") + return Chart("host",family%111 if min(axes)<8 else -1,axes=axes) + + @lru_cache(None) + def chart_matrix(self,chart): + out=identity(64) + if chart.kind=="identity":return tuple(map(tuple,out)) + if chart.kind=="data": + if chart.stage==0:return tuple(map(tuple,out)) + axes=list(range(8))+list(range(8+7*(chart.stage-1),8+7*chart.stage)) + rho=self.geometry["ports"][chart.port]["rho15"] + for i,a in enumerate(axes): + for j,b in enumerate(axes):out[a][b]=F(rho[i][j]) + return tuple(map(tuple,out)) + if chart.kind=="family" or (chart.kind=="host" and chart.port>=0): + port=self.geometry["ports"][chart.port] + for i in range(8):out[i][:8]=[F(port["q"][i],2)]+list(map(F,port["complement_columns"][i])) + if chart.kind=="host": + domain,support=set(range(8)),set(chart.axes);permutation=list(range(64)) + for a,b in zip(sorted(domain-support),sorted(support-domain)): + permutation[a],permutation[b]=b,a + need(set(permutation[:8])==support,"selected owner support completion") + out=[[row[permutation[j]] for j in range(64)] for row in out] + else:need(chart.kind=="family","known fixed chart") + return tuple(map(tuple,out)) + + def _append(self,request): + need(0=n else 1),9**(y-x-1)*(5 if x=n else 1),7*9**(2*n-1-x)*(5 if x>3)^(i>>7)^0x53)&1) + tape.origins={i+1:(1<=0: + enlarged=Count.product(pre,self.gap);pre.close();pre=enlarged + if g.raw.compare(last,self.parent_size)<0: + enlarged=Count.product(tail,self.gap);tail.close();tail=enlarged + values=[pre] + if b is not None: + distance=g.raw.subtract_exact(b,a) + count=g.raw.subtract_exact(distance,g.one) + middle=Count.literal(1) + multiply_atom_power(middle,count,self.ring,self.q) + if g.raw.compare(a,self.parent_size)<0 and g.raw.compare(b,self.parent_size)>=0: + enlarged=Count.product(middle,self.gap);middle.close();middle=enlarged + values.append(middle) + g.index.free_many(distance,count,b) + values.append(tail);g.index.free(a) + result=[value.marginal() for value in values] + for value in values:value.close() + return result + + def fibre(self): + value=Count.product(self.before,self.gap) + multiply_atom_power(value,self.total,self.ring,self.q) + result=Count.product(value,self.suffix) + value.close() + return result + + def close(self): + self.geometry.index.free_many(self.core,self.extra,self.total) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/model.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/model.py new file mode 100644 index 0000000000..9fb82fa57d --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/model.py @@ -0,0 +1,172 @@ +"""Complete small caller fixture; production streams execute its residuals. + +The selected source/grammar checks are separate. This model has two-dimensional +projectors and four live families, not a sampled selected GL64 payload. +""" +from collections import Counter +from dataclasses import dataclass +from fractions import Fraction as F + +from cardinal_counts import Count +from directory import produce +from forms import fallback_form, good_form +from layout import Layout +from low_codes import LowCodes +from matrices import Matrices +from numeric import Geometry, Page +import oracle +import packet_engine +from plan import compile_plan +from records import BLANK, RECORD_END, Tape, append_word, read_finite, read_word, seek_record +from topology import Call, Owner +from trace import execute +from words import need + +I=((F(1),F(0)),(F(0),F(1))) +S=((F(0),F(1)),(F(1),F(0))) +A=((F(1),F(1)),(F(0),F(1))) + + +@dataclass(frozen=True) +class Request: + kind: str + base: int + family: int + chart: tuple = I + + +class Catalogue: + q=3 + dimension=2 + + def __init__(self): + self.requests=[] + for _stage in range(2): + self.requests.extend((Request("MOVE",0,0),Request("COPY",0,4),Request("MOVE",0,0,S))) + for family in range(4): + self.requests.extend((Request("IDLE",0,family,A),Request("IDLE",1,family,A))) + self.codes=LowCodes(3,2,len(self.requests)) + + def low_classes(self): + for ordinal in range(self.codes.size):yield self.codes.unrank(ordinal) + + +class Topology: + replicas=1 + pairs=2 + ports=1 + families=4 + stride=4 + + def __init__(self,catalogue): + self.catalogue=catalogue + self.idles={i:(6+i,) for i in range(8)} + self.schedule=tuple( + [{"kind":"local_cover_sweep","stage":0},{"kind":"local_cover_sweep","stage":1}] + +[{"kind":"idle","idx":i} for i in range(8)] + +[{"kind":"bridge","dst":0,"src":1,"coefficient":c} for c in (1,-1)] + +[{"kind":"local_cover_sweep","stage":i} for i in (2,3)] + +[{"kind":"exchange"}]) + + def call(self,stage,replica): + need(replica==0,"model replica") + if stage<2: + events=((0,0,0,1,1,0),(2,0,3,1,0,1,0),(1,2,3,1,0,0), + (1,2,3,1,0,0),(3,0,3,1,0,0,0),(0,1,0,1,1,0)) + requests=(3*stage,3*stage+1,None,None,None,3*stage+2) + return Call(stage,0,(Owner(0,I),Owner(0,S),Owner(1,I)),(0,0,0),(1,1,0),events,requests,False) + pair=stage-2 + return Call(stage,0,(Owner(2*pair,I),Owner(2*pair+1,I)),(0,0),(0,0), + ((1,1,0,1,0,0),(1,0,1,1,0,0),(1,1,0,1,0,0)),(None,None,None),False) + + @staticmethod + def matrix(chart):return chart + + def idle_family(self,identifier,replica): + need(replica==0,"model native replica") + return self.catalogue.requests[identifier].family + + @staticmethod + def family(replica,pair,side,port): + need(replica==port==0,"model family coordinates") + return 2*pair+side + + +class Incoming: + def __init__(self,context,indices,values): + self.context,self.indices=context,indices + self.tape=Tape() + for value in values: + word=context.arena.input(value) + append_word(self.tape,word);self.tape.append(RECORD_END) + context.arena.free(word) + self.tape.rewind() + + def weight(self,coordinate): + seek_record(self.tape,coordinate) + value=read_word(self.tape,self.context.arena) + need(self.tape.read()==RECORD_END,"complete encoded fixture weight") + self.tape.rewind() + return value + + def coefficient(self,prefix,request): + need(prefix.read()==BLANK and request.kind=="incoming","model frozen-only root context") + value=self.weight(request.coordinate) + if request.negative_inverse: + inverse=self.context.ring.inverse(value) + need(inverse is not None,"fixture unit weight") + opposite=self.context.ring.negate(inverse) + self.context.arena.free_many(value,inverse);value=opposite + return value + + def close(self):self.tape.clear() + + +class Consumer: + def __init__(self,context,indices,program,parent_size,depth,catalogue,incoming): + self.context,self.indices,self.program=context,indices,program + self.parent_size,self.depth,self.catalogue,self.incoming=parent_size,depth,catalogue,incoming + self.calls=Counter();self.children=Counter() + + def apply(self,source,identifier,common,low,old_directory,old_count,before,gap,suffix,observe=None): + context,indices,arena=self.context,self.indices,self.context.arena + request=self.catalogue.requests[identifier] + need(common==(request.kind!="IDLE"),"model current source view") + self.calls[request.kind]+=1 + basis=I if request.base==0 else S + chart=I if common else request.chart + preparation=tuple(tuple(sum(chart[i][k]*basis[k][j] for k in range(2)) for j in range(2)) for i in range(2)) + low_header=oracle.multiply(low,oracle.reduce_rational(preparation,context.q),context.q) + p=oracle.multiply([[row[0]] for row in low_header],oracle.inverse(low_header,context.q)[:1],context.q) + good=p[0][0]!=0 + plan=compile_plan(p,1,context.q,good) + code=context.codes.encode(identifier,common,low) + directory,prefixes=produce(old_directory,self.depth,old_count,code,context) + columns,one=indices.literal(1),indices.literal(1) + geometry=Geometry(plan,indices,columns,self.depth,code,self.program) + fields,carry=geometry.raw.add(self.depth,one);indices.free(one) + need(not carry,"model current field count") + layout=Layout(geometry,self.parent_size,context.ring,context.q,before,gap,suffix) + def coefficient(prefix,reference): + seek_record(prefix,self.depth) + need(read_finite(prefix,context.codes.bits)==code,"model produced request/view field") + high=[[read_word(prefix,arena) for _ in range(2)] for _ in range(2)] + need(prefix.read()==RECORD_END,"model raw high record") + prefix.step(1);need(prefix.read()==BLANK,"model current field is last");prefix.rewind() + matrices=Matrices(context.ring) + header=matrices.raw_header(low,high,context.q) + prepared=matrices.constants(preparation) + full=matrices.multiply(header,prepared) + projector=matrices.projector(full,1) + form=good_form(projector,1,context.ring) if good else fallback_form(projector,context.ring) + page=Page(plan,form,context.ring,indices,columns,self.incoming.weight,self.depth,code,self.program) + value=page.evaluate(reference);page.close() + for matrix in (high,header,prepared,full,projector):matrices.free(matrix) + return value + def boundary(kind): + self.children[kind]+=1 + if observe is not None:observe(kind) + try:return packet_engine.run(source,execute(geometry),layout,directory,prefixes,fields,coefficient,observe=boundary) + finally: + layout.close();geometry.close();indices.free_many(columns,fields) + directory.clear();prefixes.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/node.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/node.py new file mode 100644 index 0000000000..13badda6f0 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/node.py @@ -0,0 +1,68 @@ +"""One complete first-range node: peel, fresh rows, global caller and return.""" +from cardinal_counts import Count, positive +from cardinality import multiply_atom_power +from consumer import Consumer, IncomingWeights +from driver import Driver +import fresh_rows +from packet import read_prefix +import peel +from plan import Request +from topology import SelectedTopology +from words import Unsigned, need + + +class Node: + def __init__(self,context,indices,program,parent_size,depth,topology,consumer,incoming,stock_multiple=1): + self.context,self.indices,self.program=context,indices,program + self.parent_size,self.depth=parent_size,depth + self.topology,self.consumer,self.incoming=topology,consumer,incoming + self.stock_multiple=stock_multiple + raw=Unsigned(indices);dimension,one=indices.literal(context.dimension),indices.literal(1) + columns,remainder=raw.divmod(parent_size,dimension) + valid=raw.compare(columns,one)==0 + indices.free_many(dimension,one,columns,remainder) + need(valid,"complete node first internal range") + + def run(self,source,old_directory,old_count,row_count,before,gap,suffix,observe=None): + old_count,row_count,before,gap,suffix=(Count(value) for value in (old_count,row_count,before,gap,suffix)) + for value in (old_count,row_count,before,gap,suffix):positive(value) + context,indices=self.context,self.indices + unused=leading=fibre=None;peeled=None;families={} + try: + old_directory.rewind();first=read_prefix(old_directory,self.depth);old_directory.rewind() + zero=indices.zero() + try: + value=self.incoming.coefficient(first,Request("incoming",zero)) + context.arena.free(value) + finally:first.clear();indices.free(zero) + unused=fresh_rows.quotient(row_count,context,self.topology.families) + stock=Count(unused) + try:need(stock.divide_small(self.stock_multiple)==0,"selected compatible unused stock factor") + finally:stock.close() + leading=Count.product(unused,before) + fibre=Count.product(leading,gap) + total=Unsigned(indices).times_small(self.parent_size,2) + multiply_atom_power(fibre,total,context.ring,context.q);indices.free(total) + following=Count.product(fibre,suffix);fibre.close();fibre=following + peeled=peel.run(source,context,indices,self.parent_size,self.depth,self.program, + old_directory,old_count,row_count,before,gap,suffix,self.incoming) + families=fresh_rows.split(peeled,context,self.topology.families,old_count,fibre) + driver=Driver(context,self.topology,self.consumer,old_directory,old_count,leading,gap,suffix,fibre,observe) + driver.global_word(families) + return fresh_rows.merge(families,context,self.topology.families,old_count,fibre) + finally: + for tape in families.values():tape.clear() + if peeled is not None and peeled is not source:peeled.clear() + for value in (unused,leading,fibre,old_count,row_count,before,gap,suffix): + if value is not None:value.close() + source.rewind();old_directory.rewind() + + +class SelectedNode(Node): + def __init__(self,context,indices,program,parent_size,depth,catalogue,specifications): + need(context.dimension==64 and context.codes is catalogue.codes and + specifications.catalogue is catalogue,"one source-bound selected node") + topology=SelectedTopology(catalogue) + consumer=Consumer(context,indices,program,specifications,parent_size,depth) + incoming=IncomingWeights(context,indices,program,specifications,parent_size,depth) + super().__init__(context,indices,program,parent_size,depth,topology,consumer,incoming,9475) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/packet_engine.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/packet_engine.py new file mode 100644 index 0000000000..27a0dbf82e --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/packet_engine.py @@ -0,0 +1,63 @@ +"""Shared trace on complete prefixes, with the caller's full two-bank layout.""" +from bitstream import copy_bits +from packet import read_prefix +from records import Tape +from stream import Counter +from stream_runner import action +from words import BLANK, need + + +def run(source,events,layout,directory,prefix_count,field_count,coefficient,factory=Tape,observe=None): + fibre=layout.fibre() + current,active=source,None + try: + for event in events: + if event.kind=="enter": + need(active is None and event.parent_identity is layout.geometry.parent_identity, + "one whole-packet completed child") + active=event + if observe is not None:observe("enter") + continue + if event.kind=="return": + need(active is not None and active.parent_identity is event.parent_identity and + (active.child_kind,active.field,active.reverse,active.half,active.source_code)== + (event.child_kind,event.field,event.reverse,event.half,event.source_code), + "same completed child returns") + for a,b in ((active.first,event.first),(active.second,event.second), + (active.width,event.width),(active.depth,event.depth)): + need(layout.geometry.raw.compare(a,b)==0,"restored child geometry") + active=None + if observe is not None:observe("return") + continue + output,prefixes=factory(),Counter(prefix_count) + directory.rewind() + try: + need(not prefixes.finished,"nonempty complete prefix packet") + while not prefixes.finished: + fields=read_prefix(directory,field_count) + local,changed=factory(),None + try: + copy_bits(current,local,fibre);local.rewind() + changed=action(local,event,layout,lambda request:coefficient(fields,request),factory) + copy_bits(changed,output,fibre) + need(changed.read()==BLANK,"complete changed prefix fibre") + finally: + if changed is not None and changed is not local:changed.clear() + local.clear();fields.clear() + prefixes.decrement() + need(current.read()==directory.read()==BLANK,"complete shared packet and directory") + current.rewind();directory.rewind() + if current is not source:current.clear() + output.rewind();current=output + except ValueError: + output.clear() + raise + finally:prefixes.close() + need(active is None,"complete child lifetime") + return current + except ValueError: + if current is not source:current.clear() + raise + finally: + fibre.close();directory.rewind();source.rewind() + events.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/peel.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/peel.py new file mode 100644 index 0000000000..2ae1769a97 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/peel.py @@ -0,0 +1,44 @@ +"""Peel the last n-m head atoms using original incoming weight offsets.""" +from cardinal_counts import Count +from layout import Layout +from numeric import Geometry +import packet_engine +from plan import Plan, Request +from trace import primitive +from words import need + + +def events(geometry,parent_size): + raw,index=geometry.raw,geometry.index + coordinate=raw.times_small(geometry.columns,geometry.plan.dimension) + total=raw.times_small(parent_size,2) + last=raw.subtract_exact(total,geometry.one) + index.free(total) + try: + while raw.compare(coordinate,parent_size)<0: + right=raw.subtract_exact(last,coordinate) + try: + for stage in range(8): + a,b=index.copy(coordinate),index.copy(right) + if stage in (0,2,4,6):yield from primitive("atom_swap",a,b,None,geometry) + elif stage==7: + index.free(a);yield from primitive("sign",b,None,None,geometry) + else: + request=Request("incoming",index.copy(coordinate),negative_inverse=stage==3) + yield from primitive("add",b,a,request,geometry) + finally:index.free(right) + raw.increment_in_place(coordinate) + finally:index.free_many(coordinate,last) + + +def run(source,context,indices,parent_size,depth,program,old_directory,old_count, + fresh_rows,before,gap,suffix,incoming): + columns=indices.literal(1) + geometry=Geometry(Plan(context.dimension,1,True,()),indices,columns,depth,0,program) + leading=Count.product(fresh_rows,before) + layout=Layout(geometry,parent_size,context.ring,context.q,leading,gap,suffix,embedded=False) + try: + return packet_engine.run(source,events(geometry,parent_size),layout,old_directory, + old_count,depth,incoming.coefficient) + finally: + layout.close();leading.close();geometry.close();indices.free(columns) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/topology.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/topology.py new file mode 100644 index 0000000000..39a2916c20 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/topology.py @@ -0,0 +1,91 @@ +"""Fixed chronological selected calls, owners and global frame boundaries.""" +from dataclasses import dataclass +from functools import lru_cache +from hashlib import sha256 + +from catalogue import canonical +from words import need + + +@dataclass(frozen=True) +class Owner: + family: int + chart: object + + +@dataclass(frozen=True) +class Call: + stage: int + replica: int + owners: tuple + start: tuple + end: tuple + events: tuple + requests: tuple + reverse: bool + + +class SelectedTopology: + replicas=32 + pairs=4 + ports=111 + families=28416 + stride=888 + + def __init__(self,catalogue): + self.catalogue=catalogue + self.schedule=tuple(catalogue.template["schedule"]) + self.idles={i:tuple(j for j,r in enumerate(catalogue.requests) if r.kind=="IDLE" and r.stage==i) + for i in range(10)} + expected="Each recipe phase: replicas then all cover classes; finish every local invocation before the next." + need(catalogue.template["loop_order"]==expected,"source-selected loop order") + self._validate_global() + + def _validate_global(self): + levels=[-1]*4 + for position,event in enumerate(self.schedule): + kind=event["kind"] + if kind=="local_cover_sweep": + need(levels[event["pair"]]==event["stage"]-1,"local call enters its data level") + levels[event["pair"]]=event["stage"] + elif kind=="idle": + need(levels[event["pair"]]==event["source_level"],"idle enters its native level") + levels[event["pair"]]=event["target_level"] + need(bool(self.idles[event["idx"]])==(event["rank"]>0),"zero idle source boundary") + elif kind=="bridge": + need(event["coefficient"] in (-1,1) and event["dst"]!=event["src"] and + levels[event["dst"]]==levels[event["src"]],"native bridge frame alignment") + else: + need(kind=="exchange" and position==len(self.schedule)-1 and levels==[8]*4, + "terminal exchange frame boundary") + + @lru_cache(None) + def recipe(self,stage): + source=self.catalogue.template["calls"][32*stage] + reverse=source["orientation"]=="reverse" + events=tuple(map(tuple,self.catalogue.template["local_programs"][source["orientation"]])) + identifiers=tuple(self.catalogue.identifier("MOVE" if event[0]==0 else "COPY",stage,position) + if event[0] in (0,2) else None for position,event in enumerate(events)) + word=self.catalogue.word + start=tuple(word["final"] if reverse else word["start"]) + end=tuple(word["start"] if reverse else word["final"]) + return events,identifiers,start,end,reverse + + @lru_cache(None) + def call(self,stage,replica): + source=self.catalogue.template["calls"][32*stage+replica] + events,identifiers,start,end,reverse=self.recipe(stage) + owners=tuple(Owner(family,self.catalogue.owner_chart(source,role)) + for role,(family,_route) in enumerate(source["owners"])) + need(len(owners)==len(start)==len(end)==661,"complete selected staged roles") + return Call(stage,replica,owners,start,end,events,identifiers,reverse) + + def matrix(self,chart):return self.catalogue.chart_matrix(chart) + + def idle_family(self,request_id,replica): + request=self.catalogue.requests[request_id] + need(request.kind=="IDLE","native idle family") + return request.family+self.stride*replica + + def family(self,replica,pair,side,port): + return self.stride*replica+(2*pair+side)*self.ports+port diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/binding.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/binding.py new file mode 100644 index 0000000000..21a5a21220 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/binding.py @@ -0,0 +1,102 @@ +"""Fixed selected labels and explicit owner-to-common numerical specifications.""" +from dataclasses import dataclass, replace +from fractions import Fraction as F +from hashlib import sha256 +import importlib.util +import json + +from routes import compile_route +from sources import ROOT, Template, compile_specification, identity, independent_columns, product +from words import need + + +def split_basis(base, rank, q): + size = len(base) + complement = [[F(i == j)-base[i][j] for j in range(size)] for i in range(size)] + image, kernel = independent_columns(base, q), independent_columns(complement, q) + need((len(image), len(kernel)) == (rank, size-rank), "source projector rank") + basis = [[base[i][j] for j in image]+[complement[i][j] for j in kernel] for i in range(size)] + projected = [[basis[i][j] if j < rank else F(0) for j in range(size)] for i in range(size)] + need(product(base, basis) == projected and len(independent_columns(basis, q)) == size, + "fixed source split basis") + return tuple(map(tuple, basis)) + + +def common_template(template): + basis = split_basis(template.base, template.rank, template.q) + need(tuple(map(tuple, product(template.chart, basis))) == template.preparation, + "original owner preparation provenance") + return replace(template, chart=tuple(map(tuple, identity(len(template.base)))), preparation=basis, + record=template.record+("common-after-owner-route",)) + + +def owner_common(template, owner_low, request, vocabulary): + route = compile_route(owner_low, template.chart, vocabulary) + owner_code = vocabulary.encode(request, False, route.low) + common_code = vocabulary.encode(request, True, route.target_low) + owner = compile_specification(owner_code, template, route.low) + common = compile_specification(common_code, common_template(template), route.target_low) + need(owner.good == common.good, "same physical low projector branch") + return owner, common, route + + +@dataclass(frozen=True) +class Episode: + source: int + targets: tuple + private: int + records: tuple + sha256: str + source_family: int + target_families: tuple + chart: tuple + template: object + request: int = 1 + + +def selected_episode(q=3): + path = ROOT / "research/pr589-five-helper-hosting/verify.py" + spec = importlib.util.spec_from_file_location("selected_source_packet_labels", path) + old = importlib.util.module_from_spec(spec) + spec.loader.exec_module(old) + word, host = old.read(old.WORD), old.read(old.HOST) + call = host["calls"][0] + need(call["orientation"] == "forward", "selected episode orientation") + records = host["local_programs"]["forward"][21881:21938] + digest = sha256(json.dumps(records, separators=(",", ":")).encode()).hexdigest() + need(digest == "e622fdcb880ed9e39962929f64272937cc4ccdd6bafd7def1dc1d7a68512b35e", + "selected literal COPY511 episode") + need(records[0] == [2,473,661,511,0,7,0] and records[-1] == [3,473,661,511,0,0,0], + "exact transported COPY and ERASE") + targets = tuple(record[1] for record in records[1:-1]) + need(len(targets) == len(set(targets)) == 55 and + all(record == [1, target, 661, 1, 0, 0] and target not in (473,661) + for target, record in zip(targets, records[1:-1])), "immutable COPY source and private value") + family, route = call["owners"][473] + need(family == 527 and route == ["hosted",2,16,8], "selected COPY source owner") + idle = next(event for event in host["schedule"] if event["kind"] == "idle" and event["idx"] == 2) + support = old.pending_axes(idle)[16:24] + need(support == list(range(17,25)), "selected source support") + permutation = list(range(64)) + for i, j in enumerate(support): + permutation[i], permutation[j] = j, i + chart = tuple(tuple(F(permutation[j] == i) for j in range(64)) for i in range(64)) + target_families = tuple(call["owners"][target][0] for target in targets) + need(target_families == targets and family not in target_families and + all(call["owners"][target][1] == ["data",0,target % 111] for target in targets), + "disjoint stage-zero target families") + local, rank = old.projection([word["lines"][i] for i in word["frames"][511]]) + need(rank == 7, "selected COPY511 rank") + key = sha256(json.dumps(["local", rank, [[str(x) for x in row] for row in local]], + sort_keys=True, separators=(",", ":")).encode()).hexdigest() + need(key == "f256295f6139080a4b55eeb08cd459385c08060fbee5b1cf318379d6ee9b5cbf", + "selected COPY511 projector label") + base = [[F(0) for _ in range(64)] for _ in range(64)] + for i in range(8): + base[i][:8] = local[i] + basis = split_basis(base, rank, q) + record = ("COPY",0,21881,473,28416,511,0,key,7,"common",tuple(support),-1) + template = Template(q, rank, record, tuple(map(tuple, base)), + tuple(map(tuple, identity(64))), basis) + return Episode(473, targets, 661, tuple(map(tuple, records)), digest, family, + target_families, chart, template) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/bitstream.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/bitstream.py new file mode 100644 index 0000000000..4d1fd4abb0 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/bitstream.py @@ -0,0 +1,160 @@ +"""Complete atom swaps and address signs, using fixed-radix digit passes.""" +from cardinality import Natural, digit_suffix, radix_power +from records import Tape +from stream import Counter, copy_blocks, one_bit_suffix, positive_extent +from words import BLANK, ONE, ZERO, need + + +def unobserved(_counter): + pass + + +def copy_bits(source, target, length): + if one_bit_suffix(length): + bit = source.read() + need(bit in (ZERO, ONE), "opaque single payload bit") + target.append(bit) + source.step(1) + return + count = Counter(length) + while not count.finished: + bit = source.read() + need(bit in (ZERO, ONE), "opaque stream bit") + target.append(bit) + source.step(1) + count.decrement() + count.close() + + +def digit_swap(source, q, before, middle, suffix): + buckets = [[Tape() for _ in range(q)] for _ in range(q)] + outer = Counter(before) + while not outer.finished: + for a in range(q): + between = Counter(middle) + while not between.finished: + for b in range(q): + copy_bits(source, buckets[a][b], suffix) + between.decrement() + between.close() + outer.decrement() + outer.close() + need(source.read() == BLANK, "complete digit-swap input") + source.rewind() + for row in buckets: + for tape in row: + tape.rewind() + out, outer = Tape(), Counter(before) + while not outer.finished: + for a in range(q): + between = Counter(middle) + while not between.finished: + for b in range(q): + copy_bits(buckets[b][a], out, suffix) + between.decrement() + between.close() + outer.decrement() + outer.close() + for row in buckets: + for tape in row: + need(tape.read() == BLANK, "complete transposed digit bucket") + tape.clear() + out.rewind() + return out + + +def digit_complement(source, q, before, suffix): + buckets, outer = [Tape() for _ in range(q)], Counter(before) + while not outer.finished: + for digit in range(q): + copy_bits(source, buckets[digit], suffix) + outer.decrement() + outer.close() + need(source.read() == BLANK, "complete digit-complement input") + source.rewind() + for tape in buckets: + tape.rewind() + out, outer = Tape(), Counter(before) + while not outer.finished: + for digit in range(q): + copy_bits(buckets[q-1-digit], out, suffix) + outer.decrement() + outer.close() + for tape in buckets: + need(tape.read() == BLANK, "complete complemented digit bucket") + tape.clear() + out.rewind() + return out + + +def atom_swap(source, ring, q, before, middle, suffix): + for value in (before, middle, suffix): + positive_extent(value) + pre, gap, tail = Natural(before), Natural(middle), Natural(suffix) + digit_suffix(gap, ring, q) + digit_suffix(tail, ring, q) + current, first = source, True + try: + for _ in radix_power(ring, q): + if not first: + pre.multiply_small(q) + need(tail.divide_small(q) == 0, "exact next digit suffix") + following = digit_swap(current, q, pre, gap, tail) + if current is not source: + current.clear() + current, first = following, False + return current + finally: + pre.close() + gap.close() + tail.close() + + +def translate_one(source, ring, before, suffix): + leading = ring.raw.subtract_exact(ring.modulus, ring.one) + left, right, output = Tape(), Tape(), Tape() + outer = Counter(before) + while not outer.finished: + copy_blocks(source, left, leading, suffix, unobserved) + copy_blocks(source, right, ring.one, suffix, unobserved) + outer.decrement() + outer.close() + need(source.read() == BLANK, "complete translation input") + source.rewind() + left.rewind() + right.rewind() + outer = Counter(before) + while not outer.finished: + copy_blocks(right, output, ring.one, suffix, unobserved) + copy_blocks(left, output, leading, suffix, unobserved) + outer.decrement() + outer.close() + need(left.read() == right.read() == BLANK, "complete translation buckets") + left.clear() + right.clear() + ring.arena.free(leading) + output.rewind() + return output + + +def sign_address(source, ring, q, before, suffix): + for value in (before, suffix): + positive_extent(value) + pre, tail = Natural(before), Natural(suffix) + digit_suffix(tail, ring, q) + current, first = source, True + try: + for _ in radix_power(ring, q): + if not first: + pre.multiply_small(q) + need(tail.divide_small(q) == 0, "exact complemented suffix") + following = digit_complement(current, q, pre, tail) + if current is not source: + current.clear() + current, first = following, False + result = translate_one(current, ring, before, suffix) + current.clear() + return result + finally: + pre.close() + tail.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/cardinality.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/cardinality.py new file mode 100644 index 0000000000..b8ba857e32 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/cardinality.py @@ -0,0 +1,136 @@ +"""Canonical unbounded binary cardinalities on one sequential tape each.""" +from records import Tape +from stream import Counter +from words import BLANK, LEFT, ONE, RIGHT, ZERO, need + + +class Natural: + def __init__(self, source=None): + self.tape = Tape() + if source is None: + self.tape.append(ONE) + else: + source.rewind() + while source.read() != RIGHT: + bit = source.read() + need(bit in (ZERO, ONE), "binary cardinality input") + self.tape.append(bit) + source.step(1) + source.rewind() + self.tape.append(RIGHT) + self.normalize() + + def read(self): + return self.tape.read() + + def step(self, direction): + self.tape.step(direction) + + def rewind(self): + self.tape.rewind() + + def msb(self): + self.rewind() + while self.read() != RIGHT: + self.step(1) + self.step(-1) + + def normalize(self): + self.rewind() + while self.read() != RIGHT: + self.step(1) + self.step(-1) + while self.read() == ZERO: + self.tape.write(RIGHT) + self.step(1) + self.tape.write(BLANK) + self.step(-1) + self.step(-1) + if self.read() == LEFT: + self.step(1) + self.tape.write(ZERO) + self.step(1) + self.tape.write(RIGHT) + self.rewind() + + def multiply_small(self, constant): + """The multiplier and bounded carry belong to fixed finite control.""" + need(constant >= 2, "fixed cardinality multiplier") + carry = 0 + while self.read() != RIGHT: + total = constant*self.read()+carry + self.tape.write(total & 1) + carry = total >> 1 + self.step(1) + while carry: + self.tape.write(carry & 1) + carry >>= 1 + self.step(1) + self.tape.write(RIGHT) + self.rewind() + + def divide_small(self, constant): + self.msb() + remainder = 0 + while self.read() != LEFT: + remainder = 2*remainder+self.read() + if remainder >= constant: + self.tape.write(ONE) + remainder -= constant + else: + self.tape.write(ZERO) + self.step(-1) + self.step(1) + self.normalize() + return remainder + + def marginal(self): + """Copy with one high zero bit for the retained ADD input contract.""" + result = Natural(self) + result.msb() + result.step(1) + result.tape.write(ZERO) + result.step(1) + result.tape.write(RIGHT) + result.rewind() + return result + + def close(self): + self.tape.clear() + + +def radix_power(ring, q): + """Yield once per radix-q digit of M=q^w, without decoding w.""" + arena = ring.arena + divisor, power = arena.literal(q), arena.copy(ring.modulus) + try: + while ring.raw.compare(power, ring.one) > 0: + quotient, remainder = ring.raw.divmod(power, divisor) + need(remainder.zero() and not quotient.zero(), "cardinality prime-power context") + arena.free_many(power, remainder) + power = quotient + yield + need(ring.raw.compare(power, ring.one) == 0, "complete radix exponent") + finally: + arena.free_many(divisor, power) + + +def multiply_atom_power(value, exponent, ring, q): + count = Counter(exponent) + try: + while not count.finished: + for _ in radix_power(ring, q): + value.multiply_small(q) + count.decrement() + finally: + count.close() + + +def digit_suffix(value, ring, q): + """Multiply by q^(w-1), preserving an arbitrary spectator factor.""" + first = True + for _ in radix_power(ring, q): + if first: + first = False + else: + value.multiply_small(q) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/check_support.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/check_support.py new file mode 100644 index 0000000000..e1f961df9f --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/check_support.py @@ -0,0 +1,111 @@ +"""Checker-only native observations and source-bit provenance.""" +from contextlib import contextmanager +from records import Tape +from words import BLANK, LEFT, ONE, RIGHT, ZERO, Word, need + + +@contextmanager +def no_decode(): + previous = Word.inspect + def reject(_word): + raise ValueError("runtime numerical decoding") + Word.inspect = reject + try: + yield + finally: + Word.inspect = previous + + +def inspect_count(value): + value.rewind() + result, bit = 0, 0 + while value.read() != RIGHT: + result |= value.read() << bit + bit += 1 + value.step(1) + value.rewind() + return result + + +def bits(tape): + end = len(tape.cells) + while end > 1 and tape.cells[end-1] == BLANK: + end -= 1 + return bytes(tape.cells[1:end]) + + +def audit(arena, live=()): + need(arena.live == {word.slot for word in live}, "exact numerical ownership") + need(arena.template.head == 1, "restored numerical template") + for word in arena.words: + need(word.head == 1, "restored numerical head") + if word.slot not in arena.live: + need(word.cells[0] == LEFT and all(x == BLANK for x in word.cells[1:]), "erased numeric work") + + +def payload(length, seed=0): + tape = Tape() + for i in range(length): + tape.append(((i*7+seed*11) ^ (i >> 3) ^ (i >> 7)) & 1) + tape.rewind() + return tape + + +class Origins: + def __init__(self): + self.last, self.live, self.erased = None, set(), 0 + audit_state = self + class Control(Tape): + def __init__(self): + super().__init__() + audit_state.live.add(self) + + def clear(self): + super().clear() + need(self.head == 1 and not bits(self), "erased encoded control work") + if self in audit_state.live: + audit_state.live.remove(self) + audit_state.erased += 1 + class Tagged(Tape): + def __init__(self): + super().__init__() + self.origins = {} + audit_state.live.add(self) + + def read(self): + value = super().read() + if self.head in self.origins: + audit_state.last = self.origins[self.head] + return value + + def write(self, value): + super().write(value) + if value == BLANK: + self.origins.pop(self.head, None) + elif value in (ZERO, ONE) and audit_state.last is not None: + self.origins[self.head] = audit_state.last + + def clear(self): + super().clear() + need(self.head == 1 and not self.origins and not bits(self), "erased route scratch") + if self in audit_state.live: + audit_state.live.remove(self) + audit_state.erased += 1 + self.factory = Tagged + self.control_factory = Control + + def source(self, length): + tape = self.factory() + for i in range(length): + tape.append(((i*13) ^ (i >> 2)) & 1) + tape.origins = {i+1:i for i in range(length)} + tape.rewind() + return tape + + +def reject(function, message): + try: + function() + except ValueError: + return message + raise ValueError("missing rejection: "+message) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/children.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/children.py new file mode 100644 index 0000000000..ce4935f838 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/children.py @@ -0,0 +1,84 @@ +"""Serialized child extensions on the same raw-prefix field band.""" +from controller import Callback +from records import BLANK, FINITE_BITS, RECORD_END, ROOT, STEP, Program, append_finite, append_word +from words import need + + +def extend(incoming, request): + parent = incoming.program + index, residue = incoming.index, incoming.residue + need(request.child_kind in ("good", "pair", "unit"), "serialized child kind") + kind = {"good": 0, "pair": 1, "unit": 2}[request.child_kind] + specification = incoming.specifications[incoming.current_code] + rank = specification.template.rank + f, remainder = incoming.raw.divmod(incoming.final_size, incoming.sixty_four) + index.free(remainder) + if kind == 0: + size = incoming.raw.times_small(f, rank) + elif request.half: + need(kind == 2, "only orientation unit children halve") + size, remainder = incoming.raw.divmod(f, incoming.two_index) + index.free(remainder) + else: + size = index.copy(f) + index.free(f) + need(not size.zero() and incoming.raw.compare(request.coordinate, size) < 0, + "requested completed-child coordinate") + new_depth = incoming.plus(incoming.depth, incoming.one_index) + out = Program(index, residue, parent.code_bits) + out.tape.append(ROOT) + for word in (incoming.root_size, incoming.root_unit, new_depth): + append_word(out.tape, word) + out.tape.append(RECORD_END) + parent.tape.rewind() + while parent.tape.read() != RECORD_END: + parent.tape.step(1) + parent.tape.step(1) + while parent.tape.read() != BLANK: + out.tape.append(parent.tape.read()) + parent.tape.step(1) + parent.tape.rewind() + out.tape.append(STEP) + metadata = (kind, incoming.current_code, rank, request.field, int(request.reverse), int(request.half)) + for position, value in enumerate(metadata): + append_finite(out.tape, value, parent.code_bits if position == 1 else FINITE_BITS) + append_word(out.tape, incoming.final_size) + append_word(out.tape, size) + out.tape.append(RECORD_END) + out.tape.rewind() + index.free_many(size, new_depth) + return out + + +def coefficient(ring, index, program, fields, specifications, current_code, request): + """Evaluate an actual appended leaf program; no fresh current field exists.""" + parent, leaf, extended = None, None, None + protected_residues, protected_indices = frozenset(ring.arena.live), frozenset(index.live) + try: + parent = Callback(ring, index, program, fields, specifications, current_code, allow_fallback=True) + extended = extend(parent, request) + leaf = Callback(ring, index, extended, fields, specifications, current_code, + allow_fallback=True, leaf=True) + value = leaf.weight(request.coordinate) + if request.negative_inverse: + inverse = ring.inverse(value) + need(inverse is not None, "serialized child weight unit") + opposite = ring.negate(inverse) + ring.arena.free_many(value, inverse) + value = opposite + leaf.close() + parent.close() + extended.tape.clear() + return value + except ValueError: + if leaf is not None: + leaf.abort() + if parent is not None: + parent.abort() + if extended is not None: + extended.tape.clear() + ring.arena.rollback(protected_residues) + index.rollback(protected_indices) + program.tape.rewind() + fields.tape.rewind() + raise diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/controller.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/controller.py new file mode 100644 index 0000000000..c631a9e77f --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/controller.py @@ -0,0 +1,305 @@ +"""Encoded selected coefficient/offset callback, including descriptor indices. + +Runtime residues, extents, coordinates and generation levels remain words. +Only finite operation/source/rank/row labels enter native control. The loop +refines the retained PR2310/2332 grammar and PR2405 raw-prefix interface. +""" +from matrices import Matrices +from records import BLANK, CONSTANT, MULTIPLY, PAIR, RETURN, VALUE, Stack, seek_record +from words import LEFT, ONE, RIGHT, ZERO, Unsigned, need + +GOOD_KIND, PAIR_KIND, UNIT_KIND = range(3) + + +def finite_word(word, limit): + """Decode only a provably finite row/pivot label, not a variable index.""" + need(0 < limit <= 128, "finite row-label range") + word.msb() + state = 0 + while word.read() != LEFT: + bit = word.read() + need(bit in (ZERO, ONE), "finite-selector bit") + state = (state << 1) | bit + need(state < limit, "finite-selector extent") + word.step(-1) + word.step(1) + return state + + +class Callback: + def __init__(self, ring, index_arena, program, fields, specifications, current_code, + allow_fallback=False, leaf=False): + self.ring, self.residue = ring, ring.arena + self.index, self.raw = index_arena, Unsigned(index_arena) + self.program, self.fields, self.specifications = program, fields, specifications + self.current_code = current_code + self.leaf = leaf + self.protected_residues, self.protected_indices = frozenset(self.residue.live), frozenset(self.index.live) + need(current_code in specifications and (allow_fallback or specifications[current_code].good), + "selected good current site") + need(program.code_bits == fields.code_bits and + all(code == spec.code and 0 <= code < 1 << program.code_bits for code, spec in specifications.items()), + "one compiled source-code vocabulary") + self.q = specifications[current_code].template.q + need(all(spec.template.q == self.q for spec in specifications.values()), "one fixed source prime") + self.index.template.rewind() + large_enough = True + for _ in range(8): + if self.index.template.read() == RIGHT: + large_enough = False + break + self.index.template.step(1) + self.index.template.rewind() + need(large_enough, "internal-site index context has eight bits") + self.one_index, self.sixty_four = self.index.literal(1), self.index.literal(64) + self.two_index = self.index.literal(2) + self.matrices = Matrices(ring) + self.pending, self.values = Stack(index_arena, self.residue), Stack(index_arena, self.residue) + self.prepared_codes = set() # Bounded finite-vocabulary checker observation. + try: + self._prime_power_context() + self._validate_program() + except ValueError: + self.abort() + raise + + def plus(self, a, b): + value, carry = self.raw.add(a, b) + need(not carry, "binary index margin") + return value + + def _prime_power_context(self): + qword = self.residue.literal(self.q) # Fixed machine prime, not a runtime residue. + self.high_cap, remainder = self.ring.raw.divmod(self.ring.modulus, qword) + need(remainder.zero() and not self.high_cap.zero(), "positive prime-power field cap") + self.residue.free(remainder) + test = self.residue.copy(self.high_cap) + while self.ring.raw.compare(test, self.ring.one) > 0: + quotient, remainder = self.ring.raw.divmod(test, qword) + need(remainder.zero(), "modulus is a power of the fixed prime") + self.residue.free_many(test, remainder) + test = quotient + need(self.ring.raw.compare(test, self.ring.one) == 0, "complete prime-power reduction") + self.residue.free_many(test, qword) + + def step(self, level): + metadata, parent, child = self.program.step(level) + kind, code, rank, field, reverse, half = metadata + need(kind in (GOOD_KIND, PAIR_KIND, UNIT_KIND) and code in self.specifications, + "selected finite step/source") + spec = self.specifications[code] + need(rank == spec.template.rank and 1 <= rank <= 42, "actual selected rank") + need((kind == GOOD_KIND) == spec.good, "actual low-class branch") + need(reverse in (0, 1) and half in (0, 1), "finite step flags") + need(kind == UNIT_KIND or not half, "halving only at unit reset") + need((kind == PAIR_KIND and field < 127 and reverse == (field >= 64)) or + (kind != PAIR_KIND and field == 0 and reverse == 0), "physical pair field and reversal") + f, remainder = self.raw.divmod(parent, self.sixty_four) + self.index.free(remainder) + need(not f.zero(), "internal parent extent") + if kind == GOOD_KIND: + expected = self.raw.times_small(f, rank) + elif half: + expected, remainder = self.raw.divmod(f, self.two_index) + self.index.free(remainder) + else: + expected = self.index.copy(f) + need(not child.zero() and self.raw.compare(child, expected) == 0 and self.raw.compare(child, parent) < 0, + "exact proper generated child extent") + self.index.free(expected) + return metadata, parent, child, f + + def _validate_program(self): + self.root_size, self.root_unit, self.depth = self.program.root() + self.root_size.msb() + top = self.root_size.read() + self.root_size.step(-1) + significant = self.root_size.read() + self.root_size.rewind() + need(top == ZERO and significant == ONE, "canonical root-index word extent") + need(self.raw.compare(self.root_size, self.sixty_four) >= 0, "selected internal root") + need(self.ring.raw.compare(self.root_unit, self.ring.modulus) < 0, "canonical root unit") + inv = self.ring.inverse(self.root_unit) + need(inv is not None, "root coefficient unit") + self.residue.free(inv) + current, count = self.index.copy(self.root_size), self.index.zero() + while self.raw.compare(count, self.depth) < 0: + level = self.plus(count, self.one_index) + metadata, parent, child, f = self.step(level) + need(self.raw.compare(parent, current) == 0, "chronological program extents") + self.fields.check_code(count, metadata[1]) + self.index.free_many(parent, f, current, count) + current, count = child, level + self.index.free(count) + self.final_size = current + after = self.plus(self.depth, self.one_index) + seek_record(self.program.tape, after) + need(self.program.tape.read() == BLANK, "exact program depth") + self.program.tape.rewind() + if self.leaf: + self.fields.end(self.depth) + else: + self.fields.check_code(self.depth, self.current_code) + self.fields.end(after) + self.index.free(after) + + def prepare(self, slot, code, scope): + high = self.fields.read(slot, code, scope) + for row in high: + for digit in row: + need(self.ring.raw.compare(digit, self.high_cap) < 0, "canonical high digit") + spec = self.specifications[code] + p = self.matrices.prepare(spec.low, high, self.q, spec.template.preparation, spec.template.rank) + self.matrices.free(high) + # Only the checker consumes this finite source-code trace. + self.prepared_codes.add(code) + return p + + def weight(self, index): + need(self.raw.compare(index, self.final_size) < 0, "requested generated coordinate") + need(self.pending.empty() and self.values.empty(), "empty binary continuation roles") + self.pending.push(VALUE, self.depth, index) + while not self.pending.empty(): + tag, operands = self.pending.pop() + if tag == CONSTANT: + coefficient, = operands + self.values.push(RETURN, coefficient) + self.residue.free(coefficient) + elif tag == MULTIPLY: + coefficient, = operands + value_tag, values = self.values.pop() + need(value_tag == RETURN, "value-stack tag") + value, = values + result = self.ring.multiply(value, coefficient) + self.values.push(RETURN, result) + self.residue.free_many(coefficient, value, result) + elif tag == PAIR: + coefficient, = operands + den_tag, den_values = self.values.pop() + num_tag, num_values = self.values.pop() + need(den_tag == num_tag == RETURN, "ordered pair value tags") + denominator, = den_values + numerator, = num_values + inv = self.ring.inverse(denominator) + need(inv is not None, "generated pair denominator unit") + product = self.ring.multiply(coefficient, numerator) + result = self.ring.multiply(product, inv) + self.values.push(RETURN, result) + self.residue.free_many(coefficient, denominator, numerator, inv, product, result) + else: + need(tag == VALUE, "pending value request") + level, coordinate = operands + if level.zero(): + need(self.raw.compare(coordinate, self.root_size) < 0, "root coordinate extent") + self.values.push(RETURN, self.root_unit) + self.index.free_many(level, coordinate) + continue + metadata, parent, child, f = self.step(level) + kind, code, rank, field, reverse, _half = metadata + need(self.raw.compare(coordinate, child) < 0, "recursive coordinate extent") + if kind == UNIT_KIND: + self.values.push(RETURN, self.ring.one) + else: + slot = self.raw.subtract_exact(level, self.one_index) + p = self.prepare(slot, code, self.depth) + if kind == GOOD_KIND: + pivots = self.matrices.good_pivots(p, rank) + self.matrices.free(p) + quotient, remainder = self.raw.divmod(coordinate, f) + pivot = finite_word(quotient, rank) + self.pending.push(MULTIPLY, pivots[pivot]) + self.pending.push(VALUE, slot, coordinate) + self.residue.free_many(*pivots) + self.index.free_many(quotient, remainder) + else: + diagonal, permutation = self.matrices.fallback(p) + self.matrices.free(p) + self.pending.push(PAIR, diagonal[field]) + if reverse: + last = self.raw.subtract_exact(f, self.one_index) + column = self.raw.subtract_exact(last, coordinate) + self.index.free(last) + else: + column = self.index.copy(coordinate) + for row in (field, permutation[field]): + if row < 64: + first = self.raw.times_small(f, row) + position = self.plus(first, column) + self.pending.push(VALUE, slot, position) + self.index.free_many(first, position) + else: + self.pending.push(CONSTANT, self.ring.one) + self.residue.free_many(*diagonal) + self.index.free(column) + self.index.free(slot) + self.index.free_many(level, coordinate, parent, child, f) + tag, values = self.values.pop() + need(tag == RETURN and self.pending.empty() and self.values.empty(), "closed generated evaluation") + result, = values + return result + + def coefficient(self, target_row, column, inverse=False): + need(not self.leaf, "internal coefficient requires a current field") + need(0 < target_row < 64 and isinstance(target_row, int), "fixed head target row") + f, remainder = self.raw.divmod(self.final_size, self.sixty_four) + self.index.free(remainder) + need(not f.zero() and self.raw.compare(column, f) < 0, "current selected column") + scope = self.plus(self.depth, self.one_index) + p = self.prepare(self.depth, self.current_code, scope) + self.index.free(scope) + pinv = self.ring.inverse(p[0][0]) + need(pinv is not None, "selected good head pivot") + ratio = self.ring.multiply(p[target_row][0], pinv) + ell = self.ring.negate(ratio) + self.residue.free_many(pinv, ratio) + self.matrices.free(p) + base = self.raw.times_small(f, target_row) + index = self.plus(base, column) + self.index.free_many(base, f) + numerator, denominator = self.weight(index), self.weight(column) + self.index.free(index) + ainv = self.ring.inverse(denominator) + need(ainv is not None, "incoming head coefficient unit") + product = self.ring.multiply(ell, numerator) + coefficient = self.ring.multiply(product, ainv) + self.residue.free_many(ell, numerator, denominator, ainv, product) + if inverse: + opposite = self.ring.negate(coefficient) + self.residue.free(coefficient) + coefficient = opposite + return coefficient + + def offset(self, target_row, column, source, inverse=False): + need(self.ring.raw.compare(source, self.ring.modulus) < 0, "canonical source atom") + coefficient = self.coefficient(target_row, column, inverse) + result = self.ring.multiply(coefficient, source) + self.residue.free(coefficient) + return result + + def close(self): + need(self.pending.empty() and self.values.empty(), "closed continuation interface") + self.index.free_many(self.root_size, self.depth, self.final_size, + self.one_index, self.sixty_four, self.two_index) + self.residue.free_many(self.root_unit, self.high_cap) + + def abort(self): + self.residue.rollback(self.protected_residues) + self.index.rollback(self.protected_indices) + self.program.tape.rewind() + self.fields.tape.rewind() + for stack in (self.pending, self.values): + stack.tape.clear() + stack.reverse.clear() + + +def selected_offset(ring, index_arena, program, fields, specifications, current_code, + target_row, column, source, inverse=False): + callback = Callback(ring, index_arena, program, fields, specifications, current_code) + try: + result = callback.offset(target_row, column, source, inverse) + prepared = tuple(sorted(callback.prepared_codes)) + callback.close() + return result, prepared + except ValueError: + callback.abort() + raise diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/counts.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/counts.py new file mode 100644 index 0000000000..81b48940ce --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/counts.py @@ -0,0 +1,57 @@ +"""Unbounded cardinalities; only compiled finite constants enter host control.""" +from cardinality import Natural, digit_suffix +from records import Tape +from words import ONE, RIGHT, ZERO, need + + +class Count(Natural): + @classmethod + def literal(cls, value): + """Compile a fixed cardinality, never decode a runtime operand.""" + need(isinstance(value, int) and value >= 0, "compiled cardinality") + tape = Tape() + for bit in range(max(1, value.bit_length())): + tape.append((value >> bit) & 1) + tape.append(RIGHT) + tape.rewind() + result = cls(tape) + tape.clear() + return result + + def increment(self): + self.rewind() + while self.read() == ONE: + self.tape.write(ZERO) + self.step(1) + if self.read() == RIGHT: + self.tape.write(ONE) + self.step(1) + self.tape.write(RIGHT) + else: + need(self.read() == ZERO, "canonical count digit") + self.tape.write(ONE) + self.rewind() + + def equals(self, other): + self.rewind() + other.rewind() + same = True + while self.read() != RIGHT and other.read() != RIGHT: + same = same and self.read() == other.read() + self.step(1) + other.step(1) + same = same and self.read() == other.read() == RIGHT + self.rewind() + other.rewind() + return same + + +def high_power(value, ring, q, dimension): + for _ in range(dimension*dimension): + digit_suffix(value, ring, q) + + +def high_count(ring, q, dimension): + result = Count.literal(1) + high_power(result, ring, q, dimension) + return result diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/directory.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/directory.py new file mode 100644 index 0000000000..c74cacf5ce --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/directory.py @@ -0,0 +1,126 @@ +"""Produce all high fields while preserving physical old-prefix multiplicity.""" +from cardinality import radix_power +from counts import Count, high_count, high_power +from records import RECORD_END, Tape, append_finite, append_word, read_finite, read_word +from stream import Counter +from words import BLANK, RIGHT, ZERO, need + + +class Context: + def __init__(self, ring, vocabulary): + self.ring, self.arena, self.raw = ring, ring.arena, ring.raw + self.codes = vocabulary + self.q, self.dimension = vocabulary.q, vocabulary.dimension + for _ in radix_power(ring, self.q): + pass + divisor = self.arena.literal(self.q) + self.cap, remainder = self.raw.divmod(ring.modulus, divisor) + need(remainder.zero() and not self.cap.zero(), "positive high-field radix") + self.arena.free_many(divisor, remainder) + self.highs = high_count(ring, self.q, self.dimension) + + def close(self): + self.arena.free(self.cap) + self.highs.close() + + +class Odometer: + def __init__(self, context): + self.context = context + self.digits = [[context.arena.zero() for _ in range(context.dimension)] + for _ in range(context.dimension)] + self.finished = False + + def advance(self): + need(not self.finished, "live high odometer") + context = self.context + for row in reversed(self.digits): + for digit in reversed(row): + context.raw.increment_in_place(digit) + if context.raw.compare(digit, context.cap) < 0: + return + need(context.raw.compare(digit, context.cap) == 0, "high digit carry") + while digit.read() != RIGHT: + digit.write(ZERO) + digit.step(1) + digit.rewind() + self.finished = True + + def close(self): + for row in self.digits: + self.context.arena.free_many(*row) + + +def append_tape(source, destination): + source.rewind() + while source.read() != BLANK: + destination.append(source.read()) + source.step(1) + source.rewind() + + +def old_prefix(source, field_count, context): + """Retain one serialized prefix; decode at most one old numerical word.""" + output, remaining = Tape(), Counter(field_count) + try: + while not remaining.finished: + code = read_finite(source, context.codes.bits) + need(code < context.codes.limit, "old compiled source code") + append_finite(output, code, context.codes.bits) + for _ in range(context.dimension*context.dimension): + word = read_word(source, context.arena) + try: + need(context.raw.compare(word, context.cap) < 0, "old high digit range") + append_word(output, word) + finally: + context.arena.free(word) + need(source.read() == RECORD_END, "old field boundary") + source.step(1) + output.append(RECORD_END) + remaining.decrement() + output.rewind() + return output + except ValueError: + output.clear() + raise + finally: + remaining.close() + + +def produce(old, old_fields, old_count, code, context): + need(0 <= code < context.codes.limit, "new compiled source code") + expected, emitted = Count(old_count), Count.literal(0) + high_power(expected, context.ring, context.q, context.dimension) + outer, output = Counter(old_count), Tape() + old.rewind() + try: + need(not outer.finished, "nonempty old physical prefix domain") + while not outer.finished: + saved = old_prefix(old, old_fields, context) + high = Odometer(context) + try: + while not high.finished: + append_tape(saved, output) + append_finite(output, code, context.codes.bits) + for row in high.digits: + for digit in row: + append_word(output, digit) + output.append(RECORD_END) + emitted.increment() + high.advance() + finally: + saved.clear() + high.close() + outer.decrement() + need(old.read() == BLANK and emitted.equals(expected), "complete canonical raw directory") + old.rewind() + output.rewind() + return output, expected + except ValueError: + output.clear() + expected.close() + old.rewind() + raise + finally: + emitted.close() + outer.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/episode.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/episode.py new file mode 100644 index 0000000000..30d11ff4f3 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/episode.py @@ -0,0 +1,124 @@ +"""Transported COPY/XOR/ERASE on staged complete packets and physical families.""" +from counts import Count +from directory import produce +from records import Tape +from routes import copy_rows, route_packet +from selection import gather, scatter +from stream import Counter +from words import BLANK, ONE, ZERO, need + + +def xor_packet(source, target, context, old_count, fibre, factory=Tape): + output, outer = factory(), Counter(old_count) + source.rewind() + target.rewind() + try: + while not outer.finished: + highs = Counter(context.highs) + while not highs.finished: + bits = Counter(fibre) + while not bits.finished: + left, right = source.read(), target.read() + need(left in (ZERO, ONE) and right in (ZERO, ONE), "aligned Boolean operands") + output.append(left ^ right) + source.step(1) + target.step(1) + bits.decrement() + bits.close() + highs.decrement() + highs.close() + outer.decrement() + need(source.read() == target.read() == BLANK, "complete aligned XOR") + output.rewind() + return output + except ValueError: + output.clear() + raise + finally: + outer.close() + source.rewind() + target.rewind() + + +def staged(source, targets, episode, context, old_count, fibre, residual, factory=Tape): + """Call the concrete residual once, then retain its transported ERASE guard.""" + need(tuple(targets) == episode.targets and len({id(tape) for tape in targets.values()}) == len(targets) + and all(tape is not source for tape in targets.values()), "distinct staged live roles") + need(len(episode.records) == len(episode.targets)+2 and + episode.records[0][:3] == (2,episode.source,episode.private) and + episode.records[-1][:3] == (3,episode.source,episode.private) and + episode.records[0][3:5] == episode.records[-1][3:5] and + all(record[0] == 1 and record[1] == target and record[2] == episode.private + and record[3] in (-1,1) and target != episode.source + for target, record in zip(episode.targets, episode.records[1:-1])), + "closed source-preserving COPY interval") + initial, outer = factory(), Counter(old_count) + source.rewind() + while not outer.finished: + copy_rows(source, initial, context.highs, fibre) + outer.decrement() + outer.close() + need(source.read() == BLANK, "complete staged COPY source") + source.rewind() + initial.rewind() + private, result = None, {} + try: + private = residual(initial) + need(private is not initial and private is not source and + all(private is not value for value in targets.values()), "owned transported private result") + for target in episode.targets: + result[target] = xor_packet(private, targets[target], context, old_count, fibre, factory) + # Only reads of private and source occur after the completed transport. + # The authenticated literal word therefore supplies the transported + # equality guard; comparison with untransported source would be wrong. + need(source.head == private.head == 1, "transported source lifetime closes at ERASE") + return result + except ValueError: + for value in result.values(): + value.clear() + raise + finally: + if private is not None and private is not initial and private is not source: + private.clear() + initial.clear() + + +def physical(families, episode, source_route, common_code, context, old_directory, + old_fields, old_count, fibre, residual, factory=Tape): + """Gather, route, produce fields, execute, scatter and erase local work. + + residual(source, directory, prefix_count) must execute the completed + common-view residual and preserve its inputs. The verifier supplies the + actual PR2501 packet interpreter, including its leaf expansion. + """ + request, common, low = context.codes.decode(common_code) + need(common and request == episode.request and low == source_route.target_low + and source_route.chart == episode.chart, "current common-view source binding") + source = gather(families[episode.source_family], context, old_count, source_route.low, fibre, factory) + common_source = directory = prefixes = changed = None + targets, result = {}, {} + try: + common_source = route_packet(source, source_route, context, old_count, fibre, factory) + for role, family in zip(episode.targets, episode.target_families): + targets[role] = gather(families[family], context, old_count, low, fibre, factory) + directory, prefixes = produce(old_directory, old_fields, old_count, common_code, context) + changed = staged(common_source, targets, episode, context, old_count, fibre, + lambda value: residual(value, directory, prefixes), factory) + for role, family in zip(episode.targets, episode.target_families): + result[family] = scatter(families[family], changed[role], context, old_count, low, fibre, factory) + return result + except ValueError: + for value in result.values(): + value.clear() + raise + finally: + source.clear() + if common_source is not None: + common_source.clear() + for collection in (targets, changed or {}): + for value in collection.values(): + value.clear() + if directory is not None: + directory.clear() + if prefixes is not None: + prefixes.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/forms.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/forms.py new file mode 100644 index 0000000000..6667c0b772 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/forms.py @@ -0,0 +1,182 @@ +"""Complete selected adapter preparations with binary scalar operands. + +The fixed matrix and reduction indices are finite control. All coefficients +remain Word objects. Algebra follows source527 and PR2159/2160/2188/2234. +""" +from dataclasses import dataclass + +from matrices import Matrices +from words import need + + +@dataclass +class GoodForm: + dimension: int + rank: int + pivots: tuple + rows: tuple + columns: tuple + cross: list + + def close(self, ring): + ring.arena.free_many(*self.pivots) + for _, _, value in self.rows + self.columns: + ring.arena.free(value) + Matrices(ring).free(self.cross) + + +@dataclass +class Reduction: + kind: str + target: int + source: int + scalar: object + permutation: tuple + + +@dataclass +class FallbackForm: + dimension: int + diagonal: tuple + permutation: tuple + reductions: tuple + negative_sign: bool + + def close(self, ring): + ring.arena.free_many(*self.diagonal) + for reduction in self.reductions: + if reduction.scalar is not None: + ring.arena.free(reduction.scalar) + + +def row_add(matrix, target, source, coefficient, ring): + if coefficient.zero(): + return + for j in range(len(matrix[0])): + product = ring.multiply(coefficient, matrix[source][j]) + result = ring.add(matrix[target][j], product) + ring.arena.free_many(matrix[target][j], product) + matrix[target][j] = result + + +def column_add(matrix, target, source, coefficient, ring): + if coefficient.zero(): + return + for row in matrix: + product = ring.multiply(coefficient, row[source]) + result = ring.add(row[target], product) + ring.arena.free_many(row[target], product) + row[target] = result + + +def negative_product(a, b, ring): + value = ring.multiply(a, b) + result = ring.negate(value) + ring.arena.free(value) + return result + + +def good_form(projector, rank, ring): + """Keep chronological row/column scalars and the full cross block.""" + m = len(projector) + need(1 <= rank < m <= 64, "fixed good preparation dimension") + matrices, arena = Matrices(ring), ring.arena + a = [[arena.copy(value) for value in reversed(row)] for row in projector] + left, right = matrices.identity(m), matrices.identity(m) + pivots, rows, columns = [], [], [] + for k in range(rank): + column = m-1-k + pivot = arena.copy(a[k][column]) + inverse = ring.inverse(pivot) + need(inverse is not None, "complete good class") + pivots.append(pivot) + for i in range(k+1, m): + coefficient = negative_product(a[i][column], inverse, ring) + rows.append((i, k, coefficient)) + row_add(a, i, k, coefficient, ring) + row_add(left, i, k, coefficient, ring) + for j in range(column): + coefficient = negative_product(a[k][j], inverse, ring) + columns.append((column, j, coefficient)) + column_add(a, j, column, coefficient, ring) + column_add(right, j, column, coefficient, ring) + arena.free(inverse) + for i in range(m): + for j in range(m): + need(ring.raw.compare(a[i][j], pivots[i]) == 0 if i < rank and j == m-1-i + else a[i][j].zero(), "complete northeast diagonal endpoint") + matrices.free(a) + li, ri = matrices.inverse(left), matrices.inverse(right) + lp = matrices.multiply(left, projector) + a0 = matrices.multiply(lp[:rank], li) + b = matrices.multiply(ri, [row[:rank] for row in reversed(li)]) + for matrix in (a0, b): + for row in matrix: + for j, value in enumerate(row): + row[j] = ring.negate(value) + arena.free(value) + cross = matrices.zero(m, m) + for k, pivot in enumerate(pivots): + inverse = ring.inverse(pivot) + need(inverse is not None, "good pivot remains a unit") + for i in range(m): + value = ring.negate(b[i][k]) + if i == m-1-k: + adjusted = ring.subtract(value, inverse) + arena.free(value) + value = adjusted + arena.free(cross[i][k]) + cross[i][k] = value + for j in range(rank, m): + value = ring.multiply(inverse, a0[k][j]) + arena.free(cross[m-1-k][j]) + cross[m-1-k][j] = value + arena.free(inverse) + for matrix in (left, right, li, ri, lp, a0, b): + matrices.free(matrix) + return GoodForm(m, rank, tuple(pivots), tuple(rows), tuple(columns), cross) + + +def fallback_form(projector, ring): + """Retain each shear's original pair and pre-operation permutation.""" + matrices, arena = Matrices(ring), ring.arena + rows = matrices.residual(projector) + size = len(rows) + permutation, reductions = list(range(size)), [] + for j in range(size): + inverse = None + for pivot in range(j, size): + inverse = ring.inverse(rows[pivot][j]) + if inverse is not None: + break + need(inverse is not None, "complete fallback unit pivot") + if pivot != j: + reductions.append(Reduction("swap", j, pivot, None, tuple(permutation))) + rows[j], rows[pivot] = rows[pivot], rows[j] + permutation[j], permutation[pivot] = permutation[pivot], permutation[j] + for i in range(size): + if i == j: + continue + coefficient = negative_product(rows[i][j], inverse, ring) + reductions.append(Reduction("shear", i, j, coefficient, tuple(permutation))) + row_add(rows, i, j, coefficient, ring) + arena.free(inverse) + diagonal = [] + determinant = arena.copy(ring.one) + for i in range(size): + for j in range(size): + if i == j: + diagonal.append(rows[i][j]) + value = ring.multiply(determinant, rows[i][j]) + arena.free(determinant) + determinant = value + else: + need(rows[i][j].zero(), "complete fallback diagonal endpoint") + arena.free(rows[i][j]) + negative_one = ring.negate(ring.one) + positive = ring.raw.compare(determinant, ring.one) == 0 + negative = ring.raw.compare(determinant, negative_one) == 0 + need(positive or negative, "fallback terminal determinant sign") + arena.free_many(determinant, negative_one) + return FallbackForm(len(projector), tuple(diagonal), tuple(permutation), + tuple(reductions), not positive) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/low_codes.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/low_codes.py new file mode 100644 index 0000000000..737edfc4a1 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/low_codes.py @@ -0,0 +1,109 @@ +"""Fixed-q compilation of lexicographic GL codes, independent of input width.""" +from math import prod +from words import need + + +class Constraints: + def __init__(self, rows, q): + self.rows, self.q = rows, q + self.basis, self.inconsistent = [], False + + def next(self, column): + coefficients = [row[column] for row in self.rows] + rhs = 0 + for pivot, row, value in self.basis: + factor = coefficients[pivot] + coefficients = [(a-factor*b) % self.q for a, b in zip(coefficients, row)] + rhs = (rhs+factor*value) % self.q + pivot = next((i for i, x in enumerate(coefficients) if x), None) + return coefficients, rhs, pivot + + def excluded(self, reduced, value): + if self.inconsistent: + return 0 + _row, rhs, pivot = reduced + if pivot is not None: + return self.q**(len(self.rows)-len(self.basis)-1) + return self.q**(len(self.rows)-len(self.basis)) if value == rhs else 0 + + def choose(self, reduced, value): + if self.inconsistent: + return + row, rhs, pivot = reduced + if pivot is None: + self.inconsistent = value != rhs + return + inverse = pow(row[pivot], -1, self.q) + normalized = tuple(x*inverse % self.q for x in row) + self.basis.append((pivot, normalized, (value-rhs)*inverse % self.q)) + self.basis.sort(key=lambda item: item[0]) + + +class LowCodes: + def __init__(self, q, dimension, requests=1): + need(q >= 3 and all(q % p for p in range(2, q)) and + 1 <= dimension <= 64 and requests > 0, "fixed prime and source vocabulary") + self.q, self.dimension, self.requests = q, dimension, requests + self.radices = tuple(q**dimension-q**k for k in range(dimension)) + self.size = prod(self.radices) + self.limit = 2*requests*self.size + self.bits = max(1, (self.limit-1).bit_length()) + + def vector_rank(self, rows, vector): + constraints, rank = Constraints(rows, self.q), 0 + for column, value in enumerate(vector): + reduced = constraints.next(column) + total = self.q**(self.dimension-column-1) + for smaller in range(value): + rank += total-constraints.excluded(reduced, smaller) + constraints.choose(reduced, value) + need(constraints.inconsistent, "independent low row") + return rank + + def vector_unrank(self, rows, rank): + constraints, vector = Constraints(rows, self.q), [] + for column in range(self.dimension): + reduced = constraints.next(column) + total = self.q**(self.dimension-column-1) + for value in range(self.q): + count = total-constraints.excluded(reduced, value) + if rank < count: + vector.append(value) + constraints.choose(reduced, value) + break + rank -= count + else: + raise ValueError("low-row rank range") + need(rank == 0 and constraints.inconsistent, "complete independent low row") + return tuple(vector) + + def rank(self, matrix): + need(len(matrix) == self.dimension and + all(len(row) == self.dimension and all(isinstance(x, int) and 0 <= x < self.q + for x in row) for row in matrix), + "fixed low matrix shape and residues") + rank, previous = 0, [] + for row, radix in zip(matrix, self.radices): + rank = rank*radix+self.vector_rank(previous, row) + previous.append(tuple(row)) + return rank + + def unrank(self, rank): + need(isinstance(rank, int) and 0 <= rank < self.size, "GL low ordinal") + digits = [] + for radix in reversed(self.radices): + rank, digit = divmod(rank, radix) + digits.append(digit) + rows = [] + for digit in reversed(digits): + rows.append(self.vector_unrank(rows, digit)) + return tuple(rows) + + def encode(self, request, common, matrix): + need(0 <= request < self.requests and common in (False, True), "fixed request/view tag") + return (2*request+int(common))*self.size+self.rank(matrix) + + def decode(self, code): + need(isinstance(code, int) and 0 <= code < self.limit, "complete compiled source code") + tag, ordinal = divmod(code, self.size) + return tag//2, bool(tag & 1), self.unrank(ordinal) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/matrices.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/matrices.py new file mode 100644 index 0000000000..5d497353ef --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/matrices.py @@ -0,0 +1,217 @@ +"""Fixed-dimensional preparations whose entries are binary word tapes. + +Matrix positions and row permutations range over the fixed 64/128-dimensional +control alphabet. Runtime entries never become Python integers. The algebra +adapts the retained source527/PR2160/2159/2234 normal forms. +""" +from words import need + + +class Matrices: + def __init__(self, ring): + self.ring, self.arena = ring, ring.arena + + def zero(self, rows, columns): + need(0 < rows <= 128 and 0 < columns <= 256, "fixed matrix dimensions") + return [[self.arena.zero() for _ in range(columns)] for _ in range(rows)] + + def free(self, matrix): + for row in matrix: + for value in row: + self.arena.free(value) + + def copy(self, matrix): + return [[self.arena.copy(value) for value in row] for row in matrix] + + def identity(self, size): + out = self.zero(size, size) + for i in range(size): + self.arena.free(out[i][i]) + out[i][i] = self.arena.copy(self.ring.one) + return out + + def constants(self, matrix): + """Compile a fixed rational source matrix; inverses use the word machine.""" + palette = {} + for row in matrix: + for constant in row: + if constant in palette: + continue + numerator = self.ring.literal(constant.numerator) + denominator = self.ring.literal(constant.denominator) + inv = self.ring.inverse(denominator) + need(inv is not None, "source denominator is a unit") + palette[constant] = self.ring.multiply(numerator, inv) + self.arena.free_many(numerator, denominator, inv) + out = [[self.arena.copy(palette[constant]) for constant in row] for row in matrix] + for value in palette.values(): + self.arena.free(value) + return out + + def multiply(self, a, b): + rows, inner, columns = len(a), len(b), len(b[0]) + need(all(len(row) == inner for row in a) and all(len(row) == columns for row in b), + "matrix product shape") + out = self.zero(rows, columns) + for i in range(rows): + for k in range(inner): + if a[i][k].zero(): + continue + for j in range(columns): + if b[k][j].zero(): + continue + product = self.ring.multiply(a[i][k], b[k][j]) + total = self.ring.add(out[i][j], product) + self.arena.free_many(out[i][j], product) + out[i][j] = total + return out + + def inverse(self, matrix): + size = len(matrix) + need(size <= 128 and all(len(row) == size for row in matrix), "fixed square matrix") + identity = self.identity(size) + rows = [[self.arena.copy(value) for value in row] + unit + for row, unit in zip(matrix, identity)] + for j in range(size): + pinv = None + for pivot in range(j, size): + pinv = self.ring.inverse(rows[pivot][j]) + if pinv is not None: + break + need(pinv is not None, "matrix unit pivot") + rows[j], rows[pivot] = rows[pivot], rows[j] + for k in range(2*size): + value = self.ring.multiply(pinv, rows[j][k]) + self.arena.free(rows[j][k]) + rows[j][k] = value + self.arena.free(pinv) + for i in range(size): + if i == j or rows[i][j].zero(): + continue + coefficient = self.arena.copy(rows[i][j]) + for k in range(2*size): + product = self.ring.multiply(coefficient, rows[j][k]) + value = self.ring.subtract(rows[i][k], product) + self.arena.free_many(rows[i][k], product) + rows[i][k] = value + self.arena.free(coefficient) + for i in range(size): + for j in range(size): + need(self.ring.raw.compare(rows[i][j], self.ring.one) == 0 if i == j else rows[i][j].zero(), + "binary matrix inverse endpoint") + self.arena.free(rows[i][j]) + return [row[size:] for row in rows] + + def projector(self, header, rank): + need(0 < rank < len(header), "proper projector rank") + inv = self.inverse(header) + out = self.multiply([row[:rank] for row in header], inv[:rank]) + self.free(inv) + return out + + def good_pivots(self, projector, rank): + rows = self.copy(projector) + size, pivots = len(rows), [] + for k in range(rank): + inv = self.ring.inverse(rows[k][k]) + need(inv is not None, "binary nongeneric good class") + pivots.append(self.arena.copy(rows[k][k])) + for i in range(k+1, size): + if rows[i][k].zero(): + continue + coefficient = self.ring.multiply(rows[i][k], inv) + for j in range(size): + product = self.ring.multiply(coefficient, rows[k][j]) + value = self.ring.subtract(rows[i][j], product) + self.arena.free_many(rows[i][j], product) + rows[i][j] = value + self.arena.free(coefficient) + self.arena.free(inv) + # Rank-r split projectors with these pivots have zero residual block. + for i in range(rank, size): + for j in range(rank, size): + need(rows[i][j].zero(), "binary full-ring Schur block") + self.free(rows) + return pivots + + def residual(self, p): + size = len(p) + need(size <= 64, "selected residual dimension") + out = self.zero(2*size, 2*size) + for i in range(size): + for j in range(size): + if i == j: + complement = self.ring.subtract(self.ring.one, p[i][j]) + else: + complement = self.ring.negate(p[i][j]) + for row, column, value in ( + (i, j, complement), + (2*size-1-i, 2*size-1-j, self.arena.copy(complement)), + (i, 2*size-1-j, self.arena.copy(p[i][j])), + (2*size-1-i, j, self.arena.copy(p[i][j])), + ): + self.arena.free(out[row][column]) + out[row][column] = value + return out + + def fallback(self, projector): + rows = self.residual(projector) + size = len(rows) + permutation = list(range(size)) # Fixed finite row-label control. + for j in range(size): + inv = None + for pivot in range(j, size): + inv = self.ring.inverse(rows[pivot][j]) + if inv is not None: + break + need(inv is not None, "binary fallback unit pivot") + rows[j], rows[pivot] = rows[pivot], rows[j] + permutation[j], permutation[pivot] = permutation[pivot], permutation[j] + for i in range(size): + if i == j or rows[i][j].zero(): + continue + coefficient = self.ring.multiply(rows[i][j], inv) + for k in range(size): + product = self.ring.multiply(coefficient, rows[j][k]) + value = self.ring.subtract(rows[i][k], product) + self.arena.free_many(rows[i][k], product) + rows[i][k] = value + self.arena.free(coefficient) + self.arena.free(inv) + diagonal = [] + for i in range(size): + for j in range(size): + if i == j: + diagonal.append(rows[i][j]) + else: + need(rows[i][j].zero(), "binary fallback diagonal endpoint") + self.arena.free(rows[i][j]) + return diagonal, tuple(permutation) + + def raw_header(self, low, high, q): + """Compile-time low class plus encoded runtime high digits.""" + qword = self.ring.literal(q) + constants = {constant for row in low for constant in row} + palette = {constant: self.ring.literal(constant) for constant in constants} + out = [] + for lo, hi in zip(low, high): + row = [] + for constant, digit in zip(lo, hi): + term = self.ring.multiply(qword, digit) + row.append(self.ring.add(term, palette[constant])) + self.arena.free(term) + out.append(row) + self.arena.free(qword) + for value in palette.values(): + self.arena.free(value) + return out + + def prepare(self, low, high, q, fixed_preparation, rank): + raw = self.raw_header(low, high, q) + basis_chart = self.constants(fixed_preparation) + header = self.multiply(raw, basis_chart) + self.free(raw) + self.free(basis_chart) + p = self.projector(header, rank) + self.free(header) + return p diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/numeric.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/numeric.py new file mode 100644 index 0000000000..6d4ebca839 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/numeric.py @@ -0,0 +1,189 @@ +"""One numeric page for one exact raw prefix; never a packet-wide constant.""" +from controller import Callback, finite_word +from forms import fallback_form, good_form +from matrices import Matrices +from words import Unsigned, need + + +class Geometry: + def __init__(self, plan, index_arena, columns, depth, source_code, parent_identity): + self.plan = plan + self.index, self.raw = index_arena, Unsigned(index_arena) + self.columns = columns + self.depth, self.source_code, self.parent_identity = depth, source_code, parent_identity + self.one, self.two = self.index.literal(1), self.index.literal(2) + self.leaf_cutoff = self.index.literal(64) + need(not columns.zero(), "positive residual columns") + + def plus(self, a, b): + out, carry = self.raw.add(a, b) + need(not carry, "residual address margin") + return out + + def point(self, field, column): + base = self.raw.times_small(self.columns, field) + if field < self.plan.dimension: + result = self.plus(base, column) + else: + last = self.raw.subtract_exact(self.columns, self.one) + reverse = self.raw.subtract_exact(last, column) + result = self.plus(base, reverse) + self.index.free_many(last, reverse) + self.index.free(base) + return result + + def close(self): + self.index.free_many(self.one, self.two, self.leaf_cutoff) + + +class Page(Geometry): + def __init__(self, plan, form, ring, index_arena, columns, weight, + depth, source_code, parent_identity): + super().__init__(plan, index_arena, columns, depth, source_code, parent_identity) + self.form, self.ring, self.weight = form, ring, weight + if plan.good: + need((form.dimension, form.rank) == (plan.dimension, plan.rank), "good plan binding") + else: + signature = tuple((r.kind, r.target, r.source, r.permutation) for r in form.reductions) + need(signature == plan.reductions and form.permutation == plan.permutation + and form.negative_sign == plan.negative_sign, "full/low fallback itinerary binding") + + def bank(self, row, column): + if row >= self.plan.dimension: + return self.ring.arena.copy(self.ring.one) + base = self.raw.times_small(self.columns, row) + position = self.plus(base, column) + result = self.weight(position) + self.index.free_many(base, position) + return result + + def ratio(self, scalar, numerator, denominator): + ring, arena = self.ring, self.ring.arena + inverse = ring.inverse(denominator) + need(inverse is not None, "generated adapter denominator unit") + product = ring.multiply(scalar, numerator) + result = ring.multiply(product, inverse) + arena.free_many(numerator, denominator, inverse, product) + return result + + def coefficient(self, reference, column, reverse=False): + ring, arena, form = self.ring, self.ring.arena, self.form + if reference.kind == "head": + scalar = form.rows[reference.index][2] + elif reference.kind == "tail": + scalar = form.columns[reference.index][2] + elif reference.kind == "cross": + scalar = form.cross[reference.first][reference.second] + else: + need(reference.kind == "shear", "adapter coefficient reference") + reduction = form.reductions[reference.index] + need((reduction.target, reduction.source, reduction.permutation) == + (reference.first, reference.second, reference.permutation), "original shear reference") + scalar = reduction.scalar + if scalar.zero(): + result = arena.zero() + elif reference.kind == "tail": + result = arena.copy(scalar) + else: + if reference.kind == "head": + numerator, denominator = self.bank(reference.first, column), self.bank(reference.second, column) + elif reference.kind == "cross": + numerator, denominator = arena.copy(ring.one), self.bank(reference.second, column) + else: + numerator = self.bank(reference.permutation[reference.first], column) + denominator = self.bank(reference.permutation[reference.second], column) + result = self.ratio(scalar, numerator, denominator) + if (reference.sign < 0) != reverse: + opposite = ring.negate(result) + arena.free(result) + result = opposite + return result + + def child_weight(self, kind, field, reverse, index): + ring, arena = self.ring, self.ring.arena + if kind == "unit": + return arena.copy(ring.one) + if kind == "good": + quotient, remainder = self.raw.divmod(index, self.columns) + k = finite_word(quotient, self.plan.rank) + parent = self.weight(index) + result = ring.multiply(parent, self.form.pivots[k]) + arena.free(parent) + self.index.free_many(quotient, remainder) + return result + need(kind == "pair" and 0 <= field < 2*self.plan.dimension-1, "pair child field") + if self.form.permutation[field] == field: + return arena.copy(self.form.diagonal[field]) + if reverse: + last = self.raw.subtract_exact(self.columns, self.one) + column = self.raw.subtract_exact(last, index) + self.index.free(last) + else: + column = self.index.copy(index) + numerator = self.bank(self.form.permutation[field], column) + denominator = self.bank(field, column) + result = self.ratio(self.form.diagonal[field], numerator, denominator) + self.index.free(column) + return result + + def close(self): + self.form.close(self.ring) + super().close() + + def evaluate(self, request): + if request.kind == "adapter": + return self.coefficient(request.reference, request.coordinate, request.reverse_adapter) + need(request.kind == "child", "symbolic coefficient request") + value = self.child_weight(request.child_kind, request.field, request.reverse, request.coordinate) + if request.negative_inverse: + inverse = self.ring.inverse(value) + need(inverse is not None, "completed leaf weight unit") + result = self.ring.negate(inverse) + self.ring.arena.free_many(value, inverse) + return result + return value + + +def selected_page(plan, ring, index_arena, program, fields, specifications, current_code): + """Caller closes the returned page and incoming frame at the same prefix.""" + incoming = Callback(ring, index_arena, program, fields, specifications, current_code, + allow_fallback=True) + columns, remainder = incoming.raw.divmod(incoming.final_size, incoming.sixty_four) + index_arena.free(remainder) + scope = incoming.plus(incoming.depth, incoming.one_index) + projector = incoming.prepare(incoming.depth, current_code, scope) + index_arena.free(scope) + need(plan.good == specifications[current_code].good, "fixed selected branch") + form = good_form(projector, plan.rank, ring) if plan.good else fallback_form(projector, ring) + Matrices(ring).free(projector) + page = Page(plan, form, ring, index_arena, columns, incoming.weight, + incoming.depth, current_code, program) + return page, incoming + + +def selected_coefficient(plan, ring, index_arena, program, fields, specifications, + current_code, request): + """Closed per-prefix callback for a symbolic trace event, on each pass.""" + need(current_code in specifications and plan.dimension == 64 and + plan.rank == specifications[current_code].template.rank and + plan.good == specifications[current_code].good, "selected trace/source binding") + if request.kind == "child": + from children import coefficient + return coefficient(ring, index_arena, program, fields, specifications, current_code, request) + protected_residues, protected_indices = frozenset(ring.arena.live), frozenset(index_arena.live) + incoming = None + try: + page, incoming = selected_page(plan, ring, index_arena, program, fields, specifications, current_code) + result = page.evaluate(request) + page.close() + index_arena.free(page.columns) + incoming.close() + return result + except ValueError: + if incoming is not None: + incoming.abort() + ring.arena.rollback(protected_residues) + index_arena.rollback(protected_indices) + program.tape.rewind() + fields.tape.rewind() + raise diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/oracle.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/oracle.py new file mode 100644 index 0000000000..244f131466 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/oracle.py @@ -0,0 +1,94 @@ +"""Host arithmetic for fixture construction and expected values only.""" +from math import gcd + +from words import need + + +def eye(n): + return [[int(i == j) for j in range(n)] for i in range(n)] + + +def multiply(a, b, modulus): + out = [[0]*len(b[0]) for _ in a] + for i, row in enumerate(a): + for k, x in enumerate(row): + if x: + for j, y in enumerate(b[k]): + if y: + out[i][j] = (out[i][j]+x*y) % modulus + return out + + +def inverse(a, modulus): + n = len(a) + rows = [list(row)+unit for row, unit in zip(a, eye(n))] + for j in range(n): + k = next((i for i in range(j, n) if gcd(rows[i][j], modulus) == 1), None) + need(k is not None, "oracle unit pivot") + rows[j], rows[k] = rows[k], rows[j] + inv = pow(rows[j][j], -1, modulus) + rows[j] = [x*inv % modulus for x in rows[j]] + for i in range(n): + if i != j and rows[i][j]: + c = rows[i][j] + rows[i] = [(x-c*y) % modulus for x, y in zip(rows[i], rows[j])] + return [row[n:] for row in rows] + + +def reduce_rational(a, modulus): + return [[x.numerator*pow(x.denominator, -1, modulus) % modulus for x in row] for row in a] + + +def fixture(template, width, high=1, bad=False, unit_low=False, row=None): + q, modulus = template.q, template.q**width + row = template.rank if row is None else row + h = eye(64) + if bad: + h[0][0], h[0][row], h[row][0], h[row][row] = q, q-1, 1, 1+q*high + elif unit_low: + h[0][0], h[0][row], h[row][0], h[row][row] = 1+q*high, 1, 1, 2 + else: + h[0][row], h[row][0], h[row][row] = 1, q*high, 1+q*high + raw = multiply(h, inverse(reduce_rational(template.preparation, modulus), modulus), modulus) + low = tuple(tuple(x % q for x in row) for row in raw) + digits = tuple(tuple(x//q for x in row) for row in raw) + return low, digits + + +def projector(template, low, high, width): + q, modulus = template.q, template.q**width + raw = [[a+q*b for a, b in zip(lo, hi)] for lo, hi in zip(low, high)] + common = multiply(raw, reduce_rational(template.chart, modulus), modulus) + return multiply(multiply(common, reduce_rational(template.base, modulus), modulus), + inverse(common, modulus), modulus) + + +def good_pivots(p, rank, modulus): + rows, pivots = [list(row) for row in p], [] + for k in range(rank): + inv = pow(rows[k][k], -1, modulus) + pivots.append(rows[k][k]) + for i in range(k+1, len(rows)): + coefficient = rows[i][k]*inv % modulus + rows[i] = [(x-coefficient*y) % modulus for x, y in zip(rows[i], rows[k])] + return pivots + + +def fallback(p, modulus): + n = len(p) + rows = [[0]*(2*n) for _ in range(2*n)] + for i in range(n): + for j in range(n): + rows[i][j] = rows[2*n-1-i][2*n-1-j] = (int(i == j)-p[i][j]) % modulus + rows[i][2*n-1-j] = rows[2*n-1-i][j] = p[i][j] + permutation = list(range(2*n)) + for j in range(2*n): + pivot = next(i for i in range(j, 2*n) if gcd(rows[i][j], modulus) == 1) + rows[j], rows[pivot] = rows[pivot], rows[j] + permutation[j], permutation[pivot] = permutation[pivot], permutation[j] + inv = pow(rows[j][j], -1, modulus) + for i in range(2*n): + if i != j and rows[i][j]: + coefficient = rows[i][j]*inv % modulus + rows[i] = [(x-coefficient*y) % modulus for x, y in zip(rows[i], rows[j])] + return [rows[i][i] for i in range(2*n)], tuple(permutation) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/packet.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/packet.py new file mode 100644 index 0000000000..ebc9b61651 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/packet.py @@ -0,0 +1,97 @@ +"""One shared trace across a sequential directory of complete raw prefixes. + +Each primitive traverses the whole packet before the next trace event. Child +entry/return occur once for the packet, never once per sampled high header. +""" +from bitstream import copy_bits +from cardinality import Natural, multiply_atom_power +from records import RECORD_END, Tape +from stream import Counter, positive_extent +from stream_runner import Layout, action +from trace import execute +from words import BLANK, need + + +def read_prefix(directory, field_count): + out, remaining = Tape(), Counter(field_count) + while not remaining.finished: + while directory.read() != RECORD_END: + symbol = directory.read() + need(symbol != BLANK, "complete raw-prefix directory") + out.append(symbol) + directory.step(1) + out.append(RECORD_END) + directory.step(1) + remaining.decrement() + remaining.close() + out.rewind() + return out + + +def copy_prefix(source, output, before, body): + count = Counter(before) + while not count.finished: + copy_bits(source, output, body) + count.decrement() + count.close() + + +def run(source, geometry, parent_size, ring, q, before, suffix, prefix_count, + field_count, directory, coefficient, payload_factory=Tape, boundary_observer=None): + positive_extent(prefix_count) + expected_fields = geometry.plus(geometry.depth, geometry.one) + matches = geometry.raw.compare(field_count, expected_fields) == 0 + geometry.index.free(expected_fields) + need(matches, "original frozen/current field count") + layout = Layout(geometry, parent_size, ring, q, before, suffix) + body = Natural(suffix) + multiply_atom_power(body, layout.total, ring, q) + current, active = source, None + try: + for event in execute(geometry): + if event.kind == "enter": + need(active is None and event.parent_identity is geometry.parent_identity, + "one whole-packet child invocation") + active = event + if boundary_observer is not None: + boundary_observer(event.kind) + continue + if event.kind == "return": + need(active is not None and active.parent_identity is event.parent_identity and + (active.child_kind, active.field, active.reverse, active.half, active.source_code) == + (event.child_kind, event.field, event.reverse, event.half, event.source_code), + "whole-packet symbolic return") + for a, b in ((active.first, event.first), (active.second, event.second), + (active.width, event.width), (active.depth, event.depth)): + need(geometry.raw.compare(a, b) == 0, "whole-packet encoded child return") + active = None + if boundary_observer is not None: + boundary_observer(event.kind) + continue + output, prefixes = payload_factory(), Counter(prefix_count) + directory.rewind() + while not prefixes.finished: + fields = read_prefix(directory, field_count) + local = payload_factory() + copy_prefix(current, local, before, body) + local.rewind() + changed = action(local, event, layout, lambda request: coefficient(fields, request), payload_factory) + copy_prefix(changed, output, before, body) + need(changed.read() == BLANK, "complete returned prefix fibre") + changed.clear() + local.clear() + fields.clear() + prefixes.decrement() + prefixes.close() + need(current.read() == directory.read() == BLANK, "complete shared high packet") + current.rewind() + directory.rewind() + if current is not source: + current.clear() + output.rewind() + current = output + need(active is None, "whole-packet child return") + return current + finally: + layout.close() + body.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/plan.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/plan.py new file mode 100644 index 0000000000..48255d5454 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/plan.py @@ -0,0 +1,112 @@ +"""Compile fixed-low symbolic itineraries, without width or high fields.""" +from dataclasses import dataclass +from math import prod + +from words import need + + +@dataclass(frozen=True) +class Reference: + kind: str + index: int = 0 + first: int = 0 + second: int = 0 + permutation: tuple = () + sign: int = 1 + + +@dataclass(frozen=True) +class Command: + kind: str + target: int + source: int + reference: Reference + + +@dataclass +class Request: + kind: str + coordinate: object + reference: object = None + reverse_adapter: bool = False + child_kind: str = "" + field: int = 0 + reverse: bool = False + negative_inverse: bool = False + half: bool = False + + +@dataclass(frozen=True) +class Plan: + dimension: int + rank: int + good: bool + commands: tuple + reductions: tuple = () + permutation: tuple = () + negative_sign: bool = False + + +def compile_plan(low_projector, rank, q, good): + """Host arithmetic here depends only on the fixed prime/low vocabulary.""" + m = len(low_projector) + need(1 <= rank < m <= 64, "compiled residual dimension") + if good: + commands = [] + index = 0 + for k in range(rank): + for i in range(k+1, m): + commands.append(Command("add", i, k, Reference("head", index, i, k))) + index += 1 + index = 0 + for k in range(rank): + column = m-1-k + for source in range(column): + commands.append(Command("add", m+column, m+source, + Reference("tail", index, sign=-1))) + index += 1 + for i in range(m): + for k in range(m): + commands.append(Command("add", m+i, k, Reference("cross", i*m+k, i, k))) + return Plan(m, rank, True, tuple(commands)) + size = 2*m + rows = [[0]*size for _ in range(size)] + for i in range(m): + for j in range(m): + rows[i][j] = rows[size-1-i][size-1-j] = (int(i == j)-low_projector[i][j]) % q + rows[i][size-1-j] = rows[size-1-i][j] = low_projector[i][j] % q + permutation, reductions = list(range(size)), [] + for j in range(size): + pivot = next(i for i in range(j, size) if rows[i][j] % q) + if pivot != j: + reductions.append(("swap", j, pivot, tuple(permutation))) + rows[j], rows[pivot] = rows[pivot], rows[j] + permutation[j], permutation[pivot] = permutation[pivot], permutation[j] + inverse = pow(rows[j][j], -1, q) + for i in range(size): + if i != j: + coefficient = -rows[i][j]*inverse % q + reductions.append(("shear", i, j, tuple(permutation))) + rows[i] = [(x+coefficient*y) % q for x, y in zip(rows[i], rows[j])] + sign = prod(rows[i][i] for i in range(size)) % q + need(sign in (1, q-1), "compiled terminal sign") + commands = [] + unit = Reference("unit") + for i in range(size-1): + commands.append(Command("child", i, size-1, unit)) + commands.append(Command("child", i, size-1, Reference("pair", i, i, size-1, + tuple(permutation)))) + if sign != 1: + commands.append(Command("sign", size-1, -1, Reference("fixed", sign=-1))) + for index in range(len(reductions)-1, -1, -1): + kind, i, k, snapshot = reductions[index] + if kind == "swap": + commands.append(Command("child", i, k, unit)) + else: + reference = Reference("shear", index, i, k, snapshot, -1) + if i > k: + commands.append(Command("add", i, k, reference)) + else: + commands.extend((Command("child", i, k, unit), Command("add", k, i, reference), + Command("child", i, k, unit))) + return Plan(m, rank, False, tuple(commands), tuple(reductions), tuple(permutation), sign != 1) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/records.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/records.py new file mode 100644 index 0000000000..4f00467a0f --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/records.py @@ -0,0 +1,271 @@ +"""Sequential binary program/field records and typed continuation stacks. + +Runtime numerical words copy between tapes. Only tags, source codes, ranks +and row labels enter fixed finite control. Fixture encoding is separate. +""" +from words import BLANK, LEFT, ONE, RIGHT, ZERO, Meter, Unsigned, need + +WORD_END, RECORD_END = 5, 6 +ROOT, STEP, VALUE, CONSTANT, MULTIPLY, PAIR, RETURN = range(7, 14) +FINITE_BITS = 16 # Fixed vocabulary width for this compiled source instance. + + +class Tape: + def __init__(self): + self.cells = bytearray([LEFT]) + self.head = 1 + self.meter = Meter() + + def read(self): + self.meter.reads += 1 + return self.cells[self.head] if self.head < len(self.cells) else BLANK + + def write(self, symbol): + need(ZERO <= symbol <= RETURN, "fixed record alphabet") + self.meter.writes += 1 + if self.head >= len(self.cells): + self.cells.extend([BLANK]*(self.head+1-len(self.cells))) + self.cells[self.head] = symbol + + def step(self, direction): + need(direction in (-1, 1), "unit record-head move") + self.head += direction + need(self.head >= 0, "local record boundary") + self.meter.moves += 1 + + def append(self, symbol): + need(self.read() == BLANK, "append at record blank") + self.write(symbol) + self.step(1) + + def rewind(self): + self.step(-1) + while self.read() != LEFT: + self.step(-1) + self.step(1) + + def clear(self): + self.rewind() + while self.read() != BLANK: + self.write(BLANK) + self.step(1) + self.rewind() + + +def append_word(tape, word): + word.rewind() + while word.read() != RIGHT: + tape.append(word.read()) + word.step(1) + tape.append(WORD_END) + word.rewind() + + +def read_word(tape, arena): + out = arena.zero() + while tape.read() != WORD_END: + bit = tape.read() + need(bit in (ZERO, ONE) and out.read() != RIGHT, "encoded word extent") + out.write(bit) + out.step(1) + tape.step(1) + need(out.read() == RIGHT, "complete encoded word") + tape.step(1) + out.rewind() + return out + + +def append_finite(tape, value, bits=FINITE_BITS): + """Compile-time finite source/operation tag encoding.""" + need(0 <= value < 1 << bits, "compiled finite vocabulary") + for bit in range(bits): + tape.append((value >> bit) & 1) + tape.append(WORD_END) + + +def read_finite(tape, bits=FINITE_BITS): + # The accumulator ranges over a fixed finite set, independent of e/w/h. + state = 0 + for bit in range(bits): + value = tape.read() + need(value in (ZERO, ONE), "finite label bit") + state |= value << bit + tape.step(1) + need(tape.read() == WORD_END, "finite label delimiter") + tape.step(1) + return state + + +def seek_record(tape, index): + machine, arena = Unsigned(index.arena), index.arena + remaining, one = arena.copy(index), arena.literal(1) + tape.rewind() + while not remaining.zero(): + while tape.read() != RECORD_END: + need(tape.read() != BLANK, "record exists at global slot") + tape.step(1) + tape.step(1) + after = machine.subtract_exact(remaining, one) + arena.free(remaining) + remaining = after + arena.free_many(remaining, one) + + +class Stack: + def __init__(self, index_arena, residue_arena): + self.index_arena, self.residue_arena = index_arena, residue_arena + self.tape, self.reverse = Tape(), Tape() + + def empty(self): + self.tape.step(-1) + result = self.tape.read() == LEFT + self.tape.step(1) + return result + + def push(self, tag, *words): + need(tag in (VALUE, CONSTANT, MULTIPLY, PAIR, RETURN), "continuation kind") + need(len(words) == (2 if tag == VALUE else 1), "continuation arity") + self.tape.append(tag) + for word in words: + append_word(self.tape, word) + self.tape.append(RECORD_END) + + def pop(self): + need(not self.empty(), "nonempty continuation stack") + tape, reverse = self.tape, self.reverse + tape.step(-1) + need(tape.read() == RECORD_END, "continuation top delimiter") + tape.write(BLANK) + tape.step(-1) + while tape.read() not in (LEFT, RECORD_END): + reverse.append(tape.read()) + tape.write(BLANK) + tape.step(-1) + tape.step(1) + reverse.step(-1) + tag = reverse.read() + need(tag in (VALUE, CONSTANT, MULTIPLY, PAIR, RETURN), "encoded continuation kind") + reverse.write(BLANK) + reverse.step(-1) + arenas = (self.index_arena, self.index_arena) if tag == VALUE else (self.residue_arena,) + words = [] + for arena in arenas: + out = arena.zero() + while reverse.read() != WORD_END: + bit = reverse.read() + need(bit in (ZERO, ONE) and out.read() != RIGHT, "continuation binary word") + out.write(bit) + out.step(1) + reverse.write(BLANK) + reverse.step(-1) + need(out.read() == RIGHT, "complete continuation operand") + reverse.write(BLANK) + reverse.step(-1) + out.rewind() + words.append(out) + need(reverse.read() == LEFT, "complete continuation record") + reverse.step(1) + return tag, tuple(words) + + +class Program: + """Encoded root and admitted chronological steps; numerical fields are words.""" + def __init__(self, index_arena, residue_arena, code_bits=FINITE_BITS): + self.index_arena, self.residue_arena = index_arena, residue_arena + self.code_bits = code_bits + self.tape = Tape() + + def root(self): + self.tape.rewind() + need(self.tape.read() == ROOT, "root record") + self.tape.step(1) + size = read_word(self.tape, self.index_arena) + unit = read_word(self.tape, self.residue_arena) + depth = read_word(self.tape, self.index_arena) + need(self.tape.read() == RECORD_END, "root record end") + self.tape.rewind() + return size, unit, depth + + def step(self, level): + need(not level.zero(), "positive step level") + seek_record(self.tape, level) + need(self.tape.read() == STEP, "step record") + self.tape.step(1) + metadata = tuple(read_finite(self.tape, self.code_bits if field == 1 else FINITE_BITS) + for field in range(6)) + parent = read_word(self.tape, self.index_arena) + child = read_word(self.tape, self.index_arena) + need(self.tape.read() == RECORD_END, "step record end") + self.tape.rewind() + return metadata, parent, child + + @classmethod + def fixture(cls, index_arena, residue_arena, root_size, root_unit, events, code_bits=FINITE_BITS): + """Fixture-only serialization; runtime computes and validates extents.""" + out = cls(index_arena, residue_arena, code_bits) + out.tape.append(ROOT) + for arena, value in ((index_arena, root_size), (residue_arena, root_unit), (index_arena, len(events))): + word = arena.input(value) + append_word(out.tape, word) + arena.free(word) + out.tape.append(RECORD_END) + size = root_size + for kind, code, rank, field, reverse, half in events: + f = size//64 + child = rank*f if kind == 0 else f//2 if half else f + out.tape.append(STEP) + for field_index, label in enumerate((kind, code, rank, field, int(reverse), int(half))): + append_finite(out.tape, label, code_bits if field_index == 1 else FINITE_BITS) + for value in (size, child): + word = index_arena.input(value) + append_word(out.tape, word) + index_arena.free(word) + out.tape.append(RECORD_END) + size = child + out.tape.rewind() + return out + + +class Fields: + def __init__(self, index_arena, residue_arena, code_bits=FINITE_BITS): + self.index_arena, self.residue_arena = index_arena, residue_arena + self.code_bits = code_bits + self.tape = Tape() + + def check_code(self, slot, code): + seek_record(self.tape, slot) + observed = read_finite(self.tape, self.code_bits) + self.tape.rewind() + need(observed == code, "original global raw-field code") + + def end(self, after): + seek_record(self.tape, after) + complete = self.tape.read() == BLANK + self.tape.rewind() + need(complete, "exact frozen/current field prefix") + + def read(self, slot, code, depth): + need(Unsigned(self.index_arena).compare(slot, depth) < 0, "frozen field excludes current/future slot") + seek_record(self.tape, slot) + observed = read_finite(self.tape, self.code_bits) + need(observed == code, "exact encoded raw-field specification") + out = [[read_word(self.tape, self.residue_arena) for _ in range(64)] for _ in range(64)] + need(self.tape.read() == RECORD_END, "complete 64-dimensional raw high field") + self.tape.rewind() + return out + + @classmethod + def fixture(cls, index_arena, residue_arena, fields, code_bits=FINITE_BITS): + """Load canonical raw-field fixture data before measured execution.""" + out = cls(index_arena, residue_arena, code_bits) + for code, high in fields: + append_finite(out.tape, code, code_bits) + need(len(high) == 64 and all(len(row) == 64 for row in high), "field fixture shape") + for row in high: + for value in row: + word = residue_arena.input(value) + append_word(out.tape, word) + residue_arena.free(word) + out.tape.append(RECORD_END) + out.tape.rewind() + return out diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/residual.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/residual.py new file mode 100644 index 0000000000..3d070d2539 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/residual.py @@ -0,0 +1,93 @@ +"""Concrete selected residual consumer for newly produced common directories.""" +from controller import Callback +from numeric import Geometry, selected_coefficient +import packet +from plan import compile_plan +from records import Fields, Tape +from words import Unsigned, need + + +class SelectedResidual: + def __init__(self, context, indices, program, specifications, code, parent_size, depth, + before, suffix): + # Only fixed source/low data enters this compilation step. + import oracle + spec = specifications[code] + _request, common, low = context.codes.decode(code) + need(context.dimension == 64 and common and low == spec.low and + spec.template.chart == tuple(map(tuple, oracle.eye(64))) and + program.code_bits == context.codes.bits, "selected common-view residual consumer") + q = context.q + prepared = oracle.multiply(low,oracle.reduce_rational(spec.template.preparation,q),q) + projector = oracle.multiply([row[:spec.template.rank] for row in prepared], + oracle.inverse(prepared,q)[:spec.template.rank],q) + self.plan = compile_plan(projector,spec.template.rank,q,spec.good) + self.context,self.indices,self.program = context,indices,program + self.specifications,self.code = specifications,code + self.parent_size,self.depth,self.before,self.suffix = parent_size,depth,before,suffix + + def __call__(self, source, directory, prefix_count): + context, indices = self.context,self.indices + raw = Unsigned(indices) + divisor,one = indices.literal(64),indices.literal(1) + columns,remainder = raw.divmod(self.parent_size,divisor) + indices.free_many(divisor,remainder) + field_count,carry = raw.add(self.depth,one) + indices.free(one) + need(not carry, "current source field extent") + geometry = Geometry(self.plan,indices,columns,self.depth,self.code,self.program) + padded_count = prefix_count.marginal() + try: + directory.rewind() + first = packet.read_prefix(directory,field_count) + directory.rewind() + fields = Fields(indices,context.arena,context.codes.bits) + fields.tape = first + frame = Callback(context.ring,indices,self.program,fields,self.specifications,self.code, + allow_fallback=True) + valid = raw.compare(frame.final_size,self.parent_size) == 0 and raw.compare(frame.depth,self.depth) == 0 + frame.close() + first.clear() + need(valid, "shared trace agrees with the encoded parent frame") + def coefficient(prefix, request): + current = Fields(indices,context.arena,context.codes.bits) + current.tape = prefix + return selected_coefficient(self.plan,context.ring,indices,self.program,current, + self.specifications,self.code,request) + return packet.run(source,geometry,self.parent_size,context.ring,context.q, + self.before,self.suffix,padded_count,field_count,directory,coefficient) + finally: + geometry.close() + indices.free_many(columns,field_count) + padded_count.close() + directory.rewind() + + +class SelectedCopy511: + """Bind the authenticated physical interval to its concrete selected callee.""" + def __init__(self, context, indices, program, specifications, common_low, + parent_size, depth, before, suffix): + import oracle + from binding import selected_episode + from routes import compile_route, inverse_rational + from sources import compile_specification + self.episode = selected_episode(context.q) + inverse = oracle.reduce_rational(inverse_rational(self.episode.chart),context.q) + native_low = oracle.multiply(common_low,inverse,context.q) + self.route = compile_route(native_low,self.episode.chart,context.codes) + self.code = context.codes.encode(self.episode.request,True,common_low) + spec = compile_specification(self.code,self.episode.template,common_low) + need(self.code not in specifications or specifications[self.code] == spec, + "one frozen/current source-code interpretation") + vocabulary = dict(specifications) + vocabulary[self.code] = spec + self.residual = SelectedResidual(context,indices,program,vocabulary,self.code, + parent_size,depth,before,suffix) + self.context,self.indices,self.depth = context,indices,depth + + def __call__(self, families, old_directory, old_fields, old_count, fibre): + from episode import physical + need(Unsigned(self.indices).compare(old_fields,self.depth) == 0, + "physical old fields agree with the generated parent depth") + return physical(families,self.episode,self.route,self.code,self.context,old_directory, + old_fields,old_count,fibre,self.residual) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/routes.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/routes.py new file mode 100644 index 0000000000..35531201dc --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/routes.py @@ -0,0 +1,249 @@ +"""Owner/common high-cube routes by binary keys and sequential stable passes.""" +from dataclasses import dataclass +from fractions import Fraction + +from bitstream import copy_bits +from counts import Count +from directory import Odometer, append_tape +from matrices import Matrices +from records import WORD_END, Tape, append_word, read_word +from stream import Counter +from words import BLANK, ONE, RIGHT, ZERO, need + + +@dataclass(frozen=True) +class Route: + q: int + dimension: int + low: tuple + target_low: tuple + chart: tuple + + +def compile_route(low, chart, vocabulary): + """Compile fixed labels only; no input modulus or high digit is available.""" + import oracle + q, dimension = vocabulary.q, vocabulary.dimension + vocabulary.rank(low) + need(len(chart) == dimension and all(len(row) == dimension for row in chart), "fixed chart shape") + chart = tuple(tuple(Fraction(x) for x in row) for row in chart) + reduced = oracle.reduce_rational(chart, q) + oracle.inverse(reduced, q) + target = tuple(map(tuple, oracle.multiply(low, reduced, q))) + vocabulary.rank(target) + return Route(q, dimension, tuple(map(tuple, low)), target, chart) + + +def inverse_rational(matrix): + """Fixed source compilation; fractions never enter measured payload loops.""" + size = len(matrix) + rows = [[Fraction(x) for x in row]+[Fraction(i == j) for j in range(size)] + for i, row in enumerate(matrix)] + for column in range(size): + pivot = next((i for i in range(column, size) if rows[i][column]), None) + need(pivot is not None, "invertible fixed rational chart") + rows[column], rows[pivot] = rows[pivot], rows[column] + scale = rows[column][column] + rows[column] = [x/scale for x in rows[column]] + for i in range(size): + if i != column: + factor = rows[i][column] + rows[i] = [x-factor*y for x, y in zip(rows[i], rows[column])] + return tuple(tuple(row[size:]) for row in rows) + + +def high_key(high, route, chart, context): + matrices, arena = Matrices(context.ring), context.arena + raw = matrices.raw_header(route.low, high, context.q) + common = matrices.multiply(raw, chart) + matrices.free(raw) + divisor = arena.literal(context.q) + keys = [] + try: + for i in range(context.dimension): + row = [] + keys.append(row) + for j in range(context.dimension): + low = arena.literal(route.target_low[i][j]) + difference = context.raw.subtract_exact(common[i][j], low) + quotient, remainder = context.raw.divmod(difference, divisor) + arena.free_many(low, difference) + valid = remainder.zero() and context.raw.compare(quotient, context.cap) < 0 + arena.free(remainder) + row.append(quotient) + need(valid, "exact routed low class and high carry") + return keys + except ValueError: + matrices.free(keys) + raise + finally: + matrices.free(common) + arena.free(divisor) + + +def copy_key(source, output, context, selected=None, cursor=None): + bit = ZERO + template = context.arena.template + for coordinate in range(context.dimension*context.dimension): + template.rewind() + if coordinate == selected: + cursor.rewind() + while template.read() != RIGHT: + value = source.read() + need(value in (ZERO, ONE), "complete binary route key") + if coordinate == selected: + if cursor.read() == ONE: + bit = value + cursor.step(1) + output.append(value) + source.step(1) + template.step(1) + need(source.read() == WORD_END, "route key word extent") + output.append(WORD_END) + source.step(1) + template.rewind() + if coordinate == selected: + cursor.rewind() + return bit + + +def copy_rows(source, output, count, fibre): + remaining = Counter(count) + try: + while not remaining.finished: + copy_bits(source, output, fibre) + remaining.decrement() + finally: + remaining.close() + + +def partition(source, coordinate, cursor, context, fibre, factory): + buckets = (factory(), factory()) + counts = (Count.literal(0), Count.literal(0)) + records = Counter(context.highs) + output = factory() + try: + while not records.finished: + key = Tape() + try: + bit = copy_key(source, key, context, coordinate, cursor) + append_tape(key, buckets[bit]) + copy_bits(source, buckets[bit], fibre) + counts[bit].increment() + finally: + key.clear() + records.decrement() + need(source.read() == BLANK, "complete route partition") + source.rewind() + for bucket, count in zip(buckets, counts): + bucket.rewind() + remaining = Counter(count) + while not remaining.finished: + copy_key(bucket, output, context) + copy_bits(bucket, output, fibre) + remaining.decrement() + remaining.close() + need(bucket.read() == BLANK, "complete stable route bucket") + output.rewind() + return output + except ValueError: + output.clear() + raise + finally: + records.close() + for bucket, count in zip(buckets, counts): + bucket.clear() + count.close() + + +def route_cube(source, route, context, fibre, factory=Tape): + need((route.q, route.dimension) == (context.q, context.dimension), "route/context binding") + matrices, arena = Matrices(context.ring), context.arena + chart = matrices.constants(route.chart) + high, decorated = Odometer(context), factory() + source.rewind() + current, output = decorated, None + try: + while not high.finished: + key = high_key(high.digits, route, chart, context) + for row in key: + for digit in row: + append_word(decorated, digit) + matrices.free(key) + copy_bits(source, decorated, fibre) + high.advance() + need(source.read() == BLANK, "complete source high cube") + source.rewind() + decorated.rewind() + if context.raw.compare(context.cap, context.ring.one) > 0: + for coordinate in reversed(range(context.dimension*context.dimension)): + cursor = arena.copy(context.ring.one) + try: + while True: + following = partition(current, coordinate, cursor, context, fibre, factory) + current.clear() + current = following + cursor.msb() + final = cursor.read() == ONE + cursor.rewind() + if final: + break + shifted = context.raw.shift_add_bit(cursor, ZERO) + arena.free(cursor) + cursor = shifted + finally: + arena.free(cursor) + high.close() + high = Odometer(context) + output = factory() + while not high.finished: + for row in high.digits: + for expected in row: + actual = read_word(current, arena) + valid = context.raw.compare(actual, expected) == 0 + arena.free(actual) + need(valid, "complete bijective routed high order") + copy_bits(current, output, fibre) + high.advance() + need(current.read() == BLANK, "complete routed key removal") + output.rewind() + return output + except ValueError: + if output is not None: + output.clear() + raise + finally: + current.clear() + high.close() + matrices.free(chart) + source.rewind() + + +def route_packet(source, route, context, old_count, fibre, factory=Tape): + outer, output = Counter(old_count), factory() + source.rewind() + try: + need(not outer.finished, "positive route prefix count") + while not outer.finished: + local = factory() + try: + copy_rows(source, local, context.highs, fibre) + local.rewind() + changed = route_cube(local, route, context, fibre, factory) + try: + copy_rows(changed, output, context.highs, fibre) + need(changed.read() == BLANK, "closed routed prefix") + finally: + changed.clear() + finally: + local.clear() + outer.decrement() + need(source.read() == BLANK, "complete old-prefix route") + output.rewind() + return output + except ValueError: + output.clear() + raise + finally: + outer.close() + source.rewind() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/selection.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/selection.py new file mode 100644 index 0000000000..2c28f1aaec --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/selection.py @@ -0,0 +1,71 @@ +"""Gather/scatter one low class at its original positions in a complete family.""" +from bitstream import copy_bits +from counts import Count, high_power +from records import Tape +from routes import copy_rows +from stream import Counter +from words import BLANK, ONE, ZERO, need + + +def discard_rows(source, count, fibre): + rows = Counter(count) + try: + while not rows.finished: + bits = Counter(fibre) + while not bits.finished: + need(source.read() in (ZERO, ONE), "complete skipped payload") + source.step(1) + bits.decrement() + bits.close() + rows.decrement() + finally: + rows.close() + + +def packet_operation(source, context, old_count, low, fibre, replacement=None, factory=Tape): + # The ordinal and vocabulary cardinality belong to fixed-q compilation. + ordinal = context.codes.rank(low) + before = Count.literal(ordinal) + after = Count.literal(context.codes.size-ordinal-1) + high_power(before, context.ring, context.q, context.dimension) + high_power(after, context.ring, context.q, context.dimension) + outer, output = Counter(old_count), factory() + source.rewind() + if replacement is not None: + replacement.rewind() + try: + need(not outer.finished, "positive physical old-prefix count") + while not outer.finished: + if replacement is None: + discard_rows(source, before, fibre) + copy_rows(source, output, context.highs, fibre) + discard_rows(source, after, fibre) + else: + copy_rows(source, output, before, fibre) + discard_rows(source, context.highs, fibre) + copy_rows(replacement, output, context.highs, fibre) + copy_rows(source, output, after, fibre) + outer.decrement() + need(source.read() == BLANK, "complete selected family") + if replacement is not None: + need(replacement.read() == BLANK, "complete packet replacement") + output.rewind() + return output + except ValueError: + output.clear() + raise + finally: + before.close() + after.close() + outer.close() + source.rewind() + if replacement is not None: + replacement.rewind() + + +def gather(source, context, old_count, low, fibre, factory=Tape): + return packet_operation(source, context, old_count, low, fibre, factory=factory) + + +def scatter(source, replacement, context, old_count, low, fibre, factory=Tape): + return packet_operation(source, context, old_count, low, fibre, replacement, factory) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/sources.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/sources.py new file mode 100644 index 0000000000..16d5e7e6a2 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/sources.py @@ -0,0 +1,148 @@ +"""Compile fixed selected rational labels and low classes. + +This stage depends on q and the fixed selected catalogue, never on the input +width or high digits. Runtime inverses and coefficients come from words.py. +The selection/chart conventions adapt PR2234 and PR2405 with attribution. +""" +from dataclasses import dataclass +from fractions import Fraction as F +from hashlib import sha256 +import importlib.util +import json +from pathlib import Path + +from words import need + + +ROOT = Path(__file__).resolve().parents[3] + + +def identity(n): + return [[F(i == j) for j in range(n)] for i in range(n)] + + +def product(a, b): + out = [[F(0) for _ in b[0]] for _ in a] + for i, row in enumerate(a): + for k, x in enumerate(row): + if x: + for j, y in enumerate(b[k]): + if y: + out[i][j] += x*y + return out + + +def independent_columns(matrix, q): + # q is fixed when compiling the finite source vocabulary. + rows = [[x.numerator*pow(x.denominator, -1, q) % q for x in row] for row in matrix] + rank, chosen = 0, [] + for j in range(len(matrix[0])): + pivot = next((i for i in range(rank, len(rows)) if rows[i][j]), None) + if pivot is None: + continue + rows[rank], rows[pivot] = rows[pivot], rows[rank] + inv = pow(rows[rank][j], -1, q) + rows[rank] = [x*inv % q for x in rows[rank]] + for i in range(len(rows)): + if i != rank and rows[i][j]: + c = rows[i][j] + rows[i] = [(x-c*y) % q for x, y in zip(rows[i], rows[rank])] + chosen.append(j) + rank += 1 + if rank == len(rows): + break + return chosen + + +@dataclass(frozen=True) +class Template: + q: int + rank: int + record: tuple + base: tuple + chart: tuple + preparation: tuple + + +@dataclass(frozen=True) +class Specification: + code: int + template: Template + low: tuple + good: bool + + +def compile_specification(code, template, low): + """Compile the finite low-class branch, with no width/high input.""" + import oracle + q = template.q + need(len(low) == 64 and all(len(row) == 64 and all(0 <= x < q for x in row) for row in low), + "fixed raw low class") + h = oracle.multiply(low, oracle.reduce_rational(template.preparation, q), q) + inv = oracle.inverse(h, q) + p = oracle.multiply([row[:template.rank] for row in h], inv[:template.rank], q) + try: + oracle.good_pivots(p, template.rank, q) + good = True + except ValueError: + good = False + return Specification(code, template, tuple(map(tuple, low)), good) + + +def compile_templates(q=3): + path = ROOT / "research/pr589-five-helper-hosting/verify.py" + spec = importlib.util.spec_from_file_location("retained_binary_control_source", path) + old = importlib.util.module_from_spec(spec) + spec.loader.exec_module(old) + word, host, geometry = (old.read(p) for p in (old.WORD, old.HOST, old.GEO)) + call = host["calls"][0] + program = host["local_programs"][call["orientation"]] + idles = {event["idx"]: event for event in host["schedule"] if event["kind"] == "idle"} + templates = [] + for position, op, role, key in ( + (21816, 2, 472, "c097fc120eea0e30ceaae6f2f6bad489ec86945dfecb852fb50c2d46d64185cd"), + (18085, 0, 222, "5a7dce9c52ac8c9c23fa89766439abfc412b5242b444945289a83828ffa9ae6d"), + ): + event = program[position] + need(event[:2] == [op, role], "exact selected literal") + a, b, rank = event[3:6] if op == 2 else event[2:5] + pa, ra = old.projection([word["lines"][i] for i in word["frames"][a]]) + pb, rb = old.projection([word["lines"][i] for i in word["frames"][b]]) + lo, hi = (pa, pb) if ra <= rb else (pb, pa) + local = old.sub(hi, lo) + observed = sha256(json.dumps(["local", rank, [[str(x) for x in row] for row in local]], + sort_keys=True, separators=(",", ":")).encode()).hexdigest() + need(observed == key and abs(ra-rb) == rank, "selected projector identity") + base = [[F(0) for _ in range(64)] for _ in range(64)] + for i in range(8): + base[i][:8] = local[i] + family, route = call["owners"][role] + need(route[0] == "hosted", "selected hosted source") + _, child, offset, width = route + axes = old.pending_axes(idles[child])[offset:offset+width] + port = family % 111 if min(axes) < 8 else -1 + chart = identity(64) + if op != 2: + if port >= 0: + entry = geometry["ports"][port] + for i in range(8): + chart[i][:8] = [F(entry["q"][i], 2)] + list(map(F, entry["complement_columns"][i])) + pi = list(range(64)) + for i, j in zip(sorted(set(range(8))-set(axes)), sorted(set(axes)-set(range(8)))): + pi[i], pi[j] = j, i + chart = [[row[pi[j]] for j in range(64)] for row in chart] + complement = [[F(i == j)-base[i][j] for j in range(64)] for i in range(64)] + image, kernel = independent_columns(base, q), independent_columns(complement, q) + need((len(image), len(kernel)) == (rank, 64-rank), "fixed low-field split basis") + basis = [[base[i][j] for j in image] + [complement[i][j] for j in kernel] for i in range(64)] + # PB=BE over the rationals, before any input-width modulus exists. + projected_basis = [[basis[i][j] if j < rank else F(0) for j in range(64)] for i in range(64)] + need(product(base, basis) == projected_basis and len(independent_columns(basis, q)) == 64, + "rational split basis with unit determinant modulo fixed q") + preparation = product(chart, basis) + record = ("COPY" if op == 2 else "MOVE", 0, position, role, + host["live"] if op == 2 else family, a, b, key, rank, + "common" if op == 2 else "owner", tuple(axes), port) + templates.append(Template(q, rank, record, tuple(map(tuple, base)), tuple(map(tuple, chart)), + tuple(map(tuple, preparation)))) + return tuple(templates) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream.py new file mode 100644 index 0000000000..5e5a4bb0f9 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream.py @@ -0,0 +1,163 @@ +"""Binary-counted complete-fibre ADD using an encoded coefficient callback. + +Each arbitrary spectator extent has its own canonical word length. None +enters the coefficient context. Payload bits remain opaque to the arithmetic. +""" +from records import Tape +from words import BLANK, LEFT, ONE, RIGHT, ZERO, need + + +class Counter: + """Canonical variable-length countdown with amortized ripple movement.""" + def __init__(self, word): + self.tape = Tape() + word.rewind() + while word.read() != RIGHT: + self.tape.append(word.read()) + word.step(1) + word.rewind() + self.tape.append(RIGHT) + self.tape.step(-1) + self.tape.step(-1) + while self.tape.read() == ZERO: + self.tape.write(RIGHT) + self.tape.step(1) + self.tape.write(BLANK) + self.tape.step(-1) + self.tape.step(-1) + self.finished = self.tape.read() == LEFT + if self.finished: + self.tape.step(1) + self.tape.write(ZERO) + self.tape.step(1) + self.tape.write(RIGHT) + self.tape.rewind() + + def decrement(self): + need(not self.finished, "positive countdown") + tape = self.tape + while tape.read() == ZERO: + tape.write(ONE) + tape.step(1) + need(tape.read() == ONE, "canonical positive counter") + tape.write(ZERO) + tape.step(1) + if tape.read() == RIGHT: + tape.write(BLANK) + tape.step(-1) + tape.step(-1) + if tape.read() == LEFT: + tape.step(1) + tape.write(ZERO) + tape.step(1) + tape.write(RIGHT) + self.finished = True + else: + tape.step(1) + tape.write(RIGHT) + tape.rewind() + + def close(self): + self.tape.clear() + + +def positive_extent(word): + """Reject padding inherited from a different, larger spectator extent.""" + word.msb() + margin = word.read() + word.step(-1) + significant = word.read() + word.rewind() + need(margin == ZERO and significant == ONE, "separately canonical positive spectator extent") + + +def one_bit_suffix(word): + """Recognize the fixed encodings of one, without decoding a cardinality.""" + word.rewind() + if word.read() != ONE: + return False + word.step(1) + if word.read() == ZERO: + word.step(1) + result = word.read() == RIGHT + word.rewind() + return result + + +def copy_blocks(source, target, count, suffix, observe): + blocks = Counter(count) + single = one_bit_suffix(suffix) + while not blocks.finished: + if single: + bit = source.read() + need(bit in (ZERO, ONE), "opaque payload bit") + target.append(bit) + source.step(1) + else: + bits = Counter(suffix) + while not bits.finished: + bit = source.read() + need(bit in (ZERO, ONE), "opaque payload bit") + target.append(bit) + source.step(1) + bits.decrement() + bits.close() + observe(bits) + blocks.decrement() + blocks.close() + observe(blocks) + + +def add_pass(source, ring, before, middle, suffix, prepare_coefficient, payload_factory=Tape): + for extent in (before, middle, suffix): + positive_extent(extent) + left, right, out = payload_factory(), payload_factory(), payload_factory() + totals = {"reads": 0, "writes": 0, "moves": 0} + def observe(counter): + # External meter only; no count controls execution. + for key in totals: + totals[key] += getattr(counter.tape.meter, key) + def traverse(merge): + coefficient = prepare_coefficient() + need(ring.raw.compare(coefficient, ring.modulus) < 0, "canonical encoded coefficient") + outer = Counter(before) + while not outer.finished: + x = ring.arena.zero() + sources = Counter(ring.modulus) + while not sources.finished: + offset = ring.multiply(coefficient, x) + leading = ring.raw.subtract_exact(ring.modulus, offset) + mid = Counter(middle) + while not mid.finished: + if merge: + copy_blocks(right, out, offset, suffix, observe) + copy_blocks(left, out, leading, suffix, observe) + else: + copy_blocks(source, left, leading, suffix, observe) + copy_blocks(source, right, offset, suffix, observe) + mid.decrement() + mid.close() + observe(mid) + ring.arena.free_many(offset, leading) + sources.decrement() + if not sources.finished: + ring.raw.increment_in_place(x) + sources.close() + observe(sources) + ring.arena.free(x) + outer.decrement() + outer.close() + observe(outer) + ring.arena.free(coefficient) + traverse(False) + need(source.read() == BLANK, "complete input extent") + source.rewind() + left.rewind() + right.rewind() + traverse(True) + need(left.read() == right.read() == BLANK, "complete split consumption") + left.clear() + right.clear() + out.rewind() + return out, {"counters": totals, "left": left.meter.record(), "right": right.meter.record(), + "output": out.meter.record()} diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream_runner.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream_runner.py new file mode 100644 index 0000000000..efff281d4c --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/stream_runner.py @@ -0,0 +1,112 @@ +"""Interpret the shared trace on a complete Boolean fibre for one prefix. + +Coefficient requests remain symbolic until a pass reads its exact raw prefix. +All physical atom positions and spectator cardinalities remain binary. +""" +from bitstream import atom_swap, sign_address +from cardinality import Natural, multiply_atom_power +from stream import add_pass, positive_extent +from trace import execute +from words import need + + +class Layout: + def __init__(self, geometry, parent_size, ring, q, before, suffix): + positive_extent(before) + positive_extent(suffix) + self.geometry, self.ring, self.q = geometry, ring, q + self.before, self.suffix = before, suffix + self.core = geometry.raw.times_small(geometry.columns, geometry.plan.dimension) + unused = geometry.raw.subtract_exact(parent_size, self.core) + self.extra = geometry.raw.times_small(unused, 2) + geometry.index.free(unused) + self.total = geometry.raw.times_small(parent_size, 2) + + def physical(self, position): + if self.geometry.raw.compare(position, self.core) < 0: + return self.geometry.index.copy(position) + return self.geometry.plus(position, self.extra) + + def extents(self, first, second=None): + g = self.geometry + a = self.physical(first) + b = self.physical(second) if second is not None else None + if b is not None: + need(g.raw.compare(a, b) < 0, "ordered stream atoms") + pre, tail = Natural(self.before), Natural(self.suffix) + multiply_atom_power(pre, a, self.ring, self.q) + after = g.raw.subtract_exact(self.total, a if b is None else b) + count = g.raw.subtract_exact(after, g.one) + multiply_atom_power(tail, count, self.ring, self.q) + g.index.free_many(after, count) + values = [pre] + if b is not None: + distance = g.raw.subtract_exact(b, a) + gap = g.raw.subtract_exact(distance, g.one) + middle = Natural() + multiply_atom_power(middle, gap, self.ring, self.q) + values.append(middle) + g.index.free_many(distance, gap, b) + values.append(tail) + g.index.free(a) + result = [value.marginal() for value in values] + for value in values: + value.close() + return result + + def close(self): + self.geometry.index.free_many(self.core, self.extra, self.total) + + +def action(source, event, layout, coefficient, payload_factory=None): + """One full primitive pass; split and merge each request a coefficient.""" + if event.kind == "add": + extents = layout.extents(event.second, event.first) + elif event.kind == "atom_swap": + extents = layout.extents(event.first, event.second) + else: + need(event.kind == "sign", "stream primitive tag") + extents = layout.extents(event.first) + try: + if event.kind == "add": + kwargs = {} if payload_factory is None else {"payload_factory": payload_factory} + output, _traffic = add_pass(source, layout.ring, *extents, + lambda: coefficient(event.request), **kwargs) + return output + if event.kind == "atom_swap": + return atom_swap(source, layout.ring, layout.q, *extents) + return sign_address(source, layout.ring, layout.q, *extents) + finally: + for extent in extents: + extent.close() + + +def run(source, geometry, parent_size, ring, q, before, suffix, coefficient, + payload_factory=None): + layout = Layout(geometry, parent_size, ring, q, before, suffix) + current, active = source, None + try: + for event in execute(geometry): + if event.kind == "enter": + need(active is None and event.parent_identity is geometry.parent_identity, + "one complete child invocation") + active = event + continue + if event.kind == "return": + need(active is not None and active.parent_identity is event.parent_identity + and active.source_code == event.source_code and active.child_kind == event.child_kind + and active.half == event.half, + "same symbolic child return") + for a, b in ((active.first, event.first), (active.second, event.second), + (active.width, event.width), (active.depth, event.depth)): + need(geometry.raw.compare(a, b) == 0, "restored encoded child context") + active = None + continue + following = action(current, event, layout, coefficient, payload_factory) + if current is not source: + current.clear() + current = following + need(active is None, "closed stream child invocation") + return current + finally: + layout.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/trace.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/trace.py new file mode 100644 index 0000000000..bb845a90f5 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/trace.py @@ -0,0 +1,167 @@ +"""One encoded-index trace for algebra observation and stream interpretation. + +The iterator lends each emitted word until the next iteration. A child +extension always refers to the unchanged parent program and current raw slot. +""" +from dataclasses import dataclass, replace + +from plan import Request +from words import need + + +@dataclass +class Event: + kind: str + first: object + second: object = None + request: object = None + width: object = None + depth: object = None + child_kind: str = "" + field: int = 0 + reverse: bool = False + source_code: int = 0 + parent_identity: object = None + half: bool = False + + +def columns(page, reverse=False): + j = page.raw.subtract_exact(page.columns, page.one) if reverse else page.index.zero() + try: + while page.raw.compare(j, page.columns) < 0: + yield j + if reverse: + if j.zero(): + break + previous = page.raw.subtract_exact(j, page.one) + page.index.free(j) + j = previous + else: + page.raw.increment_in_place(j) + finally: + page.index.free(j) + + +def primitive(kind, first, second, request, page): + try: + yield Event(kind, first, second, request) + finally: + page.index.free(first) + if second is not None: + page.index.free(second) + if request is not None: + page.index.free(request.coordinate) + + +def leaf(page, first, second, width, kind, field=0, reverse=False, half=False): + need(not width.zero() and page.raw.compare(width, page.leaf_cutoff) < 0, + "completed leaf child below selected cutoff") + depth = page.plus(page.depth, page.one) + boundary = Event("enter", first, second, width=width, depth=depth, + child_kind=kind, field=field, reverse=reverse, + source_code=page.source_code, parent_identity=page.parent_identity, half=half) + try: + yield boundary + i = page.index.zero() + try: + while page.raw.compare(i, width) < 0: + left = page.plus(first, i) + last = page.raw.subtract_exact(width, page.one) + tail = page.raw.subtract_exact(last, i) + right = page.plus(second, tail) + page.index.free_many(last, tail) + try: + # A weighted leaf uses only complete atom swaps, later + # ADDs and one sign. No weighted-swap oracle appears. + for stage in range(8): + a, b = page.index.copy(left), page.index.copy(right) + if stage in (0, 2, 4, 6): + yield from primitive("atom_swap", a, b, None, page) + elif stage == 7: + page.index.free(a) + yield from primitive("sign", b, None, None, page) + else: + request = Request("child", page.index.copy(i), child_kind=kind, + field=field, reverse=reverse, negative_inverse=stage == 3, half=half) + yield from primitive("add", b, a, request, page) + finally: + page.index.free_many(left, right) + page.raw.increment_in_place(i) + finally: + page.index.free(i) + yield replace(boundary, kind="return") + finally: + page.index.free(depth) + + +def child(page, first, second, width, kind, field=0, reverse=False, half=False): + try: + need(page.raw.compare(first, second) < 0, "ordered child chunks") + end = page.plus(first, width) + need(page.raw.compare(end, second) <= 0, "disjoint child chunks") + page.index.free(end) + yield from leaf(page, first, second, width, kind, field, reverse, half) + finally: + page.index.free_many(first, second, width) + + +def pair_command(page, command): + i, k, m = command.target, command.source, page.plan.dimension + need(i < k, "ordered fallback child fields") + same = (i < m) == (k < m) + half, remainder = page.raw.divmod(page.columns, page.two) + page.index.free(remainder) + try: + for stage in range(3): + if stage != 1: + if not same or half.zero(): + continue + first = page.raw.times_small(page.columns, k) + after = page.raw.times_small(page.columns, k+1) + second = page.raw.subtract_exact(after, half) + page.index.free(after) + yield from child(page, first, second, page.index.copy(half), "unit", half=True) + else: + first = page.raw.times_small(page.columns, i) + second = page.raw.times_small(page.columns, k) + kind = command.reference.kind + need(kind in ("unit", "pair"), "selected fallback child kind") + yield from child(page, first, second, page.index.copy(page.columns), + kind, i if kind == "pair" else 0, + i >= m if kind == "pair" else False) + finally: + page.index.free(half) + + +def adapters(page, reverse=False): + # Recreate the finite command iterator for each encoded column. + for j in columns(page, reverse): + commands = reversed(page.plan.commands) if reverse else page.plan.commands + for command in commands: + target, source = page.point(command.target, j), page.point(command.source, j) + request = Request("adapter", page.index.copy(j), command.reference, reverse) + yield from primitive("add", target, source, request, page) + + +def execute(page): + """Expand one complete residual whose children lie below the cutoff.""" + if page.plan.good: + yield from adapters(page) + first = page.index.zero() + second = page.raw.times_small(page.columns, 2*page.plan.dimension-page.plan.rank) + width = page.raw.times_small(page.columns, page.plan.rank) + yield from child(page, first, second, width, "good") + yield from adapters(page, True) + else: + for command in page.plan.commands: + if command.kind == "child": + yield from pair_command(page, command) + else: + for j in columns(page): + target = page.point(command.target, j) + if command.kind == "sign": + yield from primitive("sign", target, None, None, page) + else: + source = page.point(command.source, j) + request = Request("adapter", page.index.copy(j), command.reference) + yield from primitive("add", target, source, request, page) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/words.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/words.py new file mode 100644 index 0000000000..8d4ba37e27 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/vendor/words.py @@ -0,0 +1,415 @@ +"""Binary word tapes; unbounded numerical values stay in tape cells. + +Only zero/one carry states and fixed register/operation tags enter Python +control. Fixture loading/inspection methods are outside measured execution. +The arena bounds the tape inventory by a compile-time register capacity. +""" +ZERO, ONE, LEFT, RIGHT, BLANK = range(5) + + +def need(test, message): + if not test: + raise ValueError(message) + + +class Meter: + __slots__ = ("reads", "writes", "moves", "peak_live", "allocations") + + def __init__(self): + self.reads = self.writes = self.moves = self.peak_live = self.allocations = 0 + + def record(self): + return {name: getattr(self, name) for name in self.__slots__} + + +class Word: + __slots__ = ("arena", "slot", "cells", "head") + + def __init__(self, arena, slot): + self.arena, self.slot = arena, slot + self.cells = bytearray([LEFT] + [BLANK]*(arena.bits+1)) + self.head = 1 + + def read(self): + self.arena.meter.reads += 1 + return self.cells[self.head] + + def write(self, symbol): + need(symbol in (ZERO, ONE, RIGHT, BLANK), "word tape alphabet") + self.arena.meter.writes += 1 + self.cells[self.head] = symbol + + def step(self, direction): + need(direction in (-1, 1), "unit word-head movement") + self.head += direction + need(0 <= self.head < len(self.cells), "local word boundary") + self.arena.meter.moves += 1 + + def rewind(self): + self.step(-1) + while self.read() != LEFT: + self.step(-1) + self.step(1) + + def msb(self): + self.rewind() + while self.read() != RIGHT: + self.step(1) + self.step(-1) + + def zero(self): + self.rewind() + nonzero = False + while True: + bit = self.read() + if bit == RIGHT: + break + need(bit in (ZERO, ONE), "complete binary word") + nonzero = nonzero or bit == ONE + self.step(1) + self.rewind() + return not nonzero + + def erase(self): + self.rewind() + while self.read() != RIGHT: + self.write(BLANK) + self.step(1) + self.write(BLANK) + self.rewind() + + def inspect(self): + """Checker-only decoding; arithmetic code must not call this.""" + need(self.head == 1 and self.cells[-1] == RIGHT, "inspect a restored word") + return sum(bit << i for i, bit in enumerate(self.cells[1:-1])) + + +class Arena: + def __init__(self, bits, capacity=65536): + need(bits >= 2 and capacity > 0, "fixed word context") + self.bits, self.capacity = bits, capacity + self.meter = Meter() + self.words, self.available, self.live = [], [], set() + self.template = Word(self, -1) + self.template.cells[1:-1] = bytes([ZERO])*bits + self.template.cells[-1] = RIGHT + + def zero(self): + if self.available: + slot = self.available.pop() + out = self.words[slot] + else: + slot = len(self.words) + need(slot < self.capacity, "fixed register inventory") + out = Word(self, slot) + self.words.append(out) + need(slot not in self.live, "fresh numerical register") + self.live.add(slot) + self.meter.allocations += 1 + self.meter.peak_live = max(self.meter.peak_live, len(self.live)) + source = self.template + source.rewind() + while source.read() != RIGHT: + need(out.read() == BLANK, "erased register before reuse") + out.write(ZERO) + out.step(1) + source.step(1) + need(out.read() == BLANK, "erased right delimiter cell") + out.write(RIGHT) + out.rewind() + source.rewind() + return out + + def literal(self, value): + """Compile-time literal only; never decode a runtime word here.""" + need(isinstance(value, int) and value >= 0, "unsigned literal") + out = self.zero() + for bit in tuple((value >> i) & 1 for i in range(value.bit_length())): + need(out.read() != RIGHT, "literal fits the fixed word") + out.write(bit) + out.step(1) + out.rewind() + return out + + def input(self, value): + """Fixture-only loading of an encoded input word.""" + return self.literal(value) + + def copy(self, source): + need(source.arena is self, "one word extent") + out = self.zero() + source.rewind() + while source.read() != RIGHT: + out.write(source.read()) + source.step(1) + out.step(1) + out.rewind() + source.rewind() + return out + + def free(self, word): + need(word.arena is self and word.slot in self.live, "owned numerical register") + word.erase() + self.live.remove(word.slot) + self.available.append(word.slot) + + def free_many(self, *words): + for word in words: + self.free(word) + + def rollback(self, protected): + """Erase owned temporary roles on a rejecting path; capacity is fixed.""" + for slot in tuple(self.live): + if slot not in protected: + self.free(self.words[slot]) + for slot in protected: + self.words[slot].rewind() + + +class Unsigned: + def __init__(self, arena): + self.arena = arena + + def compare(self, a, b): + need(a.arena is b.arena is self.arena, "comparison word context") + if a is b: + return 0 + a.rewind() + b.rewind() + state = 0 + while a.read() != RIGHT: + x, y = a.read(), b.read() + need(x in (ZERO, ONE) and y in (ZERO, ONE), "comparison binary digits") + if x != y: + state = 1 if x == ONE else -1 + a.step(1) + b.step(1) + need(b.read() == RIGHT, "equal comparison extents") + a.rewind() + b.rewind() + return state + + def add(self, a, b): + out = self.arena.zero() + a.rewind() + b.rewind() + carry = 0 + while a.read() != RIGHT: + x, y = a.read(), b.read() + total = x+y+carry # Four finite carry states, not word arithmetic. + out.write(total & 1) + carry = total >> 1 + a.step(1) + if b is not a: + b.step(1) + out.step(1) + need(b.read() == RIGHT, "equal addition extents") + a.rewind() + b.rewind() + out.rewind() + return out, carry + + def subtract(self, a, b): + out = self.arena.zero() + a.rewind() + b.rewind() + borrow = 0 + while a.read() != RIGHT: + x, y = a.read(), b.read() + digit = x-y-borrow # One finite borrow bit. + out.write(digit & 1) + borrow = int(digit < 0) + a.step(1) + if b is not a: + b.step(1) + out.step(1) + need(b.read() == RIGHT, "equal subtraction extents") + a.rewind() + b.rewind() + out.rewind() + return out, borrow + + def subtract_exact(self, a, b): + out, borrow = self.subtract(a, b) + need(not borrow, "unsigned subtraction precondition") + return out + + def shift_add_bit(self, a, bit): + need(bit in (ZERO, ONE), "one incoming bit") + out = self.arena.zero() + a.rewind() + carry = bit + while a.read() != RIGHT: + previous = a.read() + out.write(carry) + carry = previous + a.step(1) + out.step(1) + a.rewind() + out.rewind() + need(not carry, "reserved high-bit margin") + return out + + def divmod(self, numerator, denominator): + need(not denominator.zero(), "nonzero binary divisor") + # A zero high bit leaves room for 2*remainder+bit. + denominator.msb() + margin = denominator.read() + denominator.rewind() + need(margin == ZERO, "binary divisor has the high-bit margin") + scan = self.arena.copy(numerator) + quotient, remainder = self.arena.zero(), self.arena.zero() + scan.msb() + quotient.msb() + while scan.read() != LEFT: + shifted = self.shift_add_bit(remainder, scan.read()) + self.arena.free(remainder) + if self.compare(shifted, denominator) >= 0: + remainder = self.subtract_exact(shifted, denominator) + self.arena.free(shifted) + quotient.write(ONE) + else: + remainder = shifted + quotient.write(ZERO) + scan.step(-1) + quotient.step(-1) + scan.step(1) + quotient.step(1) + self.arena.free(scan) + return quotient, remainder + + def times_small(self, a, constant): + """Multiply by a fixed finite matrix/rank label; preserve the word margin.""" + need(0 <= constant <= 128, "finite index multiplier") + result = self.arena.zero() + for bit in tuple((constant >> i) & 1 for i in range(constant.bit_length()-1, -1, -1)): + doubled, carry = self.add(result, result) + need(not carry, "index multiplication margin") + self.arena.free(result) + if bit: + result, carry = self.add(doubled, a) + need(not carry, "index multiplication extent") + self.arena.free(doubled) + else: + result = doubled + return result + + def increment_in_place(self, word): + """Ripple increment for a bounded address counter; restore its head.""" + word.rewind() + while word.read() == ONE: + word.write(ZERO) + word.step(1) + need(word.read() == ZERO, "ripple increment has space") + word.write(ONE) + word.rewind() + + +class Ring: + """Canonical residues modulo an encoded M>1 with one leading zero bit.""" + def __init__(self, modulus): + self.modulus, self.arena = modulus, modulus.arena + self.raw = Unsigned(self.arena) + self.one = self.arena.literal(1) + try: + need(self.raw.compare(modulus, self.one) > 0, "modulus exceeds one") + modulus.msb() + margin = modulus.read() + modulus.step(-1) + significant = modulus.read() + modulus.rewind() + need(margin == ZERO and significant == ONE, "canonical modulus word with one high-bit margin") + except ValueError: + self.arena.free(self.one) + raise + + def close(self): + self.arena.free(self.one) + + def add(self, a, b): + total, carry = self.raw.add(a, b) + need(not carry, "canonical modular addition margin") + if self.raw.compare(total, self.modulus) >= 0: + out = self.raw.subtract_exact(total, self.modulus) + self.arena.free(total) + return out + return total + + def subtract(self, a, b): + if self.raw.compare(a, b) >= 0: + return self.raw.subtract_exact(a, b) + larger, carry = self.raw.add(a, self.modulus) + need(not carry, "canonical modular subtraction margin") + out = self.raw.subtract_exact(larger, b) + self.arena.free(larger) + return out + + def negate(self, a): + zero = self.arena.zero() + out = self.subtract(zero, a) + self.arena.free(zero) + return out + + def multiply(self, a, b): + if a.zero() or b.zero(): + return self.arena.zero() + if self.raw.compare(a, self.one) == 0: + return self.arena.copy(b) + if self.raw.compare(b, self.one) == 0: + return self.arena.copy(a) + scan = self.arena.copy(b) + result = self.arena.zero() + scan.msb() + while scan.read() != LEFT: + doubled = self.add(result, result) + self.arena.free(result) + if scan.read() == ONE: + result = self.add(doubled, a) + self.arena.free(doubled) + else: + result = doubled + scan.step(-1) + scan.step(1) + self.arena.free(scan) + return result + + def inverse(self, a): + """Euclid, with Bezout coefficients reduced modulo M; None for nonunits.""" + r0, r1 = self.arena.copy(self.modulus), self.arena.copy(a) + t0, t1 = self.arena.zero(), self.arena.copy(self.one) + while not r1.zero(): + quotient, r2 = self.raw.divmod(r0, r1) + if self.raw.compare(quotient, self.modulus) >= 0: + reduced = self.raw.subtract_exact(quotient, self.modulus) + self.arena.free(quotient) + quotient = reduced + product = self.multiply(quotient, t1) + t2 = self.subtract(t0, product) + self.arena.free_many(quotient, product, r0, t0) + r0, r1, t0, t1 = r1, r2, t1, t2 + unit = self.raw.compare(r0, self.one) == 0 + self.arena.free_many(r0, r1, t1) + if unit: + return t0 + self.arena.free(t0) + return None + + def literal(self, constant): + """Compile a fixed signed integer through binary modular operations.""" + negative = constant < 0 + magnitude = abs(constant) + result = self.arena.zero() + instructions = tuple((magnitude >> i) & 1 for i in range(magnitude.bit_length()-1, -1, -1)) + for bit in instructions: + doubled = self.add(result, result) + self.arena.free(result) + if bit: + result = self.add(doubled, self.one) + self.arena.free(doubled) + else: + result = doubled + if negative: + out = self.negate(result) + self.arena.free(result) + result = out + return result diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/verify.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/verify.py new file mode 100644 index 0000000000..121acc1ff1 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/predecessor/verify.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Authenticate inputs, replay bounded evidence and compare exact receipts.""" +import argparse +from hashlib import sha256 +import json +from pathlib import Path +import sys + +HERE=Path(__file__).resolve().parent +ROOT=HERE.parents[1] +sys.path[:0]=[str(HERE),str(HERE/"vendor")] + + +def canonical(value): + # Normalize integer dictionary keys before ordering the serialized receipt. + return json.dumps(json.loads(json.dumps(value)),sort_keys=True,separators=(",",":")) + + +def main(): + parser=argparse.ArgumentParser() + parser.add_argument("--suite",choices=("source","node","controls"),required=True) + parser.add_argument("--emit",action="store_true") + args=parser.parse_args() + sources=json.loads((HERE/"SOURCES.json").read_text()) + for item in sources["files"]: + if item["usage"]=="input" and sha256((ROOT/item["path"]).read_bytes()).hexdigest()!=item["sha256"]: + raise ValueError("pinned main input changed: "+item["path"]) + for item in sources["vendor_files"]: + if sha256((HERE/"vendor"/item["name"]).read_bytes()).hexdigest()!=item["sha256"]: + raise ValueError("unchanged predecessor source changed: "+item["name"]) + if args.suite=="source": + from catalogue import Catalogue + from check_sources import catalogue_checks, consumer_probes, global_scalar + from check_layout import extents, selected_peel, complete_gapped + from check_headers import sampled_packet + catalogue=Catalogue(3) + result={"selected_sources":catalogue_checks(catalogue), + "selected_consumers":consumer_probes(catalogue), + "global_scalar":global_scalar(catalogue),"gapped_extents":extents(), + "generated_peel":selected_peel(catalogue),"gapped_endpoint":complete_gapped(), + "sampled_high_packet":sampled_packet()} + elif args.suite=="node": + from check_runtime import complete_node + result=complete_node() + else: + from control_checks import stale_controls, bridge_and_exchange, rejections_and_counts + result={"stale_state":stale_controls(),"bridge_exchange":bridge_and_exchange(), + "rejections_counts":rejections_and_counts()} + observed={"full_result_sha256":sha256(canonical(result).encode()).hexdigest(),"result":result} + if not args.emit: + expected=json.loads((HERE/"RESULT.json").read_text())[args.suite] + if canonical(observed)!=canonical(expected): + print(json.dumps(observed,sort_keys=True,indent=2)) + raise ValueError("retained exact receipt differs: "+args.suite) + print("PASS_SELECTED_BIT_NODE "+args.suite) + print(json.dumps(observed,sort_keys=True,indent=2)) + + +if __name__=="__main__": + main() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/recursive_call.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/recursive_call.py new file mode 100644 index 0000000000..6d33224145 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/recursive_call.py @@ -0,0 +1,110 @@ +"""Complete generated child on one packet, with separately charged frame work. + +The parent's frozen fields are the child's old directory. The unused U +coordinate alone supplies fresh rows; address spectators are never borrowed. +""" +from cardinal_counts import Count +from children import extend +from controller import Callback +from directory import Context, append_tape +from packet import read_prefix +from plan import Request +from records import Fields, Program +from words import Arena, RIGHT, Ring, Unsigned, need + +REGISTER_CAPACITY=1 << 24 + + +def copy_word(source,arena): + """Copy an encoded value to a separate frame bank without decoding it.""" + out=arena.zero() + source.rewind() + try: + while source.read()!=RIGHT: + need(out.read()!=RIGHT,"equal frame word extents") + out.write(source.read());source.step(1);out.step(1) + need(out.read()==RIGHT,"complete frame word copy") + out.rewind();return out + except ValueError: + arena.free(out);raise + finally:source.rewind() + + +class Frame: + def __init__(self,parent,program,event): + # bits describes the existing physical word template, not a decoded + # width, residue or address. Both frames have identical templates. + self.arena=Arena(parent.context.arena.bits,REGISTER_CAPACITY) + self.indices=Arena(parent.indices.bits,REGISTER_CAPACITY) + self.modulus=self.ring=self.context=self.program=self.size=self.depth=self.node=None + try: + self.modulus=copy_word(parent.context.ring.modulus,self.arena) + self.ring=Ring(self.modulus) + self.context=Context(self.ring,parent.context.codes) + self.program=Program(self.indices,self.arena,program.code_bits) + append_tape(program.tape,self.program.tape);self.program.tape.rewind() + self.size=copy_word(event.width,self.indices) + self.depth=copy_word(event.depth,self.indices) + from node import SelectedNode + self.node=SelectedNode(self.context,self.indices,self.program,self.size,self.depth, + parent.specifications.catalogue,parent.specifications) + except BaseException: + # The caller cannot close a constructor that never returned. + # These are fresh, separate banks, so every remaining word belongs + # to this failed frame, including partial child initialization. + if self.program is not None:self.program.tape.clear() + if self.context is not None:self.context.close() + if self.ring is not None:self.ring.close() + self.indices.rollback(frozenset()) + self.arena.rollback(frozenset()) + raise + + def close(self): + self.program.tape.clear() + self.indices.free_many(self.size,self.depth) + self.context.close();self.ring.close();self.arena.free(self.modulus) + need(not self.indices.live and not self.arena.live,"recursive frame numerical restoration") + + +def child_call(parent,source,event,layout,directory,prefixes,fields,stock,before): + need(stock is not None and before is not None,"independent child row-stock and spectators") + context,indices=parent.context,parent.indices + need(event.parent_identity is parent.program and event.source_code==layout.geometry.source_code, + "recursive call belongs to the frozen parent") + raw=Unsigned(indices) + need(raw.compare(event.width,parent.parent_size)<0,"strict recursive contraction") + extents=layout.child_extents(event.first,event.second,event.width,before=before) + extended=frame=callback=result=None + returned=False + first=None + try: + directory.rewind();first=read_prefix(directory,fields);directory.rewind() + prefix=Fields(indices,context.arena,context.codes.bits);prefix.tape=first + callback=Callback(context.ring,indices,parent.program,prefix,parent.specifications, + event.source_code,allow_fallback=True) + zero=indices.zero() + try: + request=Request("child",zero,child_kind=event.child_kind,field=event.field, + reverse=event.reverse,half=event.half) + extended=extend(callback,request) + finally:indices.free(zero) + callback.close();callback=None + # Descriptor depends only on ancestor program and the finite branch; + # the representative high prefix is not used to pick children. + frame=Frame(parent,extended,event) + extended.tape.clear();extended=None + first.clear();first=None + from scheduler import Invocation + result=yield Invocation(frame.node.run_generator(source,directory,prefixes,stock,*extents)) + need(source.head==result.head==directory.head==parent.program.tape.head==1, + "completed recursive return restores caller heads") + returned=True + return result + finally: + if result is not None and result is not source and not returned:result.clear() + if callback is not None:callback.abort() + if frame is not None:frame.close() + if extended is not None:extended.tape.clear() + if first is not None:first.clear() + for extent in extents:extent.close() + directory.rewind();source.rewind();parent.program.tape.rewind() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/scheduler.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/scheduler.py new file mode 100644 index 0000000000..60c2b6d065 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/scheduler.py @@ -0,0 +1,28 @@ +"""Iterative evaluator: child depth does not consume the Python call stack.""" +from dataclasses import dataclass +from types import GeneratorType +from words import need + +@dataclass +class Invocation: + body: object + +def complete(body): + need(isinstance(body,GeneratorType),"a suspended stream program") + stack=[body] + value=None + try: + while stack: + try: + request=stack[-1].send(value) + except StopIteration as done: + stack.pop() + value=done.value + continue + need(isinstance(request,Invocation) and isinstance(request.body,GeneratorType), + "only a complete child invocation may suspend the caller") + stack.append(request.body) + value=None + return value + finally: + for pending in reversed(stack): pending.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/stream_runner.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/stream_runner.py new file mode 100644 index 0000000000..6ba5df130b --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/stream_runner.py @@ -0,0 +1,113 @@ +"""Interpret the shared trace on a complete Boolean fibre for one prefix. + +Coefficient requests remain symbolic until a pass reads its exact raw prefix. +All physical atom positions and spectator cardinalities remain binary. +""" +from bitstream import atom_swap +from linear_sign import sign_address +from cardinality import Natural, multiply_atom_power +from stream import add_pass, positive_extent +from trace import execute +from words import need + + +class Layout: + def __init__(self, geometry, parent_size, ring, q, before, suffix): + positive_extent(before) + positive_extent(suffix) + self.geometry, self.ring, self.q = geometry, ring, q + self.before, self.suffix = before, suffix + self.core = geometry.raw.times_small(geometry.columns, geometry.plan.dimension) + unused = geometry.raw.subtract_exact(parent_size, self.core) + self.extra = geometry.raw.times_small(unused, 2) + geometry.index.free(unused) + self.total = geometry.raw.times_small(parent_size, 2) + + def physical(self, position): + if self.geometry.raw.compare(position, self.core) < 0: + return self.geometry.index.copy(position) + return self.geometry.plus(position, self.extra) + + def extents(self, first, second=None): + g = self.geometry + a = self.physical(first) + b = self.physical(second) if second is not None else None + if b is not None: + need(g.raw.compare(a, b) < 0, "ordered stream atoms") + pre, tail = Natural(self.before), Natural(self.suffix) + multiply_atom_power(pre, a, self.ring, self.q) + after = g.raw.subtract_exact(self.total, a if b is None else b) + count = g.raw.subtract_exact(after, g.one) + multiply_atom_power(tail, count, self.ring, self.q) + g.index.free_many(after, count) + values = [pre] + if b is not None: + distance = g.raw.subtract_exact(b, a) + gap = g.raw.subtract_exact(distance, g.one) + middle = Natural() + multiply_atom_power(middle, gap, self.ring, self.q) + values.append(middle) + g.index.free_many(distance, gap, b) + values.append(tail) + g.index.free(a) + result = [value.marginal() for value in values] + for value in values: + value.close() + return result + + def close(self): + self.geometry.index.free_many(self.core, self.extra, self.total) + + +def action(source, event, layout, coefficient, payload_factory=None): + """One full primitive pass; split and merge each request a coefficient.""" + if event.kind == "add": + extents = layout.extents(event.second, event.first) + elif event.kind == "atom_swap": + extents = layout.extents(event.first, event.second) + else: + need(event.kind == "sign", "stream primitive tag") + extents = layout.extents(event.first) + try: + if event.kind == "add": + kwargs = {} if payload_factory is None else {"payload_factory": payload_factory} + output, _traffic = add_pass(source, layout.ring, *extents, + lambda: coefficient(event.request), **kwargs) + return output + if event.kind == "atom_swap": + return atom_swap(source, layout.ring, layout.q, *extents) + return sign_address(source, layout.ring, layout.q, *extents) + finally: + for extent in extents: + extent.close() + + +def run(source, geometry, parent_size, ring, q, before, suffix, coefficient, + payload_factory=None): + layout = Layout(geometry, parent_size, ring, q, before, suffix) + current, active = source, None + try: + for event in execute(geometry): + if event.kind == "enter": + need(active is None and event.parent_identity is geometry.parent_identity, + "one complete child invocation") + active = event + continue + if event.kind == "return": + need(active is not None and active.parent_identity is event.parent_identity + and active.source_code == event.source_code and active.child_kind == event.child_kind + and active.half == event.half, + "same symbolic child return") + for a, b in ((active.first, event.first), (active.second, event.second), + (active.width, event.width), (active.depth, event.depth)): + need(geometry.raw.compare(a, b) == 0, "restored encoded child context") + active = None + continue + following = action(current, event, layout, coefficient, payload_factory) + if current is not source: + current.clear() + current = following + need(active is None, "closed stream child invocation") + return current + finally: + layout.close() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/trace.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/trace.py new file mode 100644 index 0000000000..4b002201ce --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/trace.py @@ -0,0 +1,184 @@ +"""One encoded-index trace for algebra observation and stream interpretation. + +The iterator lends each emitted word until the next iteration. A child +extension always refers to the unchanged parent program and current raw slot. +""" +from dataclasses import dataclass, replace + +from plan import Request +from words import need + + +@dataclass +class Event: + kind: str + first: object + second: object = None + request: object = None + width: object = None + depth: object = None + child_kind: str = "" + field: int = 0 + reverse: bool = False + source_code: int = 0 + parent_identity: object = None + half: bool = False + + +def columns(page, reverse=False): + j = page.raw.subtract_exact(page.columns, page.one) if reverse else page.index.zero() + try: + while page.raw.compare(j, page.columns) < 0: + yield j + if reverse: + if j.zero(): + break + previous = page.raw.subtract_exact(j, page.one) + page.index.free(j) + j = previous + else: + page.raw.increment_in_place(j) + finally: + page.index.free(j) + + +def primitive(kind, first, second, request, page): + try: + yield Event(kind, first, second, request) + finally: + page.index.free(first) + if second is not None: + page.index.free(second) + if request is not None: + page.index.free(request.coordinate) + + +def leaf(page, first, second, width, kind, field=0, reverse=False, half=False): + need(not width.zero() and page.raw.compare(width, page.leaf_cutoff) < 0, + "completed leaf child below selected cutoff") + depth = page.plus(page.depth, page.one) + boundary = Event("enter", first, second, width=width, depth=depth, + child_kind=kind, field=field, reverse=reverse, + source_code=page.source_code, parent_identity=page.parent_identity, half=half) + try: + yield boundary + i = page.index.zero() + try: + while page.raw.compare(i, width) < 0: + left = page.plus(first, i) + last = page.raw.subtract_exact(width, page.one) + tail = page.raw.subtract_exact(last, i) + right = page.plus(second, tail) + page.index.free_many(last, tail) + try: + # A weighted leaf uses only complete atom swaps, later + # ADDs and one sign. No weighted-swap oracle appears. + for stage in range(8): + a, b = page.index.copy(left), page.index.copy(right) + if stage in (0, 2, 4, 6): + yield from primitive("atom_swap", a, b, None, page) + elif stage == 7: + page.index.free(a) + yield from primitive("sign", b, None, None, page) + else: + request = Request("child", page.index.copy(i), child_kind=kind, + field=field, reverse=reverse, negative_inverse=stage == 3, half=half) + yield from primitive("add", b, a, request, page) + finally: + page.index.free_many(left, right) + page.raw.increment_in_place(i) + finally: + page.index.free(i) + yield replace(boundary, kind="return") + finally: + page.index.free(depth) + + +def child(page, first, second, width, kind, field=0, reverse=False, half=False): + try: + need(page.raw.compare(first, second) < 0, "ordered child chunks") + end = page.plus(first, width) + need(page.raw.compare(end, second) <= 0, "disjoint child chunks") + page.index.free(end) + need(not width.zero(), "positive complete child invocation") + if page.raw.compare(width, page.leaf_cutoff) < 0: + yield from leaf(page, first, second, width, kind, field, reverse, half) + else: + # Borrow the same encoded boundary until the caller resumes this + # generator after one whole-packet recursive return. Never loop + # over exposed high-prefix values to invoke separate children. + depth = page.plus(page.depth, page.one) + boundary = Event("enter", first, second, width=width, depth=depth, + child_kind=kind, field=field, reverse=reverse, + source_code=page.source_code, + parent_identity=page.parent_identity, half=half) + try: + yield boundary + yield replace(boundary, kind="invoke") + yield replace(boundary, kind="return") + finally: + page.index.free(depth) + finally: + page.index.free_many(first, second, width) + + +def pair_command(page, command): + i, k, m = command.target, command.source, page.plan.dimension + need(i < k, "ordered fallback child fields") + same = (i < m) == (k < m) + half, remainder = page.raw.divmod(page.columns, page.two) + page.index.free(remainder) + try: + for stage in range(3): + if stage != 1: + if not same or half.zero(): + continue + first = page.raw.times_small(page.columns, k) + after = page.raw.times_small(page.columns, k+1) + second = page.raw.subtract_exact(after, half) + page.index.free(after) + yield from child(page, first, second, page.index.copy(half), "unit", half=True) + else: + first = page.raw.times_small(page.columns, i) + second = page.raw.times_small(page.columns, k) + kind = command.reference.kind + need(kind in ("unit", "pair"), "selected fallback child kind") + yield from child(page, first, second, page.index.copy(page.columns), + kind, i if kind == "pair" else 0, + i >= m if kind == "pair" else False) + finally: + page.index.free(half) + + +def adapters(page, reverse=False): + # Recreate the finite command iterator for each encoded column. + for j in columns(page, reverse): + commands = reversed(page.plan.commands) if reverse else page.plan.commands + for command in commands: + target, source = page.point(command.target, j), page.point(command.source, j) + request = Request("adapter", page.index.copy(j), command.reference, reverse) + yield from primitive("add", target, source, request, page) + + +def execute(page): + """Expand a residual and yield opaque complete internal child calls.""" + if page.plan.good: + yield from adapters(page) + first = page.index.zero() + second = page.raw.times_small(page.columns, 2*page.plan.dimension-page.plan.rank) + width = page.raw.times_small(page.columns, page.plan.rank) + yield from child(page, first, second, width, "good") + yield from adapters(page, True) + else: + for command in page.plan.commands: + if command.kind == "child": + yield from pair_command(page, command) + else: + for j in columns(page): + target = page.point(command.target, j) + if command.kind == "sign": + yield from primitive("sign", target, None, None, page) + else: + source = page.point(command.source, j) + request = Request("adapter", page.index.copy(j), command.reference) + yield from primitive("add", target, source, request, page) diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/caller/verify.py b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/verify.py new file mode 100644 index 0000000000..96be8f5859 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/caller/verify.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python3 +"""Read-only replay, authenticating all external runtime/proof inputs first.""" +import argparse +from copy import deepcopy +from hashlib import sha1, sha256 +import json +from pathlib import Path +import shutil +import sys +from tempfile import TemporaryDirectory + +HERE=Path(__file__).resolve().parent +ROOT=HERE.parents[1] +LIVE_INPUTS=( + 'certificates/selected-result.json', + 'research/community-hyperplane599-audit/pr589/bit589/v9/hosted/GLOBAL-TEMPLATE.json.gz', + 'research/community-hyperplane599-audit/pr589/bit589/v9/nine/GEOMETRY.json', + 'research/e8-bit-p111-tuned/tune/EXPECTED.json', + 'research/e8-bit-p111-tuned/tune/bitE8mut-p111-tuned.json.gz', + 'research/pr589-five-helper-hosting/PROOF.md', + 'research/pr589-five-helper-hosting/verify.py', + 'research/recursive-parking-boundary/README.md', + 'research/selected-bit-local-ring-sweeps/PROOF.md', + 'research/selected-bit-recursive-closure/PROOF.md', + 'upstream/build/sections/02-streams.tex', +) +FROZEN_FILES=( + 'NOTICE.md','PROOF.md','README.md','RESULT.json','SOURCES.json','TASK.json','VERIFY.json', + 'cardinal_counts.py','catalogue.py','check_headers.py','check_layout.py','check_runtime.py', + 'check_sources.py','consumer.py','control.py','control_checks.py','driver.py','fresh_rows.py', + 'layout.py','model.py','node.py','packet_engine.py','peel.py','topology.py', + 'vendor/binding.py','vendor/bitstream.py','vendor/cardinality.py','vendor/check_support.py', + 'vendor/children.py','vendor/controller.py','vendor/counts.py','vendor/directory.py', + 'vendor/episode.py','vendor/forms.py','vendor/low_codes.py','vendor/matrices.py', + 'vendor/numeric.py','vendor/oracle.py','vendor/packet.py','vendor/plan.py','vendor/records.py', + 'vendor/residual.py','vendor/routes.py','vendor/selection.py','vendor/sources.py', + 'vendor/stream.py','vendor/stream_runner.py','vendor/trace.py','vendor/words.py','verify.py', +) +SUITES=('source','node','recursion','nested','controls') +EVIDENCE_FILES={ + 'evidence/pr2731-README.md':'46c0c3554608a1096816ad668c755d3b5b7a8c0b', + 'evidence/pr2708-README.md':'2982489cc00a17bd1c7ee1e206e975eda9bcb64d', + 'evidence/pr2688-PROOF.md':'1b9e1ed8793ffdde3c4b115641f0e644a9289923', + 'evidence/pr2688-NOTICE.md':'1b9e1ed8793ffdde3c4b115641f0e644a9289923', +} + + +def need(condition,message): + if not condition:raise ValueError(message) + + +def canonical(value): + # Preserve JSON scalar types; 1.0 and true must not stand in for integer 1. + return json.dumps(json.loads(json.dumps(value)),sort_keys=True,separators=(',',':'),allow_nan=False) + + +def payload(path): + need(path.is_file() and not path.is_symlink(),'regular pinned file: '+str(path)) + return path.read_bytes() + + +def authenticate(sources=None,predecessor=None,manifest=None,here=HERE,root=ROOT,evidence=None): + sources=json.loads((here/'SOURCES.json').read_text()) if sources is None else sources + predecessor=json.loads((here/'PREDECESSOR.json').read_text()) if predecessor is None else predecessor + manifest=json.loads((here/'VERIFY.json').read_text()) if manifest is None else manifest + evidence=json.loads((here/'EVIDENCE.json').read_text()) if evidence is None else evidence + live=[item for item in sources['files'] if item['usage']=='input'] + need(sorted(item['path'] for item in live)==list(LIVE_INPUTS),'exact live source inventory') + need(sorted(manifest['inputs'])==list(LIVE_INPUTS),'exact replay invalidation inventory') + need(predecessor['head']=='a53fdf4bcbe33c6732f0bec1badc8c023380f9d1','exact executable predecessor') + need(sorted(predecessor['files'])==sorted(FROZEN_FILES),'exact predecessor source inventory') + physical=sorted(str(path.relative_to(here/'predecessor')) + for path in (here/'predecessor').rglob('*') if path.is_file() + and '__pycache__' not in path.parts) + need(physical==sorted(FROZEN_FILES),'no omitted or extra predecessor files') + need(sorted(row['path'] for row in evidence['files'])==sorted(EVIDENCE_FILES), + 'exact predecessor proof inventory') + for row in evidence['files']: + need(row['commit']==EVIDENCE_FILES[row['path']],'exact predecessor proof commit') + for name,item,path in [(item['path'],item,root/item['path']) for item in live]+[ + (name,item,here/'predecessor'/name) for name,item in predecessor['files'].items()]+[ + (item['path'],item,here/item['path']) for item in evidence['files']]: + data=payload(path) + need(sha256(data).hexdigest()==item['sha256'],'pinned bytes changed: '+name) + blob=sha1(b'blob '+str(len(data)).encode()+b'\0'+data).hexdigest() + need(blob==item['git_blob'],'pinned Git blob changed: '+name) + return {'live_inputs':len(live),'frozen_files':len(FROZEN_FILES), + 'frozen_proofs':len(EVIDENCE_FILES),'predecessor_head':predecessor['head']} + + +def receipt(result): + return {'full_result_sha256':sha256(canonical(result).encode()).hexdigest(),'result':result} + + +def compare(observed,expected): + need(canonical(observed)==canonical(expected),'retained exact receipt differs') + + +def verifier_controls(): + sources=json.loads((HERE/'SOURCES.json').read_text()) + frozen=json.loads((HERE/'PREDECESSOR.json').read_text()) + manifest=json.loads((HERE/'VERIFY.json').read_text()) + rejected=[] + def reject(label,action): + try:action() + except ValueError:rejected.append(label) + else:raise ValueError('negative control accepted: '+label) + for name in LIVE_INPUTS: + changed=deepcopy(sources) + changed['files']=[row for row in changed['files'] if row['path']!=name] + reject('omitted_source:'+name,lambda:authenticate(sources=changed)) + changed=deepcopy(manifest);changed['inputs'].pop() + reject('omitted_CI_input',lambda:authenticate(manifest=changed)) + changed=deepcopy(frozen);del changed['files']['vendor/controller.py'] + reject('omitted_executable_predecessor',lambda:authenticate(predecessor=changed)) + changed=json.loads((HERE/'EVIDENCE.json').read_text());changed['files'].pop() + reject('omitted_proof_predecessor',lambda:authenticate(evidence=changed)) + changed=deepcopy(sources) + next(row for row in changed['files'] if row['usage']=='input')['sha256']='0'*64 + reject('wrong_live_hash',lambda:authenticate(sources=changed)) + with TemporaryDirectory(prefix='recursive-caller-source-control-') as temporary: + location=Path(temporary) + shutil.copytree(HERE/'predecessor',location/'predecessor',ignore=shutil.ignore_patterns('__pycache__')) + shutil.copytree(HERE/'evidence',location/'evidence') + shutil.copyfile(HERE/'EVIDENCE.json',location/'EVIDENCE.json') + path=location/'predecessor'/'vendor'/'controller.py' + path.write_bytes(path.read_bytes()+b'\n# deliberate changed executable source\n') + reject('changed_executable_bytes',lambda:authenticate(sources,frozen,manifest,location)) + base=receipt({'integer':1,'flag':True}) + for label,value in [('receipt_wrong_type',{'integer':1.0,'flag':True}), + ('receipt_wrong_value',{'integer':2,'flag':True}), + ('receipt_extra_field',{'integer':1,'flag':True,'extra':0})]: + reject(label,lambda:compare(receipt(value),base)) + changed=deepcopy(base);changed['full_result_sha256']='0'*64 + reject('receipt_wrong_digest',lambda:compare(changed,base)) + return {'rejected':rejected,'before_executable_imports':True,'verification_writes_receipts':False} + + +def evaluate(suite): + import bootstrap + if suite=='source': + from catalogue import Catalogue + from check_sources import catalogue_checks,consumer_probes,global_scalar + from check_layout import extents,selected_peel,complete_gapped + from check_headers import sampled_packet + catalogue=Catalogue(3) + return {'selected_sources':catalogue_checks(catalogue), + 'selected_consumers':consumer_probes(catalogue), + 'global_scalar':global_scalar(catalogue),'gapped_extents':extents(), + 'generated_peel':selected_peel(catalogue),'gapped_endpoint':complete_gapped(), + 'sampled_high_packet':sampled_packet()} + if suite=='node': + from check_runtime import complete_node + return complete_node(gap_size=1) + if suite=='recursion': + from check_recursion import run + return run() + if suite=='nested': + from check_nested_model import run + return run() + from check_sign import run + from control_checks import stale_controls,bridge_and_exchange,rejections_and_counts + return {'linear_sign':run(),'stale_state':stale_controls(), + 'bridge_exchange':bridge_and_exchange(),'rejections_counts':rejections_and_counts(), + 'verifier_mutations':verifier_controls()} + + +def main(): + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--suite',required=True,choices=SUITES) + parser.add_argument('--emit-to',type=Path,help='Explicit generation to a NEW file; never overwrite a retained receipt') + args=parser.parse_args() + need(not sys.flags.optimize,'assertion-based independent checkers require optimization disabled') + if args.emit_to is not None:need(not args.emit_to.exists(),'refuse to overwrite an existing receipt') + authentication=authenticate() + observed=receipt(evaluate(args.suite)) + if args.emit_to is not None: + with args.emit_to.open('x') as handle:json.dump(observed,handle,indent=2,sort_keys=True);handle.write('\n') + print('GENERATED_RECURSIVE_CALLER '+args.suite+' '+str(args.emit_to)) + else: + retained=json.loads((HERE/'RESULT.json').read_text()) + need(sorted(retained)==sorted(SUITES),'exact retained suite inventory') + compare(observed,retained[args.suite]) + print('PASS_SELECTED_BIT_RECURSIVE_CALLER '+args.suite+' '+observed['full_result_sha256']) + return authentication + + +if __name__=='__main__':main() diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/native/bits/stdc++.h b/research/bit-stage-mixedwidth-packing/provider/inputs/native/bits/stdc++.h new file mode 100644 index 0000000000..fc5664e929 --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/native/bits/stdc++.h @@ -0,0 +1,38 @@ +#ifndef PORTABLE_BITS_STDCXX_H +#define PORTABLE_BITS_STDCXX_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif diff --git a/research/bit-stage-mixedwidth-packing/provider/inputs/native/columns_k.cpp b/research/bit-stage-mixedwidth-packing/provider/inputs/native/columns_k.cpp new file mode 100644 index 0000000000..42bb232fbe --- /dev/null +++ b/research/bit-stage-mixedwidth-packing/provider/inputs/native/columns_k.cpp @@ -0,0 +1,62 @@ +// Generalization (Dylan Crow, with Anthropic Claude assistance): the copied-centre count is the macro NCOPY, defaulting to +// HDIM, so the unmodified PR #346/#352 build (no -DNCOPY) is exactly the original checker. The E8 bit word has 9 +// retained totals at h = 8 (-DNCOPY=9). +// Bridged word B_K (DaysSky, assisted with Claude): the macro KPAIRS (default 2) sets the number of bank pairs; the +// schedule, the twin bridges and the terminal exchange are generated from PR #363's bridged.py rule: +// stage 0,1,2 pair 1 forward/backward/forward; stage 2p-1, 2p pair p backward/forward (p = 2..K); +// after stage 2p-3: X(p-1) += Xp, Yp -= Y(p-1); after stage 2p-2: Yp += Y(p-1), X(p-1) -= Xp; +// after the last stage, for p = K..2: Y(p-1) -= Yp, Xp += X(p-1). +// KPAIRS = 2 reproduces the original five-stage tables and receipt (checked in verify.sh); KPAIRS = 3 is seven stages. +#ifndef NCOPY +#define NCOPY HDIM +#endif +#ifndef KPAIRS +#define KPAIRS 2 +#endif +#include "json.hpp" +#include +#include +using boost::multiprecision::cpp_int; +#include +#include +#include +#include +#include +#include +#include +using J=nlohmann::json; +struct E{int kind,dst,src,c;}; +void need(bool x,const char*s){if(!x)throw std::runtime_error(s);} +int main(int argc,char**argv){try{ +need(argc==3,"usage RAW6_RECORDS OUTPUT");std::string pre=argv[1];int v=VPORTS,r=RHELP,loc=2*v+r,global=2*KPAIRS*v+r,temp=global;const int S=2*KPAIRS+1; +struct Raw{int op,a,b,c,f,z;};std::ifstream f(pre,std::ios::binary|std::ios::ate);size_t sz=f.tellg();need(sz%sizeof(Raw)==0,"stream alignment");std::vectorp(sz/sizeof(Raw));f.seekg(0);f.read((char*)p.data(),sz);std::vectore;std::mapH;for(auto q:p){if(q.op==0){if(q.f)H[q.f]++;}else if(q.op==1)e.push_back({0,q.a,q.b,q.c});else if(q.op==2){H[q.z]++;e.push_back({1,loc,q.a,0});}else if(q.op==3)e.push_back({2,loc,q.a,0});else need(false,"opcode");} +J prefix=J::array();cpp_int largestF=0,largestB=0;for(int rev=0;rev<2;rev++){std::vectornorms(loc+1,1);cpp_int maxrow=1;bool isopen=false;for(size_t z=0;zmaxrow)maxrow=norms[q.dst];}else if(k==1){need(!isopen,"boundcopy");norms[loc]=norms[q.src];isopen=true;}else {need(isopen,"bounderase");norms[loc]=0;isopen=false;}}need(!isopen,"prefix copy closure");if(rev)largestB=maxrow;else largestF=maxrow;prefix.push_back({{"reverse",bool(rev)},{"cancellation_free_signed_row_l1_upper",maxrow.convert_to()},{"bits",boost::multiprecision::msb(maxrow)+1}});} +cpp_int payload=64*largestF*largestF*largestF*largestB*largestB;need(payload<(cpp_int(1)<<104),"payloadfiniteprefix2^104"); +long long copies=0,adds=0,odd=0;bool open=false;int center=-1;long long reverseCopies=0; +for(auto q:e){need(q.kind>=0&&q.kind<=2,"kind");need(q.dst>=0&&q.dst<=loc,"local dst");if(q.kind==0){need(q.src>=0&&q.src<=loc&&q.dst!=q.src,"source distinct");need(q.dst!=loc,"copy immutable");need(q.src!=loc||open,"temp not open");if(open)need(q.dst!=center,"source changes inside copied-center block");adds++;odd+=q.c&1;} +else if(q.kind==1){need(!open&&q.dst==loc&&q.src>=0&&q.src>active;std::vectorbackward;std::vector>>after(S); +auto X=[](int p){return 2*(p-1);};auto Y=[](int p){return 2*(p-1)+1;}; +for(int t=0;t=3&&t%2==1);backward.push_back(b);active.push_back(b?std::array{Y(p),X(p)}:std::array{X(p),Y(p)});} +for(int q=2;q<=KPAIRS;q++){after[2*q-3].push_back({X(q-1),X(q),1});after[2*q-3].push_back({Y(q),Y(q-1),-1}); + after[2*q-2].push_back({Y(q),Y(q-1),1});after[2*q-2].push_back({X(q-1),X(q),-1});} +for(int p=KPAIRS;p>=2;p--){after[S-1].push_back({Y(p-1),Y(p),-1});after[S-1].push_back({X(p),X(p-1),1});} +int nbridges=0;for(auto&a:after)nbridges+=a.size();need(nbridges==6*(KPAIRS-1),"twin bridge count"); +size_t words=(global+63)/64;std::vectora((size_t)(global+1)*words);auto row=[&](int i){return a.data()+(size_t)i*words;};for(int i=0;i=v&&i<2*v&&w==(size_t)(i-v)/64)want^=1ull<<((i-v)%64);need(x[w]==want,"local defining-decoder full formal column");}}} +for(auto q:after[stage])for(int i=0;i(std::chrono::steady_clock::now()-t0).count()<<"s\n";} +for(int bank=0;bank<2*KPAIRS;bank+=2)for(int i=0;ib(2*KPAIRS);for(int z=0;z<2*KPAIRS;z++)b[z]=1u<()},{"payload_prefix_bits",boost::multiprecision::msb(payload)+1},{"new_Q_categories",{28,29}},{"local_raw_H",H},{"negative_controls",controls},{"seconds",std::chrono::duration(std::chrono::steady_clock::now()-t0).count()}};std::ofstream(argv[2])< +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 12 || NLOHMANN_JSON_VERSION_PATCH != 0 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 12 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_DIAGNOSTIC_POSITIONS + #define JSON_DIAGNOSTIC_POSITIONS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_DIAGNOSTIC_POSITIONS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#ifdef JSON_HAS_CPP_17 + #include // optional +#endif +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2016 - 2021 Evan Nemerson +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_23) && !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus > 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L) + #define JSON_HAS_CPP_23 + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201402L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201103L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = !nlohmann_json_j.is_null() ? nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1) : nlohmann_json_default_obj.v1; + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows calling any std function as if (e.g., with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // size_t + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // numeric_limits +#include // char_traits +#include // tuple +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // random_access_iterator_tag + +// #include + +// #include + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector + + // #include + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template +struct char_traits : std::char_traits +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& +is_complete_type < +detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template