From acb28c0b5708d0aee91e457050c973e3df476fa4 Mon Sep 17 00:00:00 2001 From: Cinna Davis <1337isnot1337@users.noreply.github.com> Date: Fri, 23 Oct 2026 00:18:17 -0500 Subject: [PATCH] Prove scalar additivity required by coherent frame potentials --- .../CERTIFICATE.json.gz | Bin 0 -> 46142 bytes .../coherent-frame-additivity/OVERLAP.json | 40 +++ research/coherent-frame-additivity/PROOF.md | 197 +++++++++++ research/coherent-frame-additivity/README.md | 124 +++++++ .../coherent-frame-additivity/RESULT.json | 134 +++++++ .../coherent-frame-additivity/SOURCES.json | 24 ++ research/coherent-frame-additivity/TASK.json | 113 ++++++ .../coherent-frame-additivity/VENDORED.json | 14 + .../coherent-frame-additivity/VERIFY.json | 32 ++ .../vendor/PR4966-INVERSE-PROOF.md | 220 ++++++++++++ research/coherent-frame-additivity/verify.py | 330 ++++++++++++++++++ 11 files changed, 1228 insertions(+) create mode 100644 research/coherent-frame-additivity/CERTIFICATE.json.gz create mode 100644 research/coherent-frame-additivity/OVERLAP.json create mode 100644 research/coherent-frame-additivity/PROOF.md create mode 100644 research/coherent-frame-additivity/README.md create mode 100644 research/coherent-frame-additivity/RESULT.json create mode 100644 research/coherent-frame-additivity/SOURCES.json create mode 100644 research/coherent-frame-additivity/TASK.json create mode 100644 research/coherent-frame-additivity/VENDORED.json create mode 100644 research/coherent-frame-additivity/VERIFY.json create mode 100644 research/coherent-frame-additivity/vendor/PR4966-INVERSE-PROOF.md create mode 100644 research/coherent-frame-additivity/verify.py diff --git a/research/coherent-frame-additivity/CERTIFICATE.json.gz b/research/coherent-frame-additivity/CERTIFICATE.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..a90d2fd0441ecafda09d111237567a96f48d1dbd GIT binary patch literal 46142 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 Axc~qF literal 0 HcmV?d00001 diff --git a/research/coherent-frame-additivity/OVERLAP.json b/research/coherent-frame-additivity/OVERLAP.json new file mode 100644 index 0000000000..b9610a6137 --- /dev/null +++ b/research/coherent-frame-additivity/OVERLAP.json @@ -0,0 +1,40 @@ +{ + "base_commit": "b91956876e5b4122fd89179f1b57557ff8378f15", + "priority_revision": 7, + "terms": [ + "frame potential", + "holonomy", + "coherent frame" + ], + "coverage": { + "local": { + "head": "b91956876e5b4122fd89179f1b57557ff8378f15", + "records": 6638, + "head_records": 6636, + "complete_head_inventory": true, + "unsearched_head_paths": [] + }, + "open_prs": { + "fetched_at": "2026-10-23T05:16:29.496227+00:00", + "complete_pagination": true, + "records": 324 + }, + "discussions": { + "fetched_at": "2026-10-23T05:17:19.690420+00:00", + "complete_pagination": true, + "records": 4081 + } + }, + "nearest_work": [ + { + "pr": 4966, + "head": "039b6ea51ab7a7efb38fc6851f345839683251b0", + "adds": "Same-realization inverse recipes, independent paid-site precision census; final coherent-potential target is the audited boundary." + }, + { + "path": "research/coherent-transvection-neighborhood", + "adds": "Graph kernel constraints for binary symplectic axes; credited predecessor context, not the nonlinear ADD criterion or actual paid-frame census." + } + ], + "limits": "Open PR bodies, discussions and top-level local notes; no full diff/unpublished/closed-remote-body coverage. Not a novelty certificate." +} diff --git a/research/coherent-frame-additivity/PROOF.md b/research/coherent-frame-additivity/PROOF.md new file mode 100644 index 0000000000..67dd02c9d3 --- /dev/null +++ b/research/coherent-frame-additivity/PROOF.md @@ -0,0 +1,197 @@ +# Scalar compatibility of coherent frame potentials + +Prepared by Cinna Davis with substantial OpenAI Codex assistance. Apache-2.0. +These are written proofs with exact finite corroboration, not proof-assistant +theorems. No new κ or supplier admission is claimed. + +## 1. The actual proposed boundary + +Yiyang's PR4966 at `039b6ea51ab7a7efb38fc6851f345839683251b0` constructs +same-realization inverse recipes for both native orientations. Its final +paragraph proposes coherent frame potentials as a sufficient compatibility +target for a future caller: a paid transition a→b should realize +`A_b A_a^-1`, and a warp should realize `A_new W A_old^-1`. The proof also +explicitly warns that reversible rounded implementations can be nonlinear +and need not satisfy the controller's linear operator identities. This +contribution makes one part of that warning precise at the actual source. +The unchanged predecessor proof is vendored with its exact provenance. + +Consider a **gatewise** proof using one common bijection A_f per frame f, +shared by every register currently in that frame. It must also account for +unchanged scalar instructions. On two independent fields of that frame an +ADD has the map + +`G_c(x,y) = (x+c y,y)`. + +Commuting the product coordinate change `A_f × A_f` through that same ADD +is equivalent to + +`A_f(x+c y) = A_f(x)+c A_f(y)` for every x,y. (1) + +Transition and warp equations alone do not state (1). This observation is +about the described proof recipe. Global endpoint agreement might instead +follow from a different identity, changed scalar instructions, or a bound +on the resulting errors; none is excluded here. + +## 2. Exact local criterion + +Let D be a module over the dyadic rationals Z[1/2], with no nonzero element +killed by a power of two. Let c be a nonzero dyadic **unit**, so c=±2^k +for an integer k. An arbitrary map A:D→D satisfies (1) if and only if it +is additive. Bijectivity is unnecessary for this equivalence. + +For necessity put y=0 in (1). This gives c A(0)=0, so A(0)=0. Now put +x=0 to obtain `A(c y)=c A(y)`. For any z, choose y=c^-1 z. Equation (1) +then becomes `A(x+z)=A(x)+A(z)`. This proves additivity for every x,z. + +Conversely, an additive map commutes with integer multiplication. In a +dyadic module, `2 A(z/2)=A(z)` and the half is unique, hence +`A(z/2)=A(z)/2`. Induction gives dyadic homogeneity and therefore (1). +Thus any one such unchanged ADD forces the full dyadic-linear condition. +The theorem also holds on real or complex vector spaces viewed as dyadic +modules. Additivity by itself does **not** assert continuity, real +linearity, or complex linearity. With continuity, the usual dyadic-density +argument gives real linearity; that is a separate additional hypothesis. + +Coefficients such as 3/4 are allowed in the source, but the certificate +deliberately uses only unit dyadic coefficients. No division by three, no +finite-grid closure, and no rounding law is assumed in the argument. + +## 3. Binding to every active source frame + +The sole executed scientific input is Cao Yifan's round-three actual word, +`research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz`, at canonical base +`b91956876e5b4122fd89179f1b57557ff8378f15`. Its compressed SHA256 is +`7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05`. +This is the same actual word used by PR4966. The parser is independently +written and imports no predecessor verifier, native oracle, or inverse recipe. + +For **each** retained forward and backward orientation the exact replay finds: + +| Object | Count | +|---|---:| +| Source events | 21,449 | +| Persistent L fields | 632 | +| Active frames | 1,002 | +| Frames with a distinct persistent L-to-L unit-dyadic ADD | 1,002 | +| Owned-center macros | 8 | +| Paid occurrences including centers | 3,298 | + +Here active frames means frames occurring in the source's scalar, climb, +center, or warp records. Phase and adapter records are retained markers; +their physical action is not implemented by this audit. RESULT.json gives +the first qualifying ADD's exact event index, coefficient, register pair +and full record for **every frame in each orientation**. Witnesses occur +outside owned-center macros. Frame ids and dimensions are not conflated: +all used ids are checked, including the empty frame and the full frame. + +The parser replays scalar/paid/warp frame chronology and both persistent +endpoint lists. It verifies the actual paid profile +`{1:2201,2:412,3:510,4:127,5:40,8:8}` and all eight center macros, including +the separation of unchanged capture sources from modified destinations. +It does not evaluate their physical Gaussian matrices. + +Consequently a gatewise coherent-potential proof of this **unchanged** +word, with a shared all-input map per frame, must use additive potentials +on all 1,002 active frames in each orientation. There is no uncovered +transit-only frame where this recipe can hide a nonlinear potential. + +The all-input requirement is a contract, not something inferred from a +finite fixture. It is also compatible with arbitrary persistent dirt: +conditional on bijective persistent paid children and warps, each ordinary +persistent ADD/SCALE prefix is bijective. Each completed owned macro is a +shear from its unchanged capture sources into disjoint destinations, even +for a deterministic nonlinear center. It too is a persistent bijection. +Every witness is outside those macros. Thus under those explicit premises +the two persistent fields at a witness can vary independently. This does +not promote a test of one restricted input trajectory into (1). + +## 4. Exact distinctions from inverse and warp compatibility + +### Reversible rounded maps + +On Q² define `R(x,y)=(x+floor(y/2),y)`. Its exact inverse is +`R^-1(u,v)=(u-floor(v/2),v)`. It is a deterministic reversible rounded +shear and fixes zero. Yet at x=y=(0,1) and c=1, + +`R(x+y)=(1,2)` while `R(x)+R(y)=(0,2)`. + +Every local inverse round trip can pass while the unchanged ADD fails +equivariance. This example concerns a map that is itself proposed as a +potential; the theorem does not say that each internal rounded shear of +an otherwise additive complete realization is individually forbidden. + +### Even compatibility with all unitaries is insufficient + +On R^d or C^d define `P(v)=||v||² v`. It is a bijection: it maps each ray's +nonnegative radial parameter r to r³. The inverse is zero at zero and +`P^-1(w)=||w||^(-2/3) w` otherwise. For **every** unitary U, + +`P(Uv)=U P(v)`. + +Nevertheless at a unit vector e, +`P(e+e)=8e` and `P(e)+P(e)=2e`. Thus fixed unitary intertwining, zero +preservation, and exact two-sided inversion do not logically imply (1). +For an arbitrarily small positive t, the bijection +`P_t(v)=(1+t||v||²)v` gives the same distinction while being within t of +identity on the unit ball. Small error on a ball is not exact equivariance. + +For example, given unitary ideal frame maps C_f and unitary ideal warp +maps `C_b W C_a^-1`, choose `A_f=P C_f`. All pure transition and warp +conjugations then equal their ideal unitary maps, because P commutes with +every unitary. Their equations do not detect this nonlinear common gauge. +The unchanged ADD does detect it. This is a counterexample to sufficiency +of those equations as a **gatewise gauge proof**, not a counterexample to +the endpoint of the ideal native word. That ideal word is unchanged in +this example and may already have the desired endpoint. + +The verifier checks the rounded example, its two-sided inverses on 49 exact +rational points, the radial ADD discrepancy, and 147 exact rational +orthogonal-equivariance instances. The all-unitary statement follows from +norm preservation in the written proof, not from those 147 instances. +It also checks 12,005 rational ADD instances for an invertible linear map. + +## 5. Separate closed-walk obligations of the paid graph + +There is a second, independent distinction between inverse pairs and frame +potentials. Normalize paid transitions to maps H_e on a common field and +temporarily disregard warp edges. On any connected graph, specified +invertible H_e admit `H_e=A_b A_a^-1` if and only if every fundamental +closed-walk product is identity. Choose a root and a spanning tree. The +tree fixes each A_v from an arbitrary A_root. Every non-tree edge's equation +is exactly its fundamental closed-walk equation. This proves both directions +for arbitrary bijections, without commutativity or linearity. Reverse +traversal uses the actual inverse. Correct inverse pairs only check the +immediate edge/reverse walk and do not test other cycles. + +The source graph in each orientation has 1,002 vertices, one component, +3,298 paid occurrences, and hence 2,297 non-tree occurrence tests. If +parallel occurrences are identified by unordered endpoint pair, its 2,855 +simple edges instead have cycle rank 1,854. RESULT.json retains the full +deterministic forest/chord event partition; a separate BFS component count +cross-checks the union/find calculation. These are counts of **potential +tests**, not 2,297 proved failures or algebraically independent constraints +on a particular shared implementation. Warp constraints and scalar +compatibility remain additional conditions. + +The graph lemma is elementary and not claimed as new mathematics. Nick +Petalas's `coherent-transvection-neighborhood` uses related spanning-tree +holonomy constraints for binary symplectic axes. Its object is a restricted +geometric chart move, whereas this census binds actual paid occurrences +and the nonlinear numerical-potential boundary of PR4966. + +## 6. Constructive choices left open + +An additive family satisfying all paid and warp equations would clear this +local scalar obstruction. It still needs Gaussian/frame compatibility, +fresh independent D factors, an actual paired caller, and a complete +precision/storage/routing/recursive bill. This audit constructs no such +family and does not prove one impossible. + +Alternatively change each scalar gate to its literal conjugate under the +chosen nonlinear potentials, or prove and pay a quantitative error bound +for its failure to commute. Both change the present contract and require +a fresh caller and invoice. A global correlated-error construction may +also use an argument entirely outside this gatewise recipe. It is not +excluded by this theorem, the cycle census, or PR4966's independent-error +tariff. No selected frontier or multiplication theorem is changed. diff --git a/research/coherent-frame-additivity/README.md b/research/coherent-frame-additivity/README.md new file mode 100644 index 0000000000..5c72c03ba7 --- /dev/null +++ b/research/coherent-frame-additivity/README.md @@ -0,0 +1,124 @@ +# Coherent frame potentials need additive scalar compatibility + +**Scoped written theorem and independent source audit; no new κ.** + +PR4966 supplies exact inverse recipes for deterministic native realizations +and leaves a coherent-frame compatibility target for a future paired caller. +This contribution checks an additional requirement of that target: a shared +frame potential commuting through unchanged scalar ADDs on arbitrary inputs +must be additive. Inverses and unitary warp equations alone do not imply it. + +For a nonzero dyadic unit c, commuting a potential A through +`(x,y) -> (x+c y,y)` is equivalent to + +`A(x+c y)=A(x)+c A(y)` for all x,y. + +Putting y=0, then x=0, and finally y=c^-1 z proves additivity. The converse +follows from dyadic homogeneity. [PROOF.md](PROOF.md) states the exact domains +and the gatewise claim boundary; there is no proof-assistant claim. + +The independently written source parser checks both actual round-three +orientations, each with 21,449 events and 632 persistent fields. **All 1,002 +active frames in each orientation have a distinct persistent-register ADD +with a unit dyadic coefficient, outside every owned-center macro.** The +certificate retains one exact source event per frame per orientation, +including its register pair and coefficient. Both persistent endpoint frame +lists, all eight owned macros, and the retained paid profile are checked. + +Two exact distinctions prevent an invalid implication: + +- The reversible rounded map `(x,y) -> (x+floor(y/2),y)` has exact two-sided + inverses but fails ADD equivariance at x=y=(0,1). +- The radial bijection `v -> ||v||² v` commutes with **every unitary** but + still fails ADD equivariance. Its all-unitary property is proved from + norm preservation, rather than inferred from finite tests. + +Separately, each paid occurrence graph has 1,002 vertices, 3,298 edges, +one component and 2,297 fundamental closed-walk tests for a potential +assignment. Identifying parallel unordered pairs gives 2,855 edges and +cycle rank 1,854. These counts do not show that a particular implementation +fails any test. They identify obligations that inverse pairs alone leave. + +This closes one local implication in the **gatewise coherent-potential +recipe with unchanged scalar gates**. It does not exclude global correlated +error schemes, changed scalar circuits, additive coherent realizations, or +a different paired caller. Precision, independent fresh D factors, physical +Gaussian/frame compatibility, workspace, routing, recursive pricing and BIT +admission remain open. The selected conditional κ is unchanged. + +## Reproduce + +From the repository root, with standard-library Python 3.12: + +```sh +python3.12 -I -B research/coherent-frame-additivity/verify.py +python3.12 -I -O -B research/coherent-frame-additivity/verify.py +python3.12 -B scripts/research_package.py --package research/coherent-frame-additivity +``` + +Expected direct output: + +```text +PASS_COHERENT_FRAME_ADDITIVITY frames_per_orientation=1002 paid_cycle_rank=2297 controls=5 no_new_kappa +``` + +[RESULT.json](RESULT.json) records the recomputed summary and the SHA256 of +the canonical decompressed [certificate](CERTIFICATE.json.gz). Default replay +is read-only. `--write-result NEW_PATH` explicitly creates a new summary and +its sibling certificate, without overwriting either. Gzip headers and streams +are not mathematical evidence: replay compares exact canonical payload bytes. + +Finite corroboration includes 12,005 rational linear ADD cases, 98 rounded +two-sided inverse round trips and 147 rational radial/orthogonal cases. +Four semantic source mutations and a changed-source-byte control must fail +for their specified reasons. Conditions use exceptions and remain active +under `-O`. No native physical suite, selected cold replay, Lean build or +full multiplication theorem is part of this audit. + +## Sources and overlap + +Canonical base: `b91956876e5b4122fd89179f1b57557ff8378f15`, priority revision 7. +Assignment seed: `7497f9f029574287f7cf5b3d5415bf74`, independent-verification +track, `formal-interface-lemma` card. The scope change to a written local +boundary theorem is declared in [TASK.json](TASK.json). + +[SOURCES.json](SOURCES.json) pins the sole executed scientific input, +Cao Yifan's actual round-three word, and historical assignment context. +[VENDORED.json](VENDORED.json) authenticates Yiyang's exact PR4966 inverse +proof at `039b6ea51ab7a7efb38fc6851f345839683251b0`; no predecessor +implementation is imported or executed. + +The [overlap receipt](OVERLAP.json) records live open-PR/discussion and local +note coverage. PR4966 already distinguishes exact reversibility from linear +operator identities; the new evidence is the ADD criterion and complete +all-active-frame source binding. Nick Petalas's coherent-transvection +neighborhood proves geometric graph transport constraints, which receive +credit here; the elementary graph lemma is not claimed as new mathematics. +Coverage does not include every code diff or unpublished work and is not +a novelty certificate. + +Canonical investigation: +[Discussion4611](https://github.com/CrocSwap/integer-mult-bounds/discussions/4611#discussioncomment-19138553). + +## Open next questions + +- Can additive actual frame potentials satisfy the paid closed-walk and + unchanged warp equations at a charged precision? Start with one actual + non-tree paid edge and its forest path, including their true recursive + realizations. Such realizations and their full bill are not supplied here. +- If nonlinear potentials are retained, can a literal conjugated scalar + gate or a paid quantitative error bound replace unchanged ADDs? Start with + one emitted persistent-register witness and carry the correction through + the actual two-call caller. Unknown correction and storage costs are not zero. + +## Credit + +Yiyang (@Lyy-iiis), with OpenAI Codex assistance, supplies PR4966's paid-site +precision census and same-realization inverse construction. Cao Yifan supplies +the round-three actual word and its retained predecessor lineage. The +two-full Laurent-border, native E8/Clifford and PR4610 predecessor attribution +remains with the source authors. Nick Petalas supplies the related binary +symplectic graph-neighborhood result. No claim of independent human review +is made. Prepared by Cinna Davis with substantial OpenAI Codex assistance +in research, proof explanation, implementation, verification and writing. +New work is Apache-2.0; the vendored predecessor retains its original notice. diff --git a/research/coherent-frame-additivity/RESULT.json b/research/coherent-frame-additivity/RESULT.json new file mode 100644 index 0000000000..bd7e902cce --- /dev/null +++ b/research/coherent-frame-additivity/RESULT.json @@ -0,0 +1,134 @@ +{ + "certificate": { + "canonical_payload_sha256": "8c1f5ca6b7fc8c5493f5d57a6118fb4f726a10cdbf0d721c841fd7b71690de97", + "path": "CERTIFICATE.json.gz" + }, + "claim": "gatewise_frame_additivity_no_new_kappa", + "mathematical_checks": { + "linear_gate_cases": 12005, + "radial_counterexample": { + "coefficient": 1, + "left": [ + 8, + 0 + ], + "right": [ + 2, + 0 + ], + "x": [ + 1, + 0 + ], + "y": [ + 1, + 0 + ] + }, + "radial_unitary_cases": 147, + "rounded_counterexample": { + "coefficient": 1, + "left": [ + 1, + 2 + ], + "right": [ + 0, + 2 + ], + "x": [ + 0, + 1 + ], + "y": [ + 0, + 1 + ] + }, + "rounded_two_sided_round_trips": 98 + }, + "orientations": { + "backward": { + "active_frames": 1002, + "frame_dimension_histogram": { + "0": 1, + "1": 115, + "2": 169, + "3": 168, + "4": 66, + "5": 46, + "6": 146, + "7": 168, + "8": 122, + "9": 1 + }, + "owned_macros": 8, + "paid_graph": { + "components": 1, + "occurrence_cycle_rank": 2297, + "paid_occurrences": 3298, + "simple_cycle_rank": 1854, + "simple_edges": 2855, + "vertices": 1002 + }, + "persistent_roles": 632, + "scalar_counts": { + "add": 16273, + "clear": 16, + "scale": 1164 + }, + "source_events": 21449 + }, + "forward": { + "active_frames": 1002, + "frame_dimension_histogram": { + "0": 1, + "1": 115, + "2": 169, + "3": 168, + "4": 66, + "5": 46, + "6": 146, + "7": 168, + "8": 122, + "9": 1 + }, + "owned_macros": 8, + "paid_graph": { + "components": 1, + "occurrence_cycle_rank": 2297, + "paid_occurrences": 3298, + "simple_cycle_rank": 1854, + "simple_edges": 2855, + "vertices": 1002 + }, + "persistent_roles": 632, + "scalar_counts": { + "add": 16265, + "clear": 16, + "copy": 8, + "scale": 1164 + }, + "source_events": 21449 + } + }, + "predecessor_context": { + "credit": "Yiyang (@Lyy-iiis), with substantial OpenAI Codex assistance. Apache-2.0.", + "path": "vendor/PR4966-INVERSE-PROOF.md", + "sha256": "753f0e1e7f6305ed550cb7247204190d9f4f258e07744e16ee55a35ee42e3f85", + "source_blob": "7d939c4dc662af9cdbf306b7e5ab4f4acf21c35c", + "source_commit": "039b6ea51ab7a7efb38fc6851f345839683251b0", + "source_path": "research/two-full-border-paid-precision/inverse-interface/PROOF.md", + "source_repository": "https://github.com/CrocSwap/integer-mult-bounds", + "usage": "Quoted target and predecessor context; no predecessor implementation is executed." + }, + "rejection_controls": [ + "self_add", + "zero_coefficient", + "boolean_coefficient", + "wrong_frame" + ], + "schema_version": 1, + "source": "research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz", + "source_sha256": "7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05" +} diff --git a/research/coherent-frame-additivity/SOURCES.json b/research/coherent-frame-additivity/SOURCES.json new file mode 100644 index 0000000000..504e70d52e --- /dev/null +++ b/research/coherent-frame-additivity/SOURCES.json @@ -0,0 +1,24 @@ +{ + "schema_version": 1, + "base_commit": "b91956876e5b4122fd89179f1b57557ff8378f15", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "c35482cd9035843b15a634cc8276a7e1e40e8395", + "sha256": "6fe0a099b89aa2aed796a13c3a21dafc63f3388ebf397464e44e0451893b9375" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "f126dd2e2dad2b669e75d1d0d0bd05c600725602", + "sha256": "f7a48bfa2659b88378282a8eee7d9fe52cdf505594124c4d1686b58510fffd72" + }, + { + "path": "research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz", + "usage": "input", + "git_blob": "46d929df83817b85a5387bcdb9745e0627d6366e", + "sha256": "7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05" + } + ] +} diff --git a/research/coherent-frame-additivity/TASK.json b/research/coherent-frame-additivity/TASK.json new file mode 100644 index 0000000000..bebb2d2b78 --- /dev/null +++ b/research/coherent-frame-additivity/TASK.json @@ -0,0 +1,113 @@ +{ + "schema_version": 1, + "task_id": "formal-interface-lemma", + "priority_revision": 7, + "base_commit": "b91956876e5b4122fd89179f1b57557ff8378f15", + "original_card": { + "id": "formal-interface-lemma", + "question": "Can one uncovered interface implication be formalized with exact caller and certificate bindings?", + "starting_points": [ + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "research/gate-operand-parity-lean/README.md", + "research/staged544-certified-endpoint/README.md", + "research/unconditional-batched-crt/README.md" + ], + "methods": [ + "Formalize a missing boundary lemma identified by the selected review.", + "Audit a formal theorem-to-certificate binding independently." + ], + "acceptance_gate": "State the exact formalized proposition and remaining assumptions; avoid duplicate arithmetic formalizations already present.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Inventory the gate-operand parity lemma (#3807) and certified endpoint arithmetic (#3857). Neither is a full multiplication proof. For #4100, audit the compact-switch statement and its hypotheses before formalizing it.", + "scope": "Source-binding orientation only; no scientific replay, theorem acceptance or supplier admission. Budget any heavy replay separately." + }, + "first_experiment": "Write one missing statement with quantified hypotheses, actual caller and existing coverage. A compact-switch lemma is a candidate only after its mathematical contract is reviewed. Establish a bounded proof plan before a separately budgeted proof-assistant build; do not rerun large Lean jobs as orientation.", + "bottleneck_link": "A missing interface proof can reduce the conditional gap even if it does not change kappa.", + "allowed_variations": [ + "Narrow to one formal lemma or one theorem-to-certificate binding." + ], + "scope_change_triggers": [ + "Formalizing already-covered arithmetic and claiming the full multiplication theorem." + ], + "overlap_terms": [ + "hyperplane end", + "formal interface", + "Lean binding", + "3807", + "3857", + "4100", + "gate-operand-parity-lean", + "staged544-certified-endpoint", + "unconditional-batched-crt" + ], + "existing_checks": [ + { + "scope": "PR #3807: scoped gate-operand parity formalization.", + "evidence": "research/gate-operand-parity-lean/README.md", + "remaining": "Exact theorem-to-caller binding and genuinely uncovered interface lemmas.", + "status": "author-checked", + "source_commit": "4c3530f42a6abcc48e7a6bcffd6c901911dc8269", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #3857: certified real-power moment/endpoint arithmetic.", + "evidence": "research/staged544-certified-endpoint/README.md", + "remaining": "Uniform algorithmic implications, not another endpoint digit.", + "status": "author-checked", + "source_commit": "ef4315b8caa605e47a2515004845eb2d2ed71a86", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #4100: compact-switch formalization proposed as future validation.", + "evidence": "research/unconditional-batched-crt/README.md", + "remaining": "Audit the statement and assumptions before a formal proof campaign.", + "status": "author-checked", + "source_commit": "337d04939571a637aeab54a0f58f54fde811663a", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Prove the all-input ADD equivariance criterion for shared frame potentials and bind its necessity to all active frames in both actual round-three orientations.", + "scope_change_reason": "The selected proof retains precision/frame premises. PR4966 proposes coherent potentials as a future compatibility target; this is a written boundary theorem with exact source checks, not a proof-assistant formalization or an endpoint-digit calculation.", + "bottleneck_link": "A two-full Laurent controller needs a correlated precision implementation. The theorem identifies scalar compatibility missing from a gatewise nonlinear-potential proof and prevents inverse/warp equations from being mistaken for a complete caller.", + "budget_minutes": 60, + "stop_rule": "Finish this single local implication, source census, counterexamples, registered replay and focused PR; then refresh canonical main and choose a new campaign round.", + "outcome": "completed", + "evidence": "Written PROOF.md; RESULT.json; exact canonical CERTIFICATE.json.gz with 2,004 source witnesses and two paid-graph forest/chord partitions; independently written verify.py with positive cases and five specified controls.", + "author": "Cinna Davis, with OpenAI Codex assistance", + "ai_assistance": "Substantial OpenAI Codex assistance in research, proof explanation, implementation, testing and writing; no independent human review claimed.", + "open_questions": [ + { + "question": "Can additive actual frame potentials satisfy paid and unchanged warp equations with a complete precision bill?", + "why_it_matters": "This would address the scalar compatibility boundary without changing the retained word.", + "first_step": "Evaluate one actual fundamental paid closed walk with the proposed recursive realizations.", + "blocked_by": "Actual coherent child realizations and their precision/storage bill are not supplied." + }, + { + "question": "Can changed scalar gates or a quantitative defect bound support nonlinear coherent potentials?", + "why_it_matters": "A changed caller can use an argument outside unchanged-gate equivariance.", + "first_step": "Implement the literal conjugate of one certificate ADD and price its full two-call use.", + "blocked_by": "No such paid scalar correction/caller is constructed here." + } + ], + "assignment": { + "seed": "7497f9f029574287f7cf5b3d5415bf74", + "track": "independent-verification", + "base_commit": "b91956876e5b4122fd89179f1b57557ff8378f15", + "priority_revision": 7, + "selected_record_sha256": "6fe0a099b89aa2aed796a13c3a21dafc63f3388ebf397464e44e0451893b9375", + "candidate_task_ids": [ + "formal-interface-lemma", + "independent-moment" + ], + "selected_task_id": "formal-interface-lemma" + } +} diff --git a/research/coherent-frame-additivity/VENDORED.json b/research/coherent-frame-additivity/VENDORED.json new file mode 100644 index 0000000000..97b0069108 --- /dev/null +++ b/research/coherent-frame-additivity/VENDORED.json @@ -0,0 +1,14 @@ +{ + "files": [ + { + "path": "vendor/PR4966-INVERSE-PROOF.md", + "source_repository": "https://github.com/CrocSwap/integer-mult-bounds", + "source_commit": "039b6ea51ab7a7efb38fc6851f345839683251b0", + "source_path": "research/two-full-border-paid-precision/inverse-interface/PROOF.md", + "source_blob": "7d939c4dc662af9cdbf306b7e5ab4f4acf21c35c", + "sha256": "753f0e1e7f6305ed550cb7247204190d9f4f258e07744e16ee55a35ee42e3f85", + "usage": "Quoted target and predecessor context; no predecessor implementation is executed.", + "credit": "Yiyang (@Lyy-iiis), with substantial OpenAI Codex assistance. Apache-2.0." + } + ] +} diff --git a/research/coherent-frame-additivity/VERIFY.json b/research/coherent-frame-additivity/VERIFY.json new file mode 100644 index 0000000000..2ab45d0f1e --- /dev/null +++ b/research/coherent-frame-additivity/VERIFY.json @@ -0,0 +1,32 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 30, + "checks": "All 2,004 active-frame ADD witnesses, scalar/paid/warp frame chronology, both endpoint lists, eight macros per orientation, exact graph ranks, linear positives, nonlinear counterexamples and five specified controls." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 30, + "checks": "Identical exact source and certificate replay with optimization enabled; all rejection checks remain active." + } + ] +} diff --git a/research/coherent-frame-additivity/vendor/PR4966-INVERSE-PROOF.md b/research/coherent-frame-additivity/vendor/PR4966-INVERSE-PROOF.md new file mode 100644 index 0000000000..7d939c4dc6 --- /dev/null +++ b/research/coherent-frame-additivity/vendor/PR4966-INVERSE-PROOF.md @@ -0,0 +1,220 @@ +# A same-cost inverse for the actual owned-center macros + +Yiyang (@Lyy-iiis), with substantial OpenAI Codex assistance. Apache-2.0. + +This is a positive inverse-interface construction for both actual serialized +orientations of the round-three native word in the PR4610 lineage. It removes +the owned-CLEAR obstruction to a particular coherent +inverse construction without adding paid calls. It does not prove a new +Gaussian supplier, a recursive approximation theorem, or an improved bound. + +The source is Cao Yifan's round-three native word at +`research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz`. Its SHA-256 is +`7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05`, and its +Git blob is `46d929df83817b85a5387bcdb9745e0627d6366e`. Identical bytes are +present at revisions `0ce1b5c9fb7163d0b2f0ac3db95fc418dbbcec62`, +`1eb8da6cfb35512c0cc2533413e5ca42f48e13c6` and the current base below. +Our initial copy came unchanged through PR4694, head +`2add42d1edf14a263abe90a3bcde67fc1ba30768`, at +`research/retained-center-extension/inputs/round3-native.json.gz`. +No frozen source has been modified. Current research coordination is based +on refreshed main `cef4b52f2a59009865bf8eabde1be3f159063703`. + +## The local identity + +Let x_i be persistent capture sources, let y_j be persistent target roles +disjoint from every x_i, and let A be a deterministic function. Fix capture +coefficients b_i and fanout coefficients a_j. Consider the macro + +``` +c = 0 +c = sum_i b_i x_i +c = A(c) +for j: y_j += a_j c +c = 0 +``` + +Writing s for the captured linear form, the persistent endpoint is +`x_i'=x_i`, `y_j'=y_j+a_j A(s)`. On arbitrary fresh persistent inputs, +its inverse is + +``` +c = 0 +c = sum_i b_i x_i +c = SAME_A(c) +for j: y_j -= a_j c +c = 0 +``` + +Both directions use one invocation of the same realization A. The inverse +does not call A^-1, reconstruct discarded data from completed outputs, or +reverse a CLEAR. Every capture source remains unchanged, so both the captured +linear form and the second evaluation are identical. This identity does not need A to be linear, +invertible, unitary, or numerically exact. It needs repeatable evaluation on +the same input and exact adding/subtracting of the same increments. + +Literal reversal of the extended circuit with fresh zero garbage would +attempt to recover a discarded, generally nonzero C0 value from zero. The +present construction instead computes a different straight-line program +for the inverse of the persistent map. + +## Binding to both retained source orientations + +Each retained program has 21,449 records, 632 persistent L roles and one +reused C0. Each contains eight consecutive 26-record center macros with +sixteen CLEARs. The forward program has eight COPYs; the backward program +gathers by ADD and has no COPYs. Every COPY/CLEAR lies inside these macros. +There is no other explicit owned or zero-buffer role in this serialized layer. + +Every macro clears C0, captures a linear form, calls its paid center, +performs its fanout and clears C0 again. The two source shapes are: + +| Retained orientation | Capture | Paid center frames | Fanout | +| --- | --- | --- | --- | +| Forward | Copy one persistent source | rank 8 to rank 0 | 22 ADDs, each coefficient ±1/4 | +| Backward | Sum 22 persistent sources, each coefficient ±1/4 | rank 0 to rank 8 | One ADD, coefficient -1 | + +The forward sources, and corresponding backward destinations, are +`92,57,81,224,11,240,9,256`. In each backward macro the 22 capture sources +are disjoint from its single destination. In both orientations all capture +sources remain unmodified between capture and final clear. The generator +checks every record, frame, coefficient and capture/destination intersection. + +Separately for each retained word, reverse the order of these macros and all other +operations. Invert persistent ADDs, invert nonzero dyadic-unit SCALEs, +invert each actual warp/adapter, and call the actual inverse of the same +persistent paid-child realization. Replace each center macro by the +same-A/negative-fanout macro above. Each inverse center macro retains its +source macro's paid orientation: rank eight to zero in the forward source, +zero to rank eight in the backward source. Neither is the literal reverse +frame itinerary. The retained backward program is not assumed to be the +actual inverse of an approximate forward program; it gets its own inverse. + +The resulting persistent input frames are the source's final frames and +the resulting output frames are its start frames. Every intermediate scalar +source/destination frame and every paid/warp boundary has been checked. + +## Exact paid bill + +Each retained complete word and its constructed actual inverse have this +same paid profile: + +``` +{1:2201, 2:412, 3:510, 4:127, 5:40, 8:8}. +``` + +Each orientation retains all eight paid rank-eight jobs; no erased buffer +is credited as an independent output. There are no extra paid rank-one +reconstruction calls. In particular, the initially considered final-center +reconstruction is unnecessary: the forward macro's actual discarded value +is in frame zero, not frame eight. + +The inverse has the same scalar gate count inside each center macro. +Negating a fanout coefficient preserves its magnitude and denominator. +Other inverse scalar/route implementation constants must still be included +in any compiler allowance; they are not paid recursive calls. + +After the established disjoint-axis splitting, a two-full forward or +coherently inverted recipe therefore retains the optimistic paid invoice +`{1:4656,2:920,3:1386}`. At the declared rank-call level the macro replacement +adds no paid calls; it makes no assertion about additional precision costs. +It does not establish that the +full approximate algorithm can attain the raw `.0048568755...` crossing. + +## Workspace and exact arithmetic contract + +Each persistent paid child is required to be a bijection on its declared +field, with an implementation of the inverse of that SAME realization. +The unchanged invoice assumes this inverse is available at the same declared +rank charge. Both directions must restore any private workspace. A statement only about +the child's projected productive output is insufficient. Center children +need only be deterministic on their field and privately clean, since they +are recomputed in the same orientation. + +Under these hypotheses the complete persistent program is a composition +of bijections. It is therefore a bijection, and the constructed inverse is +its exact two-sided inverse. This structural closure survives finite +composition, permutation routing and the finite precompiler's fixed +schedule. It does not assert that the resulting bijection equals, or is +close to, its intended Gaussian operator. + +Exact dyadic arithmetic on a sufficiently fine grid makes ADD/subtract and +nonzero dyadic SCALE mutually reversible without quantization at return. +A finite dyadic word always has such an exact grid for finite dyadic input; +its necessary width and magnitude are not automatically the inherited +linear semantic guard bound. A fully charged uniform precision proof is +still required as the word and accuracy vary. + +There is also a narrowly reversible rounded-shear implementation: compute +the deterministic increment `round_grid(a_j A(s))` and then add it exactly +to y_j. The inverse recomputes and subtracts that identical increment. +The capture may itself be evaluated by a fixed deterministic rule, provided +the identical rule sees the identical unchanged sources in both directions. +This does not justify rounding `y_j+a_j A(s)` as a whole, rounding a SCALE, +overflowing an accumulator, changing the child rounding policy between +directions, or dropping private garbage. + +A rounded bijection can be nonlinear. Its exact reversibility alone does +not supply the linear operator-ring identities used by the Laurent border +controller. Those identities require their own proof for the chosen +actual realization. + +## Executed checks + +`verify.py` authenticates the actual source bytes and Git blob, extracts +all sixteen macros, and recomputes `INVERSE-RECIPE.json.gz`, an explicitly typed +inverse IR for both orientations with source event IDs. It distinguishes +`same_retained_orientation` center +children from `actual_inverse` persistent children. It is a reviewable +recipe, not an already admitted native compiler format. + +The checker passes under isolated optimized Python: + +``` +PYTHONDONTWRITEBYTECODE=1 python3 -I -B -O verify.py +``` + +The frozen receipt is `RESULT.json`. Default verification is read-only and +compares both the canonical inverse recipe and the recomputed receipt. Use +`--regenerate` explicitly to update them after reviewing a construction +change. The recipe hash covers its exact decompressed canonical JSON; +gzip headers and compression streams are not mathematical evidence. + +For each source orientation, the checker verifies both full 632-role round +trips on two sets of independent two-coordinate rational inputs: eight +whole-word round trips in total. Each persistent query site is assigned its own near-identity +dyadic shear, deliberately without imposing Gaussian/frame relations; +each center uses a deterministic nonlinear rounded function. Thus this is +a stress test of the inverse contract, not another ideal native endpoint +replay. Five controls in each orientation reject a changed center realization, +an unnegated fanout, a fresh nominal inverse instead of the actual inverse, +a changed captured linear form, and a source-overwriting fanout. + +An independent native-integration check previously confirmed the eight +forward macros and 48 local round trips. The present checker does not import +that check; its generalized source parser and whole-word round trips cover +both source orientations separately. + +## What this does not yet supply + +The inverse of a complete native word reverses its productive D orientation. +It is not automatically a second fresh-D supplier with opposite central +shear. Approximate internal children may also destroy the source's +`D U(q)` factorization and other Gaussian/frame relations. Same-word +invertibility does not recover those identities. + +Consequently the remaining constructive task is a caller/compiler whose +*actual* two orientations use this coherent inverse and whose complete +main/helper endpoints still match the intended jobs. Error correlation, +private-workspace cleanup, scalar range, exact or rounded execution and +the full paid invoice must be proved together at that caller. The macro +result supplies one concrete piece of this task without a paid-call +surcharge; it does not stand in for the rest. + +A concrete sufficient compatibility target is a family of coherent frame +potentials A_f: an actual paid climb from a to b would equal A_b A_a^-1, +and an actual warp W would equal A_new W A_old^-1. Inverse pairs alone do +not imply these relations. The inherited physical warps would need the +corresponding intertwining without new paid calls, together with the +fresh-D caller and precision bounds above. Testing that requirement on +the actual paid-site realization is an open next step. diff --git a/research/coherent-frame-additivity/verify.py b/research/coherent-frame-additivity/verify.py new file mode 100644 index 0000000000..f87085ce50 --- /dev/null +++ b/research/coherent-frame-additivity/verify.py @@ -0,0 +1,330 @@ +#!/usr/bin/env python3 +"""Source witnesses for gatewise coherent-frame additivity; no new kappa. + +Cinna Davis, with OpenAI Codex assistance. Apache-2.0. +""" +import argparse +from collections import Counter, defaultdict, deque +from fractions import Fraction as F +import gzip +import hashlib +import json +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +SOURCE = 'research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz' +SOURCE_SHA = '7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05' + + +class Rejected(ValueError): + pass + + +def need(ok, reason): + if not ok: + raise Rejected(reason) + + +def power_two(x): + return type(x) is int and x > 0 and x & (x - 1) == 0 + + +def coefficient(g): + need(type(g[-2]) is int and type(g[-1]) is int and g[-1] != 0, + 'rational coefficient') + return F(g[-2], g[-1]) + + +def unit_dyadic(c): + return power_two(abs(c.numerator)) and power_two(c.denominator) + + +def graph_counts(edges): + parent = {} + + def find(v): + parent.setdefault(v, v) + while parent[v] != v: + parent[v] = parent[parent[v]] + v = parent[v] + return v + + tree, chords = [], [] + for event, a, b in edges: + ra, rb = find(a), find(b) + if ra == rb: + chords.append(event) + else: + parent[ra] = rb + tree.append(event) + components = len({find(v) for v in parent}) + simple = {tuple(sorted((a, b))) for _, a, b in edges} + # Independent component/rank count by breadth-first search. + adjacency = defaultdict(set) + for a, b in simple: + adjacency[a].add(b); adjacency[b].add(a) + unseen = set(adjacency) + bfs_components = 0 + while unseen: + bfs_components += 1 + queue = deque([unseen.pop()]) + while queue: + for v in adjacency[queue.popleft()]: + if v in unseen: + unseen.remove(v); queue.append(v) + need(bfs_components == components, 'independent component count') + need(len(tree) == len(parent) - components, 'spanning forest size') + need(len(chords) == len(edges) - len(parent) + components, 'fundamental cycle count') + return {'vertices': len(parent), 'components': components, + 'paid_occurrences': len(edges), 'simple_edges': len(simple), + 'occurrence_cycle_rank': len(chords), + 'simple_cycle_rank': len(simple) - len(parent) + components, + 'forest_event_ids': tree, 'chord_event_ids': chords} + + +def census(src, orientation): + canonical = src['canonical'] + frames = canonical['frames'] + p = src['programs'][orientation] + now = {('L', i): f for i, f in enumerate(canonical['start'])} + used, witnesses, paid = set(), {}, [] + scalar_counts, paid_counts = Counter(), Counter() + macros, macro, macro_open = [], [], False + + def frame(f): + need(type(f) is int and 0 <= f < len(frames), 'valid frame id') + used.add(f) + + def role(r): + need(isinstance(r, list) and len(r) == 2 and type(r[1]) is int, 'role shape') + need((r[0] == 'L' and 0 <= r[1] < len(canonical['start'])) or + r == ['C', 0], 'declared role') + return tuple(r) + + for i, e in enumerate(p): + k = e[0] + if k == 'scalar': + g, f = e[1:] + frame(f) + op = g[0]; scalar_counts[op] += 1 + d = role(g[1]) + if op == 'clear': + need(d == ('C', 0), 'only owned center is cleared') + if not macro_open: + macro_open, macro = True, [i] + else: + macro.append(i); macros.append(macro) + macro_open, macro = False, [] + now[d] = f + continue + if op == 'copy': + s = role(g[2]) + need(d == ('C', 0) and now.get(s) == f, 'center COPY input frame') + now[d] = f + elif op == 'add': + s, c = role(g[2]), coefficient(g) + need(d != s and c != 0, 'nonzero distinct-register ADD') + need(now.get(d) == now.get(s) == f, 'ADD frame chronology') + if d[0] == s[0] == 'L' and unit_dyadic(c): + need(not macro_open, 'persistent witness outside owned macro') + witnesses.setdefault(f, {'frame': f, 'dimension': len(frames[f]), + 'event': i, 'record': e, + 'coefficient': [c.numerator, c.denominator]}) + elif op == 'scale': + c = coefficient(g) + need(d[0] == 'L' and now.get(d) == f and unit_dyadic(c), + 'invertible dyadic persistent SCALE') + else: + raise Rejected('unknown scalar operation') + elif k == 'climb': + _, tag, a, old, new, rank = e + frame(old); frame(new) + need(tag == 'warp_retimed' and now.get(('L', a)) == old, 'paid entrance frame') + need(type(rank) is int and len(frames[new]) - len(frames[old]) == rank > 0, + 'paid rank increment') + now[('L', a)] = new + paid.append((i, old, new)); paid_counts[rank] += 1 + elif k == 'center': + _, a, old, new, rank = e + frame(old); frame(new) + need(macro_open and a == 0 and now.get(('C', a)) == old, 'owned center entrance') + need(type(rank) is int and abs(len(frames[new]) - len(frames[old])) == rank, + 'owned center rank') + now[('C', a)] = new + paid.append((i, old, new)); paid_counts[rank] += 1 + elif k == 'warp': + _, r, op, old, new = e + frame(old); frame(new) + a = role(r) + need(type(op) is int and op != 0 and abs(op) <= len(canonical['warps']), + 'declared warp id') + need(now.get(a) == old and len(frames[old]) == len(frames[new]), + 'warp frame chronology') + now[a] = new + else: + need(k in ('phase', 'adapter'), 'supported event kind') + if macro_open: + macro.append(i) + need(not macro_open and len(macros) == 8, 'eight closed owned macros') + need([now[('L', a)] for a in range(len(canonical['start']))] == canonical['final'], + 'persistent endpoint frames') + need(set(witnesses) == used, 'every active frame has a unit persistent ADD witness') + for ids in macros: + block = [p[i] for i in ids] + need(len(block) == 26 and sum(e[0] == 'center' for e in block) == 1, 'owned macro shape') + captures, destinations = set(), set() + for e in block: + if e[0] != 'scalar' or e[1][0] == 'clear': + continue + g = e[1] + if g[1] == ['C', 0]: + need(g[0] in ('add', 'copy') and g[2][0] == 'L', 'center capture') + captures.add(g[2][1]) + else: + need(g[0] == 'add' and g[2] == ['C', 0], 'center fanout') + destinations.add(g[1][1]) + need(captures and destinations and not captures & destinations, + 'capture sources disjoint from destinations') + need(dict(sorted(paid_counts.items())) == + {int(k): v for k, v in canonical['local_profile'].items()}, 'paid profile binding') + return {'source_events': len(p), 'active_frames': len(used), + 'persistent_roles': len(canonical['start']), 'owned_macros': len(macros), + 'scalar_counts': dict(sorted(scalar_counts.items())), + 'frame_dimension_histogram': dict(sorted(Counter(len(frames[f]) for f in used).items())), + 'witnesses': [witnesses[f] for f in sorted(witnesses)], 'paid_graph': graph_counts(paid)} + + +def plus(x, y): + return tuple(a + b for a, b in zip(x, y)) + + +def times(c, x): + return tuple(c * a for a in x) + + +def commute(A, c, x, y): + return A(plus(x, times(c, y))) == plus(A(x), times(c, A(y))) + + +def rounded_shear(v, inverse=False): + x, y = v + increment = y // 2 + return (x - increment if inverse else x + increment, y) + + +def radial(v): + return times(sum(x*x for x in v), v) + + +def mathematical_checks(): + points = [(F(a, 2), F(b, 2)) for a in range(-3, 4) for b in range(-3, 4)] + coeffs = [F(1), F(-1), F(1, 2), F(-1, 4), F(2)] + linear = lambda v: (v[0] + 2*v[1], v[0] + 3*v[1]) + checked = 0 + for x in points: + need(rounded_shear(rounded_shear(x), True) == x, 'rounded forward/inverse') + need(rounded_shear(rounded_shear(x, True)) == x, 'rounded inverse/forward') + for y in points: + for c in coeffs: + need(commute(linear, c, x, y), 'linear ADD positive control') + checked += 1 + x = (F(0), F(1)) + need(not commute(rounded_shear, F(1), x, x), 'nonlinear rounded ADD counterexample') + u = (F(1), F(0)) + need(not commute(radial, F(1), u, u), 'radial ADD counterexample') + unitary_checks = 0 + for a, b in [(F(0), F(1)), (F(3, 5), F(4, 5)), (F(5, 13), F(12, 13))]: + W = lambda v: (a*v[0] - b*v[1], b*v[0] + a*v[1]) + for v in points: + need(radial(W(v)) == W(radial(v)), 'radial unitary equivariance') + unitary_checks += 1 + S = lambda v: (v[0] + v[1], v[1]) + Sinv = lambda v: (v[0] - v[1], v[1]) + need(all(Sinv(S(v)) == S(Sinv(v)) == v for v in points), 'edge inverse pairs') + need(S(x) != x, 'nontrivial triangle holonomy') + return {'linear_gate_cases': checked, 'rounded_two_sided_round_trips': 2*len(points), + 'radial_unitary_cases': unitary_checks, + 'rounded_counterexample': {'x': [0, 1], 'y': [0, 1], 'coefficient': 1, + 'left': [1, 2], 'right': [0, 2]}, + 'radial_counterexample': {'x': [1, 0], 'y': [1, 0], 'coefficient': 1, + 'left': [8, 0], 'right': [2, 0]}} + + +def controls(src): + tests = [] + + def reject(name, change, expected): + altered = json.loads(json.dumps(src)); change(altered) + try: + census(altered, 'forward') + except Rejected as e: + need(str(e) == expected, 'specified rejection: ' + name + ': ' + str(e)) + tests.append(name) + else: + raise Rejected('mutation accepted: ' + name) + + event = census(src, 'forward')['witnesses'][0]['event'] + def gate(s): + return s['programs']['forward'][event][1] + reject('self_add', lambda s: gate(s).__setitem__(2, gate(s)[1]), + 'nonzero distinct-register ADD') + reject('zero_coefficient', lambda s: gate(s).__setitem__(3, 0), + 'nonzero distinct-register ADD') + reject('boolean_coefficient', lambda s: gate(s).__setitem__(3, True), 'rational coefficient') + reject('wrong_frame', lambda s: s['programs']['forward'][event].__setitem__(2, 1), + 'ADD frame chronology') + return tests + + +def result(raw): + need(hashlib.sha256(raw).hexdigest() == SOURCE_SHA, 'source bytes') + src = json.loads(gzip.decompress(raw)) + need(set(src['programs']) == {'forward', 'backward'}, 'two source orientations') + return {'schema_version': 1, 'claim': 'gatewise_frame_additivity_no_new_kappa', + 'source': SOURCE, 'source_sha256': SOURCE_SHA, + 'orientations': {o: census(src, o) for o in ('forward', 'backward')}, + 'mathematical_checks': mathematical_checks(), 'rejection_controls': controls(src)} + + +def main(): + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument('--write-result', type=Path) + args = ap.parse_args() + raw = (ROOT / SOURCE).read_bytes(); actual = result(raw) + vendor = json.loads((HERE / 'VENDORED.json').read_text())['files'][0] + context = (HERE / vendor['path']).read_bytes() + need(hashlib.sha256(context).hexdigest() == vendor['sha256'], 'predecessor context bytes') + blob = hashlib.sha1(b'blob ' + str(len(context)).encode() + b'\0' + context).hexdigest() + need(blob == vendor['source_blob'], 'predecessor context Git blob') + actual['predecessor_context'] = vendor + certificate = {} + for orientation, data in actual['orientations'].items(): + certificate[orientation] = {'witnesses': data.pop('witnesses')} + for key in ('forest_event_ids', 'chord_event_ids'): + certificate[orientation][key] = data['paid_graph'].pop(key) + payload = (json.dumps(certificate, sort_keys=True, separators=(',', ':')) + '\n').encode() + actual['certificate'] = {'path': 'CERTIFICATE.json.gz', + 'canonical_payload_sha256': hashlib.sha256(payload).hexdigest()} + try: + result(raw + b'changed') + except Rejected as e: + need(str(e) == 'source bytes', 'source-byte rejection reason') + else: + raise Rejected('changed source accepted') + if args.write_result: + with args.write_result.with_name('CERTIFICATE.json.gz').open('xb') as stream: + stream.write(gzip.compress(payload, mtime=0)) + with args.write_result.open('x') as stream: + json.dump(actual, stream, indent=2, sort_keys=True); stream.write('\n') + else: + need(gzip.decompress((HERE / 'CERTIFICATE.json.gz').read_bytes()) == payload, + 'canonical certificate payload equality') + expected = json.loads((HERE / 'RESULT.json').read_text()) + need(json.loads(json.dumps(actual)) == expected, 'committed result equality') + print('PASS_COHERENT_FRAME_ADDITIVITY frames_per_orientation=1002 ' + 'paid_cycle_rank=2297 controls=5 no_new_kappa') + + +if __name__ == '__main__': + main()