From 444e13cd04a4b1072bbe2470a3699c5eb9b96b08 Mon Sep 17 00:00:00 2001 From: commdata2338 <199849969+commdata2338@users.noreply.github.com> Date: Thu, 15 Oct 2026 02:22:41 -0500 Subject: [PATCH] Research: lower PR #2339's initial T74 prefix with 64 monomial applications Takes PR #2339's native-lowering obligation for the 64 anticipatory frame-zero compensation terms on each 80-alias T74 word. Each source lender supplies two initial corrections; preparing its monomial once, performing both reads and restoring the reference cuts 128 monomial applications to 64, keeps all 64 scalar ADDs and adds no positive-rank recursive children. Both providers and both orientations (forward and ordinary inverse-transpose) are certified on all 512 address columns, with exact Gaussian phases and arbitrary dirty inputs. The scalar bound is 572 real-component primitive passes per invocation and orientation; address gates (CNOT, CZ, Z4) are counted separately. A finite prefix inventory; no optimality claim, supplier or kappa change. Adds research/t74-anticipatory-native-prefix/ only. Submitted by @commdata2338 with substantial AI assistance (OpenAI Codex research and implementation; packaged with Claude Code). Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01X86sCSXdoDd61SDFfC1PKG --- .../EXPECTED.json | 147 +++++++ .../PREFIX.json.gz | Bin 0 -> 11191 bytes .../t74-anticipatory-native-prefix/README.md | 224 +++++++++++ .../SOURCES.json | 36 ++ .../t74-anticipatory-native-prefix/TASK.json | 146 +++++++ .../UPSTREAM.json | 42 ++ .../VERIFY.json | 33 ++ .../t74-anticipatory-native-prefix/emit.py | 171 ++++++++ .../inputs/BORROW-WORD-80base.json.gz | Bin 0 -> 70131 bytes .../inputs/BORROW-WORD-80extra.json.gz | Bin 0 -> 70135 bytes .../inputs/pr2226_operators.py | 140 +++++++ .../notices/PR2226.md | 22 ++ .../notices/PR2269.md | 14 + .../t74-anticipatory-native-prefix/verify.py | 368 ++++++++++++++++++ 14 files changed, 1343 insertions(+) create mode 100644 research/t74-anticipatory-native-prefix/EXPECTED.json create mode 100644 research/t74-anticipatory-native-prefix/PREFIX.json.gz create mode 100644 research/t74-anticipatory-native-prefix/README.md create mode 100644 research/t74-anticipatory-native-prefix/SOURCES.json create mode 100644 research/t74-anticipatory-native-prefix/TASK.json create mode 100644 research/t74-anticipatory-native-prefix/UPSTREAM.json create mode 100644 research/t74-anticipatory-native-prefix/VERIFY.json create mode 100644 research/t74-anticipatory-native-prefix/emit.py create mode 100644 research/t74-anticipatory-native-prefix/inputs/BORROW-WORD-80base.json.gz create mode 100644 research/t74-anticipatory-native-prefix/inputs/BORROW-WORD-80extra.json.gz create mode 100644 research/t74-anticipatory-native-prefix/inputs/pr2226_operators.py create mode 100644 research/t74-anticipatory-native-prefix/notices/PR2226.md create mode 100644 research/t74-anticipatory-native-prefix/notices/PR2269.md create mode 100644 research/t74-anticipatory-native-prefix/verify.py diff --git a/research/t74-anticipatory-native-prefix/EXPECTED.json b/research/t74-anticipatory-native-prefix/EXPECTED.json new file mode 100644 index 0000000000..ba39585815 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/EXPECTED.json @@ -0,0 +1,147 @@ +{ + "prefix_sha256": "7645f5eb268472cd5cb5a3650cb4b5b1ef5840117aeeefaaabad12959d8256b5", + "providers": { + "base": { + "controls_rejected": [ + "wrong global phase", + "wrong permutation", + "wrong address phase gate", + "wrong coefficient sign", + "omitted restoration", + "addition before warp", + "wrong dual conjugation", + "wrong real-component bill", + "uncleared coefficient scratch", + "omitted scalar halving", + "nonzero lender entrance", + "wrong source-to-operator binding" + ], + "operator_count": 32, + "orientations": { + "backward": { + "active_input_columns": 32768, + "address_gate_applications": { + "cnot": 1234, + "cz": 819, + "z4": 158 + }, + "boundary_sha256": "ed39f5aea770b4dab0a7196c652bbcf06a0684c3c00872192b090cf77c475822", + "events": 128, + "monomial_entry_phase_histogram": { + "0": 9984, + "1": 8192, + "2": 6400, + "3": 8192 + }, + "operations": { + "indexed_complex_additions_at_512": 32768, + "monomial_applications": 64, + "moved_address_entries": 31144, + "positive_recursive_children": 0, + "real_component_scalar_primitive_bound": 572, + "scalar_add_macros": 64 + }, + "untouched_input_columns_by_footprint": 286720 + }, + "forward": { + "active_input_columns": 32768, + "address_gate_applications": { + "cnot": 1234, + "cz": 819, + "z4": 158 + }, + "boundary_sha256": "f6e7d8cdf078ceb8bd107c35de88b0cd891878998d0cab3bba36067165c4305d", + "events": 128, + "monomial_entry_phase_histogram": { + "0": 9984, + "1": 8192, + "2": 6400, + "3": 8192 + }, + "operations": { + "indexed_complex_additions_at_512": 32768, + "monomial_applications": 64, + "moved_address_entries": 31144, + "positive_recursive_children": 0, + "real_component_scalar_primitive_bound": 572, + "scalar_add_macros": 64 + }, + "untouched_input_columns_by_footprint": 286720 + } + }, + "recipes_checked_on_512_columns": 128 + }, + "extra": { + "controls_rejected": [ + "wrong global phase", + "wrong permutation", + "wrong address phase gate", + "wrong coefficient sign", + "omitted restoration", + "addition before warp", + "wrong dual conjugation", + "wrong real-component bill", + "uncleared coefficient scratch", + "omitted scalar halving", + "nonzero lender entrance", + "wrong source-to-operator binding" + ], + "operator_count": 32, + "orientations": { + "backward": { + "active_input_columns": 32768, + "address_gate_applications": { + "cnot": 1300, + "cz": 765, + "z4": 162 + }, + "boundary_sha256": "d2ff250e2698b461ee61f5b11a65bdd66d16d0ab78075338b688971ef649a92a", + "events": 128, + "monomial_entry_phase_histogram": { + "0": 9696, + "1": 8192, + "2": 6688, + "3": 8192 + }, + "operations": { + "indexed_complex_additions_at_512": 32768, + "monomial_applications": 64, + "moved_address_entries": 31880, + "positive_recursive_children": 0, + "real_component_scalar_primitive_bound": 572, + "scalar_add_macros": 64 + }, + "untouched_input_columns_by_footprint": 286720 + }, + "forward": { + "active_input_columns": 32768, + "address_gate_applications": { + "cnot": 1300, + "cz": 765, + "z4": 162 + }, + "boundary_sha256": "2a0c7cbcf06944c3d8387254b48d98ad49c4512f132906d011b6dc89328fbb6d", + "events": 128, + "monomial_entry_phase_histogram": { + "0": 9696, + "1": 8192, + "2": 6688, + "3": 8192 + }, + "operations": { + "indexed_complex_additions_at_512": 32768, + "monomial_applications": 64, + "moved_address_entries": 31880, + "positive_recursive_children": 0, + "real_component_scalar_primitive_bound": 572, + "scalar_add_macros": 64 + }, + "untouched_input_columns_by_footprint": 286720 + } + }, + "recipes_checked_on_512_columns": 128 + } + }, + "status": "PASS_T74_ANTICIPATORY_NATIVE_PREFIX", + "upstream_sha256": "687cbdc251d0777458caaa8edeb3d28a1f3df01406a0ba355d52fceefafef6e8" +} diff --git a/research/t74-anticipatory-native-prefix/PREFIX.json.gz b/research/t74-anticipatory-native-prefix/PREFIX.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8bd2b5cec9b617a799fdc111e7ad6e585c1e1aaf GIT binary patch literal 11191 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 PL(`BR<$LLXg7`lGyszsz literal 0 HcmV?d00001 diff --git a/research/t74-anticipatory-native-prefix/README.md b/research/t74-anticipatory-native-prefix/README.md new file mode 100644 index 0000000000..9bd56d0422 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/README.md @@ -0,0 +1,224 @@ +# T74 anticipatory compensation: a grouped native prefix + +**Finite local construction and exact certificate; no new supplier or kappa.** +For both 80-alias words in [PR2339](https://github.com/CrocSwap/integer-mult-bounds/pull/2339), +the 64 initial compensation terms have a phase-correct native implementation +with **64 monomial applications instead of 128**, retaining all 64 scalar ADDs. +It uses no positive-rank recursive child. Both forward and inverse-transpose +prefixes are checked on arbitrary dirty inputs, including all 512 address columns. + +This instantiates a named missing interface in PR2339. The general +warp/add/unwarp expansion, the monomial convention, and the anticipatory +borrowing construction belong to PR2226/PR2269. They are not new here. The +new artifact is the explicit grouped prefix for these changed source words, +its exact serialized phases and address gates, and its complete local operation +inventory. It does not re-audit the remainder of either word. + +**Current cost boundary.** [PR2360](https://github.com/CrocSwap/integer-mult-bounds/pull/2360), +head `16d4ea6c26cd45ebb9301ab90f33a73615627f8d`, reports primitive saving +`b < 0.0016870` for the full 400-helper inventory on unchanged T74 bins. +That pending result is context, not independently replayed here. It prevents +presenting the weaker rank-48 packing relaxation as evidence of a competitive +full inventory. Partial aliases or changed stock require their own whole-width +screen before a full construction effort. This prefix is useful as a concrete +component for such work; no hosted improvement follows from it. + +The claim is in [discussion #2366](https://github.com/CrocSwap/integer-mult-bounds/discussions/2366). + +## Exact boundary and proof + +The scientific input is PR2339 head +`bf1742aee4d855efb8bbd44a8419eddb33a679e5`. Both raw source words are retained +byte for byte under `inputs/`; [UPSTREAM.json](UPSTREAM.json) gives original +paths, commit, Git blobs and SHA256 hashes. Their 32 lenders and 32 target +registers are disjoint and start at frame zero. Each lender supplies exactly +two terms with one fixed operator. All prefix register numbers precede the +first removed helper, so PR2269's native register compaction leaves them +unchanged. + +For a binary invertible nine-by-nine matrix G, use precisely the predecessor's +Gaussian monomial convention + +``` +M = I + G^(-T) G^(-1) over F2 +q_M(y) = sum_i M_ii y_i + 2 sum_{i = i^(q_M(Gx)) |Gx> . +``` + +The binary entries of M in this formula are lifted to 0 or 1. This fixes the +global phase as well as the permutation. The code verifies that convention +directly; unsigned symplectic equality would not suffice. + +Fix a lender z and its two terms `y_j += c_j K z`. Apply K to z once, perform +the two scalar ADDs, then apply K inverse. This restores the arbitrary initial +value of z and gives exactly both desired target updates. Corrections from +different lenders commute: every read is from the lender set and every write +is to the disjoint target set. Grouping by lender is therefore valid even +when different lenders share a target. There are 32 such groups, so 64 +monomial applications replace the inherited termwise expansion's 128. +No minimality among other possible synthesis methods is claimed. + +For inverse transpose, the required map is + +``` +z <- z - sum_j c_j K^T y_j, all y_j unchanged. +``` + +Since K is unitary monomial, `K^(-T) = conjugate(K)`. Apply conjugate(K) to z, +perform `z -= c_j y_j`, then apply `K^T`. The old z contribution is restored +because `K^T conjugate(K) = I`; the desired dual correction remains. In +particular K transpose is **not** K adjoint. The backward prefix changes the +lenders by its prescribed dual shear; it does not restore them to their +original values at this intermediate boundary. + +All intermediate address operations are permutations or Gaussian unit phases. +They preserve the frame-zero contract and have no positive Fourier-rank child. +The certificate gives the retained compiler's monomial serialization and a +literal decomposition into address-coordinate XORs (`cnot`), single-bit +Gaussian phases (`z4`) and two-bit sign phases (`cz`). Each decomposition is +checked on all 512 columns. Thus both the compressed recipe and its expanded +address program are inspectable. + +If the rest of a source word implements its stated map, substituting this +equal prefix preserves that map. This is a conditional substitution argument, +not a new full-word/native/hosting verification. + +## Local bill + +The following counts hold **per invocation and per orientation**. The same +counts apply to forward and backward; their maps are different. + +| Operation | gauge44/base | extra | +|---|---:|---:| +| Scalar ADD macros | 64 | 64 | +| Monomial applications | 64 | 64 | +| Address-coordinate XOR gates | 1,234 | 1,300 | +| Two-bit sign-phase gates | 819 | 765 | +| Single-bit Gaussian-phase gates | 158 | 162 | +| Positive-rank recursive children | 0 | 0 | +| Real-component scalar primitive bound | 572 | 572 | + +The monomial counts are not zero-cost assertions about routing. The address +gate counts explicitly cover that work in the finite nine-bit representation. +They are not a tape running-time bound, a stream-layout proof, or a scalar-ADD +price for every address operation. [EXPECTED.json](EXPECTED.json) also records +the complete entry-phase histogram and moved-address count for each orientation. + +There are 34 coefficients of absolute value one and 30 of absolute value one +half. Each scalar macro uses the inherited owned coefficient-scratch protocol: +clear, read source, optionally halve, signed target accumulation, clear. +These are four or five complex-componentwise operations, hence +`2 * (34*4 + 30*5) = 572` real-component primitive passes. The emitted scalar +lowerings are executed by the checker, including the final scratch clearing. +One coefficient scalar suffices when addresses are processed sequentially; +no additional dirty helper or retained full-array copy is introduced. This +owned scratch is separate from the arbitrary dirty input registers. + +At the tested address size, the scalar stage contains 32,768 indexed complex +additions and at most 292,864 elementary real-component scalar operations +under that protocol. Address routing and phases are the separate rows above. +The full supplier must still account for layout, ownership, precision and the +rest of the word; 572 is not its total overhead. + +## Evidence and reproduction + +Standard-library CPython 3.12.3; no network, optimizer or numpy required: + +```sh +python3 -I -B scripts/research_package.py --package research/t74-anticipatory-native-prefix +``` + +The registered hook checks the complete certificate and controls, then +regenerates all recipes/programs and compares their parsed payloads. To run +the independent checker alone, including from a Git-free package export: + +```sh +python3 -I -O -B research/t74-anticipatory-native-prefix/verify.py +``` + +Expected last line: + +``` +PASS_T74_ANTICIPATORY_NATIVE_PREFIX providers=2 orientations=2 terms=64 monomials=64 scalar_bound=572 controls=24 no_new_kappa +``` + +Registered replay and metadata/pin checks pass. The optimized independent +checker also passes from a read-only Git-free export (12.48 seconds), preserving +all files. Source corruption, changed receipt and occupied-output controls +reject; recompressing the generated certificate preserves acceptance. + +`emit.py` reuses the exact retained Clifford compiler, with its assertions +enabled even under `-O`. `verify.py` imports neither that compiler, the +emitter nor a predecessor checker. It independently inverts the address +permutation, reconstructs M and its phases, decodes serialized monomials, +executes primitive address gates, and replays the complete prefix as sparse +Gaussian linear rows. It compares against the direct forward/transpose block +matrix. Four ungrouped predecessor-style prefixes are positive controls. + +For each provider, 128 recipes are checked on all 512 columns. Each of four +programs explicitly replays 32,768 active complex input columns. The other +286,720 columns belong to 560 untouched registers and remain identity by the +checked event footprint. The scalar scratch is cleared after every macro. +All arithmetic is exact Gaussian integers with common denominator two. + +Twelve rejecting controls per provider cover global phase, permutation, +address-phase gate, coefficient sign, omitted reference restoration, incorrect +gate order, wrong dual conjugation, understated scalar bill, uncleared scratch, +omitted halving, nonzero lender entrance and wrong operator-to-lender binding. +Each must fail at its specified semantic check. The default replay is read-only; +`--out PATH` writes exclusively to a new receipt. Generator output is likewise +exclusive. Regenerated gzip streams are compared by their complete parsed +payload, not their compression headers. + +## Scope and open obligations + +This is a finite native prefix, with a short algebraic grouping/substitution +proof. It does not certify whole-word phases or wrappers, the 44 cleanup +buffers, global owner windows (especially the initial lender reads), idle +refill, a complete moment, recursive precision, all-size addressing, tape +implementation, outer transfer or the selected cold replay. No selected +record or frozen predecessor is changed. The full construction acceptance +gate of the original task card is not claimed. + +The initial planning screen reproduced PR2339's **inherited reported** +call-weighted rank-48 relaxation in +`[873979185987/500000000000000, 69918334879/40000000000000]`. +This was orientation, not a new profile audit. PR2360's stronger whole-helper +screen was found at the next shared-board checkpoint, so no full-inventory +hosting attempt was started. [TASK.json](TASK.json) records selection, +scope refinement and exact contextual predecessors. + +## Open next questions + +1. **Which partial low-alias inventory survives the actual bin stock?** Use + PR2360's whole-width relaxation on a specified subset before native/global + work. The grouped-prefix proof applies to retained lender groups, but this + package does not choose or price a competitive subset. This matters because + the full 32-low-alias stock loses the newer-record cost screen. +2. **Can a surviving subset be spliced into an admitted complete native word?** + First map its chosen initial reads to actual owner lifetimes and integrate + the serialized prefix with the remaining native stages. Then price routing, + scalar work and buffers. The blockers are the selected subset, owner + availability, whole-word checks and a favorable complete invoice. + +## Credit + +Prepared for commdata2338 (@commdata2338), with substantial OpenAI Codex assistance. + +Cinna Davis / @1337isnot1337 (PR2226) supplies anticipatory dirty borrowing, +the K_G convention and its Gaussian checks. Jeremy Kothe (PR2269, head +`b479fc5567bc09ab9185bffe89b62594f36d74e5`) supplies the T74 predecessor, +native warp/add/unwarp expansion and dual convention. Sagar Thakrar (PR2339) +supplies both 80-alias words, their initial corrections and the native-lowering +handoff. This package does not claim those contributions as new. + +Zhihao Chen / icekylinx and the retained PR425/433/531 lineage supply the exact +Clifford compiler; the copy used here has Git blob +`166841a037f069249f6f7f6dedb89248812f59e2`, identical to PR2269's compiler. +Rohan Arun, Ali Romman, DreamingOfClouds and the retained T74/selected lineage +keep their credit. Douglas Colkitt's ceiling engine supplies the planning +screen. Jeremy Diviney (PR2360) supplies the later whole-width cost boundary; +PR2359's raw-word rank audit concerns a different source change. +Original [PR2226](notices/PR2226.md) and [PR2269](notices/PR2269.md) notices +are retained. Apache-2.0. Evidence is author-checked using two code paths by +the same AI-assisted contributor; no independent human or formal review is claimed. diff --git a/research/t74-anticipatory-native-prefix/SOURCES.json b/research/t74-anticipatory-native-prefix/SOURCES.json new file mode 100644 index 0000000000..74c44ce616 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/SOURCES.json @@ -0,0 +1,36 @@ +{ + "schema_version": 1, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", + "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "e8870e5917057d59b730eb14721a778639eca050", + "sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7" + }, + { + "path": "research/frame-sa504/vendor/clifford/clifford_exact.py", + "usage": "input", + "git_blob": "166841a037f069249f6f7f6dedb89248812f59e2", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + { + "path": "research/complex-local-word-ceiling/ceiling.py", + "usage": "input", + "git_blob": "6c0f54527d879396f689523bfde19928a9b6157c", + "sha256": "86a1432870b3b21d8454106ec9162fddc0471472d9214c590a1420f2426cedfc" + }, + { + "path": "research/frame-sa504/code/emit_local.py", + "usage": "input", + "git_blob": "a54170b0023d467be3da1db9d8623ac4665f0afe", + "sha256": "eefc76e0bee003015fe21ac685c2cce658033d5444add404d2d509c7d6f39bac" + } + ] +} diff --git a/research/t74-anticipatory-native-prefix/TASK.json b/research/t74-anticipatory-native-prefix/TASK.json new file mode 100644 index 0000000000..94b132cc24 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/TASK.json @@ -0,0 +1,146 @@ +{ + "schema_version": 1, + "task_id": "complex-new-helper-inventory", + "priority_revision": 4, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "original_card": { + "id": "complex-new-helper-inventory", + "question": "Can a new local cost interface change the deficit-to-recursive-cost ratio beyond current packing?", + "starting_points": [ + "research/complex-local-word-ceiling/README.md", + "research/heterogeneous-owner-assembly/README.md", + "certificates/selected-result.json", + "research/selected-k8-unrestricted-ends/README.md" + ], + "methods": [ + "Propose a changed helper inventory and derive an optimistic exact moment.", + "Design a small completed instance and independently verify its endpoint and rank bill." + ], + "acceptance_gate": "A new physically realizable contract outside the frozen catalogue whose per-call profile, screened with ceiling.ceiling(), beats the selected word's packing ceiling; a lower cap does not establish identical circuitry or order attainable optima, and is insufficient to pass the stronger-budget target under this model.", + "first_step": { + "command": [ + "python3", + "-B", + "research/complex-local-word-ceiling/verify.py" + ], + "expected": "PASS_COMPLEX_LOCAL_WORD_CEILING", + "inspect": "Read the selected word's per-call local profile, its packing ceiling and the lever table; run levers.py for the ideal budget of the lever you target.", + "scope": "Positive control and planning budget only; this is not a new construction or full cold replay." + }, + "first_experiment": "Before any synthesis, write the candidate per-call local profile (and centre charge / unpaid coordinates if changed) and screen it with ceiling.ceiling(); reject it if even the ideal ceiling does not beat the selected word's by your stated margin.", + "bottleneck_link": "Packing of the selected word is capped at +0.87% (ceiling model); only a lower local excess spend or a changed coverage law raises the cap.", + "allowed_variations": [ + "Narrow to one changed boundary or helper type with explicit counts.", + "If the coverage law, template or guard changes, derive an applicable fully charged replacement bound instead of applying the incumbent ceiling outside its scope." + ], + "scope_change_triggers": [ + "Mixing only providers already inside the pinned catalogue.", + "Only changing helper terminal subspaces and monotone frames within the fixed scalar word, entrances and cleanup contract already covered by #1995/#2013." + ], + "overlap_terms": [ + "helper inventory", + "heterogeneous-owner", + "mutable leaver" + ] + }, + "scope_status": "refined", + "actual_scope": "Source-bound exact native initial compensation for both PR2339 T74 80-alias words: 64 terms grouped into 32 lender groups, forward and inverse transpose, exact phases and local scalar/address bill.", + "scope_change_reason": "Take PR2339 native-lowering handoff on the drawn helper-inventory card. This closes one finite prefix interface; the whole supplier acceptance gate remains open. The later PR2360 whole-width cap stops a full-inventory hosting attempt.", + "bottleneck_link": "A changed helper inventory requires a concrete physical implementation of its additional initial reads. This supplies the missing prefix with explicit routing and scalar operations; it does not infer a new moment from a scalar saving.", + "budget_minutes": 60, + "stop_rule": "Stop after the finite prefix and its complete local operation inventory are checked, or on a phase/dirty-state mismatch. Do not attempt whole-inventory hosting after the PR2360 screen.", + "outcome": "completed", + "evidence": "PREFIX.json.gz and EXPECTED.json: both providers, both orientations; 64 monomial applications versus the inherited 128, 64 scalar ADDs, scalar primitive bound572, exact address-gate bills, 24 rejecting controls; no positive recursive child. Full supplier obligations remain open.", + "author": "commdata2338", + "ai_assistance": "Substantial OpenAI Codex assistance in derivation, implementation, checking and writing; no independent human review.", + "open_questions": [ + { + "question": "Which partial low-alias inventory survives the actual T74 bin stock?", + "why_it_matters": "The full400-helper inventory loses the newer-record whole-width screen; native prefix correctness is insufficient.", + "first_step": "Apply PR2360 whole-width relaxation to a declared partial lender subset before synthesis.", + "blocked_by": "No competitive subset or changed stock is selected here." + }, + { + "question": "Can a surviving subset be spliced into an admitted complete native word?", + "why_it_matters": "Owner availability, whole-word phases and full charges are still required for supplier use.", + "first_step": "Bind each initial lender read to actual owner lifetimes and compose the emitted monomial recipes with all remaining native stages.", + "blocked_by": "A surviving subset, owner map, full native replay and favorable completed invoice." + } + ], + "selection": { + "nonce": "f4823b39cf799305bc5def7fbfe81e7b", + "track": "complex-mechanisms", + "scope_key": "5868e5281a1e63d41a22", + "suggestion_taken": "complex-new-helper-inventory", + "passed_over": { + "complex-rank-shape-decoder": "Covered fixed-word/terminal and masked cases; no distinct bounded synthesis identified.", + "p104-side-correction": "Read active chronological 41-contact lift and completed pooled-prefix/relay results; chose a concrete missing interface in the suggested helper-inventory card." + } + }, + "predecessors": [ + { + "pr": 2339, + "head": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "role": "two source words and initial-compensation handoff" + }, + { + "pr": 2269, + "head": "b479fc5567bc09ab9185bffe89b62594f36d74e5", + "role": "native expansion, dual convention, exact compiler" + }, + { + "pr": 2226, + "head": "dacaf3d81f1936bb55b8454b1244e5d014272754", + "role": "anticipatory borrowing and Gaussian monomial convention, retained through PR2339" + }, + { + "pr": 2360, + "head": "16d4ea6c26cd45ebb9301ab90f33a73615627f8d", + "role": "contextual whole-helper cost cap; not independently replayed here" + } + ], + "local_task_card": { + "concrete_object": "All64 initial corrections,32 lenders,512 addresses, two pinned PR2339 providers; source and target sets disjoint at frame zero.", + "method": "Retained exact compiler emission plus independently implemented integer-Gaussian sparse boundary replay and address-gate interpreter.", + "bounded_domain": "Nine address bits, coefficients \u00b11 and \u00b11/2, forward and ordinary inverse transpose; no full supplier search.", + "nearest_overlap": "PR2226/2269 own the generic mechanism; PR2339 owns the words; PR2359 reconstructs different rank ledgers; PR2360 prices unsplit helper widths. This contributes instantiated phase-correct prefix programs, safe grouping and an explicit scalar/address bill.", + "optimistic_budget": "Inherited PR2339 rank48 relaxation was favorable; reproduced bracket [873979185987/500000000000000,69918334879/40000000000000]. PR2360 subsequently supplies a stronger obstruction for unchanged bins. Prefix target is zero additional positive-rank children with explicit finite charges, not an admitted saving.", + "success_evidence": "Exact native equality on every512-address basis column, full active dirty-input replay, direct transpose boundary, ungrouped controls and semantic faults.", + "unrun_obligations": "Full native word/wrappers, cleanup buffers, owner windows, whole-width invoice/moment, precision/tape/all-size/outer transfer, selected cold replay." + }, + "result_kind": "finite native prefix construction and scoped grouping proof", + "claim_url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2366", + "upstream_checkpoint": { + "utc": "2026-10-15T07:02:02Z", + "main": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "priority_revision": 4, + "changes_since_base": [], + "decision": "Continue completed finite prefix; preserve frozen inputs. PR2360 changed the whole-inventory outlook, so no full supplier construction is attempted." + }, + "overlap": { + "checked_utc": "2026-10-15T07:02Z", + "open_prs": { + "fetched_at": "2026-10-15T06:55:23.240869+00:00", + "records": 583, + "complete_pagination": true + }, + "discussions": { + "fetched_at": "2026-10-15T06:57:32.010338+00:00", + "records": 1111, + "complete_pagination": true + }, + "changed_files": { + "fetched_at": "2026-10-15T06:33:04.255876+00:00", + "records": 572, + "complete_pagination": true + }, + "queries": [ + "--task complex-new-helper-inventory", + "2339; anticipatory; native initial prefix", + "--path research/t74-anticipatory-native-prefix/*" + ], + "refined_matches": 42, + "path_matches": 0, + "limitation": "Cached snapshot; no arbitrary-code-diff novelty guarantee. Same-prefix result found only in this claim; PR2360 and PR2363 address whole-width and owner costs." + } +} diff --git a/research/t74-anticipatory-native-prefix/UPSTREAM.json b/research/t74-anticipatory-native-prefix/UPSTREAM.json new file mode 100644 index 0000000000..e2924b75d9 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/UPSTREAM.json @@ -0,0 +1,42 @@ +{ + "schema_version": 1, + "pr": 2339, + "head": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "files": [ + { + "path": "inputs/BORROW-WORD-80base.json.gz", + "origin_path": "research/t74-low-alias-borrowing/words/BORROW-WORD-80base.json.gz", + "commit": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "git_blob": "c5953dfdb0ee9ac0c2c73eb29e320582b4569d2b", + "sha256": "61290abffd8c8225e0abb3958c1506674e256de688fc4cdf358bbe7c981df493" + }, + { + "path": "inputs/BORROW-WORD-80extra.json.gz", + "origin_path": "research/t74-low-alias-borrowing/words/BORROW-WORD-80extra.json.gz", + "commit": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "git_blob": "852868543ed36efa799b3ed6dd76a0442b0d6ff1", + "sha256": "1dd2d6f2ae5b5a27b5f89fb830203f0cca7a78d0323a7845e85e1e80f8f6d1a5" + }, + { + "path": "inputs/pr2226_operators.py", + "origin_path": "research/t74-low-alias-borrowing/vendor/pr2226/operators.py", + "commit": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "git_blob": "5c4fbe8cceedd769a1c367a31cd0beeae2175dc1", + "sha256": "b37b67a04681c776dafcdc6c9af0e8a2dbfa9893b02e0fa2d77ccc9182a87988" + }, + { + "path": "notices/PR2226.md", + "origin_path": "research/t74-low-alias-borrowing/vendor/pr2226/NOTICE.md", + "commit": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "git_blob": "5ea70357a04d083dba066fbc5c809a5736d8edd6", + "sha256": "f1d45d886926915531e3a59968abf0a4c974d7038f869848e71bd3a21b834422" + }, + { + "path": "notices/PR2269.md", + "origin_path": "research/t74-low-alias-borrowing/vendor/pr2269/NOTICE.md", + "commit": "bf1742aee4d855efb8bbd44a8419eddb33a679e5", + "git_blob": "85df87ba4d86954e489a087500c2f10777040f99", + "sha256": "2f1285d52316e8648d62a69a434fcc36db226049a2a6a31edb6b3310084635f3" + } + ] +} diff --git a/research/t74-anticipatory-native-prefix/VERIFY.json b/research/t74-anticipatory-native-prefix/VERIFY.json new file mode 100644 index 0000000000..ffe4bf3fca --- /dev/null +++ b/research/t74-anticipatory-native-prefix/VERIFY.json @@ -0,0 +1,33 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/frame-sa504/vendor/clifford/clifford_exact.py", + "research/complex-local-word-ceiling/ceiling.py", + "research/frame-sa504/code/emit_local.py" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Exact Gaussian recipes and address gates; complete forward/dual dirty prefix; grouped versus ungrouped positive controls;24 semantic rejection controls; complete local bill." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/emit.py" + ], + "timeout_seconds": 120, + "checks": "Regenerate all recipes and programs with pinned exact compiler, compare complete parsed payload." + } + ] +} diff --git a/research/t74-anticipatory-native-prefix/emit.py b/research/t74-anticipatory-native-prefix/emit.py new file mode 100644 index 0000000000..fee5b49391 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/emit.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Emit the source-bound PR2339 initial prefix in the retained native vocabulary. + +The K_G convention and warp/add/unwarp expansion are PR2226 / PR2269 work. +This instantiates the previously unlowered PR2339 initial terms, retains exact +Gaussian phases, and exports their scalar and monomial operation bills. +Prepared for commdata2338 with substantial OpenAI Codex assistance. +""" +import argparse +import gzip +import hashlib +import json +import sys +import types +from fractions import Fraction +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parent.parent +COMPILER = 'research/frame-sa504/vendor/clifford/clifford_exact.py' + + +def load_compiler(): + # The retained compiler uses asserts: preserve its guards even under -O. + module = types.ModuleType('_t74_prefix_clifford') + sys.modules[module.__name__] = module + exec(compile((ROOT / COMPILER).read_bytes(), COMPILER, 'exec', optimize=0), module.__dict__) + return module + + +def conjugate(c, op): + """All K circuits here contain only permutations and Gaussian diagonals.""" + out = c.Op(op.n, c.identity(op.n), []) + for e in op.circuit: + if e[0] == 'P': + gate = c.perm(op.n, e[1]) + elif e[0] == 'D': + gate = c.diag(op.n, e[1], tuple((-a) % 4 for a in e[2])) + else: + raise ValueError('unexpected gate in K_G') + out = out.then(gate) + return out + + +def make_k(c, columns, n): + # Exact PR2269 bw_adapters.Kop convention, credited rather than new. + rows = c.transpose(tuple(columns), n) + gi_cols = c.transpose(c.inv(rows, n), n) + q = tuple((1 << i) ^ sum(c.parity(a & b) << j for j, b in enumerate(gi_cols)) + for i, a in enumerate(gi_cols)) + return c.perm(n, rows).then(c.diag(n, q)) + + +def primitive_bound(q): + """Inherited real-component Horner bound, including private-stream clearing.""" + a, b = abs(q.numerator), q.denominator + if a == 0 or b & (b - 1): + raise ValueError('nonzero dyadic coefficient required') + return 3 + a.bit_length() - 1 + a.bit_count() + b.bit_length() - 1 + + +def address_gates(rec): + """Concrete CNOT / Gaussian-unit-phase decomposition, no Fourier calls.""" + rows = list(rec['matrix_rows']) + n = len(rows) + elimination = [] + for j in range(n): + pivot = next(i for i in range(j, n) if rows[i] >> j & 1) + if pivot != j: + # An address SWAP is explicitly three coordinate XORs. + for target, source in [(j, pivot), (pivot, j), (j, pivot)]: + rows[target] ^= rows[source] + elimination.append(['cnot', target, source]) + for i in range(n): + if i != j and rows[i] >> j & 1: + rows[i] ^= rows[j] + elimination.append(['cnot', i, j]) + if rows != [1 << j for j in range(n)]: + raise ValueError('singular address map') + gates = [['z4', j, a] for j, a in enumerate(rec['linear_Z4']) if a] + gates += [['cz', i, j] for i in range(n) for j in range(i + 1, n) + if rec['quadratic_rows'][i] >> j & 1] + gates += list(reversed(elimination)) + gates += [['x', j] for j in range(n) if rec['offset'] >> j & 1] + if rec['phase']: + gates.append(['phase', rec['phase']]) + return gates + + +def build(): + c = load_compiler() + result = {'schema_version': 1, 'kind': 'PR2339_NATIVE_INITIAL_PREFIX', 'providers': {}} + for provider in ('base', 'extra'): + path = HERE / 'inputs' / f'BORROW-WORD-80{provider}.json.gz' + raw = path.read_bytes() + w = json.loads(gzip.decompress(raw)) + n = w['report']['h'] + terms = w['initial_corrections'] + operators = sorted({x['operator_word'][0] for x in terms}) + recipes = {} + for op in operators: + k = make_k(c, w['warps'][op - 1][2], n) + ck = conjugate(c, k) + for name, physical in [('K', k), ('inverse', k.adjoint()), + ('conjugate', ck), ('transpose', ck.adjoint())]: + rec, _ = c.lower_child(physical) + if rec['rank'] != 0 or rec['right'] is not None: + raise ValueError('initial compensation needs a positive-rank child') + recipes[f'{op}:{name}'] = { + 'monomial': rec['left'], + 'address_gates': address_gates(rec['left']), + } + programs = {} + for backward in (False, True): + stream = [] + for op in operators: + group = [term for term in terms if term['operator_word'] == [op]] + source, = {term['source'] for term in group} + before, after = ('conjugate', 'transpose') if backward else ('K', 'inverse') + stream.append(['monomial', source, f'{op}:{before}']) + for term in group: + t, s, q = term['target'], source, Fraction(term['coefficient']) + if backward: + t, s, q = s, t, -q + stream.append(['scalar', ['add', ['L', t], ['L', s], q.numerator, q.denominator], 0]) + stream.append(['monomial', source, f'{op}:{after}']) + programs['backward' if backward else 'forward'] = stream + result['providers'][provider] = { + 'word_sha256': hashlib.sha256(raw).hexdigest(), + 'address_bits': n, 'operators': operators, 'recipes': recipes, + 'programs': programs, + 'scalar_lowerings': { + str(q): ([['clear'], ['read_source']] + ([['half']] if q.denominator == 2 else []) + + [['write_target', 1 if q > 0 else -1], ['clear']]) + for q in (Fraction(1), Fraction(-1), Fraction(1, 2), Fraction(-1, 2)) + }, + 'bill_per_orientation': { + 'positive_recursive_children': 0, + 'scalar_add_macros': len(terms), + 'monomial_applications': 2 * len(operators), + 'ungrouped_monomial_applications': 2 * len(terms), + 'real_component_scalar_primitive_bound': 2 * sum(primitive_bound(Fraction(t['coefficient'])) for t in terms), + 'scalar_bound_excludes_monomial_routing': True, + 'coefficient_streams_peak': 1, + }, + } + return result + + +def encoded(data): + return json.dumps(data, sort_keys=True, separators=(',', ':')).encode() + b'\n' + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--out', type=Path, help='write exclusively to a new file') + args = parser.parse_args() + data = encoded(build()) + if args.out: + with args.out.open('xb') as f: + f.write(gzip.compress(data, mtime=0) if args.out.suffix == '.gz' else data) + else: + expected = gzip.decompress((HERE / 'PREFIX.json.gz').read_bytes()) + if json.loads(data) != json.loads(expected): + raise ValueError('regenerated prefix differs from the complete certificate') + print('PASS_T74_PREFIX_REGEN providers=2 programs=4 terms_per_program=64') + + +if __name__ == '__main__': + main() diff --git a/research/t74-anticipatory-native-prefix/inputs/BORROW-WORD-80base.json.gz b/research/t74-anticipatory-native-prefix/inputs/BORROW-WORD-80base.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c5953dfdb0ee9ac0c2c73eb29e320582b4569d2b GIT binary patch literal 70131 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
@ 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:out^=c + return out + + +def rank(xs): + b={} + for x in xs: + while x: + i=x.bit_length() + if i not in b:b[i]=x;break + x^=b[i] + return len(b) + + +def extend(xs,h): + out=list(xs) + for i in range(h): + if rank(out+[1<len(out):out.append(1<>i)&1)<>i&1)==(M[i]>>j&1) for i in range(h) for j in range(h)) + perm=np.array([linear(cols,x) for x in range(1<>i)&1)*(x>>i&1) for i in range(h))+ + 2*sum(((M[j]>>i)&1)*(x>>i&1)*(x>>j&1) for i in range(h) for j in range(i+1,h)) + for x in perm],dtype=np.int64)%4 + return perm,phase + + +def apply_mono(z,recipe,sign=1): + re,im,exp=z;perm,phase=recipe;rr=np.empty_like(re);ii=np.empty_like(im) + if sign==1: + for p in range(4): + mask=phase==p;r=re[mask];i=im[mask] + if p==0:a,b=r,i + elif p==1:a,b=-i,r + elif p==2:a,b=-r,-i + else:a,b=i,-r + rr[perm[mask]]=a;ii[perm[mask]]=b + else: + r=re[perm];i=im[perm] + for p in range(4): + mask=phase==p + if p==0:a,b=r[mask],i[mask] + elif p==1:a,b=i[mask],-r[mask] + elif p==2:a,b=-r[mask],-i[mask] + else:a,b=-i[mask],r[mask] + rr[mask]=a;ii[mask]=b + return rr,ii,exp + + +def coord(z,axes,sign=1): + re,im,exp=z + for j in axes: + p=np.array([x for x in range(len(re)) if not(x>>j&1)]);q=p^(1< + explicit chronological word with warps, cold restoration and inverse cleanup). +- `audit_local.py`: independent exact scalar/frame/free-algebra auditor (header credits icekylinx + with OpenAI GPT-6 Astra assistance for the base auditor; BORROW-WORD extension by PR2269). +- `borrow_controls.py`: negative controls for the auditor. + +The mechanism they implement is PR2226 anticipatory dirty borrowing (Cinna Davis, @1337isnot1337, +with OpenAI Codex assistance). Unmodified; git blob ids are pinned in ../../SOURCES-PR.json. diff --git a/research/t74-anticipatory-native-prefix/verify.py b/research/t74-anticipatory-native-prefix/verify.py new file mode 100644 index 0000000000..913d11d2a2 --- /dev/null +++ b/research/t74-anticipatory-native-prefix/verify.py @@ -0,0 +1,368 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Independent exact checker for PR2339's grouped native initial prefix. + +No emitter, Clifford compiler, numpy or predecessor checker is imported. +Arithmetic is integer Gaussian arithmetic with common denominator two. +Prepared for commdata2338 with substantial OpenAI Codex assistance. +""" +import argparse +from collections import Counter +import copy +from fractions import Fraction +import gzip +import hashlib +import json +from pathlib import Path + +HERE = Path(__file__).resolve().parent +N = 512 + + +def require(ok, why): + if not ok: + raise ValueError(why) + + +def sha(data): + return hashlib.sha256(data).hexdigest() + + +def canonical(obj): + return json.dumps(obj, sort_keys=True, separators=(',', ':')).encode() + + +def integer(value, lo, hi): + return type(value) is int and lo <= value < hi + + +def linear(columns, x): + result = 0 + for j, image in enumerate(columns): + if x & (1 << j): + result ^= image + return result + + +def reference_actions(columns): + """K|x> = i^q(Gx)|Gx>; invert G by enumerating its permutation. + + q uses I + G^{-T}G^{-1}, with diagonal coefficients lifted to {0,1} + and off-diagonal coefficients doubled: the PR2226 phase convention. + """ + require(len(columns) == 9 and all(integer(v, 0, N) for v in columns), 'G schema') + perm = [linear(columns, x) for x in range(N)] + require(len(set(perm)) == N, 'G invertibility') + inverse = [0] * N + for x, y in enumerate(perm): + inverse[y] = x + columns_i = [inverse[1 << j] for j in range(9)] + q = [[((columns_i[i] & columns_i[j]).bit_count() & 1) ^ (i == j) + for j in range(9)] for i in range(9)] + phase = [] + for y in perm: + bits = [j for j in range(9) if y >> j & 1] + phase.append((sum(q[j][j] for j in bits) + + 2 * sum(q[i][j] for i in bits for j in bits if i < j)) % 4) + return { + 'K': list(zip(perm, phase)), + 'inverse': [(inverse[y], -phase[inverse[y]] % 4) for y in range(N)], + 'conjugate': [(y, -p % 4) for y, p in zip(perm, phase)], + 'transpose': [(inverse[y], phase[inverse[y]]) for y in range(N)], + } + + +def decode_recipe(rec): + require(set(rec) == {'matrix_rows', 'quadratic_rows', 'linear_Z4', 'offset', 'phase'}, 'recipe fields') + rows, q, a = rec['matrix_rows'], rec['quadratic_rows'], rec['linear_Z4'] + require(len(rows) == len(q) == len(a) == 9, 'recipe dimensions') + require(all(integer(v, 0, N) for v in rows + q), 'recipe binary rows') + require(all(integer(v, 0, 4) for v in a), 'recipe linear phases') + require(integer(rec['phase'], 0, 4) and integer(rec['offset'], 0, N), 'recipe scalar fields') + require(all((q[i] >> j & 1) == (q[j] >> i & 1) for i in range(9) for j in range(9)), 'symmetric Q') + action = [] + for x in range(N): + y = sum(((row & x).bit_count() & 1) << j for j, row in enumerate(rows)) ^ rec['offset'] + p = rec['phase'] + sum(a[j] for j in range(9) if x >> j & 1) + p += 2 * sum(1 for i in range(9) for j in range(i + 1, 9) + if (x >> i & 1) and (x >> j & 1) and (q[i] >> j & 1)) + action.append((y, p % 4)) + require(len({y for y, _ in action}) == N, 'recipe permutation') + return action + + +def decode_gates(gates): + # Phase predicates use the current address, making gate order observable. + for gate in gates: + require(type(gate) is list and gate, 'gate schema') + tag = gate[0] + if tag in ('cnot', 'cz'): + require(len(gate) == 3 and all(integer(v, 0, 9) for v in gate[1:]) + and gate[1] != gate[2], 'two-coordinate gate') + elif tag == 'z4': + require(len(gate) == 3 and integer(gate[1], 0, 9) and integer(gate[2], 1, 4), 'z4 gate') + elif tag == 'x': + require(len(gate) == 2 and integer(gate[1], 0, 9), 'x gate') + elif tag == 'phase': + require(len(gate) == 2 and integer(gate[1], 1, 4), 'global phase gate') + else: + raise ValueError('non-monomial address gate') + action = [] + for x in range(N): + y, p = x, 0 + for gate in gates: + tag = gate[0] + if tag == 'cnot': + y ^= ((y >> gate[2]) & 1) << gate[1] + elif tag == 'cz': + p += 2 * ((y >> gate[1]) & 1) * ((y >> gate[2]) & 1) + elif tag == 'z4': + p += gate[2] * ((y >> gate[1]) & 1) + elif tag == 'x': + y ^= 1 << gate[1] + else: + p += gate[1] + action.append((y, p % 4)) + return action + + +def input_contract(word): + require(word['kind'] == 'BORROW-WORD' and word['report']['h'] == 9 and len(word['ports']) == 112, 'word boundary') + require(len(word['warps']) == 80 and len(word['initial_corrections']) == 64, 'source counts') + require(word['report']['R'] == 480 and len(word['removed']) == len(set(word['removed'])) == 80 + and all(integer(r, 224, 704) for r in word['removed']), '624 live input registers') + terms = word['initial_corrections'] + for t in terms: + require(set(t) == {'target', 'source', 'operator_word', 'coefficient'}, 'term schema') + require(integer(t['target'], 112, 224) and integer(t['source'], 224, 704), 'bipartite initial roles') + require(t['source'] not in word['removed'] and not word['start_extra'].get(str(t['source']), []), 'frame-zero lender') + require(type(t['operator_word']) is list and len(t['operator_word']) == 1 + and integer(t['operator_word'][0], 1, 81), 'one forward operator') + require(word['warps'][t['operator_word'][0] - 1][1] == t['source'], 'operator-to-lender binding') + require(Fraction(t['coefficient']) in (1, -1, Fraction(1, 2), Fraction(-1, 2)), 'coefficient domain') + sources = {t['source'] for t in terms} + targets = {t['target'] for t in terms} + ops = sorted({t['operator_word'][0] for t in terms}) + require(len(sources) == len(targets) == len(ops) == 32, 'active roles') + require(set(Counter(t['operator_word'][0] for t in terms).values()) == {2}, 'two terms per operator') + require(max(sources | targets) < min(word['removed']), 'prefix IDs unchanged by native compaction') + return sorted(sources | targets), ops + + +def rotate(a, p): + r, i = a + return ((r, i), (-i, r), (-r, -i), (i, -r))[p % 4] + + +def accumulate(row, source, numerator, denominator): + for column, (r, i) in source.items(): + require(r * numerator % denominator == i * numerator % denominator == 0, 'common exact denominator') + a, b = row.get(column, (0, 0)) + value = (a + r * numerator // denominator, b + i * numerator // denominator) + if value == (0, 0): + row.pop(column, None) + else: + row[column] = value + + +def identity_state(active): + return {r: [{r * N + x: (2, 0)} for x in range(N)] for r in active} + + +def scalar_macro(row, source, instructions): + # One owned coefficient scalar, reused at successive addresses. It is + # not an arbitrary dirty helper and cannot be retained across macros. + temporary = {} + for e in instructions: + if e == ['clear']: + temporary = {} + elif e == ['read_source']: + accumulate(temporary, source, 1, 1) + elif e == ['half']: + divided = {} + accumulate(divided, temporary, 1, 2) + temporary = divided + elif len(e) == 2 and e[0] == 'write_target' and type(e[1]) is int and e[1] in (-1, 1): + accumulate(row, temporary, e[1], 1) + else: + raise ValueError('unknown scalar primitive') + require(not temporary, 'coefficient scratch not cleared') + + +def replay(program, actions, active, scalar_lowerings): + state = identity_state(active) + for event in program: + require(type(event) is list and event, 'event schema') + if event[0] == 'monomial': + require(len(event) == 3 and event[1] in state and event[2] in actions, 'monomial event') + values = [None] * N + for x, (y, p) in enumerate(actions[event[2]]): + values[y] = {col: rotate(value, p) for col, value in state[event[1]][x].items()} + state[event[1]] = values + elif event[0] == 'scalar': + require(len(event) == 3 and event[2] == 0, 'scalar boundary') + e = event[1] + require(len(e) == 5 and e[0] == 'add' and e[1][0] == e[2][0] == 'L', 'scalar vocabulary') + t, s, a, b = e[1][1], e[2][1], e[3], e[4] + require(t in state and s in state and t != s and type(a) is type(b) is int and b > 0, 'scalar operands') + for row, src in zip(state[t], state[s]): + scalar_macro(row, src, scalar_lowerings[str(Fraction(a, b))]) + else: + raise ValueError('unpriced/unsupported event') + return state + + +def direct_boundary(word, active, refs, backward): + expected = identity_state(active) + for term in word['initial_corrections']: + t, s, op = term['target'], term['source'], term['operator_word'][0] + q = Fraction(term['coefficient']) + for x, (y, p) in enumerate(refs[op]['K']): + unit = rotate((2, 0), p) + if backward: + # Ordinary transpose, NOT conjugate transpose. + accumulate(expected[s][x], {t * N + y: unit}, -q.numerator, q.denominator) + else: + accumulate(expected[t][y], {s * N + x: unit}, q.numerator, q.denominator) + return expected + + +def ungrouped(word, backward): + events = [] + for term in word['initial_corrections']: + t, s, op = term['target'], term['source'], term['operator_word'][0] + q = Fraction(term['coefficient']) + before, after = ('conjugate', 'transpose') if backward else ('K', 'inverse') + events.append(['monomial', s, f'{op}:{before}']) + events.append(['scalar', ['add', ['L', s if backward else t], ['L', t if backward else s], + -q.numerator if backward else q.numerator, q.denominator], 0]) + events.append(['monomial', s, f'{op}:{after}']) + return events + + +def billed(program, recipes, scalar_lowerings): + bill, gates, phases = Counter(), Counter(), Counter() + for e in program: + if e[0] == 'monomial': + bill['monomial_applications'] += 1 + rec = recipes[e[2]] + gates.update(g[0] for g in rec['address_gates']) + action = decode_recipe(rec['monomial']) + bill['moved_address_entries'] += sum(y != x for x, (y, _) in enumerate(action)) + phases.update(str(p) for _, p in action) + else: + bill['scalar_add_macros'] += 1 + q = Fraction(e[1][3], e[1][4]) + bill['real_component_scalar_primitive_bound'] += 2 * len(scalar_lowerings[str(q)]) + bill['positive_recursive_children'] = 0 + bill['indexed_complex_additions_at_512'] = N * bill['scalar_add_macros'] + return {'operations': dict(sorted(bill.items())), 'address_gate_applications': dict(sorted(gates.items())), + 'monomial_entry_phase_histogram': dict(sorted(phases.items()))} + + +def check_provider(word, data, baseline=True): + active, ops = input_contract(word) + require(set(data['scalar_lowerings']) == {'1', '-1', '1/2', '-1/2'}, 'scalar lowering inventory') + require(data['address_bits'] == 9 and data['operators'] == ops, 'operator inventory') + refs = {op: reference_actions(word['warps'][op - 1][2]) for op in ops} + require(set(data['recipes']) == {f'{op}:{name}' for op in ops for name in refs[op]}, 'recipe inventory') + actions = {} + for key, rec in data['recipes'].items(): + op, kind = key.split(':') + action = decode_recipe(rec['monomial']) + require(action == refs[int(op)][kind], 'Gaussian recipe equality: ' + key) + require(decode_gates(rec['address_gates']) == action, 'primitive address equality: ' + key) + actions[key] = action + receipts = {} + for backward in (False, True): + name = 'backward' if backward else 'forward' + stream = data['programs'][name] + actual = replay(stream, actions, active, data['scalar_lowerings']) + expected = direct_boundary(word, active, refs, backward) + require(actual == expected, 'complete arbitrary-input prefix: ' + name) + if baseline: + require(replay(ungrouped(word, backward), actions, active, data['scalar_lowerings']) == expected, 'ungrouped positive control') + bill = billed(stream, data['recipes'], data['scalar_lowerings']) + claimed = data['bill_per_orientation'] + for key in ('positive_recursive_children', 'monomial_applications', 'scalar_add_macros', 'real_component_scalar_primitive_bound'): + require(bill['operations'][key] == claimed[key], 'bill mismatch: ' + key) + require(bill['operations']['monomial_applications'] == 64 and len(stream) == 128, 'grouping count') + require(claimed['ungrouped_monomial_applications'] == 128 and claimed['coefficient_streams_peak'] == 1 + and claimed['scalar_bound_excludes_monomial_routing'] is True, 'bill interpretation') + encoded_rows = [[r, [[[col, *a] for col, a in sorted(row.items())] for row in actual[r]]] for r in active] + receipts[name] = {'events': len(stream), 'active_input_columns': len(active) * N, + 'untouched_input_columns_by_footprint': (624 - len(active)) * N, + 'boundary_sha256': sha(canonical(encoded_rows)), **bill} + return receipts + + +def controls(word, data): + rejected = [] + + def reject(name, reason, alter, use_word=False): + w, d = copy.deepcopy(word), copy.deepcopy(data) + alter(w if use_word else d) + try: + check_provider(w, d, baseline=False) + except ValueError as error: + require(str(error).startswith(reason), 'wrong rejection reason: ' + name + ': ' + str(error)) + rejected.append(name) + else: + raise ValueError('negative control accepted: ' + name) + + key = next(k for k in data['recipes'] if k.endswith(':K')) + reject('wrong global phase', 'Gaussian recipe equality', lambda d: d['recipes'][key]['monomial'].__setitem__('phase', 1)) + reject('wrong permutation', 'Gaussian recipe equality', lambda d: d['recipes'][key]['monomial']['matrix_rows'].reverse()) + reject('wrong address phase gate', 'primitive address equality', lambda d: d['recipes'][key]['address_gates'].insert(0, ['phase', 1])) + reject('wrong coefficient sign', 'complete arbitrary-input prefix', lambda d: d['programs']['forward'][1][1].__setitem__(3, -d['programs']['forward'][1][1][3])) + reject('omitted restoration', 'complete arbitrary-input prefix', lambda d: d['programs']['forward'].pop(3)) + reject('addition before warp', 'complete arbitrary-input prefix', lambda d: d['programs']['forward'].__setitem__(slice(0, 2), list(reversed(d['programs']['forward'][:2])))) + reject('wrong dual conjugation', 'complete arbitrary-input prefix', lambda d: d['programs']['backward'][0].__setitem__(2, d['programs']['backward'][0][2].replace('conjugate', 'K'))) + reject('wrong real-component bill', 'bill mismatch', lambda d: d['bill_per_orientation'].__setitem__('real_component_scalar_primitive_bound', 571)) + reject('uncleared coefficient scratch', 'coefficient scratch not cleared', lambda d: d['scalar_lowerings']['1/2'].pop()) + reject('omitted scalar halving', 'complete arbitrary-input prefix', lambda d: d['scalar_lowerings']['1/2'].remove(['half'])) + first = word['initial_corrections'][0] + reject('nonzero lender entrance', 'frame-zero lender', lambda w: w['start_extra'].__setitem__(str(first['source']), [1]), True) + reject('wrong source-to-operator binding', 'operator-to-lender binding', lambda w: w['initial_corrections'][0].__setitem__('source', word['initial_corrections'][1]['source']), True) + return rejected + + +def verify(): + upstream = json.loads((HERE / 'UPSTREAM.json').read_bytes()) + for record in upstream['files']: + data = (HERE / record['path']).read_bytes() + require(sha(data) == record['sha256'], 'upstream SHA256: ' + record['path']) + blob = hashlib.sha1(b'blob ' + str(len(data)).encode() + b'\0' + data).hexdigest() + require(blob == record['git_blob'], 'upstream Git blob: ' + record['path']) + prefix = json.loads(gzip.decompress((HERE / 'PREFIX.json.gz').read_bytes())) + require(prefix['kind'] == 'PR2339_NATIVE_INITIAL_PREFIX' and prefix['schema_version'] == 1 + and set(prefix['providers']) == {'base', 'extra'}, 'certificate schema') + result = {'status': 'PASS_T74_ANTICIPATORY_NATIVE_PREFIX', 'providers': {}, + 'prefix_sha256': sha(canonical(prefix)), 'upstream_sha256': sha(canonical(upstream))} + for provider in ('base', 'extra'): + raw = (HERE / 'inputs' / f'BORROW-WORD-80{provider}.json.gz').read_bytes() + word = json.loads(gzip.decompress(raw)) + data = prefix['providers'][provider] + require(data['word_sha256'] == sha(raw), 'source word binding') + result['providers'][provider] = { + 'operator_count': 32, 'recipes_checked_on_512_columns': 128, + 'orientations': check_provider(word, data), 'controls_rejected': controls(word, data), + } + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--out', type=Path, help='write receipt exclusively to a new file') + args = parser.parse_args() + result = verify() + if args.out: + with args.out.open('x') as f: + f.write(json.dumps(result, sort_keys=True, indent=2) + '\n') + else: + require(result == json.loads((HERE / 'EXPECTED.json').read_bytes()), 'complete receipt drift') + print('PASS_T74_ANTICIPATORY_NATIVE_PREFIX providers=2 orientations=2 terms=64 monomials=64 scalar_bound=572 controls=24 no_new_kappa') + + +if __name__ == '__main__': + main()