From 364701494bc3d726806a15d4d1d4b547c1e0f9d5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 19 Oct 2026 17:18:48 +1100 Subject: [PATCH] Prove conditional uniform R437 COPY reduction and audit full relative cost --- .../.gitattributes | 2 + .../CALLBACK-PROBE.json | 55 +++ .../COORDINATION.json | 44 +++ .../MINOR-BOUND.json | 66 ++++ .../ORIGINAL-CALLER.md | 212 +++++++++++ research/r437-uniform-copy-reduction/PROOF.md | 346 ++++++++++++++++++ .../r437-uniform-copy-reduction/R437-LICENSE | 201 ++++++++++ .../R437-UPSTREAM-NOTICE.md | 71 ++++ .../r437-uniform-copy-reduction/README.md | 171 +++++++++ .../r437-uniform-copy-reduction/REPLAY.log | 15 + .../r437-uniform-copy-reduction/RESULT.json | 223 +++++++++++ .../SOURCE-BINDING.md | 121 ++++++ .../SOURCE-PLAN.json | 32 ++ .../r437-uniform-copy-reduction/SOURCES.json | 286 +++++++++++++++ .../r437-uniform-copy-reduction/TASK.json | 83 +++++ .../VALIDATION.json | 32 ++ .../r437-uniform-copy-reduction/VERIFY.json | 109 ++++++ .../callback_probe.py | 187 ++++++++++ .../r437-uniform-copy-reduction/copy_child.py | 242 ++++++++++++ .../independent.py | 96 +++++ .../inputs/predecessor-catalogue.py | 268 ++++++++++++++ .../inputs/predecessor-oracle.py | 94 +++++ .../inputs/predecessor-plan.py | 112 ++++++ .../inputs/r437-word.json.gz | Bin 0 -> 42280 bytes .../inputs/selected589-word.json.gz | Bin 0 -> 42353 bytes .../minor_bound.py | 122 ++++++ .../source_audit.py | 125 +++++++ .../test_package.py | 50 +++ .../r437-uniform-copy-reduction/verify.py | 229 ++++++++++++ 29 files changed, 3594 insertions(+) create mode 100644 research/r437-uniform-copy-reduction/.gitattributes create mode 100644 research/r437-uniform-copy-reduction/CALLBACK-PROBE.json create mode 100644 research/r437-uniform-copy-reduction/COORDINATION.json create mode 100644 research/r437-uniform-copy-reduction/MINOR-BOUND.json create mode 100644 research/r437-uniform-copy-reduction/ORIGINAL-CALLER.md create mode 100644 research/r437-uniform-copy-reduction/PROOF.md create mode 100644 research/r437-uniform-copy-reduction/R437-LICENSE create mode 100644 research/r437-uniform-copy-reduction/R437-UPSTREAM-NOTICE.md create mode 100644 research/r437-uniform-copy-reduction/README.md create mode 100644 research/r437-uniform-copy-reduction/REPLAY.log create mode 100644 research/r437-uniform-copy-reduction/RESULT.json create mode 100644 research/r437-uniform-copy-reduction/SOURCE-BINDING.md create mode 100644 research/r437-uniform-copy-reduction/SOURCE-PLAN.json create mode 100644 research/r437-uniform-copy-reduction/SOURCES.json create mode 100644 research/r437-uniform-copy-reduction/TASK.json create mode 100644 research/r437-uniform-copy-reduction/VALIDATION.json create mode 100644 research/r437-uniform-copy-reduction/VERIFY.json create mode 100644 research/r437-uniform-copy-reduction/callback_probe.py create mode 100644 research/r437-uniform-copy-reduction/copy_child.py create mode 100644 research/r437-uniform-copy-reduction/independent.py create mode 100644 research/r437-uniform-copy-reduction/inputs/predecessor-catalogue.py create mode 100644 research/r437-uniform-copy-reduction/inputs/predecessor-oracle.py create mode 100644 research/r437-uniform-copy-reduction/inputs/predecessor-plan.py create mode 100644 research/r437-uniform-copy-reduction/inputs/r437-word.json.gz create mode 100644 research/r437-uniform-copy-reduction/inputs/selected589-word.json.gz create mode 100644 research/r437-uniform-copy-reduction/minor_bound.py create mode 100644 research/r437-uniform-copy-reduction/source_audit.py create mode 100644 research/r437-uniform-copy-reduction/test_package.py create mode 100644 research/r437-uniform-copy-reduction/verify.py diff --git a/research/r437-uniform-copy-reduction/.gitattributes b/research/r437-uniform-copy-reduction/.gitattributes new file mode 100644 index 000000000..3468921aa --- /dev/null +++ b/research/r437-uniform-copy-reduction/.gitattributes @@ -0,0 +1,2 @@ +inputs/** -text -whitespace +R437-* -text -whitespace diff --git a/research/r437-uniform-copy-reduction/CALLBACK-PROBE.json b/research/r437-uniform-copy-reduction/CALLBACK-PROBE.json new file mode 100644 index 000000000..f4162a315 --- /dev/null +++ b/research/r437-uniform-copy-reduction/CALLBACK-PROBE.json @@ -0,0 +1,55 @@ +{ + "status": "PASS_ENCODED_R437_COPY_COEFFICIENT_PROBE", + "q": 3, + "atom_precision": 2, + "actual_R437_center": 475, + "actual_R437_frame": 515, + "copied_projector_rank": 7, + "synthetic_ancestor_rank": 26, + "root_width": 4096, + "parent_width": 1664, + "child_width": 182, + "child_is_nonterminal": true, + "generated_coefficients": [ + { + "coordinate": 0, + "value": 5 + }, + { + "coordinate": 26, + "value": 8 + }, + { + "coordinate": 64, + "value": 2 + }, + { + "coordinate": 181, + "value": 2 + } + ], + "child_metadata": [ + 0, + 1, + 7, + 0, + 0, + 0 + ], + "controls": [ + { + "control": "foreign_current_source", + "rejected_by": "selected good current site" + }, + { + "control": "wrong_ancestor_rank", + "rejected_by": "actual selected rank" + }, + { + "control": "wrong_current_prefix_code", + "rejected_by": "original global raw-field code" + } + ], + "runtime_host_numerical_decoding": false, + "scope": "Authenticated reused numerical components, actual COPY projector and explicit finite new source record, synthetic ancestor; no full R437 catalogue, payload, stock, physical CALL/RETURN or all-size cost proof" +} diff --git a/research/r437-uniform-copy-reduction/COORDINATION.json b/research/r437-uniform-copy-reduction/COORDINATION.json new file mode 100644 index 000000000..6f4aeb181 --- /dev/null +++ b/research/r437-uniform-copy-reduction/COORDINATION.json @@ -0,0 +1,44 @@ +{ + "checked_utc": "2026-10-19T06:18:00Z", + "coverage": "Partial targeted live PR/title/body and selected proof-file review, not novelty coverage", + "canonical_main": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "final_checkpoint": "Canonical main fetched unchanged; revision-6 priorities and selected frontier unchanged; no reroll on explicit assignment", + "predecessors": [ + { + "pr": 3690, + "head": "03c141ef1fd372cf42951488767537e55675c072", + "source": "36ff441479ff9c7e70d83f0becccd44da50effb8", + "credit": "zxv", + "scope": "Finite actual R437 catalogue/event adapter; rank34 numerical callback and controlled 256->136 CALL/RETURN; uniform physical refinement and full ordinary/native/router cohort explicitly open", + "relationship": "Substantive predecessor. Current a24f9ff/OQ4 binding remains to refresh; our unchanged-selected-Catalogue guard does not refute this adapter" + }, + { + "pr": 3562, + "head": "abb93be8b9ceca07a2b17f3a97db7bb6b074271d", + "credit": "Jose Manuel", + "scope": "Conditional ordinary retuning c=1/577; finite controlled returns; named physical premises" + }, + { + "pr": 3724, + "head": "946d03dd6b9cc794190876fe3f0f89b0ebc01c59", + "credit": "Sagar Thakrar", + "scope": "Independent arithmetic review under inherited physical premises" + }, + { + "pr": 3945, + "head": "91f81d131252db704f945891da1ea54e29d46b8b", + "scope": "Distinct staged544 terminal-fill conditional exponent; not this local COPY proof; no frontier change" + } + ], + "pr3936": { + "head": "e54c649865d737fe08edd4312a234cd186317db4", + "scientific_commit": "125f5afad680ef128e386fa58e76eef5fadaa5d6", + "ci_run": 39205477701, + "plan_job": 117907253747, + "replay_job": 117907773499, + "status": "success", + "delta": "Four-line P112 workflow-only repair; scientific package unchanged" + }, + "claim": "https://github.com/CrocSwap/integer-mult-bounds/pull/3936#issuecomment-6260449978", + "outcome": "Partial: conditional local caller and full relative cost proof; no uniform physical supplier admission" +} diff --git a/research/r437-uniform-copy-reduction/MINOR-BOUND.json b/research/r437-uniform-copy-reduction/MINOR-BOUND.json new file mode 100644 index 000000000..7daa52ccd --- /dev/null +++ b/research/r437-uniform-copy-reduction/MINOR-BOUND.json @@ -0,0 +1,66 @@ +{ + "status": "PASS_RANK7_LOW_CLASS_MINOR_BOUND", + "generic_minor_numerator_degree": 64, + "product_degree": 448, + "conditional_fraction": "min(1,448*(q-1)/(q*(q-2)))", + "simple_bound": "delta_7 < 896/q for q>=3; delta_7 <449/q for q>=450", + "source_admissible_uniform_upper": "449/1208925819614629174706176", + "fallback_children_per_bad_class_upper": 49911, + "source_admissible_fallback_multiplier_upper": "22410039/1208925819614629174706176", + "inherited_epsilon": "1/10000000000000000", + "union_over_paid_labels": false, + "full_high_lifts_covered": true, + "coverage": "Written polynomial and conditional-caller proof; finite audits are supporting evidence, not proof of physical refinement.", + "complete_small_GL_tables": [ + { + "dimension": 2, + "rank": 1, + "q": 3, + "GL": 48, + "bad": 20, + "fraction": "5/12", + "numerator_checks": 48 + }, + { + "dimension": 2, + "rank": 1, + "q": 5, + "GL": 480, + "bad": 144, + "fraction": "3/10", + "numerator_checks": 480 + }, + { + "dimension": 2, + "rank": 1, + "q": 7, + "GL": 2016, + "bad": 468, + "fraction": "13/56", + "numerator_checks": 2016 + }, + { + "dimension": 2, + "rank": 1, + "q": 17, + "GL": 78336, + "bad": 8448, + "fraction": "11/102", + "numerator_checks": 78336 + }, + { + "dimension": 3, + "rank": 2, + "q": 3, + "GL": 11232, + "bad": 6528, + "fraction": "68/117", + "numerator_checks": 22464 + } + ], + "sign_mutation_separated": true, + "checked_obligations": [ + "conditioning on GL explicitly charged", + "fallback children not free" + ] +} diff --git a/research/r437-uniform-copy-reduction/ORIGINAL-CALLER.md b/research/r437-uniform-copy-reduction/ORIGINAL-CALLER.md new file mode 100644 index 000000000..362fa753d --- /dev/null +++ b/research/r437-uniform-copy-reduction/ORIGINAL-CALLER.md @@ -0,0 +1,212 @@ +# The original rank-seven caller: uniform semantics and a conditional full bill + +This is the route relevant to the inherited R437 tariff. The alternate all-class +conjugacy in PROOF.md is deliberately kept separate: it pays additional ordinary +interchanges and cannot inherit this bill. Neither result independently closes +the published C0/B1 physical refinement, generated-source, or numerical reserve +arguments. This file proves the rank-seven specialization **under those explicitly +retained contracts**, including all bad classes; it does not assert their premises. + +## 1. The unchanged source-level primitive is applicable to arbitrary R437 dirt + +PR3936 binds the complete capture map, all 659 arbitrary input functions and +the transported ERASE guards at R437 head a24f9ff. The nine rank-seven frame +projectors, their rational root rows and their frame lists are unchanged from +the selected PR589 word. The new word changes the functions occupying some +centres; that does not change a callee quantified over **all** Boolean functions. +The new data bindings and source codes still need authentication. Equality of +projectors is not authority to replace one literal source record by another. + +For each fixed physical prefix, the actual requested residual is the weighted +partial interchange D_H(gPg^-1) defined in PROOF.md. Address matrix equality +implies equality of its pullback on every Boolean function, without independence +or clean-helper assumptions. Clone the complete current centre, call that +residual on the owned clone, keep its owned result unchanged during the literal +read interval, then clear it at the transported equality guard. This gives +source preservation and exact private output, conditional on a completed +whole-packet residual with the stated source, spectator and cleanup contracts. + +In the actual pinned compiler (`macro_code.py`, COPY branch), the first copy +commits the staged centre to `copy_source`; `residual_begin` initializes owned +`current`; `residual_end` transfers the result back to `copy_source`; the final +MOVE transfers it to the private role. `Machine.commit` preserves a permanent +source and clears a returned temporary Lease only after copying it. ERASE +clears the private role. This correspondence explains the clone/commit bill; +it is source inspection, not an executed R437-specific physical integration. + +## 2. All high lifts have the same good/fallback classification + +Fix q, r=7 and the rank-seven split basis B_P over F_q. Right multiplication +g0 -> G=g0 B_P is a bijection on GL_m(F_q). Its projector is + + Q=G E_r G^-1, E_r=diag(I_r,0), m=64. + +The source's `compile_specification` tests the successive leading pivots of Q. +Equivalently it tests the leading principal minors Delta_k, k=1,...,r. In +`good_form`, columns of Q are reversed before northeast elimination; its +northeast pivot products are the same leading principal minors of Q, up to +the fixed reversal convention. Every nonzero low pivot lifts to a unit in +Z/q^w. Thus a good g0 stays good for **every** high lift at every precision. + +Incoming weights form a diagonal unit matrix H. Each leading principal block +of H Q H^-1 is conjugate by its restricted diagonal H_I, so its determinant +equals Delta_k. Therefore the classification is independent of the actual +ancestor units and of the body/dirty payload. No new bad event is introduced +per column or per high prefix. There is no probabilistic failure of the +algorithm: the construction traverses a fixed complete cover and uses a +completed fallback on every bad class. + +## 3. A rank-specific complete low-class count + +For I={0,...,k-1}, Cauchy–Binet and Jacobi's complementary-minor identity give + + det(G) Delta_k = + sum_(J subset {0,...,r-1}, |J|=k) + (-1)^(sum I+sum J) det G[I,J] det G[I^c,J^c] = F_k(G). + +Every term of F_k has total degree k+(m-k)=m. At G=I, F_k=1. Hence F_k is +a nonzero polynomial over **every** residue field, including q dividing r. +The product F=product_(k=1)^r F_k is nonzero and has degree at most rm=448. +This proof uses complementary minors of one invertible matrix, rather than +assigning the full degree of each entry of G^-1 independently. + +A nonzero polynomial of total degree d in independent uniform field entries +vanishes on at most a d/q fraction. One proof inducts on the number of +variables: separate the highest power of the final variable, charge zeros of +its nonzero leading coefficient by induction, then use the univariate root +bound on the remaining fibres. The resulting degree contributions add to d. +This bound is harmlessly trivial if d/q>=1. + +For the uniform full matrix distribution, + + Pr(GL_m) = product_(i=1)^m (1-q^-i) + >= 1-sum_(i=1)^m q^-i > 1-1/(q-1). + +Conditioning explicitly on invertibility gives + + delta_7 < min(1,448*(q-1)/(q*(q-2))) + < 896/q (q>=3), + delta_7 < 449/q (q>=450). (A) + +The first expression can be used as a non-strict upper bound at the capped +value one; strictness of the uncapped fraction is immaterial. For the admitted +q>2^80, delta_7 <449/2^80<10^-16. The denominator 2^80 here is a monotone +lower bound on q, **not** a claimed prime. This is a deterministic fraction +of low classes; every low class has exactly the same H high-lift multiplicity. +It is not a union over COPY labels, all paid requests, columns, or prefixes. + +The exact finite check independently evaluates Jacobi numerators with an +adjugate over complete small GL domains, including 78,336 matrices in GL2(F17) +and 11,232 in GL3(F3). A missing Jacobi sign is detected. These audits support +the displayed polynomial proof; they do not prove its quantified statement. + +## 4. Good and fallback children, with every physical call paid + +Retain the source's completed normal-form identities and primitive contracts. +A good residual has forward ordered adapters, one weighted reversed child +of width 7f, then backward adapters. All current high fields remain frozen +prefixes and all unused rows/spectators stay complete. The child is outside +the prefix loop. Its [B',G',S'] and compatible fresh-row divisor are the ones +in PROOF.md section 4. Width 7f=1. Put R=Z/q^w and A=q^w. Source-admissible large +primes are required when importing the selected backend time/stock theorems; +the algebra alone works for every odd q. Let m=64, r=7, n=64f+delta, +f>=1 and 0<=delta<64. One complete selected low packet has shape + + [Z physical prefixes][U unused fresh rows] + [B][A^n head][G][A^n tail][S], + v = Z U B G S A^(2n). + +Z,U,B,G,S are independent positive complete extents. In a parent invocation +Z=C H, H=q^(4096(w-1)). The prefixes retain **physical ordinals**, including +repeated or correlated field values; they are not a set of distinct headers. +Every incoming Boolean payload is arbitrary. In particular it may be the +complete dirty capture in PR3936, with input 340 present. No SOURCE/helper +projection, clean-input restriction or independence of payloads is allowed. + +For each prefix and column j, let a_(i,j) be the incoming diagonal units. +They can depend on the source-bound ancestor program and j, but not on body +addresses or fresh unused rows. Let g be the complete invertible cover matrix +over R at that prefix. Let P be the rank-seven rational projector of the +literal capture, embedded into the first eight of m coordinates. Section 7 +binds all nine projectors to the exact R437 input. + +Write E=diag(I_7,0_57), Q=g P g^-1, H_j=diag(a_(0,j),...,a_(63,j)). In +reflected tail coordinates the requested address map is + + D(Q) = [[I-Q,Q],[Q,I-Q]], + D_H(Q) = diag(H_j,I) D(Q) diag(H_j^-1,I). + +The physical reflected tail sends the partner of head (i,j) to tail +(m-1-i,f-1-j), with the peeled delta and external G left in the middle. +Thus the central E map is exactly one **reversed** interchange of width 7f; +it is not an ordinary scalar swap on one representative address. + +The output contract is: preserve borrowed source, program, directory and +Counts; return a distinct owned stream f_in composed with the complete +requested address permutation; preserve every spectator and physical prefix +ordinal pointwise; reset borrowed heads; restore owned scratch before reuse. +At the guarded ERASE the caller clears the owned output, charging that scan. +Successful execution is the contract. Interruption recovery is not asserted. + +## 2. Kernel normalization removes diagonal scaling from the factor alphabet + +The retained projectors have dyadic entries and satisfy P^2=P. Their rational +characteristic polynomials specialize to t^57(t-1)^7, so reduction modulo q +has rank seven even for q=7; trace modulo q is not a rank test. As in PR2234, +choose seven independent columns of P modulo q and 57 independent columns +of I-P. Lift those columns to R and concatenate them into B_P. Then + + P B_P = B_P E, det(B_P) is a unit. + +This follows because their residue-field image/kernel spaces are a direct +sum. Unit determinant over the local ring implies invertibility, and hence +P=B_P E B_P^-1. The same selected column labels work for every precision w +at this fixed prime. They are source/compiler data, not payload-dependent +advice. The proof does not require symmetry of Q or g^-1=g^T. + +Set T=g B_P, S_h=H_j T and S_t=T. Both are invertible. For either S, multiply +its first kernel column (column 7, zero based) by det(S)^-1. Call the result +U. Thus U=S Z_S, det(U)=1 and Z_S changes only a kernel coordinate of E. +The two independent kernel scalings, on head and tail, commute with D(E): +D(E) fixes each of these kernel coordinates. Consequently + + K=diag(U_h,U_t), + K D(E) K^-1 = D_H(Q). (1) + +Normalizing an image column independently on the two banks would generally +change the weighted swap. The unused kernel column is essential to (1). +This proves a complete matrix identity over R for every admitted g and all +unit ancestor weights. It uses neither a good-leading-minor assumption nor +an exceptional-class probability. Its new costs are billed below; this is +not permission to delete the original fallback charge from R437's invoice. + +## 3. A fixed-support word of elementary shears + +For U in SL_d(R), d>=2, the reference compiler emits exactly + + L_d = 3d(d-1)/2 + d(d-1) + 6(d-1) + = (d-1)(5d+12)/2 + +elementary factors. Their ordered (target,source) pairs are independent of +U, q, w, the prefix and the column. Zero coefficients remain emitted and paid. + +At Gaussian column j, the invertible remaining residue-field block has a +nonzero entry in that column, hence a unit pivot over R. Select its first +row k. For **every** candidate k>j emit + + E_(j,k)(s), E_(k,j)(-s), E_(j,k)(s), + s=1 if k is selected, and 0 otherwise. + +The selected triple is a signed row exchange, of determinant one; the other +triples are identities. Then emit one elimination shear for every i!=j, +including a zero shear if the entry is already zero. Previous diagonal +columns stay diagonal because the pivot row is zero in them. The reduction +G U=D is diagonal, and det(D)=1. This proves the first two terms of L_d. + +For each i 0, + (1+c_R)*(1-a2)-1 > 0. + +Thus those **available upper bounds** do not justify absorbing this term +into that allowance with an input-independent constant. This is not a lower +bound on actual runtime, not a counterexample to the original good/fallback +algorithm, and not an impossibility theorem for a different COPY realization. +It is a failed cost implication for this generic replacement schedule. + +Continue only after binding a cheaper reverse adapter, sharing it inside an +actual child/consumer, or supplying an affordable different factorization. +Start with one nonzero reverse factor, its generated coefficient and the exact +source-preserving complete-packet interface. Preserve the full return, scratch, +preparation and disposal bill. Separately, independently review C0/B1's universal +source/refinement arguments before treating the conditional composition as a +physical supplier proof. No selected result or frontier is changed here. diff --git a/research/r437-uniform-copy-reduction/R437-LICENSE b/research/r437-uniform-copy-reduction/R437-LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/research/r437-uniform-copy-reduction/R437-LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/r437-uniform-copy-reduction/R437-UPSTREAM-NOTICE.md b/research/r437-uniform-copy-reduction/R437-UPSTREAM-NOTICE.md new file mode 100644 index 000000000..9b519b904 --- /dev/null +++ b/research/r437-uniform-copy-reduction/R437-UPSTREAM-NOTICE.md @@ -0,0 +1,71 @@ +# Notice + +Apache-2.0 (`LICENSE`, copied from #493's package). Prepared by eumemic with substantial Anthropic Claude +assistance. + +## New in this package + +- `code/gen_p3.py` (the generator of the punctured word: the L3 skeleton of #543 restricted to the live lines, the + pseudo-target totals, the phase-A mini-nodes and extra carriers), `code/pwordl.py` (word builder for a live subset + of the 120 lines; output in the bitE8/1 layout with the `ports_geom` and `punctured` fields introduced by #545), + `data/bitE8mut-p111.json.gz` (the word), `data/punct.json` (its frozen parameters), `discovery/choose.py` and + `discovery/search.py` (the nomination of P and of the parameters; not run by `verify.sh`). +- `code/gen_p3.py` carries `derive`, `ex_part` and `plan_thirds` from #543's `code/gen_l3.py` (eumemic), and + `data/plan-l3.json` is #543's CP-SAT plan, unchanged. `code/nodeopt.py`, `code/planio.py`, `code/mutants.py`, + `code/mutrec_b.py` and `code/provenance.py` are #543's files, unchanged. +- `code/xcheck_p.py`: #543's independent checker `code/xcheck.py` with nine listed edits for v <= 120 live labels + (root-line enumeration of the lattice, frame closure and target frames over the live labels) and a new part T (the + frame and COPY rank of every retained total at the scatter, and whether it is the hyperplane of a punctured line). +- `code/mutants_p.py` (punctured-design controls), `code/adapt9p.py` (#510's nine-stage files parameterised for + v <= 120 and any copy ranks, the way #545's `adapt.py` parameterises #493's eleven-stage files), `code/cited.py`, + `code/receipt_kappa.py`, `code/summary.py`, `verify.sh`, `EXPECTED.json`, `DEPENDS.json`, `requirements.txt`, + `data/complex-b.json`, `data/selection9-p111.json` and `data/hosting11-p111.json` (frozen nominations of #442's + hosting programme, rediscovered by `verify.sh`), `.github/workflows/e8-bit-p111.yml`. + +## Vendored, byte-identical (git blob ids in `SOURCE-pr*.json`, checked by `code/provenance.py`) + +- **PR #510 (DreamingOfClouds, with Claude Opus 5.5 via Claude Code), commit 64edee1** (`vendor/pr510/`): the same 19 + files as #543's package (#510's nine-stage chain with the files it vendors from #463, #443, #442 and #315, and #503's + R480 word). Their notices are listed in #543's NOTICE and in the files. +- **PR #545 (DreamingOfClouds, with Claude Opus 5.5 via Claude Code; draft), commit 376426f** (`vendor/pr545/`): + `code/adapt.py` and `code/punct_cfg.py`, run unchanged on this package's word; `data/bitE8mut-v111-r489.json.gz`, + `data/hosting-v111-r489.json` and `EXPECTED.json` (a control). +- **PR #548 (Dugongue), commit 66dbc2b** (`data/complex/pr548/`): `EXPECTED.json` and `evidence/EXACT-ASSEMBLY.json`. +- **PR #544 (chafreaky, with OpenAI Codex assistance), commit 4858bb3** (`data/complex/pr544/`): `EXPECTED.json` and + the Linux exact-assembly receipt. +- **PR #535 (icekylinx, with GPT-6 Astra assistance), commit 8b758a1** (`data/complex/pr535/`): `EXPECTED.json` and + `evidence/audit/EXACT-ASSEMBLY-PR493.json`. + +## Used from main, unchanged (pinned in `DEPENDS.json`) + +- `research/e8-bit-carrier-skeleton` (PR #493, eumemic): the skeleton modules and D4 partition the generator imports, + #370's checker (run here in #545's v <= 120 form), the official cohort checkers, `gram_frames.py`, the record + exporter, the geometries and the eleven-stage chain that #545's `adapt.py` parameterises, #442's hosting programme, + the R489 word, the control receipts and #315's engines. +- `research/direct-delivery504-global/EXPECTED.json` (PR #531, icekylinx): its complex b and kappa. + +## Cited, not rebuilt + +Complex coarse savings in `data/complex-b.json`, each bound to its PR's receipt by `code/cited.py`: PR #548 (primary; +open), PR #544 and PR #535 (open), PR #531 (merged), and PR #484, #471 and #458 (controls). + +## Ideas used + +- PR #545 (DreamingOfClouds): the punctured-star unit. Nine lines are neither sources nor targets; each retained total + is a pseudo-target that reads what the removed target would read, at frame rank 7, so the decoder constant is 63; + the rank-mass identity with v and the decoder constant as parameters; the parameterisation of the hub chain. +- PR #543 (eumemic): the R420 L3 skeleton with keepers read by targets and rewritten in phase B. +- PR #493 (eumemic), PR #503 and #510 (DreamingOfClouds), PR #425 (Zhihao Chen / jacklightChen), PR #370 (Dylan Crow), + PR #472, #445, #443 (chafreaky), PR #442 (DaysSky), PR #463 and #315 (DreamingOfClouds), PR #386 (Zhihao Chen): the + skeleton, the scalar-interface lemma, the format, and the pricing pipelines. +- PR #523 (icekylinx): the puncture pattern on the complex side, cited by #545. +- Jacob Sussman introduced the E8 unit. + +R437 composition: Ali Romman (@aliromman), with substantial OpenAI Codex assistance, authored the public1043 helper470 source-boundary deletion. Its exact canonical-main package and NOTICE are retained in public1043/. The new contribution here composes that credited deletion with the independently validated helper464 GL, then reconstructs actual owners, full invoice, independent checks and portable replay. + +Sagar Thakrar (thakrarsagar), PR3700 Open question4, proposed the exact +window6 two-leftover coalescing used by this follow-up. No code from that +PR is imported by the author pipeline; root independently replayed its +hosting and price engines. Full owner/template/invoice regeneration and +packaging used substantial OpenAI Codex assistance. All prior credits and +Apache-2.0 notices remain in place. diff --git a/research/r437-uniform-copy-reduction/README.md b/research/r437-uniform-copy-reduction/README.md new file mode 100644 index 000000000..2323b060f --- /dev/null +++ b/research/r437-uniform-copy-reduction/README.md @@ -0,0 +1,171 @@ +# R437 uniform COPY: caller reduction and the complete relative cost + +**Scoped proof and cost audit; physical supplier proof remains incomplete.** +This answers the explicit follow-up to [PR3936](https://github.com/CrocSwap/integer-mult-bounds/pull/3936). +Its initial scientific-head CI was checked first: [run 39202988286](https://github.com/CrocSwap/integer-mult-bounds/actions/runs/39202988286) +completed successfully, including planning, registered replay and unchanged +inputs. The later live head e54c649865d737fe08edd4312a234cd186317db4 also passed +[run 39205477701](https://github.com/CrocSwap/integer-mult-bounds/actions/runs/39205477701). +Its only delta is the unrelated four-line P112 workflow repair; scientific +bytes are unchanged. Those checks are prior-package execution, not this proof. + +The requested full physical rank-seven tariff is **not established in this +session**. The package supplies two independently reviewable proof results +and identifies the precise source/refinement premise still needed. + +## Original caller: uniform semantics and the relative bill + +[ORIGINAL-CALLER.md](ORIGINAL-CALLER.md) specializes the existing good/fallback +construction to the actual nine R437 COPY frames and arbitrary complete dirty +functions, with unit ancestor weights and all high lifts. It proves a +rank-specific bad-low-class bound by Cauchy–Binet/Jacobi: + + delta_7 <= min(1,448*(q-1)/(q*(q-2))) <896/q, + delta_7 <449/q for q>=450. + +Every high lift shares the low classification; weighted diagonal conjugation +preserves all leading principal minors. The fraction counts a deterministic +complete cover, not algorithmic failure or a union over labels/prefixes. +At admitted q>2^80 it fits the inherited 10^-16 allowance. + +There is one good child of width 7f and at most 49911 fallback children of +width <=f per bad class, including all main and half-reset calls. The complete +relative mean cost over the cover is + + T(7f,w)+delta_7*49911*max_(1<=j<=f)T(j,w) + + local scans/leaf toll + explicit encoded preparation. + +The familiar `T(7f,w)+10^-16*(32*64^2)*max T(j,w)+O_q(n+w^p)` follows +**only under the retained completed-callee, fixed-tape, numerical and canonical +root/history hypotheses**. This new argument does not prove those premises. +There is no factor multiplying the coarse child count by physical prefixes; +all equal or correlated prefix values retain their separate ordinals. + +## Alternate uniform factorization: correct map, additional paid adapters + +[PROOF.md](PROOF.md) gives an all-low-class construction. A kernel-column +normalization puts separate head/tail conjugators in SL64 without changing +the weighted rank-seven map. A fixed-support shear word has 10458 slots per +bank and works over every local ring Z/q^w. The reference compiler is new; +generic split-projector conjugation is credited predecessor mathematics. + +The full alternate schedule has one reversed 7f child, **41832*f ordered ADD +passes and 41832 ordinary interchanges of f-atom blocks**, plus the initial +clone, all intermediate releases, metadata, returned output and final +guarded disposal. It has the conditional relative bound + + t(v,7f,w)+41832*C_B*v*(f*w)^p+C_q*v*(f+1). + +The ordinary term cannot be silently folded into the intended cheap local +toll using either pinned original B1/B2 exponent at the R437 root scaling. +This is a failed implication from this upper bound, **not** an impossibility +theorem or a counterexample to the original good/fallback algorithm. + +## Evidence and limits + +The new exact checker imports no predecessor executable. It reconstructs all +nine frame projectors from the byte-pinned R437 root rows; checks 45 modular +contexts, including characteristic seven; handles a full ambient-64 case +with a zero leading seven-by-seven minor; and tests eight semantic mutations. +A complete 81-address function cube keeps repeated physical prefixes and +independent spectators. This is exact algebra/function-model evidence, not +selected GL64 payload or fixed-tape execution. + +`independent.py` uses rational nullspaces to reconstruct the projectors and +counts the factor/order invoice separately. `minor_bound.py` evaluates the +Jacobi numerator identities over complete small GL domains and preserves +the conditioning and full fallback bill. `test_package.py` runs the actual +optimized CLI in a Git-free export and rejects source corruption, missing +and symlinked inputs, and a falsified free-interchange receipt. + +`source_audit.py` separately authenticates and executes the original pure plan +compiler on actual ambient-64 good/bad conjugates of R437 frame 515. This +explicitly reused-code probe checks all ordered adapters and main/half-reset +counts. The original good branch pays 9872*f ordered ADDs; fallback pays at +most 16257*f scalar passes and 49911 coarse children. This probe executes no +physical payload or generated coefficient/continuation integration. + +`callback_probe.py` runs authenticated predecessor numerical components at the +actual R437 frame-515 projector and an explicit finite COPY source record. +With a **declared synthetic rank-26 ancestor**, ROOT width 4096 produces parent +width 1664 and a nonterminal rank-seven child of width 182. Four generated +unit coefficients and the serialized descriptor agree with an independent +modular calculation. Program/prefix bytes and numerical ownership restore; +three source/rank mutations reject with host numerical decoding disabled. +This is a component/descriptor probe, not an actual R437 ancestor, full +Catalogue, payload, stock or physical CALL/RETURN execution. Its 25 canonical +runtime source files are declared replay inputs. The full source boundary is +in [SOURCE-BINDING.md](SOURCE-BINDING.md). + +The reference factor compiler uses host exact ring arithmetic. An encoded +physical implementation of that alternate schedule is not supplied. Source +inspection of the existing COPY/commit/return code and its published proof +does not independently validate PR2809's pending universal refinement, nor +bind a new R437 source code to the old selected registry. Exact modular +arithmetic introduces no local rounding; complete integer recovery and +interrupted-macro restoration remain outside this local result. + +Reproduce with standard-library Python 3.12: + +```sh +python3 -B scripts/research_package.py --package research/r437-uniform-copy-reduction +python3 -B scripts/check_research_commit.py --package research/r437-uniform-copy-reduction --check-source-history +``` + +The package commands are read-only. `--write-result` is an explicit generation +option for the two new receipts. Source inputs carry exact SHA256 and Git-blob +identities, including lossless retained bytes from the pending predecessor. + +## Coordination + +Explicit donor assignment refines revision-6 `independent-moment`; canonical +base 20ecf2891d80b5acf18d980b2164fb44ea7faa90. The current main guidance was +read and fetched at entry and again at the proof checkpoint. Existing staged +work, frozen inputs and the synced project sources are preserved. Overlap +includes targeted live PR searches, the start-here and physical-caller board, +and the PR3936 claim; coverage is partial, not a novelty certificate. + +The final overlap check also read [PR3690](https://github.com/CrocSwap/integer-mult-bounds/pull/3690) +at 03c141ef1fd372cf42951488767537e55675c072. zxv already supplies a finite +R437 adapter and controlled rank-34 CALL/RETURN at the older R437 source +36ff441479ff9c7e70d83f0becccd44da50effb8. That is substantive predecessor +integration, not refuted by our unchanged-selected-Catalogue guard probe. +Our retained R437 source is a24f9ff95c12fd0b6792e3f710569237efd72db2; +our synthetic rank-26 probe does not refresh that actual adapter. PR3562 +(Jose Manuel) and PR3724 (Sagar Thakrar) already retune/check conditional +ordinary arithmetic; their changed physical premises remain separate from +the original B1/B2 comparison above. See [COORDINATION.json](COORDINATION.json). + +## Open next questions + +The [structured next questions](TASK.json) concern a source-bound physical +Specification/CALL/RETURN integration and the reverse-adapter bill. First +refresh PR3690's finite adapter at the current a24f9ff/OQ4 source, then bind +one actual current rank-26 ancestor and rank-seven COPY request with source/program identity, complete raw +prefix ordinals, independent U stock, precision, returned output, parent +continuation, and all owned scratch. Prove its preparation and visited-cell +bound. A finite matrix equality or the conditional inequality above cannot +replace that integration. A cheaper alternate adapter would need its full +consumer/restoration bill, not just a smaller scalar count. + +## Credit and license + +R437 and its original invoice: ai-nanachi/PR3647, Sagar Thakrar/PR3700, +Ali Romman/PR1043, and the native/compiler/owner/outer lineage preserved in +`R437-UPSTREAM-NOTICE.md` and `R437-LICENSE`. Complete-stream/gauge semantics: +alephnan/PR1627, Adam Gall/PR2088, Ross Richardson/PR1704 and the selected +COPY separation/two-copy audits. The full preceding execution audit is PR3936. +Finite R437 adapter and controlled returns: zxv/PR3690. Conditional ordinary +retuning and arithmetic review: Jose Manuel/PR3562 and Sagar Thakrar/PR3724. + +Local-ring split bases and common labels: eumemic's GL argument and Jose +Manuel/PR2234. Completed logical/physical caller and backends: David Arias/PR2753; +Jose Manuel/jmbarrancoml/PR2809/2899/2915; Nick Petalas/PR2808; ywz65's parking +controller; commdata2338's normal-form/substitution work; Aakash Thakkar's +stock-fit proof; Sagar Thakrar's stock audit; and all retained primitive, +source527, BIT, geometry and assembly authors. No claim to invent their +conjugation, normal forms, polynomial root bound or universal caller. + +New proofs, source specialization, implementation and checks by Chris R / +Clear1nsight with substantial OpenAI Codex assistance, Apache-2.0. No independent +human or formal-kernel review. No supplier admission or selected-frontier change. diff --git a/research/r437-uniform-copy-reduction/REPLAY.log b/research/r437-uniform-copy-reduction/REPLAY.log new file mode 100644 index 000000000..dcbdc012e --- /dev/null +++ b/research/r437-uniform-copy-reduction/REPLAY.log @@ -0,0 +1,15 @@ +CHECK Source-bound weighted projector factorization over complete local-ring address matrices, including bad leading minor, characteristic seven and separately billed reverse adapters. +PASS_UNIFORM_COPY_REDUCTION_WITH_EXPLICIT_BACKEND_PREMISES cases=45 controls=8 +CHECK Repeat semantic controls with assertions disabled. +PASS_UNIFORM_COPY_REDUCTION_WITH_EXPLICIT_BACKEND_PREMISES cases=45 controls=8 +CHECK Independent nullspace projector and fixed-support invoice derivation; no compiler imports. +PASS_INDEPENDENT_NULLSPACE_AND_COMPLETE_INVOICE frames=9 unit_identities=124 +CHECK Independent adjugate/Cauchy-Binet verification on complete small GL fields, explicit conditioning, and rank-seven fallback allowance. Written proof covers all admitted primes and precisions. +PASS_RANK7_LOW_CLASS_MINOR_BOUND small_GL=92112 +CHECK Explicit reused-code probe of authenticated original plan compiler on actual ambient-64 good/bad R437 projectors, including all main/half reset counts. Not independent physical execution. +PASS_REUSED_ORIGINAL_PLAN_ALGEBRA_AND_COUNTS good_ADDs_per_column=9872 fallback_cap=49911 +CHECK Authenticated predecessor encoded coefficient/descriptor components at actual R437 COPY515 with a declared synthetic rank-26 ancestor; numerical source controls and no-decode guard. No physical payload/return execution. +PASS_ENCODED_R437_COPY_COEFFICIENT_PROBE parent=1664 child=182 controls=3 no_decode=true +CHECK Actual optimized Git-free CLI positive and altered source/result, missing and symlink input controls. +PASS_ACTUAL_EXPORTED_CLI positive=1 controls=4 optimized=true Git_free=true +PASS_REGISTERED_RESEARCH_PACKAGE research/r437-uniform-copy-reduction outcome=partial diff --git a/research/r437-uniform-copy-reduction/RESULT.json b/research/r437-uniform-copy-reduction/RESULT.json new file mode 100644 index 000000000..14dddce8b --- /dev/null +++ b/research/r437-uniform-copy-reduction/RESULT.json @@ -0,0 +1,223 @@ +{ + "algebra_cases": 45, + "bad_leading_minor_passes": true, + "captures": [ + { + "center": 470, + "frame": 510, + "projector_sha256": "48dc372319cc093038dbdb1edb6b063827b501ecf2cf36c44c05bccc33cc5dec", + "rank": 7 + }, + { + "center": 471, + "frame": 511, + "projector_sha256": "082eb8841573259ccfdff731dd97e31ad53e136da958948056757f05c194ce74", + "rank": 7 + }, + { + "center": 472, + "frame": 512, + "projector_sha256": "15e3bd0160aabca63e242ae487cbf1841be12380b32631517f9bc877bd7a040d", + "rank": 7 + }, + { + "center": 473, + "frame": 513, + "projector_sha256": "eccbba6e86eb53dbe1af1456de5aef450884f6e1abd1e53a83b58d82b5335e66", + "rank": 7 + }, + { + "center": 474, + "frame": 514, + "projector_sha256": "72d3ef2e5dab6d5c75f562e3b4fbae1b9bad4df5ffa37186d5743915c17e1286", + "rank": 7 + }, + { + "center": 475, + "frame": 515, + "projector_sha256": "6b710ec1abe0bb8f8d252c7872a64b9c97f77252a4b8c615584c9b15ecb4b714", + "rank": 7 + }, + { + "center": 476, + "frame": 516, + "projector_sha256": "1767972ba33c5b500c10fa05e2b557234a0ff08e28e70fbbd0dfe824d54eadab", + "rank": 7 + }, + { + "center": 477, + "frame": 517, + "projector_sha256": "834018d1dc78d932487eb4d6fc86c9a1c9daf859bb953ae29dba1b9d84c16490", + "rank": 7 + }, + { + "center": 478, + "frame": 518, + "projector_sha256": "a3f7c0bf53d5f976a2afa1f5dbda3005ff1302f77fd0fbea782054766a80e714", + "rank": 7 + } + ], + "claim": "uniform local-ring algebra and conditional caller/cost reduction; inherited cheap tariff NOT proved", + "controls": [ + "omit kernel determinant normalization", + "nonunit incoming weight", + "same label with rank six", + "transpose high-chart inverse", + "full swap priced as rank seven", + "omit a nonzero factor", + "multiply core calls by repeated prefixes", + "free reverse-order adapters" + ], + "dimension": 64, + "fixed_word_length": 10458, + "full_ambient_cases": 1, + "inherited_dependencies": [ + "completed same-q ordinary B1/B2 with source/spectator preservation and restored owned work", + "proper-width reversed child with the specified compatible stock and successful return contract", + "encoded scalar coefficient preparation and complete ordered shear", + "canonical root-coupling absorption if simplified asymptotic costs are used" + ], + "invoice": { + "clone_episodes": 1, + "coarse_calls": 1, + "coarse_width_atoms": 70, + "disposal_episodes": 1, + "factor_slots": 41832, + "intermediate_disposals_upper": 460153, + "ordered_shear_calls": 418320, + "ordinary_block_swap_calls_upper": 41832, + "ordinary_block_width_atoms": 10, + "physical_prefixes": 11, + "prefix_multiplier_on_coarse_calls": 1, + "reverse_factor_slots": 20916 + }, + "nonabsorption_deltas": { + "B1": "3658876267404271047807531239/100000000000000000000000000000000", + "B2": "33698665299123223902351340421063/1000000000000000000000000000000000000" + }, + "physical_backend_implemented": false, + "physical_reverse_factor_slots": 20916, + "projected_geometry": [ + [ + 64, + 7, + 114 + ], + [ + 65, + 7, + 116 + ], + [ + 127, + 7, + 240 + ], + [ + 128, + 14, + 228 + ], + [ + 129, + 14, + 230 + ], + [ + 191, + 14, + 354 + ], + [ + 576, + 63, + 1026 + ], + [ + 577, + 63, + 1028 + ], + [ + 639, + 63, + 1152 + ], + [ + 640, + 70, + 1140 + ], + [ + 641, + 70, + 1142 + ], + [ + 703, + 70, + 1266 + ], + [ + 4032, + 441, + 7182 + ], + [ + 4033, + 441, + 7184 + ], + [ + 4095, + 441, + 7308 + ], + [ + 4096, + 448, + 7296 + ], + [ + 4097, + 448, + 7298 + ], + [ + 4159, + 448, + 7422 + ], + [ + 64000, + 7000, + 114000 + ], + [ + 64001, + 7000, + 114002 + ], + [ + 64063, + 7000, + 114126 + ] + ], + "remaining": [ + "eliminate, share, or otherwise fully pay reverse-order interchanges inside the intended rank-seven tariff", + "bind an encoded physical implementation of this new factor schedule; this algebra compiler is not that implementation", + "independent universal review of the inherited C0/B1 source-refinement and complete-cost arguments", + "all-source hosting, outer transfer and integer recovery remain outside this local reduction" + ], + "selected_root_and_frame_tables_unchanged": true, + "small_function_check": { + "addresses": 81, + "payload_bits": 486, + "physical_prefixes": 3, + "scope": "finite function/permutation check, not physical execution", + "spectators": 2 + }, + "status": "PASS_UNIFORM_COPY_REDUCTION_WITH_EXPLICIT_BACKEND_PREMISES", + "supplier_admitted": false +} diff --git a/research/r437-uniform-copy-reduction/SOURCE-BINDING.md b/research/r437-uniform-copy-reduction/SOURCE-BINDING.md new file mode 100644 index 000000000..32ebb764f --- /dev/null +++ b/research/r437-uniform-copy-reduction/SOURCE-BINDING.md @@ -0,0 +1,121 @@ +# The concrete physical integration still required + +This is a source-binding boundary, not an allegation of a predecessor defect. +All quoted source files are pinned at canonical main +20ecf2891d80b5acf18d980b2164fb44ea7faa90. The R437 word is the exact retained +PR3647/PR3936 input. The old selected caller intentionally authenticates its +own 661-role construction. + +## Same COPY maps, different authenticated caller records + +The new verifier compares the **complete** rational root and frame tables of +the R437 and selected PR589 words, byte-retained separately. They are equal. +Replaying frame assignments through D and A places the R437 retained centres +470..478 at frames 510..518. Their rank-seven residual maps are therefore the +same mathematical maps at which the selected source's generic normal forms +apply. A function at one of those centres may have changed dirty support; +the all-function contract covers that change. + +The physical caller record has changed. R437 has 2*111+437=659 ordinary +roles and uses private index 659. In the actual selected +`inputs/pr2753/predecessor/catalogue.py`, `_bind` requires + + len(other['owners']) == len(call['owners']) == 661 + +before accepting replica ownership, and requires `temporary==661` before +accepting a private COPY. It later authenticates the complete paid catalogue +and exact ordered source digest. `source_audit.py` evaluates these **exact +unchanged guard expressions** from the authenticated AST: 659 rejects and +the matching 661 controls accept. It does not fake a full R437 template run. + +Thus swapping the new template into the old selected Catalogue cannot itself +establish a uniform physical R437 caller. Changing 661 to 659 alone would +also be insufficient: owners, events, fresh-row inventory, request ordering, +ERASE guards, canonical codes and complete catalogue digest need their actual +new source bindings. The old selected source and frozen manifests are preserved. +This package implements no such silent adaptation. + +This guard result concerns the **unchanged selected Catalogue only**. It is +not a claim that no R437 adapter exists. PR3690 (zxv), head +03c141ef1fd372cf42951488767537e55675c072, already authenticates the older R437 +36ff441479ff9c7e70d83f0becccd44da50effb8 through a finite adapter, reconstructs +903456 paid requests and 7814016 local events, and tests its actual rank-34 +idle with a controlled 256-to-136 CALL/RETURN. It explicitly leaves the +complete ordinary/native/router cohort and uniform changed-program refinement +open. Our a24f9ff/OQ4 word and synthetic rank-26 component probe do not update +that actual integration. Its adapter is the appropriate starting point for +the next task; its finite tests do not discharge the uniform premise here. + +## The generated program must carry the current source + +`children.extend` obtains the rank from the current source Specification, +derives rf, f or floor(f/2) from the encoded parent width, and appends + + (kind, current_code, rank, field, reverse, half), + parent_size, child_size + +to the source-bound program. It preserves the parent program and copies the +complete frozen history. `Callback.step` requires that the code is in the +Specification vocabulary, that the recorded rank equals that code's rank, +and that the exact size and depth relation holds. In the good branch the +new incoming unit is the parent's generated weight times the unit pivot; +`Page.child_weight` derives that value at the actual coordinate/prefix. + +This is why an algebraic equality of the nine projectors does not authorize +replacing arbitrary source codes in a generated history. An actual integration +must either authenticate a new vocabulary and history grammar, or prove a +source-label translation that preserves every decoded coefficient, scope, +prefix ordinal and continuation. It must cover ancestor records, not only a +new root COPY label. The `source_audit.py` plan probe is separate from numerical callback execution. + +`callback_probe.py` goes one step further using the authenticated original +`Callback`, `children.coefficient` and `children.extend` components. It creates +an explicit R437 COPY515 Template record at centre 475, with a new two-label +source vocabulary, and a **declared synthetic** rank-26 ancestor. At q=3,w=2, +ROOT4096 -> rank26/1664 -> rank7/182, the generated child is nonterminal. +Four unit coefficients agree with independently computed projector pivots; +the encoded descriptor carries the current code/rank and exact 1664/182 +extents. Source/program bytes, heads and numerical ownership restore. Foreign +current source, wrong ancestor rank and wrong current prefix code reject with +runtime host numerical decoding disabled. This is an actual component probe, +not execution of a full R437 Catalogue, an actual R437 ancestor/owner record, +complete payload, U stock, or physical CALL/RETURN. It does not remove the +659-versus-661 catalogue authentication boundary above. + +The physical `Machine.prepare_child` additionally checks parent program +identity and current source code before copying the whole packet, directory, +program, prefix count, unused U stock and three spectators to handoff ports. +The protected output returns through the parked parent continuation. A new +R437 binding must preserve these guards and the fixed-role/lease/parking +invariants. A source-semantic rank equality cannot stand in for those facts. + +## Time, space and parameter domain + +The original good/fallback relative bound in ORIGINAL-CALLER.md is proved +without treating its T(j,w), coefficient preparation or restored scratch as +zero. The simplification to `O_q(n+w^p)` uses the source-specific canonical +root/history and completed primitive arguments. Substituting a different +root scaling, source vocabulary or compiler needs its own verification of +those hypotheses; a scalar exponent substitution is not that verification. + +The repository's physical-contract map still marks the universal PR2809 +refinement partially reviewed. Its archival incorporation and later B1/C1 +compositions do not independently prove it. The new alternative factorization +also has no encoded physical implementation in this package. Its complete +extra ordinary-interchange term is retained as a distinct cost route. + +The useful remaining test is concrete: refresh PR3690's adapter at the current +a24f9ff/OQ4 source, bind its actual rank-26 ancestor and rank-seven +Specification in a generated nonterminal child context, preserve the current +source/program identities and all frozen raw prefixes, pass U separately from +B, and verify the actual numerical coefficient and protected return path. +Then prove its preparation/visited-cell ledger and the uniform continuation +argument at that binding. This task remains uncompleted here. It is the +physical implication required to upgrade the conditional reduction to the +full proof requested by the donor; no supplier admission is claimed. + +Credit Jose Manuel/jmbarrancoml's source authentication, compiler and backend +work, David Arias's caller, ywz65's parking protocol and all retained lineage. +Credit zxv/PR3690's preceding finite R437 adapter and controlled physical returns. +New source-bound inspection and guard probes by Chris R / Clear1nsight with +substantial OpenAI Codex assistance. Apache-2.0. diff --git a/research/r437-uniform-copy-reduction/SOURCE-PLAN.json b/research/r437-uniform-copy-reduction/SOURCE-PLAN.json new file mode 100644 index 000000000..d65cd6b9f --- /dev/null +++ b/research/r437-uniform-copy-reduction/SOURCE-PLAN.json @@ -0,0 +1,32 @@ +{ + "status": "PASS_REUSED_ORIGINAL_PLAN_ALGEBRA_AND_COUNTS", + "frame": 515, + "dimension": 64, + "rank": 7, + "q": 3, + "good_adapter_commands": 4936, + "good_forward_backward_ADDs_per_column": 9872, + "fallback_command_counts": { + "add": 16256, + "child": 16517, + "sign": 0 + }, + "expanded_fallback_children": { + "1": 16517, + "2": 32897, + "3": 32897, + "10": 32897, + "64": 32897 + }, + "fallback_children_upper": 49911, + "actual_R437_ordinary_roles": 659, + "selected_owner_schema_accepts": { + "659": false, + "661": true + }, + "selected_private_schema_accepts": { + "659": false, + "661": true + }, + "scope": "Reused pure plan compiler and low pivot probe; no physical payload, generated callback or CALL/RETURN execution" +} diff --git a/research/r437-uniform-copy-reduction/SOURCES.json b/research/r437-uniform-copy-reduction/SOURCES.json new file mode 100644 index 000000000..b99346f77 --- /dev/null +++ b/research/r437-uniform-copy-reduction/SOURCES.json @@ -0,0 +1,286 @@ +{ + "schema_version": 1, + "base_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0" + }, + { + "path": "docs/research/selected-bit-physical-contract-map.md", + "usage": "provenance", + "git_blob": "bc2810efa90ba8d5a25cc9627ae9ffd4ffa5c5a0", + "sha256": "1311f839e109a16e3f1c093a62b51583ebaf1277ffda6e0df0768ba8e6a09c8e" + }, + { + "path": "research/selected-bit-local-ring-sweeps/PROOF.md", + "usage": "provenance", + "git_blob": "4330de85dd9862ed15d84ab917887d249753df99", + "sha256": "846c59440cc99e28bae93ad2af99525bc769de29368080071b8427141215b4f7" + }, + { + "path": "research/selected-bit-physical-caller/PROOF.md", + "usage": "provenance", + "git_blob": "548ecff3ef79a32c14bafc7f2309781181d3c23d", + "sha256": "e5a827e93fe313ba9bf4a2e300bae01b58b28004aa8a8ee119cf6d950edd9f93" + }, + { + "path": "research/selected-bit-physical-caller/macro_code.py", + "usage": "provenance", + "git_blob": "2f5f8ecfac6457171707b1b5ff02b5071954fcb7", + "sha256": "f626b018124747a5f17c1603bea36cd74c00a69a0647fd7b10e9c4e2964caea8" + }, + { + "path": "research/selected-bit-physical-caller/macro_machine.py", + "usage": "provenance", + "git_blob": "5a032e8923f7f8b22bb98f3e39b804beb9906c16", + "sha256": "7bc6e42072a09a08ac961e05c3da01cde012d740d4b4c605f298d994f2ad7c5a" + }, + { + "path": "research/selected-bit-fast-primitives/PROOF.md", + "usage": "provenance", + "git_blob": "6522e6ec84ed91bce98056456a88698b1cbfe1ad", + "sha256": "c6912c307304b71ab51a5b9647df19a3e2c85efaca5bb3f1b635e918a62b5978" + }, + { + "path": "research/physical-ordinary-interchange/PROOF.md", + "usage": "provenance", + "git_blob": "12be1f06062090fcc68e598bae250f185e3d8524", + "sha256": "8a1c2145cd8f080026488a571d95813c09679aa323f19aeaef0ea98030136e1c" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/sources.py", + "usage": "input", + "git_blob": "16d5e7e6a28018f1e2d76d61efe2d54f6a6941d4", + "sha256": "f102edc7816d742bd89db8097254c19b843d0ef5cf6758ad42e93bcc0b214c62" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/oracle.py", + "usage": "input", + "git_blob": "244f131466698a3ace10b657242fe1f65c07fd1f", + "sha256": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/forms.py", + "usage": "input", + "git_blob": "6667c0b772a63f0059c7caffec63e0d919a92398", + "sha256": "1fdf9d31b7eb107c396e33f94dad61c9d3f2c709cae61178268a44ca80dbc0b4" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/numeric.py", + "usage": "input", + "git_blob": "6d4ebca8398008375b8f4762d1a9f1514e8c2611", + "sha256": "7327b05c4ec3e0f6d9c352cc7de85bfd4ebe940482553e77c59a773a8c09c514" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/plan.py", + "usage": "input", + "git_blob": "48255d5454308c07635fae4e7eb4873b0bd2a4f8", + "sha256": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/trace.py", + "usage": "provenance", + "git_blob": "4b002201ce54cdecec9acf4e874b7f71cd75fe71", + "sha256": "3a664224c558244f606b603cad816d75e94a17c9b2620a06a1530e893dfceac2" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/layout.py", + "usage": "provenance", + "git_blob": "aa554b14fe0f6b308d9fba0a2afc92e5a28e20cb", + "sha256": "3beef6534b02c3b011b741f957a7d9fb05a9ac0bba1fed53b2c71834e4ea6bc1" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/controller.py", + "usage": "input", + "git_blob": "c631a9e77fbcccf0e8f448adc22978728aed7b60", + "sha256": "fa09146991f6c04e6f4b6eb9bf0c8e103e70e90a0e402ff3d69814e6aac8ff8c" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/children.py", + "usage": "input", + "git_blob": "ce4935f838516e2b08d13bec767cb803786fbc6b", + "sha256": "a78866939631214c1d1659203b2b5fc062e3c6255e9f11f975c310046b010bd6" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/catalogue.py", + "usage": "provenance", + "git_blob": "0efc0575a7623ac41c094d2e8772beda5a9fdc29", + "sha256": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/binding.py", + "usage": "input", + "git_blob": "21a5a21220a18ab62a19ac403a9944bc3a8665c8", + "sha256": "20169a8af6ed2b34069fd353a2bc1c42335ab686c58de8479baef33dd3fb493b" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/bitstream.py", + "usage": "input", + "git_blob": "4d1fd4abb0f2aabe833e5cbc9efb51039739e7ca", + "sha256": "f78bac9641007dbd8824984edcac057274fe016ce78bd9cb512d0c0913274783" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/cardinality.py", + "usage": "input", + "git_blob": "b8ba857e32c5903408e1e61ff916300848b4a208", + "sha256": "505d5e560c5a507e6184edcc19a87cf1fed243eb34a5cb21fbe1e4fe017e7f22" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/check_support.py", + "usage": "input", + "git_blob": "e1f961df9fa3a441fc5b600d1288a8d038eca51e", + "sha256": "d9977e87ddc5acdb836b8e4a4e3942da17a05b04ce67c04547d17b986b518964" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/counts.py", + "usage": "input", + "git_blob": "81b48940ce222290a40d4fb349ce827f4788469d", + "sha256": "00b476dbda0e8cc99886bf794439e1cb9e775f435f599a3557e99321fe084069" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/directory.py", + "usage": "input", + "git_blob": "c74cacf5ce809c0561d374f137a52df0992b4226", + "sha256": "4270e370b2bfe38ef73aadcd97d1b3496b56bd582115d74331eb9e5ceb90bec7" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/episode.py", + "usage": "input", + "git_blob": "30d11ff4f333813855d36da3eb5a1ab0e154bafe", + "sha256": "38f79cb2a370548471063952d5f7c74bd795a2a8496fdcf3ce0996d79e3adaff" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/low_codes.py", + "usage": "input", + "git_blob": "737edfc4a10f4b7b3b97a7cef4b40864efd806e6", + "sha256": "f657e17f6088c840e3f7783e662257630f6d2c1e71c217721ffbca4d6ac93e87" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/matrices.py", + "usage": "input", + "git_blob": "5d497353efbb9eeaaf4facd96ab40ffb0f3aa20d", + "sha256": "00b687434039b54529ee092e34f9435cfcd66e0816eb3bd2a6688c73f4e01459" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/packet.py", + "usage": "input", + "git_blob": "ebc9b616514412b80c56d523776e6ba5d6766453", + "sha256": "970e7fe0719e3dfe122b248941e6f21cd90d7dd62089fa6acbd0e5412ce083a5" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/records.py", + "usage": "input", + "git_blob": "4f00467a0ff580954ad2fd0c7380240c753ddef3", + "sha256": "0c9c4b23e998597fb877bb1a29da69ac869b68262abe635b162b4dba9c69b372" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/residual.py", + "usage": "input", + "git_blob": "3d070d2539a529f3b14ecb086a92a3db056229fe", + "sha256": "8fd24747cae498dfb2ba333e7f8a68d7315ae4c2d7530d8ca145aab95ede21df" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/routes.py", + "usage": "input", + "git_blob": "35531201dc349a811dfabc6f1f6e64697d665194", + "sha256": "ed7dc3679451696ab1dd841146b215c9515a3eec5e4ff3763f33c315f1696ada" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/selection.py", + "usage": "input", + "git_blob": "2c28f1aaec104a75c4e6c170b3e6a60300ee6700", + "sha256": "bc8e371fb1fa0b41fb05ef0b34d0f4c317b2396f9833d91f44f95c2b54b4052b" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/stream.py", + "usage": "input", + "git_blob": "5e5a4bb0f98971447043e25d4dd6991bfc070389", + "sha256": "c7dc7da5b00f27016982ada4c0416f8328568b00df16d97012f33d4b372d79b5" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/stream_runner.py", + "usage": "input", + "git_blob": "efff281d4c4be5c1378e31404fbcc634fe4ade59", + "sha256": "751c5023ca0e477369e448583961ace6a76db2723bb6c26f81203def539f1249" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/trace.py", + "usage": "input", + "git_blob": "bb845a90f5bcf006e683e581e385936208f6a1f4", + "sha256": "c71ba11d793dde2ac6e4cdcf468482872975c34589bf1167f2a460cb8a74e984" + }, + { + "path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/words.py", + "usage": "input", + "git_blob": "8d4ba37e2778acb35b34e0719df2caf138fbeb50", + "sha256": "5c37f57708ba3131bdcb03139f9dbc29886bee44569c09cbba51b68f75acd7f9" + } + ], + "retained": [ + { + "path": "inputs/r437-word.json.gz", + "sha256": "e432182d5b62c8bbefeb871fce30317234d707e5e18d4295e65ac21f7fd8365e", + "git_blob": "c558a221dd44cbdaa732a401f9876de4c096d4a7", + "origin_commit": "125f5afad680ef128e386fa58e76eef5fadaa5d6", + "origin_path": "research/t385-r437-copy-audit/inputs/r437-word.json.gz", + "origin_repository": "CrocSwap/integer-mult-bounds PR3936; R437 scientific bytes from PR3647 a24f9ff95c12fd0b6792e3f710569237efd72db2" + }, + { + "path": "R437-UPSTREAM-NOTICE.md", + "sha256": "8ed83f2f0bde43a41e44279f44d29efaeae3df44850b86f0e3578edf3ee104e4", + "git_blob": "9b519b904d456b0b5861f7469a66c365e77799a6", + "origin_commit": "125f5afad680ef128e386fa58e76eef5fadaa5d6", + "origin_path": "research/t385-r437-copy-audit/R437-UPSTREAM-NOTICE.md", + "origin_repository": "CrocSwap/integer-mult-bounds PR3936; R437 scientific bytes from PR3647 a24f9ff95c12fd0b6792e3f710569237efd72db2" + }, + { + "path": "R437-LICENSE", + "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "git_blob": "261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + "origin_commit": "125f5afad680ef128e386fa58e76eef5fadaa5d6", + "origin_path": "research/t385-r437-copy-audit/R437-LICENSE", + "origin_repository": "CrocSwap/integer-mult-bounds PR3936; R437 scientific bytes from PR3647 a24f9ff95c12fd0b6792e3f710569237efd72db2" + }, + { + "path": "inputs/selected589-word.json.gz", + "sha256": "e3e301e62bc2b41dbf1ceac0acf3d35824ebeab1848c5a2142d4577b109da52f", + "git_blob": "85a4499bf9e4911a705d50567a2c2ef6cf23739a", + "origin_commit": "125f5afad680ef128e386fa58e76eef5fadaa5d6", + "origin_path": "research/t385-r437-copy-audit/inputs/selected589-word.json.gz", + "origin_repository": "CrocSwap/integer-mult-bounds PR3936 retained selected PR589 word" + }, + { + "path": "inputs/predecessor-plan.py", + "sha256": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "git_blob": "48255d5454308c07635fae4e7eb4873b0bd2a4f8", + "origin_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "origin_path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/plan.py", + "origin_repository": "CrocSwap/integer-mult-bounds canonical base; Jose Manuel retained source" + }, + { + "path": "inputs/predecessor-oracle.py", + "sha256": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67", + "git_blob": "244f131466698a3ace10b657242fe1f65c07fd1f", + "origin_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "origin_path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/oracle.py", + "origin_repository": "CrocSwap/integer-mult-bounds canonical base; Jose Manuel retained source" + }, + { + "path": "inputs/predecessor-catalogue.py", + "sha256": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "git_blob": "0efc0575a7623ac41c094d2e8772beda5a9fdc29", + "origin_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "origin_path": "research/selected-bit-physical-caller/inputs/pr2753/predecessor/catalogue.py", + "origin_repository": "CrocSwap/integer-mult-bounds; Jose Manuel selected Catalogue" + } + ] +} diff --git a/research/r437-uniform-copy-reduction/TASK.json b/research/r437-uniform-copy-reduction/TASK.json new file mode 100644 index 000000000..e2ab45683 --- /dev/null +++ b/research/r437-uniform-copy-reduction/TASK.json @@ -0,0 +1,83 @@ +{ + "schema_version": 1, + "task_id": "independent-moment", + "priority_revision": 6, + "base_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "original_card": { + "id": "independent-moment", + "question": "Does one changed supplier or assembly claim lack a source-bound independent check of a specific new implication?", + "starting_points": [ + "certificates/selected-result.json", + "research/rank7-joint-endframes/README.md", + "docs/research/research-family-status.md" + ], + "methods": [ + "Independently reconstruct a coordinated frame/circuit change and its single-change control, then derive the complete rank and physical ledger.", + "Implement certified moment inequalities through a different exact enclosure method." + ], + "acceptance_gate": "Demonstrate independence, source binding, positive cases and semantic failure controls. Name the existing checks and the missing coverage. More digits or another equivalent evaluation of an unchanged root is not by itself new verification coverage.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read #2979 joint rank-7 end-frame proposal and the revision-6 evidence status. Its claimed kappa is not selected. Compare coordinated changes with the losing single-change controls and locate the complete physical ledger; an aggregate moment alone does not validate the mechanism.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "Prioritize a bounded independent audit of #2979: reconstruct one joint group and its single-lowering control, check the declared frames/chronology, then trace changed children, idle widths and cleanup buffers into the complete invoice and both supplier caps. Choose one still-missing implication after checking existing audits. Stop with exact unresolved dependencies if full admission exceeds the session; do not launch a new lowering census on an unvalidated premise or substitute extra root digits for mechanism checking.", + "bottleneck_link": "Independent pricing prevents unsupported frontier claims and can reveal genuine accounting slack.", + "allowed_variations": [ + "Reconstruct either a source ledger or a numeric enclosure with a different method." + ], + "scope_change_triggers": [ + "Importing the primary function and calling its output independent verification.", + "Promoting #2979 from merged source archive to validated supplier solely from author PASS receipts or aggregate pricing." + ], + "overlap_terms": [ + "independent moment", + "rank histogram", + "exact enclosure", + "2979", + "rank7 joint endframes", + "paired extraction", + "joint lowering" + ] + }, + "scope_status": "refined", + "actual_scope": "Prove the uniform arbitrary-dirty rank-seven specialization and complete relative good/fallback bill under explicit inherited callee/refinement premises; derive the rank-specific low-class fraction; audit an alternate all-class factorization with reverse-order adapters charged.", + "scope_change_reason": "Explicit donor follow-up to PR3936. A generic conjugacy route has reverse-order adapters; the new result charges them and does not equate the reduction with the inherited cheap tariff.", + "bottleneck_link": "An exact finite identity and a price endpoint do not establish the arbitrary-complete-stream implementation contract or its normalization.", + "budget_minutes": 60, + "stop_rule": "One approximately 60-minute session from 2026-10-19 05:32 UTC, reserving the final quarter for verification and publication. Stop at a missing physical cost implication rather than infer admission from a matrix identity.", + "outcome": "partial", + "evidence": "ORIGINAL-CALLER.md proves delta_7 <=448(q-1)/(q(q-2)) and the full relative good/fallback cost. PROOF.md supplies a fixed-support alternative and exposes its extra ordinary bill. The requested physical source/refinement proof remains incomplete. SOURCE-PLAN.json proves the concrete 659/661 schema distinction. CALLBACK-PROBE.json records actual encoded numerical components on the R437 COPY515 projector with a synthetic rank26 ancestor: 1664->182, four coefficients, three source controls, no runtime host decoding; no physical return.", + "author": "Chris R (@Clear1nsight), with substantial OpenAI assistance", + "ai_assistance": "Substantial OpenAI Codex assistance in new implementation, execution and writing; no independent human or formal kernel review.", + "open_questions": [ + { + "question": "Can one actual R437 rank-seven source record be bound to a uniform completed physical CALL/RETURN with proved preparation and full visited-cell reserve?", + "why_it_matters": "The relative good/fallback inequality does not independently prove its physical/backend premises or authorize substituting new source records into the selected registry.", + "first_step": "Bind a concrete R437 Specification, raw prefix/program identity, coefficient request, U stock, child width/precision and protected return/continuation; prove the actual preparation and scratch bound.", + "blocked_by": "Inherited universal C0/B1 refinement remains partially reviewed, and this package has no executed R437-specific physical integration." + }, + { + "question": "Can reverse-order adapters be realized or shared within the intended rank-seven local toll, with the actual generated coefficient access?", + "why_it_matters": "The new all-class conjugacy reduction pays ordinary interchanges of width f*w; the retained rank label alone does not pay them.", + "first_step": "Take one nonzero reverse factor of the actual rank-seven weighted conjugator; bind an encoded source-preserving primitive and prove its complete time and scratch bill, including any consumer restoration.", + "blocked_by": "No cheaper bound follows from this generic reduction. This is not an impossibility result for the original good/fallback construction." + } + ], + "freshness": { + "canonical_main": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "priority_revision": 6, + "entry_utc": "2026-10-19T05:33Z", + "CI3936": "run 39202988286 completed success; plan and replay 117900282788 passed including unchanged inputs", + "predecessor_scientific_head": "125f5afad680ef128e386fa58e76eef5fadaa5d6", + "predecessor_live_head": "e54c649865d737fe08edd4312a234cd186317db4", + "predecessor_delta": "Only .github/workflows/p112-common-slice.yml, 2 added and 2 removed lines; scientific package unchanged.", + "current_CI3936": "run 39205477701 completed success at the live head" + }, + "late_overlap_handoff": "Refresh zxv/PR3690 finite adapter at current a24f9ff/OQ4; bind its actual current rank26 ancestor and rank7 COPY to complete protected return, then prove uniform preparation and visited-cell reserve. The unchanged-selected-Catalogue guard does not refute that older R437 adapter." +} diff --git a/research/r437-uniform-copy-reduction/VALIDATION.json b/research/r437-uniform-copy-reduction/VALIDATION.json new file mode 100644 index 000000000..4668cc163 --- /dev/null +++ b/research/r437-uniform-copy-reduction/VALIDATION.json @@ -0,0 +1,32 @@ +{ + "status": "PASS", + "exit_code": 0, + "started_utc": "2026-10-19T06:11:34Z", + "finished_utc": "2026-10-19T06:12:00Z", + "seconds": 25.894155, + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "registered_commands": 7, + "manifest_sha256": "43866e4d21ad7babbec9f3fcb1c7e9987c72bfc583eae47ee2bcbbf4c2e59b07", + "replay_log_sha256": "3ca5992d9f45fccf65643dfe9a4aefe350adca1cf0a421eceaad0bccad30a5e6", + "scientific_status": "PARTIAL: conditional caller/cost proof; full physical R437 source integration and universal refinement not established", + "validation_scope": "Exact local-ring algebra, independent nullspace/minor checks, authenticated reused-code plan and numerical component probes, actual optimized Git-free main CLI controls; no physical whole-packet R437 CALL/RETURN", + "executed_source_sha256": { + "RESULT.json": "63e0c6115380e6c08c23026e5f431e0d8e490cc3e00160e07973cd7560e0a300", + "copy_child.py": "7b0bd55917e2e27d744f716071fe58d9e11c391d4c5967eb1790f80bdb0f6078", + "CALLBACK-PROBE.json": "ba8836f7a4802ef4c7b09f013ea79e2ff040a836d91c68b53e91f03a6c7760a0", + "callback_probe.py": "b5c487f8946fb4c9df1cbb3ad4782ba61a8d500f0b597a65ad1c739a352c6ed4", + "test_package.py": "e5cc73fa307a4b6eab30481065e5ee7bfee8333e0b322e3c47f952588f3ce15f", + "VERIFY.json": "43866e4d21ad7babbec9f3fcb1c7e9987c72bfc583eae47ee2bcbbf4c2e59b07", + "SOURCE-PLAN.json": "a8c4bdc90fdc58ec9a04aa8727d3ec44b8fa4a274a28d35a8db40ba09d2eba93", + "minor_bound.py": "38424925e492a6381f64d9794ee76d893ca2781d15ce90f695a84b9241802db2", + "verify.py": "e03bf42b20013f6e35cb25929fef1d6d0679b7bc96fd7b77001b7570157132cd", + "source_audit.py": "441ca6f460d4a9287dad3673948c4ae5d9d45dfa2c11d0d03f208a012dce689e", + "independent.py": "63ddb431cc4513089dceaf9c57327b5c783f54f45313f8101b0d19defb65a572", + "SOURCES.json": "18dd1bd769a75a3796b516c9d21e85d88f158f2ed43a1ca28df86c0b42de93c1", + "MINOR-BOUND.json": "6fa7c9a0ae4026b7f3358d28d8b0faea0febb2f11d7f6e1d03ec2a7e12c887a2", + "inputs/predecessor-catalogue.py": "83ea88f82d4a83c5f889774bfe3519b7ebaa24b6a0e2a969dafff012107a89bf", + "inputs/predecessor-plan.py": "d9c8dc93762db4d3a449814aa51e2211460648694469854d89cb48cb04188cf3", + "inputs/predecessor-oracle.py": "7bd18089e32ce48085b5e3a75159f6a82cdb2649ec682c53db05e399d97aef67" + } +} diff --git a/research/r437-uniform-copy-reduction/VERIFY.json b/research/r437-uniform-copy-reduction/VERIFY.json new file mode 100644 index 000000000..7c16fac60 --- /dev/null +++ b/research/r437-uniform-copy-reduction/VERIFY.json @@ -0,0 +1,109 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/binding.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/bitstream.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/cardinality.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/check_support.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/children.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/controller.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/counts.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/directory.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/episode.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/forms.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/low_codes.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/matrices.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/numeric.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/oracle.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/packet.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/plan.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/records.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/residual.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/routes.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/selection.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/sources.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/stream.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/stream_runner.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/trace.py", + "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor/words.py" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 180, + "checks": "Source-bound weighted projector factorization over complete local-ring address matrices, including bad leading minor, characteristic seven and separately billed reverse adapters." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 180, + "checks": "Repeat semantic controls with assertions disabled." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/independent.py" + ], + "timeout_seconds": 60, + "checks": "Independent nullspace projector and fixed-support invoice derivation; no compiler imports." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/minor_bound.py" + ], + "timeout_seconds": 120, + "checks": "Independent adjugate/Cauchy-Binet verification on complete small GL fields, explicit conditioning, and rank-seven fallback allowance. Written proof covers all admitted primes and precisions." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/source_audit.py" + ], + "timeout_seconds": 60, + "checks": "Explicit reused-code probe of authenticated original plan compiler on actual ambient-64 good/bad R437 projectors, including all main/half reset counts. Not independent physical execution." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/callback_probe.py" + ], + "timeout_seconds": 180, + "checks": "Authenticated predecessor encoded coefficient/descriptor components at actual R437 COPY515 with a declared synthetic rank-26 ancestor; numerical source controls and no-decode guard. No physical payload/return execution." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/test_package.py" + ], + "timeout_seconds": 300, + "checks": "Actual optimized Git-free CLI positive and altered source/result, missing and symlink input controls." + } + ] +} diff --git a/research/r437-uniform-copy-reduction/callback_probe.py b/research/r437-uniform-copy-reduction/callback_probe.py new file mode 100644 index 000000000..4a3432e14 --- /dev/null +++ b/research/r437-uniform-copy-reduction/callback_probe.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Direct, authenticated encoded-component probe; predecessor code is reused. + +Actual R437 COPY515 projector/source record plus a declared synthetic rank-26 +ancestor. No full R437 Catalogue, payload, stock or physical return is claimed. +""" +from contextlib import contextmanager +from dataclasses import replace +from fractions import Fraction as F +import gzip +import hashlib +import json +from pathlib import Path +import sys + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +VENDOR = ROOT / "research/selected-bit-physical-caller/inputs/pr2753/predecessor/vendor" + + +def need(ok, why): + if not ok: + raise ValueError(why) + + +def authenticate(): + source = json.loads((HERE / "SOURCES.json").read_bytes()) + inputs = {row["path"]: row for row in source["files"] if row["usage"] == "input"} + for path in sorted(VENDOR.glob("*.py")): + relative = path.relative_to(ROOT).as_posix() + need(relative in inputs and not path.is_symlink(), "declared encoded component input") + data = path.read_bytes() + need(hashlib.sha256(data).hexdigest() == inputs[relative]["sha256"], "encoded component source SHA") + return source + + +def body(tape): + # Observer only, outside no_decode and outside the component algorithm. + return bytes(tape.cells[1:]).rstrip(bytes([4])) + + +def numerical_return(arena, live): + need(arena.live == live and arena.template.head == 1, "numerical slots/template return") + for word in arena.words: + need(word.head == 1, "returned numerical head") + if word.slot not in live: + need(word.cells[0] == 2 and all(x == 4 for x in word.cells[1:]), + "complete erased numerical scratch") + + +def main(): + authenticate() + sys.path.insert(0, str(VENDOR)) + from binding import split_basis + from children import coefficient, extend + from controller import Callback + from numeric import selected_coefficient + import oracle + from plan import Request, compile_plan + from records import Fields, Program + from sources import Template, compile_specification + from words import Arena, Ring, Unsigned, Word + # Import the new independent projector only after the pinned source + # namespace is established. The predecessor module name does not collide. + sys.path.insert(0, str(HERE)) + from copy_child import projector + + @contextmanager + def no_decode(): + original = Word.inspect + def forbidden(_self): + raise ValueError("runtime host numerical decoding") + Word.inspect = forbidden + try: + yield + finally: + Word.inspect = original + + raw = (HERE / "inputs/r437-word.json.gz").read_bytes() + need(hashlib.sha256(raw).hexdigest() == "e432182d5b62c8bbefeb871fce30317234d707e5e18d4295e65ac21f7fd8365e", "R437 target input") + word = json.loads(gzip.decompress(raw)) + local, rank = projector(word["lines"], word["frames"][515]) + need(rank == 7 and word["ret"][5] == 475, "literal R437 target") + zero = [[F(0)] * 64 for _ in range(64)] + base7 = [row[:] for row in zero] + for i, row in enumerate(local): + base7[i][:8] = row + base26 = [[F(i == j and i < 26) for j in range(64)] for i in range(64)] + identity = tuple(tuple(F(i == j) for j in range(64)) for i in range(64)) + templates = [Template(3, 26, ("DECLARED_SYNTHETIC_ANCESTOR", 26), tuple(map(tuple, base26)), identity, + split_basis(base26, 26, 3)), + Template(3, 7, ("R437_COPY", 475, 515, 0, 28416, "common"), tuple(map(tuple, base7)), identity, + split_basis(base7, 7, 3))] + fixtures = [oracle.fixture(template, 2, high=1) for template in templates] + specifications = {code: compile_specification(code, template, fixtures[code][0]) + for code, template in enumerate(templates)} + need(all(spec.good for spec in specifications.values()), "actual compiled good low branches") + pivots = [oracle.good_pivots(oracle.projector(template, low, high, 2), template.rank, 9) + for template, (low, high) in zip(templates, fixtures)] + + arena, indices = Arena(5), Arena(14) + modulus = arena.input(9) + ring = Ring(modulus) + # ROOT4096 -> GOOD rank26, width1664 -> current COPY7, width182. + # The ancestor is a legal declared grammar probe, not a claimed actual + # R437 owner/idle descriptor or a fresh large-prime selected execution. + program = Program.fixture(indices, arena, 4096, 2, [(0, 0, 26, 0, False, False)], 2) + fields = Fields.fixture(indices, arena, [(code, high) for code, (_low, high) in enumerate(fixtures)], 2) + original_program, original_fields = body(program.tape), body(fields.tape) + protected_arena, protected_indices = set(arena.live), set(indices.live) + observed = [] + for i in (0, 26, 64, 181): + coordinate = indices.input(i) + request = Request("child", coordinate, child_kind="good") + expected = 2 * pivots[0][i // 64] * pivots[1][i // 26] % 9 + with no_decode(): + result = coefficient(ring, indices, program, fields, specifications, 1, request) + expected_word = arena.literal(expected) + need(Unsigned(arena).compare(result, expected_word) == 0, "actual generated two-level unit coefficient") + need(expected % 3 != 0, "generated value remains a unit") + observed.append(dict(coordinate=i, value=expected)) + arena.free_many(result, expected_word) + indices.free(coordinate) + numerical_return(arena, protected_arena) + numerical_return(indices, protected_indices) + need(body(program.tape) == original_program and body(fields.tape) == original_fields + and program.tape.head == fields.tape.head == 1, "borrowed encoded source/prefixes preserved") + + coordinate = indices.zero() + with no_decode(): + incoming = Callback(ring, indices, program, fields, specifications, 1, allow_fallback=True) + child_program = extend(incoming, Request("child", coordinate, child_kind="good")) + incoming.close() + level = indices.input(2) + metadata, parent, child = child_program.step(level) + expected_parent, expected_child = indices.input(1664), indices.input(182) + need(metadata == (0, 1, 7, 0, 0, 0) and Unsigned(indices).compare(parent, expected_parent) == 0 + and Unsigned(indices).compare(child, expected_child) == 0, "actual nonterminal descriptor extent and source") + indices.free_many(level, parent, child, expected_parent, expected_child, coordinate) + child_program.tape.clear() + + controls = [] + for name, current, table in [ + ("foreign_current_source", 3, specifications), + ("wrong_ancestor_rank", 1, {0: replace(specifications[0], template=replace(templates[0], rank=25)), 1: specifications[1]}), + ("wrong_current_prefix_code", 0, specifications), + ]: + coordinate = indices.zero() + try: + with no_decode(): + value = coefficient(ring, indices, program, fields, table, current, + Request("child", coordinate, child_kind="good")) + except ValueError as error: + controls.append(dict(control=name, rejected_by=str(error))) + else: + arena.free(value) + raise ValueError("accepted encoded source mutation: " + name) + finally: + indices.free(coordinate) + numerical_return(arena, protected_arena) + numerical_return(indices, protected_indices) + need(body(program.tape) == original_program and body(fields.tape) == original_fields + and program.tape.head == fields.tape.head == 1, "failed source binding preserves borrowed bytes/heads") + program.tape.clear() + fields.tape.clear() + ring.close() + arena.free(modulus) + numerical_return(arena, set()) + numerical_return(indices, set()) + result = dict(status="PASS_ENCODED_R437_COPY_COEFFICIENT_PROBE", q=3, atom_precision=2, + actual_R437_center=475, actual_R437_frame=515, copied_projector_rank=7, + synthetic_ancestor_rank=26, root_width=4096, parent_width=1664, + child_width=182, child_is_nonterminal=True, + generated_coefficients=observed, child_metadata=list(metadata), controls=controls, + runtime_host_numerical_decoding=False, + scope="Authenticated reused numerical components, actual COPY projector and explicit finite new source record, synthetic ancestor; no full R437 catalogue, payload, stock, physical CALL/RETURN or all-size cost proof") + path = HERE / "CALLBACK-PROBE.json" + if "--write-result" in sys.argv: + path.write_text(json.dumps(result, indent=2) + "\n") + else: + need(json.loads(path.read_bytes()) == result, "callback probe receipt differs") + print(result["status"] + " parent=1664 child=182 controls=3 no_decode=true") + + +if __name__ == "__main__": + main() diff --git a/research/r437-uniform-copy-reduction/copy_child.py b/research/r437-uniform-copy-reduction/copy_child.py new file mode 100644 index 000000000..5650d34be --- /dev/null +++ b/research/r437-uniform-copy-reduction/copy_child.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Chris R / Clear1nsight, with substantial OpenAI Codex assistance. +"""Fixed-support local-ring reduction, not a physical tape interpreter. + +Generic split-projector conjugation is predecessor work (PR2234, PR1627). +This implementation normalizes only a kernel column, emits a fixed-support +SL word and exposes every reverse-order adapter in the caller invoice. +""" +from fractions import Fraction +from math import gcd + + +def need(ok, why): + if not ok: + raise ValueError(why) + + +def eye(n): + return [[int(i == j) for j in range(n)] for i in range(n)] + + +def mul(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, "unit pivot required") + 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: + 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 determinant(a, modulus): + rows, value, n = [list(row) for row in a], 1, len(a) + 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, "invertible local-ring matrix") + if k != j: + rows[j], rows[k] = rows[k], rows[j] + value = -value + pivot = rows[j][j] + value = value * pivot % modulus + for i in range(j + 1, n): + c = rows[i][j] * pow(pivot, -1, modulus) % modulus + rows[i] = [(x - c * y) % modulus for x, y in zip(rows[i], rows[j])] + return value % modulus + + +def independent_columns(a, q): + """Column independence over the residue field, with original ordinals.""" + rows = [[x % q for x in row] for row in a] + selected, pivot = [], 0 + for column in range(len(a[0])): + k = next((i for i in range(pivot, len(a)) if rows[i][column]), None) + if k is None: + continue + rows[pivot], rows[k] = rows[k], rows[pivot] + inv = pow(rows[pivot][column], -1, q) + rows[pivot] = [x * inv % q for x in rows[pivot]] + for i in range(len(a)): + if i != pivot: + c = rows[i][column] + rows[i] = [(x - c * y) % q for x, y in zip(rows[i], rows[pivot])] + selected.append(column) + pivot += 1 + if pivot == len(a): + break + return selected + + +def split_basis(p, rank, q, modulus): + n = len(p) + complement = [[(int(i == j) - p[i][j]) % modulus for j in range(n)] for i in range(n)] + image = independent_columns(p, q) + kernel = independent_columns(complement, q) + need(len(image) == rank and len(kernel) == n - rank, "split ranks from residue field") + basis = [[p[i][j] for j in image] + [complement[i][j] for j in kernel] for i in range(n)] + e = [[int(i == j and i < rank) for j in range(n)] for i in range(n)] + need(mul(p, basis, modulus) == mul(basis, e, modulus), "image/kernel basis") + need(gcd(determinant(basis, modulus), modulus) == 1, "split basis is a unit") + return basis + + +def normalize_kernel(s, rank, modulus): + """Right multiplication in ker(E) commutes with the central interchange.""" + need(0 < rank < len(s), "nonempty image and kernel") + out = [list(row) for row in s] + value = determinant(s, modulus) + multiplier = pow(value, -1, modulus) + for row in out: + row[rank] = row[rank] * multiplier % modulus + need(determinant(out, modulus) == 1, "special linear normalization") + return out + + +def support_bound(n): + need(n >= 2, "factor dimension") + return (n - 1) * (5 * n + 12) // 2 + + +def row_add(rows, target, source, coefficient, modulus): + rows[target] = [(x + coefficient * y) % modulus for x, y in zip(rows[target], rows[source])] + + +def factor_sl(s, modulus): + """Chronological left actions, with identical (target,source) support. + +Zero coefficients are deliberately emitted and charged. Pivot selection is +numeric preparation; the factor support and length never depend on it. +""" + n = len(s) + need(determinant(s, modulus) == 1, "SL input") + rows, reduction = [list(row) for row in s], [] + + def emit(i, j, c): + c %= modulus + row_add(rows, i, j, c, modulus) + reduction.append((i, j, c)) + + for j in range(n): + pivot = next((i for i in range(j, n) if gcd(rows[i][j], modulus) == 1), None) + need(pivot is not None, "local-ring elimination unit") + for k in range(j + 1, n): + chosen = int(pivot == k) + emit(j, k, chosen) + emit(k, j, -chosen) + emit(j, k, chosen) + inv = pow(rows[j][j], -1, modulus) + for i in range(n): + if i != j: + emit(i, j, -rows[i][j] * inv) + diagonal = [rows[i][i] for i in range(n)] + need(all(rows[i][j] == (diagonal[i] if i == j else 0) for i in range(n) for j in range(n)), "diagonal endpoint") + word = [] + for i, a in enumerate(diagonal[:-1]): + last = n - 1 + # w(a)w(-1) = diag(a,a^-1); actions accumulate on the left. + word.extend([(i, last, -1), (last, i, 1), (i, last, -1), + (i, last, a), (last, i, -pow(a, -1, modulus)), (i, last, a)]) + word.extend((i, j, -c) for i, j, c in reversed(reduction)) + word = [(i, j, c % modulus) for i, j, c in word] + need(len(word) == support_bound(n), "fixed factor bound") + return word + + +def word_matrix(word, n, modulus): + out = eye(n) + for i, j, c in word: + need(i != j and 0 <= i < n and 0 <= j < n, "elementary support") + row_add(out, i, j, c, modulus) + return out + + +def projector(lines, indices): + """Independent orthogonal elimination from the retained E8 root rows.""" + orthogonal = [] + for index in indices: + v = list(map(Fraction, lines[index])) + for b in orthogonal: + c = sum(x * y for x, y in zip(v, b)) / sum(y * y for y in b) + v = [x - c * y for x, y in zip(v, b)] + if any(v): + orthogonal.append(v) + n = len(lines[0]) + p = [[sum((b[i] * b[j] / sum(y * y for y in b) for b in orthogonal), Fraction(0)) + for j in range(n)] for i in range(n)] + return p, len(orthogonal) + + +def reduce_rational(a, modulus): + return [[x.numerator * pow(x.denominator, -1, modulus) % modulus for x in row] for row in a] + + +def block_diagonal(a, b): + n = len(a) + return [row + [0] * n for row in a] + [[0] * n + row for row in b] + + +def residual(p, weights, modulus): + """Tail is written in reflected coordinates; physical reversal is external.""" + n = len(p) + out = [[0] * (2 * n) for _ in range(2 * n)] + for i in range(n): + for j in range(n): + c = (int(i == j) - p[i][j]) % modulus + out[i][j] = weights[i] * c * pow(weights[j], -1, modulus) % modulus + out[i][n + j] = weights[i] * p[i][j] % modulus + out[n + i][j] = p[i][j] * pow(weights[j], -1, modulus) % modulus + out[n + i][n + j] = c + return out + + +def compile_copy(p, rank, g, weights, q, modulus): + n = len(p) + need(all(gcd(a, modulus) == 1 for a in weights), "incoming diagonal units") + basis = split_basis(p, rank, q, modulus) + u = mul(g, basis, modulus) + head = [[weights[i] * x % modulus for x in row] for i, row in enumerate(u)] + head, tail = normalize_kernel(head, rank, modulus), normalize_kernel(u, rank, modulus) + head_word, tail_word = factor_sl(head, modulus), factor_sl(tail, modulus) + need(word_matrix(head_word, n, modulus) == head, "head word") + need(word_matrix(tail_word, n, modulus) == tail, "tail word") + k = block_diagonal(head, tail) + e = [[int(i == j and i < rank) for j in range(n)] for i in range(n)] + central = residual(e, [1] * n, modulus) + endpoint = mul(mul(k, central, modulus), inverse(k, modulus), modulus) + conjugate = mul(mul(g, p, modulus), inverse(g, modulus), modulus) + expected = residual(conjugate, weights, modulus) + need(endpoint == expected, "complete weighted conjugate, not a rank-only test") + return dict(head=head_word, tail=tail_word, matrix=endpoint, conjugator=k) + + +def invoice(dimension=64, columns=1, prefixes=1): + need(dimension > 7 and columns >= 1 and prefixes >= 1, "COPY invoice domain") + length = support_bound(dimension) + # Four words: head/tail and their inverses; all factors are paid. + slots = 4 * length + return dict(factor_slots=slots, ordered_shear_calls=slots * columns, + reverse_factor_slots=2 * length, + ordinary_block_swap_calls_upper=4 * length, + ordinary_block_width_atoms=columns, + coarse_calls=1, coarse_width_atoms=7 * columns, + prefix_multiplier_on_coarse_calls=1, + physical_prefixes=prefixes, clone_episodes=1, disposal_episodes=1, + intermediate_disposals_upper=slots * columns + 4 * length + 1) diff --git a/research/r437-uniform-copy-reduction/independent.py b/research/r437-uniform-copy-reduction/independent.py new file mode 100644 index 000000000..088767e84 --- /dev/null +++ b/research/r437-uniform-copy-reduction/independent.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Independent nullspace and schedule checks; imports no reduction code.""" +from fractions import Fraction as F +import gzip +import hashlib +import json +from pathlib import Path + +P = Path(__file__).resolve().parent + + +def need(ok, why): + if not ok: + raise ValueError(why) + + +def nullspace(rows): + a = [[F(x) for x in row] for row in rows] + width, row, pivots = len(a[0]), 0, [] + for j in range(width): + k = next((k for k in range(row, len(a)) if a[k][j]), None) + if k is None: + continue + a[row], a[k] = a[k], a[row] + c = a[row][j] + a[row] = [x / c for x in a[row]] + for k in range(len(a)): + if k != row: + c = a[k][j] + a[k] = [x - c * y for x, y in zip(a[k], a[row])] + pivots.append(j) + row += 1 + if row == len(a): + break + free = [j for j in range(width) if j not in pivots] + need(len(free) == 1 and len(pivots) == 7, "rank-seven hyperplane") + normal = [F(j == free[0]) for j in range(width)] + for i, j in enumerate(pivots): + normal[j] = -a[i][free[0]] + need(all(sum(x * y for x, y in zip(row, normal)) == 0 for row in rows), "actual root-row nullspace") + norm = sum(x * x for x in normal) + return [[F(i == j) - normal[i] * normal[j] / norm for j in range(width)] for i in range(width)] + + +def product2(a, b, modulus): + return [[sum(a[i][k] * b[k][j] for k in range(2)) % modulus for j in range(2)] for i in range(2)] + + +def main(): + data = (P / "inputs/r437-word.json.gz").read_bytes() + need(hashlib.sha256(data).hexdigest() == "e432182d5b62c8bbefeb871fce30317234d707e5e18d4295e65ac21f7fd8365e", "independent source pin") + word, result = json.loads(gzip.decompress(data)), json.loads((P / "RESULT.json").read_bytes()) + for row in result["captures"]: + frame = row["frame"] + projection = nullspace([word["lines"][k] for k in word["frames"][frame]]) + digest = hashlib.sha256(json.dumps([[str(x) for x in r] for r in projection], sort_keys=True, separators=(",", ":")).encode()).hexdigest() + need(digest == row["projector_sha256"], "independent projector matrix") + + # Count the actual fixed supports in a different loop organization. + d = 64 + swaps = [(j, k) for j in range(d) for k in range(j + 1, d)] + eliminations = [(i, j) for j in range(d) for i in range(d) if i != j] + supports = [] + for j, k in swaps: + supports += [(j, k), (k, j), (j, k)] + supports += eliminations + for i in range(d - 1): + supports += [(i, d - 1), (d - 1, i), (i, d - 1)] * 2 + length = len(supports) + reverse = sum(i < j for i, j in supports) + sum(i > j for i, j in supports) + invoice = result["invoice"] + need(length == result["fixed_word_length"] == 10458, "independent support length") + need(2 * reverse == result["physical_reverse_factor_slots"] == 20916, "physical head/tail order") + need(invoice["ordered_shear_calls"] == 4 * length * 10, "all column scalar passes") + need(invoice["ordinary_block_swap_calls_upper"] == 4 * reverse == 41832, "all reverse interchanges") + need(invoice["coarse_calls"] == 1 and invoice["coarse_width_atoms"] == 70, "one complete coarse child") + + identities = 0 + for modulus in (3, 9, 25, 49, 81): + for a in range(1, modulus): + if a % (3 if modulus in (3, 9, 81) else 5 if modulus == 25 else 7) == 0: + continue + inv = pow(a, -1, modulus) + # Direct left-to-right matrix multiplication, independently of + # factor_sl's chronological row-action implementation. + forward = [[0, a], [-inv % modulus, 0]] + right = [[0, -1 % modulus], [1, 0]] + need(product2(forward, right, modulus) == [[a, 0], [0, inv]], "unit diagonal identity") + identities += 1 + need(result["supplier_admitted"] is False and result["physical_backend_implemented"] is False, "no scientific promotion") + print("PASS_INDEPENDENT_NULLSPACE_AND_COMPLETE_INVOICE frames=9 unit_identities=" + str(identities)) + + +if __name__ == "__main__": + main() diff --git a/research/r437-uniform-copy-reduction/inputs/predecessor-catalogue.py b/research/r437-uniform-copy-reduction/inputs/predecessor-catalogue.py new file mode 100644 index 000000000..0efc0575a --- /dev/null +++ b/research/r437-uniform-copy-reduction/inputs/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 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/r437-uniform-copy-reduction/inputs/r437-word.json.gz b/research/r437-uniform-copy-reduction/inputs/r437-word.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c558a221dd44cbdaa732a401f9876de4c096d4a7 GIT binary patch literal 42280 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 J(cMU!GGwV$%u+D>Tm+#J#?ykp?=-hYc++fmk#H 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 2 + and isinstance(node.args[1], ast.Constant) + and node.args[1].value in ("replica owner symmetry", "fresh selected COPY")): + guards[node.args[1].value] = compile(ast.Expression(body=node.args[0]), str(catalogue_path), "eval") + need(set(guards) == {"replica owner symmetry", "fresh selected COPY"}, "exact selected schema guards") + ordinary = 2 * word["v"] + word["R"] + owner_accepts = {} + copy_accepts = {} + for count in (ordinary, 661): + owners = [(0, ("identity",))] * count + context = dict(other=dict(owners=owners), call=dict(owners=owners), replica=0) + owner_accepts[str(count)] = eval(guards["replica owner symmetry"], context, context) + copy_accepts[str(count)] = eval(guards["fresh selected COPY"], {}, + dict(temporary=count, opened=None, base=SimpleNamespace(rank=7), rank=7)) + need(ordinary == 659 and owner_accepts == {"659": False, "661": True} + and copy_accepts == {"659": False, "661": True}, "R437 requires explicit source/schema integration") + rational, rank = projector(word["lines"], word["frames"][515]) + need(rank == 7, "actual R437 frame") + q, p = 3, [[0] * 64 for _ in range(64)] + for i, row in enumerate(reduce_rational(rational, q)): + p[i][:8] = row + basis = split_basis(p, 7, q, q) + good_g = inverse(basis, q) + good = mul(mul(good_g, p, q), inverse(good_g, q), q) + oracle["good_pivots"](good, 7, q) + gp = namespace["compile_plan"](good, 7, q, True) + need(len(gp.commands) == 4936 and all(c.kind == "add" and c.target > c.source for c in gp.commands), "every original good adapter is physically ordered") + permutation = eye(64) + for i in range(7): + permutation[i], permutation[57 + i] = permutation[57 + i], permutation[i] + bad_g = mul(permutation, inverse(basis, q), q) + bad = mul(mul(bad_g, p, q), inverse(bad_g, q), q) + try: + oracle["good_pivots"](bad, 7, q) + except ValueError: + pass + else: + raise ValueError("bad probe entered the good source branch") + bp = namespace["compile_plan"](bad, 7, q, False) + need(all(c.target > c.source for c in bp.commands if c.kind == "add"), "all original fallback scalar adapters are ordered") + expanded = {} + for f in (1, 2, 3, 10, 64): + children = 0 + for c in bp.commands: + if c.kind == "child": + same_bank = (c.target < 64) == (c.source < 64) + children += 1 + (2 if same_bank and f // 2 else 0) + need(children <= 49911, "all original main and half children fit the complete allowance") + expanded[str(f)] = children + count = {kind: sum(c.kind == kind for c in bp.commands) for kind in ("add", "child", "sign")} + need(count["add"] <= 16256 and count["sign"] <= 1 and count["child"] <= 16637, "fallback finite-control bounds") + result = dict(status="PASS_REUSED_ORIGINAL_PLAN_ALGEBRA_AND_COUNTS", frame=515, + dimension=64, rank=7, q=3, good_adapter_commands=4936, + good_forward_backward_ADDs_per_column=9872, + fallback_command_counts=count, expanded_fallback_children=expanded, + fallback_children_upper=49911, + actual_R437_ordinary_roles=ordinary, + selected_owner_schema_accepts=owner_accepts, + selected_private_schema_accepts=copy_accepts, + scope="Reused pure plan compiler and low pivot probe; no physical payload, generated callback or CALL/RETURN execution") + expected = HERE / "SOURCE-PLAN.json" + if "--write-result" in sys.argv: + expected.write_text(json.dumps(result, indent=2) + "\n") + else: + need(json.loads(expected.read_bytes()) == result, "source-plan receipt differs") + print(result["status"] + " good_ADDs_per_column=9872 fallback_cap=49911") + + +if __name__ == "__main__": + main() diff --git a/research/r437-uniform-copy-reduction/test_package.py b/research/r437-uniform-copy-reduction/test_package.py new file mode 100644 index 000000000..5faf23508 --- /dev/null +++ b/research/r437-uniform-copy-reduction/test_package.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Exercise the real optimized CLI in a Git-free source export.""" +import json +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile + +P = Path(__file__).resolve().parent + + +def run(package, good, message): + r = subprocess.run([sys.executable, "-I", "-O", "-B", str(package / "verify.py")], + cwd=package.parent, capture_output=True, text=True, timeout=240) + if (r.returncode == 0) != good or message not in r.stdout + r.stderr: + raise ValueError("unexpected actual CLI response: " + r.stdout + r.stderr) + + +def main(): + with tempfile.TemporaryDirectory(prefix="r437-copy-uniform-export-") as folder: + root = Path(folder) + package = root / "package" + shutil.copytree(P, package, ignore=shutil.ignore_patterns("__pycache__", "*.pyc")) + if (root / ".git").exists(): + raise ValueError("export unexpectedly has Git") + run(package, True, "PASS_UNIFORM_COPY_REDUCTION_WITH_EXPLICIT_BACKEND_PREMISES") + word = package / "inputs/r437-word.json.gz" + saved = word.read_bytes() + word.write_bytes(saved + b"modified") + run(package, False, "retained SHA") + word.unlink() + run(package, False, "missing/linked retained input") + outside = root / "outside.gz" + outside.write_bytes(saved) + word.symlink_to(outside) + run(package, False, "missing/linked retained input") + word.unlink() + word.write_bytes(saved) + receipt = package / "RESULT.json" + changed = json.loads(receipt.read_bytes()) + changed["invoice"]["ordinary_block_swap_calls_upper"] = 0 + receipt.write_text(json.dumps(changed)) + run(package, False, "recomputed result differs") + print("PASS_ACTUAL_EXPORTED_CLI positive=1 controls=4 optimized=true Git_free=true") + + +if __name__ == "__main__": + main() diff --git a/research/r437-uniform-copy-reduction/verify.py b/research/r437-uniform-copy-reduction/verify.py new file mode 100644 index 000000000..cdf8b4cba --- /dev/null +++ b/research/r437-uniform-copy-reduction/verify.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Source-bound algebra and obligation checks, not physical supplier admission.""" +import argparse +from fractions import Fraction as Q +import gzip +import hashlib +from itertools import product +import json +from pathlib import Path +import random +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from copy_child import (block_diagonal, compile_copy, determinant, eye, factor_sl, + independent_columns, inverse, invoice, mul, need, + normalize_kernel, projector, reduce_rational, residual, + row_add, split_basis, support_bound, word_matrix) + +HERE = Path(__file__).resolve().parent +WORD_SHA = "e432182d5b62c8bbefeb871fce30317234d707e5e18d4295e65ac21f7fd8365e" + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + + +def authenticate(): + sources = json.loads((HERE / "SOURCES.json").read_bytes()) + for row in sources["retained"]: + path = HERE / row["path"] + need(path.is_file() and not path.is_symlink(), "missing/linked retained input") + data = path.read_bytes() + need(hashlib.sha256(data).hexdigest() == row["sha256"], "retained SHA") + need(hashlib.sha1(b"blob " + str(len(data)).encode() + b"\0" + data).hexdigest() == row["git_blob"], "retained Git blob") + data = (HERE / "inputs/r437-word.json.gz").read_bytes() + need(hashlib.sha256(data).hexdigest() == WORD_SHA, "fixed R437 input binding") + return json.loads(gzip.decompress(data)) + + +def embed(p, n): + out = [[0] * n for _ in range(n)] + for i, row in enumerate(p): + out[i][:len(p)] = row + return out + + +def generated_unit(n, modulus, seed): + rng = random.Random(seed) + out = eye(n) + # Arbitrary high coefficients and nonorthogonal unit matrices; invertible + # by construction, with no acceptance/rejection conditioning on endpoints. + for _ in range(3 * n): + i, j = rng.sample(range(n), 2) + row_add(out, i, j, rng.randrange(modulus), modulus) + return out + + +def reject(fn, name): + try: + fn() + except (ValueError, ZeroDivisionError): + return name + raise ValueError("accepted semantic control: " + name) + + +def geometry_check(n, columns, delta, rank=7): + parent = n * columns + delta + width = rank * columns + # These exponents describe three independent spectators. The external G + # appears once in the middle, not hidden in an aggregate volume equality. + before, gap, suffix = 0, 2 * parent - 2 * width, 0 + need(before + 2 * width + gap + suffix == 2 * parent, "projected full volume") + need(width < parent and gap >= 0, "proper-width child") + return [parent, width, gap] + + +def finite_function_check(): + """Complete small address cube with repeated physical prefixes/spectators.""" + modulus, n, rank = 3, 2, 1 + p = [[1, 0], [0, 0]] + g = [[1, 1], [1, 2]] + weights = [2, 1] + result = compile_copy(p, rank, g, weights, 3, modulus) + matrix = result["matrix"] + addresses = list(product(range(modulus), repeat=2 * n)) + lookup = {x: i for i, x in enumerate(addresses)} + rng = random.Random(3936) + source = tuple(rng.randrange(2) for _ in range(3 * len(addresses) * 2)) + original = source[:] + output = [] + for physical_prefix in range(3): + for x in addresses: + y = tuple(sum(a * b for a, b in zip(row, x)) % modulus for row in matrix) + for spectator in range(2): + output.append(source[(physical_prefix * len(addresses) + lookup[y]) * 2 + spectator]) + need(source == original and len(output) == len(source), "borrowed source and full extents") + need(len({tuple(sum(a * b for a, b in zip(row, x)) % modulus for row in matrix) for x in addresses}) == len(addresses), "full small permutation") + # Complete inverse on arbitrary payload, including repeated prefix labels. + recovered = [] + mi = inverse(matrix, modulus) + for physical_prefix in range(3): + for x in addresses: + y = tuple(sum(a * b for a, b in zip(row, x)) % modulus for row in mi) + for spectator in range(2): + recovered.append(output[(physical_prefix * len(addresses) + lookup[y]) * 2 + spectator]) + need(tuple(recovered) == source, "all small payload cells return") + output[:] = [0] * len(output) + need(source == original and not any(output), "owned disposal does not clear borrowed source") + return dict(addresses=len(addresses), physical_prefixes=3, spectators=2, + payload_bits=len(source), scope="finite function/permutation check, not physical execution") + + +def calculate(): + word = authenticate() + selected = json.loads(gzip.decompress((HERE / "inputs/selected589-word.json.gz").read_bytes())) + need(word["lines"] == selected["lines"] and word["frames"] == selected["frames"], + "complete source root/frame equality with the selected predecessor") + need(word["R"] == 437 and word["ret"] == list(range(470, 479)), "actual R437 source labels") + # R437's nine retained centres end section A at their capture frames. + current = word["start"][:] + for section in ("D", "A"): + for frame, target, sources in word[section]: + for role in [target] + sources: + current[role] = frame + centres = {centre: current[centre] for centre in word["ret"]} + need([centres[c] for c in word["ret"]] == list(range(510, 519)), "actual capture-frame source correspondence") + frame_rows, algebra_cases, support_hashes = [], 0, set() + last = None + for centre in word["ret"]: + frame = centres[centre] + rational, rank = projector(word["lines"], word["frames"][frame]) + need(rank == 7, "literal rank seven") + frame_rows.append(dict(center=centre, frame=frame, rank=rank, + projector_sha256=hashlib.sha256(canonical([[str(x) for x in row] for row in rational])).hexdigest())) + for q, w in [(3, 1), (3, 2), (5, 2), (7, 2), (11, 1)]: + modulus = q ** w + p = reduce_rational(rational, modulus) + g = generated_unit(8, modulus, centre * q + w) + weights = [a for a in range(1, modulus) if a % q][:8] + weights = (weights * 8)[:8] + result = compile_copy(p, rank, g, weights, q, modulus) + support_hashes.add(hashlib.sha256(canonical([(i, j) for i, j, _c in result["head"]])).hexdigest()) + last = p, g, weights, q, modulus, result + algebra_cases += 1 + need(len(support_hashes) == 1, "one fixed factor support over all tested contexts") + + # Full ambient-64 binding and a deliberately bad leading rank-seven minor. + rational, _rank = projector(word["lines"], word["frames"][515]) + q, modulus = 3, 9 + p = embed(reduce_rational(rational, modulus), 64) + basis = split_basis(p, 7, q, modulus) + permutation = eye(64) + for i in range(7): + permutation[i], permutation[57 + i] = permutation[57 + i], permutation[i] + bad_g = mul(permutation, inverse(basis, modulus), modulus) + bad_p = mul(mul(bad_g, p, modulus), inverse(bad_g, modulus), modulus) + need(all(bad_p[i][j] == 0 for i in range(7) for j in range(7)), "bad leading-minor control really is bad") + ambient = compile_copy(p, 7, bad_g, [1 + 3 * (i % 3) for i in range(64)], q, modulus) + need(len(ambient["head"]) == 10458, "ambient fixed-support bound") + # Every pair of head/tail words has complementary physical order because + # the second bank is reflected. Include both inverse words as well. + support = [(i, j) for i, j, _c in ambient["head"]] + need(support == [(i, j) for i, j, _c in ambient["tail"]], "same head/tail factor support") + reverse_slots = 2 * (sum(i < j for i, j in support) + sum(i > j for i, j in support)) + need(reverse_slots == 20916, "all reverse-order factors separately billed") + + controls = [] + controls.append(reject(lambda: factor_sl([[2, 0], [0, 1]], 9), "omit kernel determinant normalization")) + controls.append(reject(lambda: compile_copy(p, 7, bad_g, [3] + [1] * 63, 3, 9), "nonunit incoming weight")) + wrong_rank = [[int(i == j and i < 6) for j in range(64)] for i in range(64)] + controls.append(reject(lambda: split_basis(wrong_rank, 7, 3, 9), "same label with rank six")) + p0, g0, weights0, q0, m0, case = last + expected = case["matrix"] + transpose = [list(row) for row in zip(*g0)] + wrong = residual(mul(mul(g0, p0, m0), transpose, m0), weights0, m0) + controls.append(reject(lambda: need(wrong == expected, "inverse is not transpose"), "transpose high-chart inverse")) + controls.append(reject(lambda: need(residual(eye(8), weights0, m0) == expected, "full swap differs"), "full swap priced as rank seven")) + removed = next(i for i, (_a, _b, c) in enumerate(case["head"]) if c) + damaged = case["head"][:removed] + case["head"][removed + 1:] + controls.append(reject(lambda: need(word_matrix(damaged, 8, m0) == word_matrix(case["head"], 8, m0), "omitted factor differs"), "omit a nonzero factor")) + controls.append(reject(lambda: need(invoice(columns=2, prefixes=7)["coarse_calls"] == 7, "one whole-packet call"), "multiply core calls by repeated prefixes")) + controls.append(reject(lambda: need(reverse_slots == 0, "reverse-order adapters cost is nonzero"), "free reverse-order adapters")) + + # A power-counting rejection of an implication from THIS bound, not a + # lower bound on any algorithm or an impossibility result for R437. + c = Q(17, 10000) + a1, a2 = c * (1 - c), c * (1 - c * c) + target = Q(1736646042038446578551, 10 ** 24) + deltas = {"B1": (1 + target) * (1 - a1) - 1, + "B2": (1 + target) * (1 - a2) - 1} + need(all(v > 0 for v in deltas.values()), "reverse-adapter bound cannot be silently absorbed") + return dict(status="PASS_UNIFORM_COPY_REDUCTION_WITH_EXPLICIT_BACKEND_PREMISES", + claim="uniform local-ring algebra and conditional caller/cost reduction; inherited cheap tariff NOT proved", + captures=frame_rows, algebra_cases=algebra_cases, + selected_root_and_frame_tables_unchanged=True, + full_ambient_cases=1, bad_leading_minor_passes=True, + dimension=64, fixed_word_length=10458, + physical_reverse_factor_slots=reverse_slots, + invoice=invoice(columns=10, prefixes=11), + projected_geometry=[geometry_check(64, f, d) for f in (1, 2, 9, 10, 63, 64, 1000) for d in (0, 1, 63)], + small_function_check=finite_function_check(), controls=controls, + nonabsorption_deltas={k: str(v) for k, v in deltas.items()}, + physical_backend_implemented=False, supplier_admitted=False, + inherited_dependencies=["completed same-q ordinary B1/B2 with source/spectator preservation and restored owned work", + "proper-width reversed child with the specified compatible stock and successful return contract", + "encoded scalar coefficient preparation and complete ordered shear", + "canonical root-coupling absorption if simplified asymptotic costs are used"], + remaining=["eliminate, share, or otherwise fully pay reverse-order interchanges inside the intended rank-seven tariff", + "bind an encoded physical implementation of this new factor schedule; this algebra compiler is not that implementation", + "independent universal review of the inherited C0/B1 source-refinement and complete-cost arguments", + "all-source hosting, outer transfer and integer recovery remain outside this local reduction"]) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--write-result", action="store_true") + args = parser.parse_args() + result = json.loads(canonical(calculate())) + receipt = HERE / "RESULT.json" + if args.write_result: + receipt.write_text(json.dumps(result, indent=2) + "\n") + else: + need(json.loads(receipt.read_bytes()) == result, "recomputed result differs") + print(result["status"] + " cases=" + str(result["algebra_cases"]) + " controls=" + str(len(result["controls"]))) + + +if __name__ == "__main__": + main()