From bb36fc65ee0b161229169505f4840c436c5ca2b9 Mon Sep 17 00:00:00 2001 From: Clear1nsight <22630354+Clear1nsight@users.noreply.github.com> Date: Wed, 11 Nov 2026 14:22:27 +1100 Subject: [PATCH 1/3] Reuse #7147 selected replay navigation for onboarding This is the exact documentation prerequisite retained by #7156. It points the onboarding check to the selected #7000/#7001 review. Credit to Rohan Arun and the source authors. --- docs/ci-verification.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/ci-verification.md b/docs/ci-verification.md index 63ba3e9aa8..52b62d0481 100644 --- a/docs/ci-verification.md +++ b/docs/ci-verification.md @@ -1,8 +1,25 @@ # CI verification -## Current selected-family replay: #6030 +## Current selected-family replay: #7000 with #7001 The [selected record](../certificates/selected-result.json) binds conditional +κ = 0.00363005817 to the [application review](research/pr-intake-evidence/pr7000-application/PROOF-REVIEW.md), +[validation receipts](research/pr-intake-evidence/pr7000-application/VALIDATION.json), +and [explicit source closure](../certificates/frontier7000-source.json). +`make frontier7000-verify` follows that exact-source selected replay. The review +reuses eleven authenticated preceding executions and records seven fresh serial +application, scalar and complete native-catalogue executions. The earlier +monolithic timeout is retained separately and is not completed coverage. +Consult the receipts for exact commands, source heads and limits. + +The five inherited framework assumptions remain. No complete uniform word, +literal multiplier execution, independent human proof or formal-kernel proof +is asserted. Routine research submissions do not need to rerun this +selected-family replay. The sections below preserve historical checkpoints. + +## Historical selected-family replay: #6030 + +The [historical checkpoint](../certificates/checkpoints/frontier6030.json) binds conditional κ = 0.003125804 to the [proof review](research/pr-intake-evidence/pr6030-audit/PROOF-REVIEW.md), [validation receipts](research/pr-intake-evidence/pr6030-audit/VALIDATION.json), and [explicit source closure](../certificates/frontier6030-source.json). From d2e54af81f9dda6487636b79d4964a2385d89b2b Mon Sep 17 00:00:00 2001 From: Clear1nsight <22630354+Clear1nsight@users.noreply.github.com> Date: Wed, 11 Nov 2026 21:53:51 +1100 Subject: [PATCH 2/3] Replay the historical selected check at its inspected commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PR #6292 rejection census and package plan are statements about 2485805. Load its exact sources and planner in a private sparse checkout, keeping all source hashes, 19 expected rejections, nine package selections and the empty-plan control. Subsequent edits to the live Makefile and CI guide no longer invalidate this historical check. The original audit is by unpaidmoon, building on Dennis’s historical replay gate. The pinned repository view follows the precedent of Matarener’s PR #5434. Repair prepared with substantial OpenAI Codex assistance. --- .../historical-selected-replay-gap/README.md | 6 +- .../SOURCES.json | 60 +++++++++--------- .../VERIFY.json | 31 +-------- .../historical-selected-replay-gap/verify.py | 63 ++++++++++++++----- 4 files changed, 82 insertions(+), 78 deletions(-) diff --git a/research/historical-selected-replay-gap/README.md b/research/historical-selected-replay-gap/README.md index 55d8cc3b49..36d9a873ca 100644 --- a/research/historical-selected-replay-gap/README.md +++ b/research/historical-selected-replay-gap/README.md @@ -69,7 +69,11 @@ python3 -B scripts/research_package.py --package research/historical-selected-re The direct command prints `PASS_HISTORICAL_SELECTED_REPLAY_GAP`. A registered replay prints `PASS_REGISTERED_RESEARCH_PACKAGE`. Both require Git history -containing the two inspected commits. +containing the two inspected commits and the source and manifest objects at +`2485805a6d47f36ea83ddde6327d453ac82d44dc`. The verifier uses a temporary +sparse checkout of that commit, checks the declared source digests there, and +uses its planner and manifest inventory. The recorded rejections and selection +therefore remain reproducible after later changes to the live Makefile or CI guide. ## Open next questions diff --git a/research/historical-selected-replay-gap/SOURCES.json b/research/historical-selected-replay-gap/SOURCES.json index c1010eec95..62bb8b3950 100644 --- a/research/historical-selected-replay-gap/SOURCES.json +++ b/research/historical-selected-replay-gap/SOURCES.json @@ -4,13 +4,13 @@ "files": [ { "path": "Makefile", - "usage": "input", + "usage": "provenance", "git_blob": "0d683a06b9e7ee162496108ce9a7c5d2ee94fccf", "sha256": "4f2d4f2dcd15139ec82658a975f85ed300897385f85799218539f4c8d60567da" }, { "path": "certificates/partial-swap-network.json", - "usage": "input", + "usage": "provenance", "git_blob": "eccafa830c16170c36faf93045ddf1f638f7bcd4", "sha256": "4c0b9d37e1034b2076e30a70f8e514416298c462d9ee98bc87fe6556b14df786" }, @@ -22,7 +22,7 @@ }, { "path": "docs/ci-verification.md", - "usage": "input", + "usage": "provenance", "git_blob": "63ba3e9aa8bdc5e942b56e34244b92b16f854085", "sha256": "c7d3027e9ad8bcbff68f07aa9576b30fb2f3c76c44d876d40c7fdbf4a3e2228a" }, @@ -34,163 +34,163 @@ }, { "path": "research/clifford-state-performance/SOURCE.json", - "usage": "input", + "usage": "provenance", "git_blob": "6f98a0061a5104dfab82c9e806f819b41811f684", "sha256": "396d0f08df24952248140d5c65c51b8c902ef1c580892ff7ea182890530f67ee" }, { "path": "research/community-batch1047-audit/CONTENT-COVERAGE.json", - "usage": "input", + "usage": "provenance", "git_blob": "5e0f92af463ec12c5e1dcc3effd44081a88af647", "sha256": "07a9daeaf2bda308a92e9a4684f13d5fc766c7772d74801fceb7f4599fdab226" }, { "path": "research/community-batch1099-audit/CONTENT-COVERAGE.json", - "usage": "input", + "usage": "provenance", "git_blob": "9e13266bf85e627f1b7dc225e9530ea69fd2c7f0", "sha256": "421e1211fb1897c45621dc6801c276e53f2e6f335583c9c9049e535f87c0a3b1" }, { "path": "research/community-batch932-audit/CONTENT-COVERAGE.json", - "usage": "input", + "usage": "provenance", "git_blob": "cc4d03eb59b9ab3f952735f7e88ff18c2d15d7af", "sha256": "184629cac91a5cfaca50330a88596008b824221433867dcf8117539c913c284a" }, { "path": "research/community-batch970-audit/CONTENT-COVERAGE.json", - "usage": "input", + "usage": "provenance", "git_blob": "8b9f4111badf7de5d97684799560b55110e9da79", "sha256": "23188ed920e38a54006cb883e181585620821c63bf7e8b5e05d32719417cc37e" }, { "path": "research/community-frontier741-audit/CONTENT-COVERAGE.json", - "usage": "input", + "usage": "provenance", "git_blob": "a5300d4e7a5381a3f443fc54c768ca6f0f236d68", "sha256": "3c820fb30e1b4d9bcfc6a7ab524375e5b2abd66b940af2c509146104f0bcd79c" }, { "path": "research/community-frontier890-audit/CONTENT-COVERAGE.json", - "usage": "input", + "usage": "provenance", "git_blob": "d7ff6d777b01d69b6ce84caf25d3b7e4a4d2f211", "sha256": "6b185a9902652f893f3ebd8ada92d2f11b6de6533a9a4d11718a8a4496101128" }, { "path": "research/community-hyperplane599-audit/SOURCE.json", - "usage": "input", + "usage": "provenance", "git_blob": "546f37d326d10a99910ae8f908e71ef768524d98", "sha256": "65099d764bfcc39bda5e4d9966783611b094c3522dbdd1435cd498d657a8ef8e" }, { "path": "research/community-k492-audit/SOURCE.json", - "usage": "input", + "usage": "provenance", "git_blob": "e538481e4cb16ed936d3195f2dfb5b5a9ca0a76b", "sha256": "2c0f4fa5bc150d05658af2e7c54c4d2c337dd52b7efd3d69530ae73bcbdf452a" }, { "path": "research/community-reconciliation92-audit/MANIFEST.json", - "usage": "input", + "usage": "provenance", "git_blob": "2a2e93685173d5f13cbb5abe740f5d90352e0228", "sha256": "5f501f3c118131e7d069f30ad77186eb2ad6961f9680a0ef105f4514ed41808a" }, { "path": "research/partial-swap-digest/baseline.py", - "usage": "input", + "usage": "provenance", "git_blob": "a2f0190704db83bd8ef48e46e723c49b925804fe", "sha256": "81e9af92cdf38243a540cdcff2062778e449467848d444da37a9553c12ca4c34" }, { "path": "research/r420-two-sided-basis/SOURCES.json", - "usage": "input", + "usage": "provenance", "git_blob": "5d718e11e62f4bcadecf1e02d6b61f87dbe190b0", "sha256": "d9810b0d139c5a1211fd2c1f0d142187cc1fca30026e1e7bc4f9ecfacf1596d1" }, { "path": "research/skip-clones/SOURCE.json", - "usage": "input", + "usage": "provenance", "git_blob": "8d1bb3b9c8189e35e5d8bfdfa632d7473e8be0d5", "sha256": "0b68e63e35a97ce6b0cdb6e291b88ebaa8f2dd4afb70b2498f10ee89428258dc" }, { "path": "research/split-skip/SOURCE.json", - "usage": "input", + "usage": "provenance", "git_blob": "2ab610b6ea2edd2865fda793ef2168b0c76afb4f", "sha256": "7c2b4646a3ecfef6f881da5c43e4bd0fa9a4d1b00548b8ab458d897e16735134" }, { "path": "scripts/historical-ci-inputs/Makefile", - "usage": "input", + "usage": "provenance", "git_blob": "aff68409021c9d401a6f8013b9dfd7dbcc30f2a8", "sha256": "ea8830dd79da493e2d75baf753d733ff7efbcf2b4794afe41fae0ac8f3055646" }, { "path": "scripts/historical-ci-inputs/ledger-batch932-run_isolated_tests.py", - "usage": "input", + "usage": "provenance", "git_blob": "65db599ab0b1dea0312c4ca048e0bd0f44c3736f", "sha256": "96ea543e6c707424afe247e77bd86c82152f90fc76a0773c4232145da5cdf8d1" }, { "path": "scripts/historical-ci-inputs/ledger-batch932-test_isolated_test_runner.py", - "usage": "input", + "usage": "provenance", "git_blob": "34820a8f24678f918f4d0e7a35380d8013fc3495", "sha256": "628391b6abfbc8674ceec1751867a4392f2cc0b5b66886243e139af86cf355ac" }, { "path": "scripts/historical-ci-inputs/ledger-batch970-verify_selected_result.py", - "usage": "input", + "usage": "provenance", "git_blob": "c755b76e0d44ba4917aa94440ebe54daefce5b2a", "sha256": "d7fd929726b326aeeaf0a3996475adec88eee9aac09ae0bebeeaa0bc1fc8f199" }, { "path": "scripts/historical-ci-inputs/ledger-frontier741-ci-verification.md", - "usage": "input", + "usage": "provenance", "git_blob": "7f3c012504187917a728b9fe87043f0fc8cd006a", "sha256": "a854022e0e1d5d4db4d60e586be3ea56005013ef14a1fc06d02bc06e8529c4b0" }, { "path": "scripts/historical-ci-inputs/partial-swap-context.json", - "usage": "input", + "usage": "provenance", "git_blob": "ad65114886bf34a4fd27e79f3be502389e689faa", "sha256": "833a9642f33aeab2ffea17ec9c6b82e0a953f90192b2c82e10bef21538dccba9" }, { "path": "scripts/historical-ci-inputs/partial-swap-network.json", - "usage": "input", + "usage": "provenance", "git_blob": "52075f2463f60af5e16571347f24274fce73a1ea", "sha256": "f3c4be597b2f2136da4ae2cc80c7454f63c90aa01f84e5b8131cee4dd55de815" }, { "path": "scripts/partial_swap/shared.py", - "usage": "input", + "usage": "provenance", "git_blob": "44a0e454c70f9c4b98e258b8443612e6a119904b", "sha256": "5a0646a50b9f3e8ea55168620a78e8853b0ab810517cefc8cfb8696aedee278a" }, { "path": "scripts/replay_historical_check.py", - "usage": "input", + "usage": "provenance", "git_blob": "1e92fff2782970ef71378f594f2350d245a4db26", "sha256": "5467619c78183d3adc82b0cb55af28e5c1a01fca2b0588677816244b53e2bafd" }, { "path": "scripts/research_package.py", - "usage": "input", + "usage": "provenance", "git_blob": "091b4c8f58bac9a9580d76025b887dc5c873d05f", "sha256": "e1256016e7f51827d04fa2179255989f639ae1d97afaa9c16265f85a0c6abd70" }, { "path": "scripts/run_isolated_tests.py", - "usage": "input", + "usage": "provenance", "git_blob": "a96ab35b315ce492e7fbbfd6c5ae211aa066b541", "sha256": "49eb56dd0fc0d8d8ffdb209970a7adf2176223580646f575d5c22e59543b381c" }, { "path": "scripts/verify_selected_result.py", - "usage": "input", + "usage": "provenance", "git_blob": "6882a4700e410dec569b51ae2eaf1a19cc019195", "sha256": "d6b305eac5b9bdb8172c469ad30a1655a60fa0aceac8b1bf610e1b73f51babd8" }, { "path": "tests/test_isolated_test_runner.py", - "usage": "input", + "usage": "provenance", "git_blob": "343b24abf6719b81805eba5a84c74e57634c8288", "sha256": "3a5470d0b139828b90e19bf9583ddeafcd69f8e34f2824664eb3a2958a52e34d" } diff --git a/research/historical-selected-replay-gap/VERIFY.json b/research/historical-selected-replay-gap/VERIFY.json index 98553e72ed..ab7efa3471 100644 --- a/research/historical-selected-replay-gap/VERIFY.json +++ b/research/historical-selected-replay-gap/VERIFY.json @@ -4,36 +4,7 @@ "python": "3.12", "requirements": [], "inputs": [ - "Makefile", - "certificates/partial-swap-network.json", - "docs/ci-verification.md", - "research/clifford-state-performance/SOURCE.json", - "research/community-batch1047-audit/CONTENT-COVERAGE.json", - "research/community-batch1099-audit/CONTENT-COVERAGE.json", - "research/community-batch932-audit/CONTENT-COVERAGE.json", - "research/community-batch970-audit/CONTENT-COVERAGE.json", - "research/community-frontier741-audit/CONTENT-COVERAGE.json", - "research/community-frontier890-audit/CONTENT-COVERAGE.json", - "research/community-hyperplane599-audit/SOURCE.json", - "research/community-k492-audit/SOURCE.json", - "research/community-reconciliation92-audit/MANIFEST.json", - "research/partial-swap-digest/baseline.py", - "research/r420-two-sided-basis/SOURCES.json", - "research/skip-clones/SOURCE.json", - "research/split-skip/SOURCE.json", - "scripts/historical-ci-inputs/Makefile", - "scripts/historical-ci-inputs/ledger-batch932-run_isolated_tests.py", - "scripts/historical-ci-inputs/ledger-batch932-test_isolated_test_runner.py", - "scripts/historical-ci-inputs/ledger-batch970-verify_selected_result.py", - "scripts/historical-ci-inputs/ledger-frontier741-ci-verification.md", - "scripts/historical-ci-inputs/partial-swap-context.json", - "scripts/historical-ci-inputs/partial-swap-network.json", - "scripts/partial_swap/shared.py", - "scripts/replay_historical_check.py", - "scripts/research_package.py", - "scripts/run_isolated_tests.py", - "scripts/verify_selected_result.py", - "tests/test_isolated_test_runner.py" + "scripts/research_package.py" ], "commands": [ { diff --git a/research/historical-selected-replay-gap/verify.py b/research/historical-selected-replay-gap/verify.py index 83b995941a..9d266c5a4e 100644 --- a/research/historical-selected-replay-gap/verify.py +++ b/research/historical-selected-replay-gap/verify.py @@ -6,8 +6,10 @@ """ import hashlib import importlib.util +import json import subprocess import sys +import tempfile from pathlib import Path ROOT = Path(__file__).resolve().parents[2] @@ -61,31 +63,47 @@ def require(ok, message): raise SystemExit(message) -def load_checker(): - path = ROOT / "scripts/replay_historical_check.py" - spec = importlib.util.spec_from_file_location("historical_selected_replay_gap_checker", path) +def load_module(path): + spec = importlib.util.spec_from_file_location(path.stem, path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module +def checkout_snapshot(snapshot, sources, runner, env): + paths = [runner.canonical_relative_path(row["path"]) for row in sources["files"]] + git = ["git", "-c", "maintenance.auto=false", "-c", "gc.auto=0", + "-c", "core.autocrlf=false"] + subprocess.run([*git, "clone", "--quiet", "--shared", "--no-tags", "--no-checkout", + "--", str(ROOT), str(snapshot)], cwd=ROOT, env=env, check=True) + subprocess.run([*git, "update-ref", "--no-deref", "HEAD", INSPECTED], + cwd=snapshot, env=env, check=True) + # The pinned planner reads omitted manifests from the sparse HEAD/index. + patterns = "".join(f"/{path.as_posix()}\n" for path in paths) + subprocess.run([*git, "sparse-checkout", "set", "--no-cone", "--stdin"], + cwd=snapshot, env=env, input=patterns.encode("utf-8"), check=True) + subprocess.run([*git, "read-tree", "-mu", "HEAD"], cwd=snapshot, env=env, check=True) + for path, row in zip(paths, sources["files"], strict=True): + require(hashlib.sha256((snapshot / path).read_bytes()).hexdigest() == row["sha256"], + "historical checkout source digest changed: " + path.as_posix()) + + def entries(checker): for name, config in checker.CONFIG.items(): for entry in [config, *config.get("additional_inputs", [])]: yield name, entry -def reject(checker, entry): +def reject(root, checker, entry): try: - checker.authenticated_input(ROOT, entry) + checker.authenticated_input(root, entry) except ValueError as exc: return str(exc) raise SystemExit("historical input was admitted: " + entry["path"]) -def main(): - require(not sys.flags.optimize, "assertions must stay enabled") - checker = load_checker() +def check_snapshot(root, env): + checker = load_module(root / "scripts/replay_historical_check.py") selected = [entry for name, entry in entries(checker) if name == "tooling-ledger" and entry["path"] == SELECTED_PATH] require(len(selected) == 1, "selected-result checker overlay is not unique") @@ -94,7 +112,7 @@ def main(): require(entry["accepted_live_sha256"] == [SELECTED_ACCEPTED], "accepted selected-checker successors changed") frozen = (checker.INPUTS / entry["input"]).read_bytes() - live = (ROOT / SELECTED_PATH).read_bytes() + live = (root / SELECTED_PATH).read_bytes() require(hashlib.sha256(frozen).hexdigest() == SELECTED_PIN, "frozen selected checker bytes changed") require(hashlib.sha256(live).hexdigest() == SELECTED_LIVE, "live selected checker digest changed") require(SELECTED_LIVE not in (SELECTED_PIN, SELECTED_ACCEPTED), "live checker was already admitted") @@ -102,7 +120,7 @@ def main(): # live successor, not a broken comparison. require(SELECTED_PIN in (SELECTED_PIN, *entry["accepted_live_sha256"]), "pin membership control failed") - require(reject(checker, entry) == REJECTIONS[SELECTED_PATH][1], + require(reject(root, checker, entry) == REJECTIONS[SELECTED_PATH][1], "selected checker rejection text changed") counts = {path: 0 for path in REJECTIONS} @@ -110,7 +128,7 @@ def main(): for _name, item in entries(checker): if item["path"] not in REJECTIONS: continue - message = reject(checker, item) + message = reject(root, checker, item) counts[item["path"]] += 1 messages.setdefault(item["path"], message) for path, (count, message) in REJECTIONS.items(): @@ -118,20 +136,31 @@ def main(): require(messages[path] == message, "rejection text changed for " + path) require(sum(counts.values()) == 19, "rejection total changed") ci = [item for _name, item in entries(checker) if item["path"] == CI_PATH] - require(len(ci) == 1 and hashlib.sha256((ROOT / CI_PATH).read_bytes()).hexdigest() == CI_LIVE, + require(len(ci) == 1 and hashlib.sha256((root / CI_PATH).read_bytes()).hexdigest() == CI_LIVE, "selected CI note digest changed") diff = subprocess.check_output( - ["git", "diff", "--name-only", PARENT, INSPECTED], cwd=ROOT, text=True) + ["git", "diff", "--name-only", PARENT, INSPECTED], cwd=root, env=env, text=True) changed = sorted(name for name in diff.splitlines() if name) require(changed == CHANGED, "inspected commit diff changed") - sys.path.insert(0, str(ROOT / "scripts")) - from research_package import plan_details - details = plan_details(ROOT, set(changed)) + planner = load_module(root / "scripts/research_package.py") + details = planner.plan_details(root, set(changed)) require([row["package"] for row in details] == PLAN_PACKAGES, "helper plan selection changed") matched = {name for row in details for names in row["causes"].values() for name in names} require(sorted(set(changed) - matched) == UNMATCHED, "unmatched plan paths changed") - require(plan_details(ROOT, set()) == [], "empty change set selected a package") + require(planner.plan_details(root, set()) == [], "empty change set selected a package") + + +def main(): + require(not sys.flags.optimize, "assertions must stay enabled") + sources = json.loads(Path(__file__).with_name("SOURCES.json").read_bytes()) + require(sources["base_commit"] == INSPECTED, "historical checkout base changed") + runner = load_module(ROOT / "scripts/research_package.py") + env = runner.git_source_env() + with tempfile.TemporaryDirectory(prefix="historical-selected-replay-") as temporary: + snapshot = Path(temporary) / "snapshot" + checkout_snapshot(snapshot, sources, runner, env) + check_snapshot(snapshot, env) print("PASS_HISTORICAL_SELECTED_REPLAY_GAP") print("selected_checker_live=" + SELECTED_LIVE) print("rejections=19 distinct_paths=7 plan_packages=9") From a0502b0b30a4a4a0e9a37c08e83febbd515c5955 Mon Sep 17 00:00:00 2001 From: ToikY <27568617+ToikY@users.noreply.github.com> Date: Wed, 11 Nov 2026 18:56:02 -0800 Subject: [PATCH 3/3] Bound fixed-paid rank-eight chart-245 banks --- .../LOCAL-PINS.json | 41 ++ .../NOTICE | 7 + .../PROOF.md | 35 ++ .../PROVENANCE.json | 61 +++ .../README.md | 36 ++ .../SOURCES.json | 18 + .../TASK.json | 117 ++++++ .../VERIFICATION.md | 9 + .../VERIFY.json | 19 + .../engines/r96/continue_modular.py | 62 +++ .../engines/r96/exact_four.py | 75 ++++ .../engines/r96/freeze_remaining.py | 34 ++ .../engines/r96/geometry.py | 112 ++++++ .../engines/r96/prefix.py | 49 +++ .../engines/r96/select.py | 14 + .../engines/r96/suffix.py | 68 ++++ .../engines/r97/freeze.py | 29 ++ .../engines/r97/modular_compare.py | 56 +++ .../engines/r97/second_prime.py | 339 +++++++++++++++++ .../engines/rational/exact_six.py | 355 +++++++++++++++++ .../engines/rational/r96_compare.py | 55 +++ .../engines/rational/r96_independent.py | 158 ++++++++ .../rational/r96_pairing_obstruction.py | 55 +++ .../engines/rational/r97_independent.py | 210 +++++++++++ .../engines/rational/rolling_exterior.py | 286 ++++++++++++++ .../inputs/7334-WORD.json.gz | Bin 0 -> 393282 bytes .../inputs/exterior_minor.py | 179 +++++++++ .../inputs/paired_rank.py | 187 +++++++++ .../inputs/paired_support.py | 356 ++++++++++++++++++ .../inputs/reverse_engine.py | 148 ++++++++ .../price/inputs/7314-HELPERS.json.gz | Bin 0 -> 19158 bytes .../price/inputs/7334-CHANGED.json | 72 ++++ .../price/inputs/ADMITTED.json | 58 +++ .../price/inputs/PR7319-SHA256.json | 6 + .../price/inputs/READBACK.json | 188 +++++++++ .../price/inputs/pricing.py | 82 ++++ .../price/quote.py | 70 ++++ .../receipts/SHA256.json | 19 + .../receipts/UNRESOLVED.json | 118 ++++++ .../replay.py | 250 ++++++++++++ 40 files changed, 4033 insertions(+) create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/LOCAL-PINS.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/NOTICE create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/PROOF.md create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/PROVENANCE.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/README.md create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/SOURCES.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/TASK.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/VERIFICATION.md create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/VERIFY.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/continue_modular.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/exact_four.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/freeze_remaining.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/geometry.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/prefix.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/select.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/suffix.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/freeze.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/modular_compare.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/second_prime.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/exact_six.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_compare.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_independent.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_pairing_obstruction.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r97_independent.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/rolling_exterior.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/inputs/7334-WORD.json.gz create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/inputs/exterior_minor.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_rank.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_support.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/inputs/reverse_engine.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7314-HELPERS.json.gz create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7334-CHANGED.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/ADMITTED.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/PR7319-SHA256.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/READBACK.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/pricing.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/price/quote.py create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/receipts/SHA256.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/receipts/UNRESOLVED.json create mode 100644 research/p104-rank-eight-fixed-paid-bank-bound/replay.py diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/LOCAL-PINS.json b/research/p104-rank-eight-fixed-paid-bank-bound/LOCAL-PINS.json new file mode 100644 index 0000000000..100bd9cd63 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/LOCAL-PINS.json @@ -0,0 +1,41 @@ +{ + "NOTICE": "a103976d6f63f7798580cce5481d60705e0753f97b1d064fe57717d5b4f6441a", + "PROOF.md": "888a80e6f8dc0c2a875cde9940d5a1868d79749007929eebf223da5d09855dcc", + "PROVENANCE.json": "0a5f5f67afa6c5e5c9344d75be12a7ae5b2acc689be231bb34ddf21889c80940", + "README.md": "bfa676bb1d4d67270a1291b0c4a786fa3729a700a354b67c516831af468c5053", + "SOURCES.json": "5ae4cfc96aa890b1b06aa0de688e03d9713b2772fb0f9c6ae7e23ad7d49c479d", + "TASK.json": "8198b4a9f5618a1d2fda2e40e40d67fd197dde3e5700a7caaf4245936b1ec756", + "VERIFICATION.md": "cad30fe3215974566d34a96051b46a4e8644e803488b31c3aee7135a4bbfe8cd", + "VERIFY.json": "2d16f628bbde19c72e3a869d10a2d918021023d49d7a0e7e57b9ddc489b9c9ad", + "engines/r96/continue_modular.py": "02a1694b25e64815462d8c98ca0ea670ea67544ae5bcf4e6d728cd3d53635dd3", + "engines/r96/exact_four.py": "aa0155d61b9861a49d228fcc241dcf073f2ed0f2ae1e3ae898524c9b58ddcb0f", + "engines/r96/freeze_remaining.py": "8754dfcca9e089b0a6eb2935428bf95d65483f14b4fcf96cccb876e51abd751b", + "engines/r96/geometry.py": "3d7e6935053b910022072dadd6085fc6b68534b792085d5a8ddcd2bdc32b75e7", + "engines/r96/prefix.py": "3bfc69f588d1d9edfb7c172980570545d52463ae4942fb78490e6f5d167716c3", + "engines/r96/select.py": "f356d31d330bd9b17e5ed8a4186432cce2025a79d42afb267d91416c52502fa8", + "engines/r96/suffix.py": "eb0216f7c4188abb7dcfa30829e24e34c03cc58671c49b8810981a52f86cdffa", + "engines/r97/freeze.py": "a56c0ee8b830838a67b3a11f77f614e5d78f2181750adaa830b1719337895812", + "engines/r97/modular_compare.py": "70097a64b158489eac7a9fd0a82bb482a9eba8e57f2280dbb45c3d1fa9a8f607", + "engines/r97/second_prime.py": "21dbd96192e1f60c00ceddba01a7e8d0ddd7d6ad7da4ad3ed22ef2e47cc589c4", + "engines/rational/exact_six.py": "5bffcbbbdc5b0622e29fbc778540cc240b41e7d252e3e5c68d708d48808fcb5a", + "engines/rational/r96_compare.py": "2c30156846f73b383786fb9966f06b4b8b06aaaabb8a0cc9ab6c30439b82b281", + "engines/rational/r96_independent.py": "0bbf9d1ea0957de30dbe9f7afa4a6fb86236b2910127f1af2722cab6b597ab26", + "engines/rational/r96_pairing_obstruction.py": "aa321146f36814ba7b45904387577aa4de06e18df952866a191d60d41cd77865", + "engines/rational/r97_independent.py": "7762b236d62fe7dd9a3ab89b81ede93f4101ae9254ea72d1226409a75632fcc6", + "engines/rational/rolling_exterior.py": "ffc6dfa01554974f2b913b65c39230d3a7f7b6c06da1c940617b7938afe2b9c7", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "inputs/exterior_minor.py": "b25fef5432d8ea9cff9eecc422cf07ccf7473568084de3e8d3d1b5224793504d", + "inputs/paired_rank.py": "d1b7c34e6f8c8a7b810414762015e6e300a8292422af66ff671ae09741141f09", + "inputs/paired_support.py": "38c796cbe1a73f386177faf88cd53294d4b911f6cde7fd47cd9fcef3b558373f", + "inputs/reverse_engine.py": "751d5d0c4c665c8768ff69bcf939700d3be2f989c59f09af3a4aa14d3c1ebbc4", + "price/inputs/7314-HELPERS.json.gz": "e817ac36ffd85b5b8ad7320daf57bedfa5692b4a0f2990570008afe4888bca6d", + "price/inputs/7334-CHANGED.json": "f4d3f6ca2d87f8cd68c01ac9f77b69bd5a796f92bd567cea8afe3ac7c72e8e4b", + "price/inputs/ADMITTED.json": "c95300e9bca27e44a25c82d794f88cbf70757c142806b0e4c590ea29feb81a13", + "price/inputs/PR7319-SHA256.json": "ca3ed296a19bdd7b2b37608e93d1763d97c7620ac9faef732a01bae4f485114c", + "price/inputs/READBACK.json": "337668788fb39ec9575887f9c5faf438a880471f78d936357dabf7deeac5de82", + "price/inputs/pricing.py": "f4d0b6c9314b838d882d6d06020f24881c19a3fda97a7c00df87b1e920785182", + "price/quote.py": "7767925228e4c3bec74071eac7fe2cf47695a6f4ffbd5f6dd934457f39af32a6", + "receipts/SHA256.json": "91aa157df8168be25cfda9acdeea45e097e17d4047e7b37c935061e5a2a44f47", + "receipts/UNRESOLVED.json": "90bad1091b3008cedcbf02d3ad91de1879faee5784ae2771ea54cdab199434dc", + "replay.py": "fa44267689a4d07f9a72db2427aa08c30687ed9f6cb8265593fd5ba2f59ffd32" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/NOTICE b/research/p104-rank-eight-fixed-paid-bank-bound/NOTICE new file mode 100644 index 0000000000..789e1f8cb9 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/NOTICE @@ -0,0 +1,7 @@ +Apache-2.0. + +#7334 and #7113 supply the pinned word and signed caller. #7298 and #7338 supply +directed pricing and admitted accounting. #7314 and #7319 supply the inherited +census. #5599, #7121, #7244, #7274, #7339, #7353 and #7359 are relevant +construction and support precedents. OpenAI Codex and subagents materially +assisted proof, implementation, independent replay and packaging. diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/PROOF.md b/research/p104-rank-eight-fixed-paid-bank-bound/PROOF.md new file mode 100644 index 0000000000..62a95de824 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/PROOF.md @@ -0,0 +1,35 @@ +# Exact scope and necessary conditions + +Let C be the 15-element cohort of unchanged public helpers with endpoints chart 3 and chart 245 and original productive rank eight. The cohort comes from the exact inherited #7314 census after omitting the changed #7334 roles and protected roles. Both endpoint charts, every paid event, the signed #7113 caller and every other target stay fixed. The proposed edit splits one productive target into two rank-four targets using a single basis coordinate in a public bank on an existing chart V with strict GF(2) inclusion `chart 3 < V < chart 245` and absolute rank four. At least one original public bank role belongs to C. + +The chronological walk tests the initial bank where applicable and records a representative after every incident event that leaves a productive pivot present. ADD and COPY are cocharted. MOVE is incident to both its old and new charts. INIT and CLEAR are incident to the associated chart. An event away from a given chart keeps that bank's occupancy and normalized scalar prefix and suffix maps fixed. The result counts the 326 frozen incident-event representatives, without treating signed physical materialization at distinct clocks as equivalent. + +At a pre-event cut, let P be the normalized prefix map from all public inputs to the public bank, and S the suffix map from that bank to all public outputs. The retained single-coordinate factorization chooses a cut row a and a column b of the inverse basis. Their product must satisfy `a·b = 1`. Their endpoint images `c = aP` and `d = Sb` must be nonzero, have no support outside C, and pair to one under the endpoint basis and inverse basis. Thus the necessary equations are + +```text +supp(aP) ⊆ C, supp(Sb) ⊆ C +c = aP, d = Sb +a·b = c·d = 1. +``` + +The replay exposes all public coordinates, even those outside C. Live owned roles are tracked and follow the unchanged literal word. They are never variables of a public bank coefficient vector. + +## Exterior minors + +Deleting coordinates in C from a prefix row gives the exterior map whose coefficient kernel contains every candidate a. The same applies to b using the suffix columns. Each input scalar denominator is a unit at the relevant prime. Rational MOVE normalization, scaled additions and the owned field lifecycle commute with reduction. A nonzero minor of order equal to the public bank size proves full exterior rank over the rationals. That side has zero coefficient kernel, so the bank cannot have a unit pair. A modular rank drop contributes no rational exclusion. + +The first 16 representatives yield nine prefix and one suffix exterior exclusions. The complementary 310 yield 279 more prefix exclusions. The two continuation engines reconstruct all 310 banks with different trace directions and check their rank and disposition independently modulo 65521 and 65537. + +## Exact pairing + +The exact continuations construct both exterior kernels and their productive images over the rationals. The primary and independent rational engines use different replay directions and reduction routines. On seven chart-242 cuts both coefficient kernels are lines with nonzero productive images. The independent receipt gives signed generators and exact bilinear forms. Their cut and endpoint pairings are zero, and rescaling the lines preserves zero. On cut 45675 at chart 1091 the prefix coefficient kernel is a line whose productive image is the zero vector. A nonzero productive prefix therefore cannot be formed from that public bank. The two original owned fields are recorded and held fixed. + +Of the 326 frozen representatives, the modular exclusions and eight rational exclusions are disjoint. The remaining 29 are modular dual drops without a rational decision. + +## Directed price and comparability + +Across the 17 caller copies, one fixed-paid split would change the productive histogram by T4 +34 and T8 −17. The paid histogram and other target counts remain fixed. The exact #7334 complete invoice has 110,519 paid positions, 22,461 productive positions and signed rank surplus 1,424. The hypothetical split preserves that rank surplus. + +The signed crossing of #7334 lies in the strict interval `(0.00364665195644044790699554028334161, 0.00364665195644044790699554028334162)`. At the certified upper endpoint the one-edit directed gross upper is about 0.3415972937126856 raw. The exact price replay gives a positive complete margin at the frozen incumbent-plus-`10^-9` probe for the hypothetical zero-overhead edit. A raw paid rank-one position costs one and consumes that one-edit margin. The optimistic whole-cohort upper grants 15 compatible edits and all ancillary work free, giving 5.123959405690284 raw at the incumbent. The complete margin upper at the fixed moonshot κ = 0.0040075385047236 is below −134.1394 raw. No priced edit has been physically constructed. + +The comparator retains `native_all_columns`, `owned_erasure`, `compiler`, `precision_tape` and `analytic_recovery`. This package reuses the admitted comparator receipt. It does not replace its full native or outer replay. The selected certificate is unchanged. diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/PROVENANCE.json b/research/p104-rank-eight-fixed-paid-bank-bound/PROVENANCE.json new file mode 100644 index 0000000000..99d08ce63a --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/PROVENANCE.json @@ -0,0 +1,61 @@ +{ + "derived_inputs": { + "price/inputs/7314-HELPERS.json.gz": { + "compression": "gzip", + "keys": [ + "REVERSE.json" + ], + "receipt": "price/inputs/PR7319-SHA256.json" + }, + "price/inputs/7334-CHANGED.json": { + "keys": [ + "receipt", + "peer-prep/IDENTITIES.json" + ], + "receipt": "price/inputs/ADMITTED.json" + } + }, + "files": { + "inputs/7334-WORD.json.gz": { + "commit": "aaeec8c0acf01e99a5f331ef363a698d9c084ace", + "git_blob": "73f43007192eb5a38eb5abb591b871df3e52c7cd", + "path": "research/p104-helper-319-fused-return/WORD.json.gz", + "sha256": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "source": "https://github.com/Clear1nsight/integer-mult-bounds/blob/aaeec8c0acf01e99a5f331ef363a698d9c084ace/research/p104-helper-319-fused-return/WORD.json.gz", + "uncompress": false + }, + "price/inputs/ADMITTED.json": { + "commit": "349996445176e934ffb3c76813adcd230ca8f783", + "git_blob": "464c89e45c4eca230c099e8bac784a90200a5069", + "path": "research/p104-compensated-fusion-readout-bound/inputs/ADMITTED.json", + "sha256": "c95300e9bca27e44a25c82d794f88cbf70757c142806b0e4c590ea29feb81a13", + "source": "https://github.com/CrocSwap/integer-mult-bounds/blob/349996445176e934ffb3c76813adcd230ca8f783/research/p104-compensated-fusion-readout-bound/inputs/ADMITTED.json", + "uncompress": false + }, + "price/inputs/PR7319-SHA256.json": { + "commit": "b2d3bc4dd584f8d3aacd244505b12286db4d4875", + "git_blob": "3a28905e8d69888617b56578761c16d39fcdf7a6", + "path": "research/p104-helper-entrance-first-contact-bound/receipts/SHA256.json", + "sha256": "ca3ed296a19bdd7b2b37608e93d1763d97c7620ac9faef732a01bae4f485114c", + "source": "https://github.com/CrocSwap/integer-mult-bounds/blob/b2d3bc4dd584f8d3aacd244505b12286db4d4875/research/p104-helper-entrance-first-contact-bound/receipts/SHA256.json", + "uncompress": false + }, + "price/inputs/READBACK.json": { + "commit": "349996445176e934ffb3c76813adcd230ca8f783", + "git_blob": "625b508eead24b4428253bd257620b7e775800c1", + "path": "research/p104-compensated-fusion-readout-bound/price/READBACK.json", + "sha256": "337668788fb39ec9575887f9c5faf438a880471f78d936357dabf7deeac5de82", + "source": "https://github.com/CrocSwap/integer-mult-bounds/blob/349996445176e934ffb3c76813adcd230ca8f783/research/p104-compensated-fusion-readout-bound/price/READBACK.json", + "uncompress": false + }, + "price/inputs/pricing.py": { + "commit": "c522451caf287bb3c16eaece72be4c263315dca4", + "git_blob": "40ec194017bda1d524bba4f07b188c53281419d0", + "path": "research/adjacent-owned-add-exchange-bound/pricing.py", + "sha256": "f4d0b6c9314b838d882d6d06020f24881c19a3fda97a7c00df87b1e920785182", + "source": "https://github.com/CrocSwap/integer-mult-bounds/blob/c522451caf287bb3c16eaece72be4c263315dca4/research/adjacent-owned-add-exchange-bound/pricing.py", + "uncompress": false + } + }, + "schema_version": 1 +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/README.md b/research/p104-rank-eight-fixed-paid-bank-bound/README.md new file mode 100644 index 0000000000..390a8b75e5 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/README.md @@ -0,0 +1,36 @@ +# Fixed-paid rank-eight chart-245 bank bound + +**NO VERIFIED GAIN.** This package excludes 297 of 326 frozen public cochart bank representatives for one productive rank-eight 4+4 split. It preserves the 29 unresolved bank keys for exact continuation. The comparator is conditional κ = 0.00364665195644 from exact [#7334](https://github.com/CrocSwap/integer-mult-bounds/pull/7334), head `aaeec8c0acf01e99a5f331ef363a698d9c084ace`. Δκ = 0 and the relative gain is exactly 0%. + +The literal native word and [#7113 signed caller](https://github.com/CrocSwap/integer-mult-bounds/pull/7113) stay fixed. The productive target is one of the 15 unprotected rank-eight helpers with endpoints chart 3→245. The cut uses an existing rank-four cochart bank on chart 242, 772 or 1091. The bank may use exterior public axes. The productive prefix and suffix images must stay in the fixed 15-role cohort. Original owned fields keep their operations and remain outside the public basis. + +| Screen | Tested | Excluded | Result | +| --- | ---: | ---: | --- | +| Initial modular prefix and suffix | 16 | 10 | Nine full exterior prefix ranks, one full exterior suffix rank | +| First exact pairing continuation | 4 | 4 | Both pure lines exist and their generator pairing vanishes at cut and endpoint | +| Remaining modular representatives | 310 | 279 | Full exterior prefix ranks verified independently modulo 65521 and 65537 | +| Second exact pairing continuation | 4 | 4 | Three zero pairings and one zero productive prefix image | + +The second rational continuation tests two inherited drops and two new drops, all distinct from the initial rational cases. The eight exact dispositions agree between independent engines. The one zero-image case has a nonzero exterior-kernel line at chart 1091 with two unchanged owned occupants. The seven other exact cases are on chart 242. See the [exact argument and paid invoice](PROOF.md) and [verification receipts](VERIFICATION.md). + +## Reproduce + +Use CPython 3.12 with assertions enabled and the standard library. From the package directory in a clean checkout or Git-free export: + +```sh +python3.12 -I -B replay.py +``` + +To inspect the exact sparse domain matrices, pairing forms and minors, run `python3.12 -I -B replay.py --output replayed`. This materializes the [17 path-keyed receipts](receipts/SHA256.json). All inputs travel with the package. [Source provenance](PROVENANCE.json) + +## Open next questions + +Start with the [29 exact keys](receipts/UNRESOLVED.json). Freeze at most four, favoring distinct chart and bank shapes, and reconstruct both rational exterior kernels and the signed pairing. A nonzero rational unit pair still requires a legal signed basis change, the arbitrary-input forward and adjoint identities, restoration, the complete paid and ordinary invoice, precision and tape, and a full independent replay. One new paid rank-one position would erase the favorable one-edit directed price. + +The result covers the frozen single-pivot, fixed public bank contract. Other chart labels, changes to paid paths, a basis using owned fields, wider cohorts and interacting edits are open as different scopes. + +## Credit + +[#7334](https://github.com/CrocSwap/integer-mult-bounds/pull/7334) supplies the literal paid word and comparable complete witness. [#7113](https://github.com/CrocSwap/integer-mult-bounds/pull/7113) supplies the signed caller. [#7298](https://github.com/CrocSwap/integer-mult-bounds/pull/7298) and [#7338](https://github.com/CrocSwap/integer-mult-bounds/pull/7338) supply the directed pricing and independently admitted invoice. [#7314](https://github.com/CrocSwap/integer-mult-bounds/pull/7314) and [#7319](https://github.com/CrocSwap/integer-mult-bounds/pull/7319) supply the inherited helper census and exact cohort source. + +[#5599](https://github.com/CrocSwap/integer-mult-bounds/pull/5599) supplies the paired cochart split. [#7121](https://github.com/CrocSwap/integer-mult-bounds/pull/7121) supplies a rank-eight split in a different cohort. [#7244](https://github.com/CrocSwap/integer-mult-bounds/pull/7244) and [#7274](https://github.com/CrocSwap/integer-mult-bounds/pull/7274) use chart 245 with older paid-path changes. [#7339](https://github.com/CrocSwap/integer-mult-bounds/pull/7339), [#7353](https://github.com/CrocSwap/integer-mult-bounds/pull/7353) and [#7359](https://github.com/CrocSwap/integer-mult-bounds/pull/7359) supply earlier exact support tests for rank-nine helpers. OpenAI Codex and subagents materially assisted the proof, implementation, independent replay and packaging. diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/SOURCES.json b/research/p104-rank-eight-fixed-paid-bank-bound/SOURCES.json new file mode 100644 index 0000000000..e8c2f265cd --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/SOURCES.json @@ -0,0 +1,18 @@ +{ + "base_commit": "e54523517d0f03e58352e647c403a5af3e525a57", + "files": [ + { + "git_blob": "75d77b328ea02ded535e7f23aee5b1e55d0bb1a8", + "path": "certificates/selected-result.json", + "sha256": "154c3d30455d778fd3343b6b4851f0fa4665f0f7625b0adb3675e2bafbbf6bf1", + "usage": "provenance" + }, + { + "git_blob": "3404fbdd5e7529a0674eef26114b5071e4586cec", + "path": "docs/research/agent-task-catalog.json", + "sha256": "ead6cdc9d0af6d58e8a49744d8ec8c7c15e13d2ba93c276c434bcf9b51b93a81", + "usage": "provenance" + } + ], + "schema_version": 1 +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/TASK.json b/research/p104-rank-eight-fixed-paid-bank-bound/TASK.json new file mode 100644 index 0000000000..005cbe1ac4 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/TASK.json @@ -0,0 +1,117 @@ +{ + "actual_scope": "Exact #7334 fixed-paid 4+4 split on the 15 public chart-3 to chart-245 rank-eight helpers and 326 frozen incident-event bank representatives.", + "ai_assistance": "OpenAI Codex and subagents materially assisted proof, implementation, independent verification and packaging.", + "author": "P104 rank-eight split research", + "base_commit": "e54523517d0f03e58352e647c403a5af3e525a57", + "bottleneck_link": "A fixed-paid 4+4 productive split improves the directed complex invoice only with legal signed cochart unit pairing and retained route, ownership, precision and tape.", + "budget_minutes": 25, + "evidence": "326 representatives across three strict rank-four intermediate charts. Exact evidence excludes 297 and leaves 29 unresolved. Two modular engines agree for every continuation key; two rational engines agree for both four-key selections.", + "open_questions": [ + { + "blocked_by": "A modular rank drop gives no rational result. Even a rational pair would require signed materialization, full cost accounting and complete independent replay.", + "first_step": "Pin at most four keys from receipts/UNRESOLVED.json, then compute both exact exterior kernels, images and pairing forms from the literal word.", + "question": "Does any of the remaining 29 exact bank keys admit a nonzero rational unit pair on its fixed public bank?", + "why_it_matters": "A legal single 4+4 split has positive directed price with the paid itinerary fixed." + } + ], + "original_card": { + "acceptance_gate": "An exact arbitrary-input identity, source/target frame availability and restoration at the chosen cut, plus the complete channel+correction+idle/hosting bill or an explicit favorable bound. The native channel alone is not a supplier. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "allowed_variations": [ + "One exact source head, helper/cut region or quantified proposition and changed hypothesis; check live handoffs first. Different seeds are not different scopes." + ], + "bottleneck_link": "Judge the actual current supplier contract and complete signed target/paid bill; frozen-profile ceilings require an applicability proof.", + "existing_checks": [ + { + "evidence": "research/p104-literal-slot-defect/README.md", + "remaining": "Independently validate the stated scope or change its producer/consumer premise and pay the complete boundary.", + "scope": "PR #4133: literal-slot defect", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "source_commit": "88666f1dee93fbd85b31fd5d6f91a219e111b5f4", + "status": "author-checked" + }, + { + "evidence": "research/p104-uniform-commutation-gap/README.md", + "remaining": "Independently validate the stated scope or change its producer/consumer premise and pay the complete boundary.", + "scope": "PR #4136: uniform commutation gap", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "source_commit": "281ce601a8be9db470de630759179c23e1dfaa88", + "status": "author-checked" + }, + { + "evidence": "research/p104-uniform-encoding-gap/README.md", + "remaining": "Independently validate the stated scope or change its producer/consumer premise and pay the complete boundary.", + "scope": "PR #4140: uniform encoding gap", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "source_commit": "de25c6525aa866962309df5d107b32d55e6e5628", + "status": "author-checked" + }, + { + "evidence": "research/p104-source-chart-shortcut/README.md", + "remaining": "Independently validate the stated scope or change its producer/consumer premise and pay the complete boundary.", + "scope": "PR #4153: source-chart shortcut exhausts its optimistic allowance", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "source_commit": "9123241fea53df77e51ffe30d9aca1625d4bf3a8", + "status": "author-checked" + }, + { + "evidence": "research/p104-fiber-tag-seam/README.md", + "remaining": "Independently validate the stated scope or change its producer/consumer premise and pay the complete boundary.", + "scope": "PR #4154: fiber-tag seam mismatch", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "source_commit": "4ffcdaee5d6255a9cea1fe53a5424435068089d0", + "status": "author-checked" + }, + { + "evidence": "docs/research/pr-intake-evidence/pr5599-completion/PROOF-REVIEW.md", + "remaining": "The next experiment must identify uncovered source-specific work. Successor archive intake does not transfer this admission.", + "scope": "Selected PR5599: complete helper-subspace construction and independent caller replay; five framework assumptions remain.", + "selected_record_sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5", + "source_commit": "09dd0965711ca7eeb169057a420abab1c9052137", + "status": "reviewed" + } + ], + "first_experiment": "Start with the selected #5599 emitted word and review pending #5718 distinct input/output bases plus #5717/#5719 coverage before claiming work. Pick one uncovered source word, helper group and cut region. Prove the arbitrary-input relation and legal entry/exit corrections, then compare full target and paid profiles. Reject if completion, owned lifetimes or consumer costs repay the gain. A static pairing rank alone is not a physical split.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_selected_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read revision 8, the selected review and live exact-source handoffs. Then follow this card's bounded first_experiment.", + "scope": "Source-bound orientation only, not a supplier replay or theorem proof." + }, + "id": "p104-side-correction", + "methods": [ + "Construct and independently check one source-bound instance of the stated first experiment.", + "Seek an exact counterexample or target-specific complete-budget obstruction to that same proposed change." + ], + "overlap_terms": [ + "P104", + "helper basis", + "helper split", + "5718", + "dyadic capacity" + ], + "question": "Can joint helper bases and a legal causal split improve the complete P104 productive/paid invoice?", + "scope_change_triggers": [ + "Changing source head, helper/cut domain, operation alphabet or caller boundary without recording the new scope.", + "Treating an archived proposal or local numerical pass as complete supplier admission." + ], + "starting_points": [ + "docs/research/current-priorities.md", + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "docs/research/pr-intake-evidence/pr5599-completion/PROOF-REVIEW.md", + "research/p104-helper-subspace-splits/README.md", + "research/dyadic-helper-channel-capacity/README.md" + ] + }, + "outcome": "negative-result", + "priority_revision": 8, + "schema_version": 1, + "scope_change_reason": "Uses the separate rank-eight chart-3 to chart-245 cohort with two bounded exact selections, distinct from earlier rank-nine and changed paid path scopes.", + "scope_status": "changed", + "stop_rule": "Sweep at most 76,466 literal events, screen the first frozen 16 and then the complementary 310, and replay only the two exact four-key selections with a 35-second cap per round.", + "task_id": "p104-side-correction" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/VERIFICATION.md b/research/p104-rank-eight-fixed-paid-bank-bound/VERIFICATION.md new file mode 100644 index 0000000000..8c6f984165 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/VERIFICATION.md @@ -0,0 +1,9 @@ +# Verification + +The direct replay passed on CPython 3.12 with assertions, using only the standard library. It rebuilds the exact preprice and literal geometry, regenerates 17 path-keyed receipts byte-for-byte, compares both modular and both rational engines, and checks that the exclusion and unresolved sets partition the 326 frozen keys. The [receipt manifest](receipts/SHA256.json) and [remaining keys](receipts/UNRESOLVED.json) are compact. Pass `--output` to retain every regenerated result, including the exact signed sparse matrices, kernel generators and pairing forms. + +Round 96 screened its first 16 representatives and four rational drops. Round 97's 310-case primary and independent modular stages each exhausted their scope under 25 seconds, taking 1.56 and 1.86 seconds. The four exact keys in the Round 97 primary took 4.97 seconds. The independent two batches took 0.14 and 0.13 seconds and shared the four-key cap. No exact-selected key remains unresolved. The other 29 dual drops have no rational disposition. + +The wrapper runs a signed owned COPY/CLEAR control, a determinant sign control, a planted rank-drop control, a nonunit denominator control and positive and negative exact pairing controls. It rejects altered selection, remaining-key and word bytes. Each negative control requires exit code 1 and no result receipt. + +The comparator's four independent local stages are recorded in [the exact admission](https://github.com/CrocSwap/integer-mult-bounds/blob/349996445176e934ffb3c76813adcd230ca8f783/research/p104-compensated-fusion-readout-bound/inputs/ADMITTED.json). Its [exact-head hosted replay](https://github.com/CrocSwap/integer-mult-bounds/actions/runs/43114736518) passed. The contribution itself uses the registered focused replay. No changed signed supplier or complete outer replay was run because the exact support stage produced no admissible candidate. diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/VERIFY.json b/research/p104-rank-eight-fixed-paid-bank-bound/VERIFY.json new file mode 100644 index 0000000000..dae3635dc2 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/VERIFY.json @@ -0,0 +1,19 @@ +{ + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/replay.py" + ], + "checks": "Regenerate exact price, 326-bank geometry, 17 pinned receipts, modular and rational agreements, and unresolved keys. Check rejection of corrupted selection, remaining list and native word.", + "timeout_seconds": 180 + } + ], + "inputs": [], + "python": "3.12", + "requirements": [], + "schema_version": 1, + "status": "ready" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/continue_modular.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/continue_modular.py new file mode 100644 index 0000000000..b2a4d18ca8 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/continue_modular.py @@ -0,0 +1,62 @@ +"""Check only the 310 banks outside the first R96 modular cap.""" +from collections import Counter +from gzip import decompress +from hashlib import sha256 +import json +from pathlib import Path +from runpy import run_path +import sys +from time import monotonic + +PINS = { + "price/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "lead/REMAINING.json": "3597499663a57702856945e91214a65e1d0f94db8643b93c0234c2bbf9291b1a", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "inputs/exterior_minor.py": "b25fef5432d8ea9cff9eecc422cf07ccf7473568084de3e8d3d1b5224793504d", + "inputs/reverse_engine.py": "751d5d0c4c665c8768ff69bcf939700d3be2f989c59f09af3a4aa14d3c1ebbc4", +} + + +def main(): + assert __debug__ and sys.version_info[:2] == (3,12) + deadline = monotonic() + 22 + root = Path(sys.argv[1]) + inputs = {} + for name, expected in PINS.items(): + data = (root/name).read_bytes() + if sha256(data).hexdigest() != expected: + raise ValueError(f"changed dependency: {name}") + inputs[name] = data + engine = run_path(str(root/"inputs/exterior_minor.py")) + reverse = run_path(str(root/"inputs/reverse_engine.py")) + unique = engine["unique"] + price = json.loads(inputs["price/PRICE.json"],object_pairs_hook=unique) + previous = json.loads(inputs["lead/REMAINING.json"],object_pairs_hook=unique) + assert price["head"] == previous["head"] == engine["HEAD"] + keys = [tuple(k) for k in previous["unvisited_prefix"]] + assert len(keys) == len(set(keys)) == previous["next_modular_cases"] == 310 + assert not set(keys) & set(map(tuple,previous["dual_drops_requiring_rational"])) + word = json.loads(decompress(inputs["inputs/7334-WORD.json.gz"]),object_pairs_hook=unique) + cohort = set(price["cohort"]) + controls = reverse["controls"](engine) + prefix, visited_prefix = engine["sweep"](word,keys,cohort,deadline) + remaining = [prefix[key] for key in keys if key in prefix and prefix[key]["disposition"] == "rank drop"] + suffix, visited_suffix = reverse["sweep"](word,remaining,cohort,engine,deadline) + rows = [] + for key in keys: + p, s = prefix.get(key), suffix.get(key) + if p and p["disposition"] == "excluded": + status = "prefix_exclusion" + elif s: + status = "suffix_exclusion" if s["disposition"] == "excluded" else "dual_drop" + else: + status = "capped" + rows.append({"key":list(key),"prefix":p,"suffix":s,"status":status}) + print(json.dumps({"head":price["head"],"pins":PINS,"controls":controls,"case_cap":310, + "runner_seconds":25,"visited_prefix_events":visited_prefix,"visited_suffix_events":visited_suffix, + "counts":Counter(r["status"] for r in rows),"rows":rows, + "existing_exact_pending":previous["dual_drops_requiring_rational"]},indent=2,sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/exact_four.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/exact_four.py new file mode 100644 index 0000000000..0ddc369a26 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/exact_four.py @@ -0,0 +1,75 @@ +"""Rational two-sided pairing for the frozen six-bank continuation.""" +from collections import Counter +from gzip import decompress +from hashlib import sha256 +import json +from pathlib import Path +from runpy import run_path +import sys +from time import monotonic + +PINS = { + "lead/SELECTION.json": "b95765ffa0bd426b3dae781aaafc1c21e3b25bcebc71b71a3871824f9009fd5f", + "price/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "inputs/paired_rank.py": "d1b7c34e6f8c8a7b810414762015e6e300a8292422af66ff671ae09741141f09", + "inputs/paired_support.py": "38c796cbe1a73f386177faf88cd53294d4b911f6cde7fd47cd9fcef3b558373f", +} + + +def main(): + deadline = monotonic() + 32 + root = Path(sys.argv[1]) + raw = {} + for path, pin in PINS.items(): + value = (root/path).read_bytes() + if sha256(value).hexdigest() != pin: + raise ValueError(f"changed dependency: {path}") + raw[path] = value + select = json.loads(raw["lead/SELECTION.json"]) + price = json.loads(raw["price/PRICE.json"]) + word = json.loads(decompress(raw["inputs/7334-WORD.json.gz"])) + rank, solve = [run_path(str(root/"inputs"/x)) for x in ("paired_rank.py", "paired_support.py")] + cohort = set(price["cohort"]) + assert len(cohort) == 15 and all(word["initial"][r] == 3 and word["final"][r] == 245 for r in cohort) + controls = solve["controls"]() + banks = {r["key"][0]: r["public"] for r in select["selected"]} + assert len(banks) == 4 + prefix = rank["side"](word, banks, cohort, deadline, False) + open_banks = {t: banks[t] for t, rows in prefix.items() if any(c for _, c in rows)} + suffix = rank["side"](word, open_banks, cohort, deadline, True) if open_banks else {} + results, pending = [], [] + for row in select["selected"]: + t = row["key"][0] + if t not in prefix or (t in open_banks and t not in suffix): + pending.append(row["key"]) + continue + f = prefix[t] + record = {**row, "pure_prefix_dimension": len(f), + "nonzero_prefix_images": sum(bool(c) for _, c in f)} + if t not in open_banks: + results.append(record | dict(status="no nonzero pure prefix")) + continue + s = suffix[t] + record.update(pure_suffix_dimension=len(s), nonzero_suffix_images=sum(bool(d) for _, d in s)) + if not any(d for _, d in s): + results.append(record | dict(status="no nonzero pure suffix")) + continue + try: + pair = solve["paired"](f, s, deadline) + except solve["Capped"]: + pending.append(row["key"]) + continue + if pair is None: + results.append(record | dict(status="no unit pairing")) + continue + assert solve["dot"](pair["a"],pair["b"]) == solve["dot"](pair["c"],pair["d"]) == 1 + results.append(record | dict(status="exact paired support", + witness={k: {j: str(x) for j,x in v.items()} for k,v in pair.items()})) + print(json.dumps(dict(head=price["head"],pins=PINS,controls=controls,exact_cap=4,seconds_cap=32, + results=results,counts=Counter(r["status"] for r in results),selected_unresolved=pending, + unselected=select["unselected"]), indent=2,sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/freeze_remaining.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/freeze_remaining.py new file mode 100644 index 0000000000..190fd36df1 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/freeze_remaining.py @@ -0,0 +1,34 @@ +"""Identify unvisited rank-eight banks and the two unresolved dual drops.""" +from hashlib import sha256 +import json +from pathlib import Path +import sys + +PINS = { + "lead/GEOMETRY.json": "c6f9f018df8b58fcdf4f44356bd59bcac6d411b7845104ff4ad372ed4a95cfbd", + "lead/RESULT.json": "45b6c8992dcff04b7252dfec809fc64812b86f094531ed3964ff967408057ed2", + "lead/SUFFIX.json": "77d78eb692bf6d3f0433730b48dbf8a0178c3288eeca961f94b2aaa6683eb59a", + "lead/EXACT.json": "362a879401158678c8a30ea0dbd4f919a9a0e907db2d2247ce96ac8724f68b14", +} + +root = Path(sys.argv[1]) +receipts = {} +for name, digest in PINS.items(): + raw = (root/name).read_bytes() + if sha256(raw).hexdigest() != digest: + raise ValueError(f"changed receipt: {name}") + receipts[Path(name).stem] = json.loads(raw) +g, p, s, e = (receipts[k] for k in ("GEOMETRY","RESULT","SUFFIX","EXACT")) +assert g["eligible_bank_count"] == 326 and g["status"] == "EXHAUSTED" +assert p["counts"] == {"excluded":9,"rank drop":7} and not p["unvisited"] +assert s["counts"] == {"excluded":1,"rank drop":6} and not s["unvisited"] +assert e["counts"] == {"no unit pairing":4} and not e["selected_unresolved"] +exact = {tuple(r["key"]) for r in e["results"]} +unresolved = [r["key"] for r in s["rows"] if r["disposition"] == "rank drop" and tuple(r["key"]) not in exact] +unvisited = g["unvisited_keys"] +assert len(unvisited) == 310 and len(unresolved) == 2 +assert e["unselected"] == unresolved + unvisited +print(json.dumps({"head":g["head"],"input_sha256":PINS,"excluded":14, + "unresolved":312,"unvisited_prefix":unvisited,"dual_drops_requiring_rational":unresolved, + "next_modular_cases":310,"next_modular_runner_seconds":25, + "next_exact_cases":4,"next_exact_runner_seconds":35},indent=2,sort_keys=True)) diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/geometry.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/geometry.py new file mode 100644 index 0000000000..3050905547 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/geometry.py @@ -0,0 +1,112 @@ +"""Exact full-word occupied rank-four cochart bank census.""" +from collections import defaultdict +from gzip import decompress +from hashlib import sha256 +from pathlib import Path +from time import monotonic +import json +import sys + +PRICE="a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525" +WORD="4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a" + + +def checked(path,pin): + b=path.read_bytes() + if sha256(b).hexdigest()!=pin: + raise ValueError(f"changed dependency: {path.name}") + return b + + +def span(frame): + result={0} + for v in frame: + assert v not in result + result|={w^v for w in result} + return result + + +def main(): + root=Path(sys.argv[1]) + price=json.loads(checked(root/"price/PRICE.json",PRICE)) + word=json.loads(decompress(checked(root/"inputs/7334-WORD.json.gz",WORD))) + assert price["word_sha256"]==WORD and price["support_cap"]==16 + n=word["public"] + cohort=set(price["cohort"]) + assert len(cohort)==15 and all(word["initial"][r]==3 and word["final"][r]==245 for r in cohort) + spaces=list(map(span,word["frames"])) + intermediate={i for i,w in enumerate(spaces) if len(w)==16 and spaces[3]=n),pivots=sorted(pivots))) + for c in sorted(bank): + save(0,c) + until=monotonic()+18 + visited=0 + for t,e in enumerate(word["program"]): + if t%128==0 and monotonic()>=until: + break + op,r,*args=e + old=chart[r] + if op=="MOVE": + assert old==args[0] and args[2]==(r>=n) + new=args[1] + elif op=="INIT": + assert old is None and r>=n + new=args[0] + elif op=="CLEAR": + assert old==args[0] and r>=n + new=None + else: + assert old==args[-1] and op in ("ADD","COPY","SCALE") + if op in ("ADD","COPY"): + assert chart[args[0]]==old + new=old + if old in intermediate: + bank[old].remove(r) + if new in intermediate: + bank[new].add(r) + chart[r]=new + for c in sorted({v for v in (old,new) if v in intermediate}): + save(t+1,c) + visited=t+1 + complete=visited==len(word["program"]) + if complete: + assert chart==word["final"]+[None]*word["owned_fields"] + def score(r): + return (bool(r["owned"]),len(r["pivots"])<2,len(r["public"])-len(r["pivots"]), + len(r["public"]),r["key"]) + selected=[] + bank_shapes=set() + selected_clocks=set() + if complete: + for row in sorted(rows,key=score): + shape=row["key"][1],tuple(row["public"]),tuple(row["owned"]) + if shape in bank_shapes or row['key'][0] in selected_clocks: + continue + bank_shapes.add(shape) + selected_clocks.add(row['key'][0]) + selected.append(row) + if len(selected)==16: + break + assert len({tuple(row["key"]) for row in rows})==len(rows) + picked={tuple(r["key"]) for r in selected} + print(json.dumps(dict(head=price["head"],word_sha256=WORD,price_sha256=PRICE,visited_events=visited, + status="EXHAUSTED" if complete else "CAPPED",ranks=[4],bank_cap=16, + eligible_bank_count=len(rows),eligible_chart_count=len({r["key"][1] for r in rows}), + selected=selected,unvisited_keys=[r["key"] for r in rows if tuple(r["key"]) not in picked], + all_representative_keys=[r["key"] for r in rows],scope="Representatives after each chart incident event; grouping for selection only."), + indent=2,sort_keys=True)) + + +if __name__=="__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/prefix.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/prefix.py new file mode 100644 index 0000000000..ecd90a7378 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/prefix.py @@ -0,0 +1,49 @@ +"""Test the frozen sixteen rank-eight-cohort banks by exact exterior minors.""" +from collections import Counter +from gzip import decompress +from hashlib import sha256 +import json +from pathlib import Path +from runpy import run_path +import sys +from time import monotonic + +PINS = { + "price/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "lead/GEOMETRY.json": "c6f9f018df8b58fcdf4f44356bd59bcac6d411b7845104ff4ad372ed4a95cfbd", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "inputs/exterior_minor.py": "b25fef5432d8ea9cff9eecc422cf07ccf7473568084de3e8d3d1b5224793504d", +} + + +def main(): + assert __debug__ + deadline = monotonic() + 22 + root = Path(sys.argv[1]) + raw = {} + for name, digest in PINS.items(): + raw[name] = (root/name).read_bytes() + if sha256(raw[name]).hexdigest() != digest: + raise ValueError(f"changed dependency: {name}") + engine = run_path(str(root/"inputs/exterior_minor.py")) + unique = engine["unique"] + price = json.loads(raw["price/PRICE.json"], object_pairs_hook=unique) + geometry = json.loads(raw["lead/GEOMETRY.json"], object_pairs_hook=unique) + word = json.loads(decompress(raw["inputs/7334-WORD.json.gz"]), object_pairs_hook=unique) + assert geometry["head"] == price["head"] == engine["HEAD"] + assert geometry["status"] == "EXHAUSTED" and geometry["eligible_bank_count"] == 326 + assert len(geometry["selected"]) == 16 and len(price["cohort"]) == 15 + selected = {tuple(row["key"]): row for row in geometry["selected"]} + controls = engine["controls"]() + result, events = engine["sweep"](word, list(selected), set(price["cohort"]), deadline) + assert all(all(row[k] == selected[key][k] for k in ("key","public","owned","pivots")) + for key,row in result.items()) + rows = [result[k] for k in selected if k in result] + print(json.dumps({"head":price["head"],"pins":PINS,"event_count":events,"case_cap":16,"runner_seconds":25, + "controls":controls,"rows":rows,"counts":Counter(row["disposition"] for row in rows), + "unvisited":[list(k) for k in selected if k not in result], + "unselected":geometry["unvisited_keys"]},indent=2,sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/select.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/select.py new file mode 100644 index 0000000000..4e8102db18 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/select.py @@ -0,0 +1,14 @@ +"""Freeze the first four suffix drops in the original rank-eight bank order.""" +from hashlib import sha256 +import json +from pathlib import Path +import sys + +root = Path(sys.argv[1]) +raw = (root/"lead/SUFFIX.json").read_bytes() +assert sha256(raw).hexdigest()=="77d78eb692bf6d3f0433730b48dbf8a0178c3288eeca961f94b2aaa6683eb59a" +s = json.loads(raw) +assert not s["unvisited"] and s["counts"]=={"excluded":1,"rank drop":6} +drops=[r for r in s["rows"] if r["disposition"]=="rank drop"] +print(json.dumps({"selected":drops[:4],"unselected":[r["key"] for r in drops[4:]]+s["unselected"], + "case_cap":4,"seconds_cap":35},indent=2,sort_keys=True)) diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/suffix.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/suffix.py new file mode 100644 index 0000000000..8b02139632 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r96/suffix.py @@ -0,0 +1,68 @@ +"""Check the seven frozen prefix drops in the rank-eight cohort.""" +from collections import Counter +from gzip import decompress +from hashlib import sha256 +import json +from pathlib import Path +from runpy import run_path +import sys +from time import monotonic + +PINS = { + "lead/RESULT.json": "45b6c8992dcff04b7252dfec809fc64812b86f094531ed3964ff967408057ed2", + "price/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "inputs/exterior_minor.py": "b25fef5432d8ea9cff9eecc422cf07ccf7473568084de3e8d3d1b5224793504d", + "inputs/reverse_engine.py": "751d5d0c4c665c8768ff69bcf939700d3be2f989c59f09af3a4aa14d3c1ebbc4", +} + + +def main(): + assert __debug__ + deadline = monotonic() + 20 + root = Path(sys.argv[1]) + raw = {} + for name, digest in PINS.items(): + raw[name] = (root/name).read_bytes() + if sha256(raw[name]).hexdigest() != digest: + raise ValueError(f"changed dependency: {name}") + engine = run_path(str(root/"inputs/exterior_minor.py")) + reverse = run_path(str(root/"inputs/reverse_engine.py")) + unique, scalar, plus, prime, minor = (engine[k] for k in ("unique","scalar","plus","P","exterior_minor")) + price = json.loads(raw["price/PRICE.json"],object_pairs_hook=unique) + prefix = json.loads(raw["lead/RESULT.json"],object_pairs_hook=unique) + word = json.loads(decompress(raw["inputs/7334-WORD.json.gz"]),object_pairs_hook=unique) + assert prefix["head"] == price["head"] == engine["HEAD"] + assert prefix["counts"] == {"excluded":9,"rank drop":7} and not prefix["unvisited"] + requests = {row["key"][0]: row for row in prefix["rows"] if row["disposition"] == "rank drop"} + assert len(requests)==7 + controls = reverse["controls"](engine) + public = word["public"] + active = word["final"] + [None] * word["owned_fields"] + columns = [{i:1} for i in range(public)] + [None]*word["owned_fields"] + cohort = set(price["cohort"]) + results = {} + tape = word["program"] + for cut in range(len(tape),-1,-1): + if (cut % 128 == 0 or cut in requests) and monotonic() >= deadline: + break + if cut in requests: + row = requests[cut] + c = row["key"][1] + bank = [i for i in range(public) if active[i] == c] + owners = [i for i in range(public,len(active)) if active[i] == c] + assert bank == row["public"] and owners == row["owned"] + result = minor(bank,columns,cohort) + results[cut] = {k: row[k] for k in ("key","public","owned","pivots")} | result + if cut: + reverse["reverse_event"](tape[cut-1],active,columns,public,scalar,plus,prime) + if cut == 0: + assert active == word["initial"]+[None]*word["owned_fields"] + rows = [results[t] for t in requests if t in results] + print(json.dumps({"head":price["head"],"pins":PINS,"controls":controls,"rows":rows, + "counts":Counter(r["disposition"] for r in rows),"unvisited":[requests[t]["key"] for t in requests if t not in results], + "unselected":prefix["unselected"]},indent=2,sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/freeze.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/freeze.py new file mode 100644 index 0000000000..30f34da614 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/freeze.py @@ -0,0 +1,29 @@ +from hashlib import sha256 +from pathlib import Path +import json +root=Path('.') +lead=root/'lead' +one=json.loads((lead/'CONTINUATION.json').read_bytes()) +two=json.loads((root/'modular/RESULT.json').read_bytes()) +old=json.loads((root/'input/lead/SUFFIX.json').read_bytes()) +assert [(r['key'],r['status']) for r in one['rows']]==[(r['key'],r['status']) for r in two['results']] +for a,b in zip(one['rows'],two['results'],strict=True): + for part in ('prefix','suffix'): + if a[part] is not None: + assert all(a[part][f]==b[part]['bank'][f] for f in ('public','owned','pivots')) +known=[(41740,242),(45266,242)] +new=[(40243,242),(45675,1091)] +by_key={tuple(r['key']): r for r in old['rows']} +by_key.update({tuple(r['key']): r['prefix'] for r in one['rows'] if r['status']=='dual_drop'}) +selected=[{k:by_key[key][k] for k in ('key','public','owned','pivots')} for key in known+new] +all_open=set(known+[tuple(r['key']) for r in one['rows'] if r['status']=='dual_drop']) +out={'selected':selected,'unselected':sorted(all_open-set(known+new)), + 'basis':'Inherited first two. Added smallest/earliest chart-242 bank and first of distinct chart-1091 owned-coexistence banks, after two independent primes agreed.', + 'inputs':{name:sha256((root/name).read_bytes()).hexdigest() for name in ('lead/CONTINUATION.json','modular/RESULT.json','input/lead/SUFFIX.json')}} +data=(json.dumps(out,indent=2,sort_keys=True)+'\n').encode() +(lead/'SELECTION.json').write_bytes(data) +source=(root/'input/lead/exact_four.py').read_text() +source=source.replace('"lead/SELECTION.json": "b95765ffa0bd426b3dae781aaafc1c21e3b25bcebc71b71a3871824f9009fd5f"',f'"../lead/SELECTION.json": "{sha256(data).hexdigest()}"') +source=source.replace('raw["lead/SELECTION.json"]','raw["../lead/SELECTION.json"]') +(lead/'exact_four.py').write_text(source) +print(sha256(data).hexdigest()) diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/modular_compare.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/modular_compare.py new file mode 100644 index 0000000000..8963dabfd0 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/modular_compare.py @@ -0,0 +1,56 @@ +"""Reconcile all R97 frozen bank labels, modular ranks and dispositions.""" +from collections import Counter +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path +import sys + +PINS = { + "modular/RESULT.json": "6710e8711907a0c8412660696cf821e69fdc42bebf7fc24689fc3385fe7aabf3", + "lead/CONTINUATION.json": "1f1b1db497436811c3d18219a2277fff6fedc8ad19b7e3c4a486fdfc53c7907a", +} + + +def unique(items): + value = dict(items) + if len(value) != len(items): + raise ValueError("duplicate JSON key") + return value + + +def main(root): + documents = {} + for path, digest in PINS.items(): + raw = (root / path).read_bytes() + if sha256(raw).hexdigest() != digest: + raise ValueError(f"changed receipt: {path}") + documents[path] = loads(raw, object_pairs_hook=unique) + independent, lead = (documents[k] for k in PINS) + assert independent["head"] == lead["head"] + assert independent["complete"] and independent["modulus"] == 65537 + assert independent["previously_frozen_exact_keys"] == lead["existing_exact_pending"] + assert independent["cap_cases"] == lead["case_cap"] == 310 + assert independent["cap_seconds"] == lead["runner_seconds"] == 25 + assert independent["prefix_progress"]["events"] == lead["visited_prefix_events"] == 76466 + assert independent["suffix_progress"]["events"] == lead["visited_suffix_events"] == 76466 + out = [] + for a,b in zip(independent["results"], lead["rows"], strict=True): + assert a["key"] == b["key"] and a["status"] == b["status"] + bank = a["prefix"]["bank"] + assert all(v == b["prefix"][k] for k,v in bank.items()) + assert a["prefix"]["rank"] == b["prefix"]["exterior_rank"] + assert bool(a["suffix"]) == bool(b["suffix"]) + if a["suffix"]: + assert a["suffix"]["rank"] == b["suffix"]["suffix_rank_mod_65521"] + assert all(v == b["suffix"][k] for k,v in bank.items()) + out.append({"key":a["key"], "bank":bank, "status":a["status"], + "prefix_rank":a["prefix"]["rank"], + "suffix_rank":a["suffix"]["rank"] if a["suffix"] else None}) + assert len(out) == len({tuple(r["key"]) for r in out}) == 310 + print(dumps(dict(head=lead["head"], input_sha256=PINS, moduli=[65521,65537], + counts=Counter(r["status"] for r in out), rows=out, matched=310), indent=2, sort_keys=True)) + + +if __name__ == "__main__": + assert __debug__ + main(Path(sys.argv[1])) diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/second_prime.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/second_prime.py new file mode 100644 index 0000000000..0be5407fe6 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/r97/second_prime.py @@ -0,0 +1,339 @@ +"""Independently verify R97's 310 frozen R96 bank keys modulo 65537.""" + +from argparse import ArgumentParser +from collections import Counter, defaultdict +from fractions import Fraction +from functools import cache +from gzip import decompress +from hashlib import sha256 +from json import dumps, loads +from math import isqrt +from pathlib import Path +from signal import SIGALRM, alarm, signal +from time import monotonic +import sys + +ROOT = Path(__file__).resolve().parent +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +CALLER = "07a76c5e2738882c0cb322278e56f6cae3c9885d" +WORD = "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a" +PAYLOAD = "9aa8d6b054ba7eb2289d052c1079b16be518d2f0fbfb244569fa18e3733acdac" +PINS = { + "inputs/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "inputs/GEOMETRY.json": "c6f9f018df8b58fcdf4f44356bd59bcac6d411b7845104ff4ad372ed4a95cfbd", + "inputs/REMAINING.json": "3597499663a57702856945e91214a65e1d0f94db8643b93c0234c2bbf9291b1a", + "inputs/7334-WORD.json.gz": WORD, +} +PRIME = 65537 +CASES = 310 +SECONDS = 25 +EVENTS = 76466 + + +def unique(items): + data = dict(items) + if len(items) != len(data): + raise ValueError("duplicate JSON key") + return data + + +def authenticate(root): + raw = {} + for rel, expected in PINS.items(): + data = (root / rel).read_bytes() + if sha256(data).hexdigest() != expected: + raise ValueError(f"changed dependency: {rel}") + raw[rel] = data + return raw + + +@cache +def coefficient(value): + q = Fraction(value) + if not q or q.denominator % PRIME == 0: + raise ValueError("zero scalar or denominator divisible by modulus") + return q.numerator * pow(q.denominator, -1, PRIME) % PRIME, q.denominator + + +def axpy(target, source, scale): + if scale: + for role, old in source.items(): + current = (target.get(role, 0) + scale * old) % PRIME + if current: + target[role] = current + else: + target.pop(role, None) + + +def scaled(vector, scale): + return {i: y for i, x in vector.items() if (y := x * scale % PRIME)} + + +def verify_minor(vectors, columns): + """Independently recompute a minor on the original projected rows.""" + matrix = [[row.get(c, 0) for c in columns] for row in vectors] + determinant = 1 + for c in range(len(matrix)): + pivot = next((r for r in range(c, len(matrix)) if matrix[r][c]), None) + if pivot is None: + return 0 + if pivot != c: + matrix[c], matrix[pivot] = matrix[pivot], matrix[c] + determinant = -determinant + diag = matrix[c][c] + determinant = determinant * diag % PRIME + inverse = pow(diag, -1, PRIME) + for r in range(c + 1, len(matrix)): + factor = matrix[r][c] * inverse % PRIME + if factor: + for k in range(c + 1, len(matrix)): + matrix[r][k] = (matrix[r][k] - factor * matrix[c][k]) % PRIME + matrix[r][c] = 0 + return determinant % PRIME + + +def classify(bank, vectors, cohort): + full_rows = [vectors[r] for r in bank] + exterior = [{i: x for i, x in row.items() if i not in cohort} for row in full_rows] + basis, kernel = [], [] + determinant = 1 + for index, vector in enumerate(exterior): + work = vector.copy() + combination = {index: 1} + for col, known, combo in basis: + factor = -work.get(col, 0) + axpy(work, known, factor) + axpy(combination, combo, factor) + if not work: + image = {} + for i, factor in combination.items(): + axpy(image, full_rows[i], factor) + assert image.keys() <= cohort + kernel.append(dict(cut={bank[i]: x for i, x in combination.items()}, endpoint=image)) + continue + col = max(work) + pivot = work[col] + determinant = determinant * pivot % PRIME + inverse = pow(pivot, -1, PRIME) + basis.append((col, scaled(work, inverse), scaled(combination, inverse))) + rank = len(basis) + assert rank + len(kernel) == len(bank) + columns = [col for col, _, _ in basis] + if kernel: + return dict(rank=rank, kernel=kernel, minor_axes=None, determinant=None) + assert columns and verify_minor(exterior, columns) == determinant != 0 + return dict(rank=rank, kernel=[], minor_axes=columns, determinant=determinant) + + +def apply(event, state, vectors, fresh, n, denominators, backward): + op, r, *args = event + current = state[r] + if op == "MOVE": + old, new, owned = args + assert owned == (r >= n) + assert current == (new if backward else old) + state[r] = old if backward else new + fresh.discard(r) + return + if op in ("INIT", "CLEAR"): + assert r >= n + c, = args + entering = (op == "CLEAR") if backward else (op == "INIT") + if entering: + assert current is None and vectors[r] is None + state[r], vectors[r] = c, {} + if not backward: + fresh.add(r) + else: + assert current == c and vectors[r] is not None + state[r] = vectors[r] = None + fresh.discard(r) + return + assert op in ("SCALE", "ADD", "COPY") and current == args[-1] and vectors[r] is not None + factor, denominator = coefficient(args[-2]) + denominators.add(denominator) + if op == "SCALE": + vectors[r] = scaled(vectors[r], factor) + else: + src = args[0] + assert src != r and state[src] == current and vectors[src] is not None + if backward: + axpy(vectors[src], vectors[r], factor) + if op == "COPY": + assert r >= n + vectors[r] = {} + elif op == "COPY": + assert r >= n and r in fresh and not vectors[r] + vectors[r] = scaled(vectors[src], factor) + else: + axpy(vectors[r], vectors[src], factor) + fresh.discard(r) + + +def controls(): + assert all(PRIME % i for i in range(2, isqrt(PRIME) + 1)) + witness = classify([0, 1], [{3: 2, 8: 1}, {3: 3, 8: 4}], set()) + assert witness["minor_axes"] == [8, 3] and witness["determinant"] == PRIME - 5 + dropped = classify([0, 1], [{0: 1, 8: 1}, {1: 1, 8: 1}], {0, 1}) + assert dropped["kernel"] == [dict(cut={0: PRIME - 1, 1: 1}, endpoint={0: PRIME - 1, 1: 1})] + tape = [("ADD", 1, 0, "-3/2", 4), ("SCALE", 0, "2", 4), ("INIT", 2, 4), + ("COPY", 2, 1, "1", 4), ("ADD", 0, 2, "5", 4), ("CLEAR", 2, 4)] + result = [] + for backward in (False, True): + state, vectors, fresh, denoms = [4, 4, None], [{0: 1}, {1: 1}, None], set(), set() + for event in reversed(tape) if backward else tape: + apply(event, state, vectors, fresh, 2, denoms, backward) + assert state == [4, 4, None] and not fresh and denoms == {1, 2} + result.append(vectors) + assert result[0] == [{0: coefficient("-11/2")[0], 1: 5}, {0: coefficient("-3/2")[0], 1: 1}, None] + assert result[1] == [{0: coefficient("-11/2")[0], 1: coefficient("-3/2")[0]}, {0: 5, 1: 1}, None] + try: + coefficient("1/65537") + except ValueError: + pass + else: + raise AssertionError("nonunit denominator admitted") + return ["prime and signed nonzero minor", "planted pure kernel", "owned COPY forward and adjoint", + "nonunit denominator rejection"] + + +def span(frame): + vectors = {0} + for v in frame: + assert v not in vectors + vectors |= {v ^ w for w in vectors} + return vectors + + +def sweep(word, keys, cohort, deadline, result, progress, backward, previous=None): + tape, n, owned = (word[k] for k in ("program", "public", "owned_fields")) + assert (len(tape), n, owned) == (EVENTS, 1501, 68) + origin, target = ("final", "initial") if backward else ("initial", "final") + state = word[origin] + [None] * owned + vectors = [{r: 1} for r in range(n)] + [None] * owned + fresh, denoms = set(), set() + request = defaultdict(list) + frames = word["frames"] + low, high = span(frames[3]), span(frames[245]) + for cut, chart in keys: + assert 0 <= cut <= EVENTS and len(frames[chart]) == 4 and low < span(frames[chart]) < high + request[cut].append(chart) + boundaries = range(EVENTS, -1, -1) if backward else range(EVENTS + 1) + progress.update(events=0, first_unvisited_cut=boundaries.start, denominator_units=[]) + for cut in boundaries: + progress["first_unvisited_cut"] = cut + if (cut % 128 == 0 or cut in request) and monotonic() >= deadline: + break + for chart in request.get(cut, []): + key = (cut, chart) + public_bank = [r for r in range(n) if state[r] == chart] + owned_bank = [r for r in range(n, n + owned) if state[r] == chart] + pivots = sorted(set(public_bank) & cohort) + assert public_bank and pivots + if cut: + event = tape[cut - 1] + assert chart in (event[2:4] if event[0] == "MOVE" else event[-1:]) + bank = dict(public=public_bank, owned=owned_bank, pivots=pivots) + if previous is not None: + assert bank == previous[key]["bank"] + result[key] = dict(bank=bank, **classify(public_bank, vectors, cohort)) + if cut == (0 if backward else EVENTS): + assert state == word[target] + [None] * owned and not fresh + assert set(result) == set(keys) + progress["first_unvisited_cut"] = None + break + apply(tape[cut - 1 if backward else cut], state, vectors, fresh, n, denoms, backward) + progress["events"] += 1 + progress["denominator_units"] = sorted(denoms) + + +def pairing(prefix, suffix): + def dot(left, right): + return sum(v * right.get(i, 0) for i, v in left.items()) % PRIME + + return [[dict(cut=dot(a["cut"], b["cut"]), endpoint=dot(a["endpoint"], b["endpoint"])) + for b in suffix["kernel"]] for a in prefix["kernel"]] + + +def main(): + parser = ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, default=ROOT) + parser.add_argument("--controls-only", action="store_true") + args = parser.parse_args() + assert __debug__ and sys.version_info[:2] == (3, 12) + checks = controls() + if args.controls_only: + print(dumps(checks)) + return + + def stop(*_): + raise TimeoutError("hard 25-second cap") + + start = monotonic() + signal(SIGALRM, stop) + alarm(SECONDS) + timeout = None + keys, prior, prefix, suffix = [], [], {}, {} + prefix_progress, suffix_progress = {}, {} + try: + raw = authenticate(args.root) + price, geom, remaining = [loads(raw[f"inputs/{name}.json"], object_pairs_hook=unique) + for name in ("PRICE", "GEOMETRY", "REMAINING")] + assert price["head"] == geom["head"] == remaining["head"] == HEAD and price["caller"] == CALLER + assert price["word_sha256"] == geom["word_sha256"] == WORD + assert geom["price_sha256"] == PINS["inputs/PRICE.json"] + assert remaining["input_sha256"]["lead/GEOMETRY.json"] == PINS["inputs/GEOMETRY.json"] + assert geom["status"] == "EXHAUSTED" and geom["visited_events"] == EVENTS + keys = list(map(tuple, remaining["unvisited_prefix"])) + prior = remaining["dual_drops_requiring_rational"] + assert len(keys) == len(set(keys)) == remaining["next_modular_cases"] == CASES + assert remaining["next_modular_runner_seconds"] == SECONDS + assert keys == list(map(tuple, geom["unvisited_keys"])) + selected = {tuple(row["key"]) for row in geom["selected"]} + assert len(selected) == 16 and not set(keys) & selected and set(map(tuple, prior)) <= selected + assert set(keys) | selected == set(map(tuple, geom["all_representative_keys"])) + assert prior == [[41740, 242], [45266, 242]] + payload = decompress(raw["inputs/7334-WORD.json.gz"]) + assert sha256(payload).hexdigest() == PAYLOAD + word = loads(payload, object_pairs_hook=unique) + cohort = set(price["cohort"]) + assert len(cohort) == 15 and all((word["initial"][r], word["final"][r]) == (3, 245) for r in cohort) + deadline = start + SECONDS - 2 + sweep(word, keys, cohort, deadline, prefix, prefix_progress, False) + candidates = [key for key in keys if key in prefix and prefix[key]["kernel"]] + if candidates: + sweep(word, candidates, cohort, deadline, suffix, suffix_progress, True, prefix) + else: + suffix_progress.update(events=0, first_unvisited_cut=None, denominator_units=[]) + except TimeoutError as error: + timeout = str(error) + finally: + alarm(0) + + results = [] + for key in keys: + left, right = prefix.get(key), suffix.get(key) + pair = None + if left and not left["kernel"]: + status = "prefix_exclusion" + elif right and not right["kernel"]: + status = "suffix_exclusion" + elif right: + status = "dual_drop" + pair = pairing(left, right) + else: + status = "unvisited" + results.append(dict(key=key, status=status, prefix=left, suffix=right, modular_pairings=pair)) + complete = (timeout is None and prefix_progress.get("first_unvisited_cut", 0) is None + and suffix_progress.get("first_unvisited_cut", 0) is None) + print(dumps(dict(head=HEAD, caller=CALLER, pins=PINS, modulus=PRIME, controls=checks, + cap_cases=CASES, cap_seconds=SECONDS, prefix_progress=prefix_progress, suffix_progress=suffix_progress, + timeout=timeout, complete=complete, results=results, + counts=Counter(row["status"] for row in results), previously_frozen_exact_keys=prior), + indent=2, sort_keys=True)) + if not complete: + raise SystemExit(2) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/exact_six.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/exact_six.py new file mode 100644 index 0000000000..d3807ea5d6 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/exact_six.py @@ -0,0 +1,355 @@ +"""Exact six-bank rational check by dual-direction replay and transposed pairing.""" +from argparse import ArgumentParser +from collections import Counter, defaultdict +from fractions import Fraction as Q +from functools import cache +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path +from runpy import run_path +from signal import SIGALRM, alarm, signal +from time import monotonic + +_mod = run_path(str(Path(__file__).resolve().with_name('rolling_exterior.py'))) +HEAD, PROTECTED, checked, unique = (_mod[k] for k in ('HEAD','PROTECTED','checked','unique')) + +SELECTION = "a4877749084f276d00917c137fda2b2593894daca1e10629a4a27de7914b4574" +MODULAR = "fa35b69613ad4af03eada14f251827464dba0d002f67da085817422ec3351649" +PRIMARY = "a3505dd0cfd3ee9e242f804e12e3c4705ea6548080d537f597cec355f358e92c" + + +def read_extra(path, pin): + raw = path.read_bytes() + assert sha256(raw).hexdigest() == pin, f"Changed input {path.name}" + return loads(raw, object_pairs_hook=unique) + + +@cache +def scalar(value): + return Q(value) + + +def add(dst,src,k): + for j,v in src.items(): + x = dst.get(j,0)+k*v + if x: + dst[j]=x + else: + dst.pop(j,None) + + +def scale(row,k): + return {j:k*v for j,v in row.items() if k*v} + + +def compose(weights, rows): + out={} + for j,value in weights.items(): + add(out,rows[j],value) + return out + + +def dot(a,b): + return sum((v*b.get(j,0) for j,v in a.items()),Q(0)) + + +def stop_at(deadline): + if monotonic() >= deadline: + raise TimeoutError("exact rational continuation cap") + + +def trace(word, selected, deadline): + n=word["public"] + tape=word["program"] + size=n+word["owned_fields"] + requests=defaultdict(list) + offsets=[] + count=0 + for row in selected: + t,_=row["key"] + offsets.append((count,count+len(row["public"]))) + for r in row["public"]: + requests[t].append((r,count)) + count+=1 + + # Prefix rows via backward covectors injected at each pre-event cut. + carry=[{} for _ in range(size)] + for t in range(max(requests),-1,-1): + if t%128==0: + stop_at(deadline) + op,d,*args=tape[t] + if op in ("INIT","CLEAR"): + carry[d]={} + elif op=="SCALE" and carry[d]: + carry[d]=scale(carry[d],scalar(args[0])) + elif op in ("ADD","COPY"): + add(carry[args[0]],carry[d],scalar(args[-2])) + if op=="COPY": + carry[d]={} + for r,j in requests.get(t,()): + add(carry[r],{j:Q(1)},1) + assert not any(carry[n:]) + prefix=[{} for _ in range(count)] + for coordinate,vec in enumerate(carry[:n]): + for j,v in vec.items(): + prefix[j][coordinate]=v + + # Suffix columns via forward impulses injected at each pre-event cut. + carry=[{} for _ in range(size)] + charts=list(word["initial"])+[None]*(size-n) + for t, event in enumerate(tape): + if t%128==0: + stop_at(deadline) + for r,j in requests.get(t,()): + # Any other cotangents in carry refer to earlier, independent cuts. + add(carry[r],{j:Q(1)},1) + op,d,*args=event + if op=="MOVE": + a,b,owned=args + assert charts[d]==a and owned==(d>=n) + charts[d]=b + elif op=="INIT": + assert d>=n and charts[d] is None + carry[d]={} + charts[d]=args[0] + elif op=="CLEAR": + assert d>=n and charts[d]==args[0] + carry[d]={} + charts[d]=None + elif op=="SCALE": + assert charts[d]==args[-1] + if carry[d]: + carry[d]=scale(carry[d],scalar(args[0])) + else: + src= args[0] + assert op in ("ADD","COPY") and charts[d]==charts[src]==args[-1] and d!=src + if op=="COPY": + assert d>=n and not carry[d] + carry[d]={} + add(carry[d],carry[src],scalar(args[-2])) + assert charts==list(word["final"])+[None]*(size-n) and not any(carry[n:]) + suffix=[{} for _ in range(count)] + for coordinate,vec in enumerate(carry[:n]): + for j,v in vec.items(): + suffix[j][coordinate]=v + return [(prefix[a:b],suffix[a:b]) for a,b in offsets] + + +def kernel(equations,width): + """Exact column-variable nullspace by descending-coordinate row reduction.""" + pivots={} + for equation in equations: + row=equation.copy() + while row: + j=max(row) + if j in pivots: + add(row,pivots[j],-row[j]) + else: + pivots[j]=scale(row,1/row[j]) + break + basis=[] + for free in sorted(set(range(width))-pivots.keys()): + vec={free:Q(1)} + for j,row in sorted(pivots.items()): + v=-dot(row,vec) + if v: + vec[j]=v + assert all(dot(row,vec)==0 for row in pivots.values()) + basis.append(vec) + return len(pivots),basis + + +def pure(rows,cohort): + equations=defaultdict(dict) + for j,row in enumerate(rows): + for i,v in row.items(): + if i not in cohort: + equations[i][j]=v + rank,coefficients=kernel(equations.values(),len(rows)) + result=[] + for weights in coefficients: + image=compose(weights,rows) + assert image.keys()<=cohort + result.append((weights,image)) + return rank,result + + +def pair(prefix,suffix,deadline): + """Use transposed bilinear maps and their explicit wedge coefficients.""" + B,D=[],[] + for b,d in suffix: + bv,dv={},{} + for i,(a,c) in enumerate(prefix): + if value:=dot(c,d): + bv[i]=value + if value:=dot(a,b)-bv.get(i,0): + dv[i]=value + B.append(bv) + D.append(dv) + + def columns(y): + return compose(y,B),compose(y,D) + + def solve(y): + u,v=columns(y) + if not u: + return None + if not v: + i=min(u) + return {i:1/u[i]},y + j=min(v) + for i in sorted(u.keys()|v.keys()): + den=u.get(i,0)*v[j]-u.get(j,0)*v.get(i,0) + if den: + return {i:v[j]/den,j:-v.get(i,0)/den},y + return None + + def wedge(u,v): + coords=sorted(u.keys()|v.keys()) + return {(i,j):x for k,i in enumerate(coords) for j in coords[k+1:] + if (x:=u.get(i,0)*v.get(j,0)-u.get(j,0)*v.get(i,0))} + + hit=None + for j,(u,v) in enumerate(zip(B,D,strict=True)): + stop_at(deadline) + if wedge(u,v): + hit=solve({j:Q(1)}) + assert hit + break + if hit is None: + for j,u in enumerate(B): + stop_at(deadline) + for k in range(j+1,len(B)): + mixed=wedge(u,D[k]) + add(mixed,wedge(B[k],D[j]),1) + if mixed: + hit=solve({j:Q(1),k:Q(1)}) + assert hit + break + if hit is not None: + break + if hit is None: + equations=[{j:D[j][i] for j in range(len(D)) if i in D[j]} for i in range(len(prefix))] + _,right_null=kernel(equations,len(D)) + for y in right_null: + stop_at(deadline) + hit=solve(y) + if hit is not None: + break + if hit is None: + return None + x,y=hit + a,c=(compose(x,[p[i] for p in prefix]) for i in (0,1)) + b,d=(compose(y,[p[i] for p in suffix]) for i in (0,1)) + assert dot(a,b)==dot(c,d)==1 + return {k:{j:v for j,v in row.items() if v} for k,row in zip("abcd",(a,b,c,d))} + + +def smooth(v): + v=abs(v) + assert v + for p in (2,3,5): + while v%p==0: + v//=p + return v==1 + + +def physical_screen(witness,pivots): + # This is only a coefficient and reciprocal preflight. + def pivots_for(row, allowed): + return [j for j,v in sorted(row.items()) if j in allowed and smooth(v.numerator) and smooth(v.denominator)] + return { + "cut_unit_pivots":pivots_for(witness["a"],set(pivots)), + "boundary_unit_pivots":pivots_for(witness["c"],set(witness["c"])), + "all_denominators_in_Z_1_over_30":all(smooth(v.denominator) for row in witness.values() for v in row.values()), + "physical_route_price_tape_unverified":True, + } + + +def checks(): + inf=float("inf") + pref=[({0:Q(1)},{10:Q(2)})] + suf=[({0:Q(1)},{10:Q(1,2)})] + assert pair(pref,suf,inf) + assert pair(pref,[({0:Q(1)},{10:Q(1)})],inf) is None + # Both single suffix basis directions fail, but their mixed wedge works. + pref=[({0:Q(1)},{10:Q(1)}),({1:Q(1)},{11:Q(1)})] + suf=[({0:Q(2)},{10:Q(1)}),({1:Q(3)},{11:Q(1)})] + assert pair(pref,suf,inf) + assert kernel([{1:Q(1),0:Q(2)},{1:Q(2),0:Q(4)}],2)[1] == [{0:Q(1),1:Q(-2)}] + return ["signed_unit","unequal_pairing_rejected","mixed_wedge","dependent_kernel"] + + +def main(): + parser=ArgumentParser(description=__doc__) + for name in ("word","price","selection","modular"): + parser.add_argument("--"+name,type=Path) + parser.add_argument("--controls-only",action="store_true") + a=parser.parse_args() + if not __debug__: + raise RuntimeError("Run with assertions") + if a.controls_only: + print(dumps(checks())) + return + if not all((a.word,a.price,a.selection,a.modular)): + parser.error("All four pinned input paths required") + selected, results=[],[] + diagnostics=[] + timeout=None + + def stop(*_): + raise TimeoutError("hard exact 35-second cap") + + signal(SIGALRM,stop) + alarm(35) + deadline=monotonic()+33 + try: + diagnostics=checks() + price=checked(a.price,"price") + selection=read_extra(a.selection,SELECTION) + mod=read_extra(a.modular,MODULAR) + assert selection["modular_sha256"]==PRIMARY and selection["exact_cap"]==6 and selection["exact_seconds_cap"]==35 + selected=selection["selected"] + assert len(selected)==len({tuple(x["key"]) for x in selected})==6 + modular={tuple(row["key"]):row for row in mod["tested"]} + for row in selected: + other=modular[tuple(row["key"])] + assert all(row[k]==other[k] for k in ("key","public","owned","pivots")) + assert row["exterior_rank"]==other["modular_rank"] and other["status"]=="modular_rank_drop" + assert not row["owned"] and len(row["pivots"])>=2 + word=checked(a.word,"word") + n=word["public"] + main_roles=set(word["live"])|{r+112 for r in word["live"]}|set(word["hosted"]["X2"])|set(word["hosted"]["Y2"]) + cohort={r for r,(a,z) in enumerate(zip(word["initial"],word["final"],strict=True)) + if (a,z)==(3,127) and r not in main_roles|PROTECTED} + assert len(cohort)==615 and cohort==set(price["endpoint_cohort"]) + all_rows=trace(word,selected,deadline) + for bank,(P,S) in zip(selected,all_rows,strict=True): + stop_at(deadline) + pr,prefix=pure(P,cohort) + sr,suffix=pure(S,cohort) + assert pr>=bank["exterior_rank"] + answer=pair(prefix,suffix,deadline) + entry=dict(key=bank["key"],bank=bank["public"],prefix_exterior_rank=pr,suffix_exterior_rank=sr, + prefix_nullity=len(prefix),suffix_nullity=len(suffix),modular_rank=bank["exterior_rank"], + status="exact_unit_pair" if answer else "no_exact_unit_pair") + if answer: + for name in ("a","b"): + answer[name]={bank["public"][j]:v for j,v in answer[name].items()} + entry["materialization_preflight"]=physical_screen(answer,bank["pivots"]) + entry["witness"]={name:{j:str(v) for j,v in w.items()} for name,w in answer.items()} + results.append(entry) + except TimeoutError as exc: + timeout=str(exc) + finally: + alarm(0) + print(dumps(dict(head=HEAD,selection_sha256=SELECTION,independent_modular_sha256=MODULAR, + case_cap=6,runner_cap_seconds=35,controls=diagnostics,results=results, + unresolved=[r["key"] for r in selected[len(results):]],modular_drops_outside_exact_scope=2128, + status_counts=dict(Counter(row["status"] for row in results)),timeout=timeout),indent=2,sort_keys=True)) + if timeout: + raise SystemExit(2) + + +if __name__=="__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_compare.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_compare.py new file mode 100644 index 0000000000..cbc29dfea5 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_compare.py @@ -0,0 +1,55 @@ +"""Authenticate and compare the primary and independent R96 exact dispositions.""" +from argparse import ArgumentParser +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path + +PINS = { + "primary": "362a879401158678c8a30ea0dbd4f919a9a0e907db2d2247ce96ac8724f68b14", + "independent": "69c694a17e562a6e6534406e252428ca081f8e2ac6673ec01cf21e77cb468b58", +} + + +def unique(pairs): + result = dict(pairs) + if len(result) != len(pairs): + raise ValueError("Duplicate JSON key") + return result + + +def main(): + assert __debug__ + parser = ArgumentParser(description=__doc__) + for name in PINS: + parser.add_argument("--" + name, type=Path, required=True) + args = parser.parse_args() + data = {} + for name, expected in PINS.items(): + raw = getattr(args, name).read_bytes() + if sha256(raw).hexdigest() != expected: + raise ValueError(f"Changed receipt {name}") + data[name] = loads(raw, object_pairs_hook=unique) + primary, independent = data["primary"], data["independent"] + assert primary["head"] == independent["head"] + assert primary["selected_unresolved"] == independent["selected_unvisited"] == [] + assert len(primary["results"]) == len(independent["results"]) == 4 + rows = [] + for p, i in zip(primary["results"], independent["results"], strict=True): + assert all(p[field] == i[field] for field in ("key", "owned", "public", "pivots")) + assert p["status"] == "no unit pairing" and i["status"] == "no_exact_unit_pair" + assert p["pure_prefix_dimension"] == i["prefix_nullity"] == 1 + assert p["pure_suffix_dimension"] == i["suffix_nullity"] == 1 + assert p["nonzero_prefix_images"] == i["nonzero_prefix_basis_images"] == 1 + assert p["nonzero_suffix_images"] == i["nonzero_suffix_basis_images"] == 1 + rows.append(dict(key=p["key"], prefix_rank=i["prefix_rank"], suffix_rank=i["suffix_rank"], + prefix_nonzero_dimension=1, suffix_nonzero_dimension=1, + exact_unit_pair=False)) + assert len(primary["unselected"]) == independent["modular_dual_drops_outside_exact_scope"] + ( + independent["unvisited_modular_representatives"]) == 312 + print(dumps(dict(head=primary["head"], receipt_sha256=PINS, agree=True, + results=rows, outside_exact_scope=primary["unselected"]), + indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_independent.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_independent.py new file mode 100644 index 0000000000..51d2306200 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_independent.py @@ -0,0 +1,158 @@ +"""Check four frozen R96 banks using independent exact dual-direction replay.""" +from argparse import ArgumentParser +from collections import Counter +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path +from runpy import run_path +from signal import SIGALRM, alarm, signal +from time import monotonic + +ROOT = Path(__file__).resolve().parent +PINS = { + "inputs/GEOMETRY.json": "c6f9f018df8b58fcdf4f44356bd59bcac6d411b7845104ff4ad372ed4a95cfbd", + "inputs/SELECTION.json": "b95765ffa0bd426b3dae781aaafc1c21e3b25bcebc71b71a3871824f9009fd5f", + "inputs/SUFFIX.json": "77d78eb692bf6d3f0433730b48dbf8a0178c3288eeca961f94b2aaa6683eb59a", + "inputs/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "reused/exact_six.py": "5bffcbbbdc5b0622e29fbc778540cc240b41e7d252e3e5c68d708d48808fcb5a", + "reused/rolling_exterior.py": "ffc6dfa01554974f2b913b65c39230d3a7f7b6c06da1c940617b7938afe2b9c7", +} +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +KEYS = [[45269, 242], [45276, 242], [45434, 242], [40242, 242]] +CAP = 4 +SECONDS = 35 +FIELDS = ("key", "owned", "pivots", "public") + + +def pinned(path, rel): + data = path.read_bytes() + if sha256(data).hexdigest() != PINS[rel]: + raise ValueError(f"Changed input {rel}") + return data + + +def selected_banks(selection, geometry, suffix, price): + assert selection["case_cap"] == price["exact_cap"] == CAP + assert selection["seconds_cap"] == price["exact_runner_seconds"] == SECONDS + assert geometry["head"] == suffix["head"] == price["head"] == HEAD + assert geometry["price_sha256"] == PINS["inputs/PRICE.json"] + assert geometry["word_sha256"] == price["word_sha256"] == PINS["inputs/7334-WORD.json.gz"] + assert geometry["eligible_bank_count"] == 326 and geometry["eligible_chart_count"] == 3 + assert not suffix["unvisited"] + geo = {tuple(row["key"]): row for row in geometry["selected"]} + mod = {tuple(row["key"]): row for row in suffix["rows"] if row["disposition"] == "rank drop"} + assert len(geo) == 16 and len(mod) == 6 + selected = selection["selected"] + assert [row["key"] for row in selected] == KEYS + assert len(selection["unselected"]) == len({tuple(k) for k in selection["unselected"]}) == 312 + assert set(mod) - {tuple(k) for k in KEYS} == {(41740, 242), (45266, 242)} + assert {tuple(k) for k in selection["unselected"]} == ( + {tuple(k) for k in geometry["unvisited_keys"]} | {(41740, 242), (45266, 242)}) + for row in selected: + key = tuple(row["key"]) + assert row["disposition"] == "rank drop" and not row["owned"] and row["pivots"] + assert all(row[k] == geo[key][k] == mod[key][k] for k in FIELDS) + return selected, mod + + +def validate_cuts(word, rows, cohort): + requests = {r["key"][0]: r for r in rows} + n = word["public"] + chart = word["initial"] + [None] * word["owned_fields"] + assert len(word["program"]) == 76466 and len(requests) == CAP + for t, (op, role, *args) in enumerate(word["program"]): + if t in requests: + row = requests.pop(t) + label = row["key"][1] + live = [i for i, loc in enumerate(chart) if loc == label] + assert row["public"] == [i for i in live if i < n] + assert row["owned"] == [i for i in live if i >= n] == [] + assert row["pivots"] == sorted(cohort.intersection(live)) + if op == "MOVE": + chart[role] = args[1] + elif op == "INIT": + chart[role] = args[0] + elif op == "CLEAR": + chart[role] = None + assert not requests and chart == word["final"] + [None] * word["owned_fields"] + + +def main(): + parser = ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, default=ROOT) + parser.add_argument("--controls-only", action="store_true") + args = parser.parse_args() + assert __debug__ + for rel in ("reused/exact_six.py", "reused/rolling_exterior.py"): + pinned(ROOT / rel, rel) + engine = run_path(str(ROOT / "reused/exact_six.py")) + checks = engine["checks"]() + if args.controls_only: + print(dumps(checks)) + return + + def stop(*_): + raise TimeoutError("Hard 35-second exact cap") + + selected, results = [], [] + timeout = None + signal(SIGALRM, stop) + alarm(SECONDS) + deadline = monotonic() + SECONDS - 2 + try: + def read(name): + rel = f"inputs/{name}.json" + return loads(pinned(args.root / rel, rel), object_pairs_hook=engine["unique"]) + + selection, geometry, suffix, price = (read(x) for x in ("SELECTION", "GEOMETRY", "SUFFIX", "PRICE")) + selected, mod = selected_banks(selection, geometry, suffix, price) + word = engine["checked"](args.root / "inputs/7334-WORD.json.gz", "word") + cohort = set(price["cohort"]) + assert len(cohort) == len(price["cohort"]) == 15 + assert all((word["initial"][r], word["final"][r]) == (3, 245) for r in cohort) + validate_cuts(word, selected, cohort) + exact = engine["trace"](word, selected, deadline) + for row, (p, s) in zip(selected, exact, strict=True): + engine["stop_at"](deadline) + pre_rank, pre = engine["pure"](p, cohort) + suf_rank, suf = engine["pure"](s, cohort) + mod_rank = mod[tuple(row["key"])]["exterior_rank"] + assert pre_rank >= row["exterior_rank"] and suf_rank >= mod_rank + a_count = sum(bool(v) for _, v in pre) + b_count = sum(bool(v) for _, v in suf) + pair = engine["pair"](pre, suf, deadline) + status = ("exact_unit_pair" if pair else "no_nonzero_pure_prefix" if not a_count else + "no_nonzero_pure_suffix" if not b_count else "no_exact_unit_pair") + record = {k: row[k] for k in FIELDS} + record.update(prefix_rank=pre_rank, suffix_rank=suf_rank, + prefix_nullity=len(pre), suffix_nullity=len(suf), + nonzero_prefix_basis_images=a_count, nonzero_suffix_basis_images=b_count, + prefix_modular_rank=row["exterior_rank"], suffix_modular_rank=mod_rank, + status=status) + if pair: + assert engine["compose"](pair["a"], p) == pair["c"] + assert engine["compose"](pair["b"], s) == pair["d"] + assert pair["c"].keys() <= cohort and pair["d"].keys() <= cohort + assert engine["dot"](pair["a"], pair["b"]) == engine["dot"](pair["c"], pair["d"]) == 1 + for name in ("a", "b"): + pair[name] = {row["public"][j]: v for j, v in pair[name].items()} + record["physical_coefficient_preflight"] = engine["physical_screen"](pair, row["pivots"]) + record["witness"] = {name: {j: str(v) for j, v in vec.items()} for name, vec in pair.items()} + results.append(record) + except TimeoutError as error: + timeout = str(error) + finally: + alarm(0) + print(dumps(dict(head=HEAD, input_sha256=PINS, exact_case_cap=CAP, runner_seconds_cap=SECONDS, + controls=checks, timeout=timeout, results=results, + selected_unvisited=[row["key"] for row in selected[len(results):]] if selected else KEYS, + counts=dict(Counter(r["status"] for r in results)), + modular_dual_drops_outside_exact_scope=2, unvisited_modular_representatives=310), + indent=2, sort_keys=True)) + if timeout: + raise SystemExit(2) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_pairing_obstruction.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_pairing_obstruction.py new file mode 100644 index 0000000000..96714118a2 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r96_pairing_obstruction.py @@ -0,0 +1,55 @@ +"""Record the exact two scalar pairings on each of four independently traced lines.""" +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path +from runpy import run_path +from signal import SIGALRM, alarm, signal +from time import monotonic + +ROOT = Path(__file__).resolve().parent +SOURCE_SHA = "0bbf9d1ea0957de30dbe9f7afa4a6fb86236b2910127f1af2722cab6b597ab26" + + +def main(): + assert __debug__ + source = ROOT / "exact_four.py" + assert sha256(source.read_bytes()).hexdigest() == SOURCE_SHA + adapter = run_path(str(source)) + for rel in ("reused/exact_six.py", "reused/rolling_exterior.py"): + adapter["pinned"](ROOT / rel, rel) + exact = run_path(str(ROOT / "reused/exact_six.py")) + + def read(name): + rel = f"inputs/{name}.json" + return loads(adapter["pinned"](ROOT / rel, rel), object_pairs_hook=exact["unique"]) + + def stop(*_): + raise TimeoutError("Hard 35-second verification cap") + + signal(SIGALRM, stop) + alarm(35) + deadline = monotonic() + 33 + try: + rows, _ = adapter["selected_banks"](*(read(x) for x in ("SELECTION", "GEOMETRY", "SUFFIX", "PRICE"))) + word = exact["checked"](ROOT / "inputs/7334-WORD.json.gz", "word") + cohort = set(read("PRICE")["cohort"]) + result = [] + for row, (p, s) in zip(rows, exact["trace"](word, rows, deadline), strict=True): + _, pre = exact["pure"](p, cohort) + _, suf = exact["pure"](s, cohort) + assert len(pre) == len(suf) == 1 + (a, c), (b, d) = pre[0], suf[0] + cut, endpoint = exact["dot"](a, b), exact["dot"](c, d) + assert c and d and (cut == 0 or cut != endpoint) + a = {row["public"][i]: v for i, v in a.items()} + b = {row["public"][i]: v for i, v in b.items()} + result.append(dict(key=row["key"], cut_pairing=str(cut), endpoint_pairing=str(endpoint), + generators={name: {i: str(v) for i, v in values.items()} + for name, values in zip("abcd", (a,b,c,d), strict=True)})) + finally: + alarm(0) + print(dumps(dict(adapter_sha256=SOURCE_SHA, results=result), indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r97_independent.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r97_independent.py new file mode 100644 index 0000000000..0b499179ad --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/r97_independent.py @@ -0,0 +1,210 @@ +"""Independently replay the frozen R97 cohort cuts using exact dual-direction traces.""" +from argparse import ArgumentParser +from collections import Counter +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path +from runpy import run_path +from signal import SIGALRM, alarm, signal +from time import monotonic + +ROOT = Path(__file__).resolve().parent +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +KEYS = ((41740, 242), (45266, 242)) +FOLLOWUP_KEYS = ((40243, 242), (45675, 1091)) +FOLLOWUP_SHA = "53f3a3b08bd6e97514e7077e7c0b55c9d272b0527f3a1b0e415f0924514fddf1" +SECONDS = 35 +CASE_CAP = 4 +PINS = { + "inputs/REMAINING.json": "3597499663a57702856945e91214a65e1d0f94db8643b93c0234c2bbf9291b1a", + "inputs/PREFIX.json": "45b6c8992dcff04b7252dfec809fc64812b86f094531ed3964ff967408057ed2", + "inputs/SUFFIX.json": "77d78eb692bf6d3f0433730b48dbf8a0178c3288eeca961f94b2aaa6683eb59a", + "inputs/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "reused/exact_six.py": "5bffcbbbdc5b0622e29fbc778540cc240b41e7d252e3e5c68d708d48808fcb5a", + "reused/rolling_exterior.py": "ffc6dfa01554974f2b913b65c39230d3a7f7b6c06da1c940617b7938afe2b9c7", +} +BANK = ("key", "public", "owned", "pivots") + + +def checked(path, expected): + raw = path.read_bytes() + if sha256(raw).hexdigest() != expected: + raise ValueError(f"Changed input {path.name}") + return raw + + +def index(rows): + out = {tuple(r["key"]): r for r in rows} + assert len(out) == len(rows) + return out + + +def inherited_keys(remaining, prefix, suffix): + assert remaining["head"] == prefix["head"] == suffix["head"] == HEAD + assert remaining["input_sha256"]["lead/RESULT.json"] == PINS["inputs/PREFIX.json"] + assert remaining["input_sha256"]["lead/SUFFIX.json"] == PINS["inputs/SUFFIX.json"] + assert [tuple(k) for k in remaining["dual_drops_requiring_rational"]] == list(KEYS) + assert remaining["next_exact_cases"] == CASE_CAP and remaining["next_exact_runner_seconds"] == SECONDS + assert len(remaining["unvisited_prefix"]) == 310 and remaining["unresolved"] == 312 + p, s = index(prefix["rows"]), index(suffix["rows"]) + out = [] + for key in KEYS: + a, b = p[key], s[key] + assert all(a[k] == b[k] for k in BANK) + assert a["disposition"] == b["disposition"] == "rank drop" and not a["owned"] + out.append({k: a[k] for k in BANK} | dict( + prefix_modular_rank=a["exterior_rank"], suffix_modular_rank=b["exterior_rank"])) + return out + + +def cut_check(word, rows, cohort): + def span(basis): + seen = {0} + for v in basis: + assert v not in seen + seen |= {u ^ v for u in seen} + return seen + + frames = word["frames"] + lo, hi = span(frames[3]), span(frames[245]) + requested = {} + for row in rows: + t, label = row["key"] + assert len(frames[label]) == 4 and lo < span(frames[label]) < hi + requested.setdefault(t, []).append(row) + n = word["public"] + chart = word["initial"] + [None] * word["owned_fields"] + for t, (op, dst, *args) in enumerate(word["program"]): + for row in requested.pop(t, ()): + _, target = row["key"] + live = [r for r, label in enumerate(chart) if label == target] + assert row["public"] == [r for r in live if r < n] + assert row["owned"] == [r for r in live if r >= n] + assert row["pivots"] == sorted(cohort.intersection(live)) and row["pivots"] + if op == "MOVE": + chart[dst] = args[1] + elif op == "INIT": + chart[dst] = args[0] + elif op == "CLEAR": + chart[dst] = None + assert not requested and chart == word["final"] + [None] * word["owned_fields"] + + +def rational_row(vec): + return {str(k): str(v) for k, v in sorted(vec.items())} + + +def evaluate(exact, row, prefix, suffix, cohort, deadline): + a_rank, a_basis = exact["pure"](prefix, cohort) + b_rank, b_basis = exact["pure"](suffix, cohort) + assert a_rank >= row.get("prefix_modular_rank", 0) + assert b_rank >= row.get("suffix_modular_rank", 0) + a_images = sum(bool(c) for _, c in a_basis) + b_images = sum(bool(d) for _, d in b_basis) + pair = exact["pair"](a_basis, b_basis, deadline) + status = ("exact_unit_pair" if pair else "no_nonzero_pure_prefix" if not a_images else + "no_nonzero_pure_suffix" if not b_images else "no_exact_unit_pair") + a_form = [[str(exact["dot"](a, b)) for b, _ in b_basis] for a, _ in a_basis] + c_form = [[str(exact["dot"](c, d)) for _, d in b_basis] for _, c in a_basis] + if len(a_basis) == len(b_basis) == 1: + assert bool(pair) == (a_form[0][0] != "0" and a_form == c_form) + pub = row["public"] + + def at_cut(weights): + return rational_row({pub[j]: value for j, value in weights.items()}) + + entry = row | dict(status=status, prefix_rank=a_rank, suffix_rank=b_rank, + prefix_nullity=len(a_basis), suffix_nullity=len(b_basis), + nonzero_prefix_basis_images=a_images, nonzero_suffix_basis_images=b_images, + prefix_rows=[rational_row(vec) for vec in prefix], + suffix_columns=[rational_row(vec) for vec in suffix], + prefix_pure_basis=[dict(a=at_cut(a), c=rational_row(c)) for a, c in a_basis], + suffix_pure_basis=[dict(b=at_cut(b), d=rational_row(d)) for b, d in b_basis], + cut_pairing_matrix=a_form, endpoint_pairing_matrix=c_form) + if pair: + assert exact["compose"](pair["a"], prefix) == pair["c"] + assert exact["compose"](pair["b"], suffix) == pair["d"] + assert pair["c"].keys() <= cohort and pair["d"].keys() <= cohort + assert exact["dot"](pair["a"], pair["b"]) == exact["dot"](pair["c"], pair["d"]) == 1 + pair["a"] = {pub[j]: v for j, v in pair["a"].items()} + pair["b"] = {pub[j]: v for j, v in pair["b"].items()} + entry["physical_coefficient_preflight"] = exact["physical_screen"](pair, row["pivots"]) + entry["witness"] = {k: rational_row(v) for k, v in pair.items()} + return entry + + +def main(): + assert __debug__ + parser = ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, default=ROOT) + parser.add_argument("--followup", type=Path) + parser.add_argument("--followup-sha") + parser.add_argument("--only-followup", action="store_true") + parser.add_argument("--controls-only", action="store_true") + args = parser.parse_args() + if bool(args.followup) != bool(args.followup_sha) or args.only_followup and not args.followup: + parser.error("Use a pinned follow-up file and its exact SHA together") + for rel in ("reused/exact_six.py", "reused/rolling_exterior.py"): + checked(ROOT / rel, PINS[rel]) + exact = run_path(str(ROOT / "reused/exact_six.py")) + checks = exact["checks"]() + if args.controls_only: + print(dumps(checks)) + return + + def read(name): + rel = f"inputs/{name}.json" + return loads(checked(args.root / rel, PINS[rel]), object_pairs_hook=exact["unique"]) + + def stop(*_): + raise TimeoutError("Hard 35-second exact cap") + + selected, results, fail = [], [], None + input_pins = dict(PINS) + signal(SIGALRM, stop) + phase_seconds = SECONDS - int(args.only_followup) + alarm(phase_seconds) + deadline = monotonic() + phase_seconds - 2 + try: + remaining, prefix, suffix, price = (read(k) for k in ("REMAINING", "PREFIX", "SUFFIX", "PRICE")) + assert price["head"] == HEAD and price["word_sha256"] == PINS["inputs/7334-WORD.json.gz"] + inherited = inherited_keys(remaining, prefix, suffix) + selected = [] if args.only_followup else inherited + if args.followup: + assert args.followup_sha == FOLLOWUP_SHA + raw = checked(args.followup, FOLLOWUP_SHA) + followup = loads(raw, object_pairs_hook=exact["unique"]) + assert followup["inputs"]["input/lead/SUFFIX.json"] == PINS["inputs/SUFFIX.json"] + assert len(followup["selected"]) == CASE_CAP and len(followup["unselected"]) == 29 + first, added = followup["selected"][:len(KEYS)], followup["selected"][len(KEYS):] + for saved, previous in zip(first, inherited, strict=True): + assert all(saved[k] == previous[k] for k in BANK) + assert tuple(tuple(r["key"]) for r in added) == FOLLOWUP_KEYS + assert index(added).keys() <= {tuple(k) for k in remaining["unvisited_prefix"]} + selected = selected + added + input_pins["inputs/R97-SELECTION.json"] = FOLLOWUP_SHA + assert 0 < len(selected) <= CASE_CAP + word = exact["checked"](args.root / "inputs/7334-WORD.json.gz", "word") + cohort = set(price["cohort"]) + assert len(cohort) == 15 and len(word["program"]) == 76466 + assert all((word["initial"][r], word["final"][r]) == (3, 245) for r in cohort) + cut_check(word, selected, cohort) + for row, (p, s) in zip(selected, exact["trace"](word, selected, deadline), strict=True): + exact["stop_at"](deadline) + results.append(evaluate(exact, row, p, s, cohort, deadline)) + except TimeoutError as err: + fail = str(err) + finally: + alarm(0) + print(dumps(dict(head=HEAD, input_sha256=input_pins, case_cap=CASE_CAP, + runner_seconds_cap=SECONDS, controls=checks, results=results, + selected_unvisited=[row["key"] for row in selected[len(results):]], + counts=dict(Counter(row["status"] for row in results)), timeout=fail), + indent=2, sort_keys=True)) + if fail: + raise SystemExit(2) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/rolling_exterior.py b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/rolling_exterior.py new file mode 100644 index 0000000000..621640c40a --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/engines/rational/rolling_exterior.py @@ -0,0 +1,286 @@ +"""Independent full exterior rank for the 4,183 frozen R86 bank keys.""" +from argparse import ArgumentParser +from collections import Counter, defaultdict +from fractions import Fraction +from functools import cache +from gzip import decompress +from hashlib import sha256 +from json import dumps, loads +from math import isqrt +from pathlib import Path +from signal import SIGALRM, alarm, signal +from time import monotonic + +PRIME = 65537 +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +PINS = { + "price": "b4bf8e00a8289f03b1da731fb3ab563a771d88d875e0da73acf70954df2f2c56", + "geometry": "238135413a5646cb39b34dd65dad73b3032f28352f114da9d67b854ffff39250", + "prior": "60ccc6007510c1125a5dee8612f0a3474c2d7e5c21f931745a58a8d4e2077d7b", + "word": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", +} +PAYLOAD = "9aa8d6b054ba7eb2289d052c1079b16be518d2f0fbfb244569fa18e3733acdac" +PROTECTED = {319, 863, 1355, 1568} + + +def unique(pairs): + values = dict(pairs) + if len(values) != len(pairs): + raise ValueError("Duplicate JSON key") + return values + + +def checked(path, name): + raw = path.read_bytes() + if sha256(raw).hexdigest() != PINS[name]: + raise ValueError(f"Changed input {name}") + if name == "word": + raw = decompress(raw) + assert sha256(raw).hexdigest() == PAYLOAD + return loads(raw, object_pairs_hook=unique) + + +@cache +def coefficient(value): + q = Fraction(value) + if not q or not q.denominator % PRIME: + raise ValueError("Zero native scalar or nonunit denominator") + return q.numerator * pow(q.denominator, -1, PRIME) % PRIME, q.denominator + + +def axpy(dst, src, scalar): + for column, value in src.items(): + current = (dst.get(column, 0) + scalar * value) % PRIME + if current: + dst[column] = current + else: + dst.pop(column, None) + + +def rank_witness(rows): + """Use greatest available columns, preserving the order of accepted rows.""" + basis = [] + determinant = 1 + for row in rows: + reduced = row.copy() + for pivot, inverse, earlier in basis: + if (value := reduced.get(pivot, 0)): + axpy(reduced, earlier, -value*inverse) + if reduced: + pivot = max(reduced) + diagonal = reduced[pivot] + determinant = determinant * diagonal % PRIME + basis.append((pivot, pow(diagonal, -1, PRIME), reduced)) + rank = len(basis) + if rank != len(rows): + return {"status":"modular_rank_drop","modular_rank":rank} + # In pivot insertion order, the selected original columns become upper + # triangular under the same determinant-preserving row additions. + assert determinant + columns = [p for p,_,_ in basis] + return {"status":"no_nonzero_pure_prefix","modular_rank":rank, + "minor_columns":columns,"minor_determinant_mod_prime":determinant} + + +def controls(): + assert all(PRIME % divisor for divisor in range(2, isqrt(PRIME)+1)) + # The first selected column is 8, so the minor order swaps the natural axes. + proof = rank_witness([{3:2,8:1},{3:3,8:4}]) + assert proof["minor_columns"] == [8,3] and proof["minor_determinant_mod_prime"] == PRIME-5 + assert rank_witness([{3:2,8:1},{3:6,8:3}]) == {"status":"modular_rank_drop","modular_rank":1} + assert rank_witness([{},{}])["modular_rank"] == 0 + row = {1:1, 2:3} + axpy(row,{2:1,9:2},coefficient("-3")[0]) + assert row == {1:1,9:PRIME-6} + try: + coefficient("1/65537") + except ValueError: + pass + else: + raise AssertionError("Nonunit denominator was accepted") + return ["nontrivial_signed_minor","planted_rank_drop","zero_rows","signed_cancellation","nonunit_denominator_rejected"] + + +def admission(price, geometry, prior): + assert price["head"] == geometry["head"] == prior["head"] == HEAD + assert geometry["word_sha256"] == price["word_sha256"] == prior["pins"]["word"] == PINS["word"] + assert geometry["price_sha256"] == prior["pins"]["price"] == PINS["price"] + assert prior["pins"]["geometry"] == PINS["geometry"] and prior["prime"] == 65521 + assert geometry["status"] == "EXHAUSTED" and geometry["visited_events"] == 76466 + assert geometry["ranks"] == [4,5] and geometry["bank_cap"] == 24 + chosen = {tuple(x["key"]):x for x in geometry["selected"]} + keys = [tuple(k) for k in geometry["unvisited_keys"]] + entire = {tuple(k) for k in geometry["all_representative_keys"]} + assert len(chosen) == 24 and len(keys) == len(set(keys)) == 4183 + assert len(entire) == 4207 and not chosen.keys() & set(keys) and entire == chosen.keys() | set(keys) + previous = {tuple(r["key"]):r for r in prior["results"]} + assert previous.keys() == chosen.keys() and not prior["selected_unresolved"] + for k, row in chosen.items(): + record = previous[k] + assert all(record[field] == row[field] for field in ("key","public","owned","pivots")) + assert record["status"] == "no nonzero pure prefix" and record["minor"]["determinant_mod_prime"] + return keys, chosen + + +def exterior_rows(word, cohort, keys, chosen, deadline, results, previous, progress): + n = word["public"] + owners = word["owned_fields"] + initial, final = word["initial"], word["final"] + assert (n, owners, len(word["program"])) == (1501,68,76466) + mains = set(word["live"]) | {r+112 for r in word["live"]} + mains.update(word["hosted"]["X2"],word["hosted"]["Y2"]) + expected = {r for r,(a,z) in enumerate(zip(initial,final,strict=True)) + if (a,z)==(3,127) and r not in mains | PROTECTED} + assert expected == cohort and len(cohort) == 615 + frames = word["frames"] + + @cache + def space(chart): + values = {0} + for v in frames[chart]: + assert v not in values + values.update(v ^ x for x in tuple(values)) + return values + + banks = defaultdict(set) + states = list(initial) + [None]*owners + revision = [0]*len(states) + for r,c in enumerate(initial): + banks[c].add(r) + rows = [({r:1} if r not in cohort else {}) for r in range(n)] + [None]*owners + requests = defaultdict(list) + for t,c in [*keys,*chosen]: + assert len(frames[c]) in (4,5) and space(3) < space(c) < space(127) + requests[t].append(c) + + fresh = set() + cache_by_rows = {} + denoms = set() + moves = Counter() + tape = word["program"] + for t in range(len(tape)+1): + if t % 128 == 0 and monotonic() >= deadline: + raise TimeoutError("normalized exterior replay") + progress["first_unvisited_event"] = t + for c in requests.get(t,()): + if monotonic() >= deadline: + raise TimeoutError("frozen bank rank") + key = (t,c) + public = sorted(r for r in banks[c] if r=n) + eligible = sorted(set(public)&cohort) + assert public and eligible + if t: + op = tape[t-1] + incident = op[2:4] if op[0]=="MOVE" else op[-1:] + assert c in incident + signature = tuple((r,revision[r]) for r in public) + if signature not in cache_by_rows: + cache_by_rows[signature] = rank_witness([rows[r] for r in public]) + rank = cache_by_rows[signature] + record = dict(key=list(key),chart_rank=len(frames[c]),public=public,owned=owned,pivots=eligible,**rank) + if key in chosen: + assert all(record[k] == chosen[key][k] for k in ("key","public","owned","pivots")) + previous[key] = record + else: + results[key] = record + if t == len(tape): + break + op,d,*args = tape[t] + assert 0 <= d < len(states) + old = states[d] + if op=="MOVE": + a,b,owned = args + assert old == a and owned == (d>=n) + assert space(a)=n and old is None and rows[d] is None + states[d]=args[0] + banks[args[0]].add(d) + rows[d]={} + fresh.add(d) + elif op=="CLEAR": + assert d>=n and old==args[0] and rows[d] is not None + banks[old].remove(d) + states[d]=rows[d]=None + fresh.discard(d) + else: + assert old==args[-1] and rows[d] is not None and op in ("SCALE","ADD","COPY") + scale,denominator=coefficient(args[-2]) + denoms.add(denominator) + if op=="SCALE": + rows[d]={i:v*scale%PRIME for i,v in rows[d].items() if v*scale%PRIME} + else: + s=args[0] + assert d!=s and states[s]==old and rows[s] is not None + if op=="COPY": + assert d>=n and d in fresh and not rows[d] + axpy(rows[d],rows[s],scale) + fresh.discard(d) + revision[d]+=1 + + assert states == list(final)+[None]*owners and not fresh + assert dict(moves)=={1:4000,2:853,3:829,4:223,5:345,6:14,7:10,8:5} + progress.update(first_unvisited_event=None, literal_events_replayed=len(tape), + distinct_exterior_row_sets=len(cache_by_rows), denominator_units=sorted(denoms), + native_paid_histogram=dict(moves)) + + +def main(): + parser=ArgumentParser(description=__doc__) + for k in PINS: + parser.add_argument("--"+k,type=Path) + parser.add_argument("--controls-only",action="store_true") + args=parser.parse_args() + if not __debug__: + raise RuntimeError("Run with assertions") + if args.controls_only: + print(dumps(controls())) + return + if not all(getattr(args,k) for k in PINS): + parser.error("All four explicit inputs are required") + + def stop(*_): + raise TimeoutError("hard 35-second cap") + + keys, chosen, results, previous = [], {}, {}, {} + progress = {} + checks = [] + timed_out = None + signal(SIGALRM,stop) + alarm(35) + deadline=monotonic()+33 + try: + checks = controls() + price = checked(args.price,"price") + geometry = checked(args.geometry,"geometry") + prior = checked(args.prior,"prior") + keys,chosen = admission(price,geometry,prior) + word = checked(args.word,"word") + exterior_rows(word,set(price["endpoint_cohort"]),keys,chosen,deadline,results,previous,progress) + except TimeoutError as exc: + timed_out = str(exc) + finally: + alarm(0) + tested = [results[k] for k in keys if k in results] + tested_prior = [previous[k] for k in chosen if k in previous] + unvisited = [list(k) for k in keys if k not in results] + control_unvisited = [list(k) for k in chosen if k not in previous] + drops = [r["key"] for r in tested if r["status"]=="modular_rank_drop"] + control_drops = [r["key"] for r in tested_prior if r["status"]=="modular_rank_drop"] + print(dumps(dict(head=HEAD,pins=PINS,prime=PRIME,case_cap=4183,runner_cap_seconds=35, + controls=checks,prior_24=tested_prior,prior_unvisited=control_unvisited,prior_rank_drops=control_drops, + tested=tested,unvisited=unvisited,rank_drops=drops,disposition_counts=dict(Counter(r["status"] for r in tested)), + actual_full_rank_only=True,timeout=timed_out,**progress),indent=2,sort_keys=True)) + if timed_out or control_drops or control_unvisited: + raise SystemExit(2) + + +if __name__=="__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/inputs/7334-WORD.json.gz b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/7334-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..73f43007192eb5a38eb5abb591b871df3e52c7cd GIT binary patch literal 393282 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%0D>(h9A<5KmxPj0RM7Ow%Cdd&-_N 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 )p`f7wfFJ;xD;q5C(yNi0mCa{0f9A&w$ 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î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 literal 0 HcmV?d00001 diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/inputs/exterior_minor.py b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/exterior_minor.py new file mode 100644 index 0000000000..4e173778c3 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/exterior_minor.py @@ -0,0 +1,179 @@ +"""Exact modular exterior minors for the frozen rank-four/five banks.""" +from collections import Counter, defaultdict +from fractions import Fraction +from functools import cache +from gzip import decompress +from hashlib import sha256 +import json +from math import isqrt +from pathlib import Path +import sys +from time import monotonic + +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +P = 65521 +PINS = { + "inputs/GEOMETRY.json": "238135413a5646cb39b34dd65dad73b3032f28352f114da9d67b854ffff39250", + "inputs/PRICE.json": "b4bf8e00a8289f03b1da731fb3ab563a771d88d875e0da73acf70954df2f2c56", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", +} + + +def unique(items): + d = dict(items) + if len(d) != len(items): + raise ValueError("duplicate JSON key") + return d + + +def checked(root, name): + raw = (root / name).read_bytes() + if sha256(raw).hexdigest() != PINS[name]: + raise ValueError(f"changed dependency: {name}") + return json.loads(decompress(raw) if name.endswith(".gz") else raw, + object_pairs_hook=unique) + + +@cache +def scalar(x): + q = Fraction(x) + if q.denominator % P == 0: + raise ValueError("nonunit native denominator") + return q.numerator * pow(q.denominator, -1, P) % P + + +def plus(row, other, c): + if c: + for k, x in other.items(): + y = (row.get(k, 0) + c * x) % P + if y: + row[k] = y + else: + row.pop(k, None) + + +def exterior_minor(bank, rows, allowed): + """Use the discovered pivot order as the column order of the minor.""" + basis = [] + determinant = 1 + for role in bank: + row = {i: x for i, x in rows[role].items() if i not in allowed} + for k, vector in basis: + plus(row, vector, -row.get(k, 0)) + if row: + k = min(row) + pivot = row[k] + determinant = determinant * pivot % P + scale = pow(pivot, -1, P) + basis.append((k, {i: x * scale % P for i, x in row.items()})) + rank = len(basis) + full = rank == len(bank) + return dict(exterior_rank=rank, columns=[k for k, _ in basis], + determinant=determinant if full else None, + disposition="excluded" if full else "rank drop") + + +def controls(): + bank = [0, 1] + rows = [{0: 2, 1: 3}, {0: 5, 1: 7}] + x = exterior_minor(bank, rows, set()) + assert x["determinant"] == P - 1 and x["columns"] == [0, 1] + rows = [{0: 1, 2: 1}, {1: 1, 2: 1}] + assert exterior_minor(bank, rows, {0, 1})["disposition"] == "rank drop" + try: + scalar(f"1/{P}") + except ValueError: + pass + else: + raise AssertionError("nonunit denominator admitted") + return ["determinant sign", "planted nonzero pure prefix", "nonunit denominator rejection"] + + +def sweep(word, keys, allowed, deadline): + n = word["public"] + active = word["initial"] + [None] * word["owned_fields"] + rows = [{i: 1} for i in range(n)] + [None] * word["owned_fields"] + requests = defaultdict(list) + for t, c in keys: + requests[t].append(c) + requested = set(keys) + out = {} + finished = 0 + for t, e in enumerate(word["program"]): + if (t % 128 == 0 or t in requests) and monotonic() >= deadline: + break + for c in requests.get(t, ()): + public = [i for i in range(n) if active[i] == c] + owned = [i for i in range(n, len(active)) if active[i] == c] + pivots = sorted(set(public) & allowed) + assert pivots and len(word["frames"][c]) in (4, 5) + if t: + prior = word["program"][t - 1] + charts = prior[2:4] if prior[0] == "MOVE" else prior[-1:] + assert c in charts + out[t, c] = dict(key=[t, c], public=public, owned=owned, pivots=pivots, + **exterior_minor(public, rows, allowed)) + op, r, *a = e + if op == "MOVE": + assert active[r] == a[0] and a[2] == (r >= n) + active[r] = a[1] + elif op == "INIT": + assert active[r] is None and r >= n and rows[r] is None + active[r], rows[r] = a[0], {} + elif op == "CLEAR": + assert active[r] == a[0] and r >= n and rows[r] is not None + active[r] = rows[r] = None + elif op == "SCALE": + assert active[r] == a[1] + c = scalar(a[0]) + rows[r] = {i: c * x % P for i, x in rows[r].items()} if c else {} + else: + s, c, f = a + assert active[r] == active[s] == f and r != s and op in ("ADD", "COPY") + if op == "COPY": + assert r >= n and not rows[r] + plus(rows[r], rows[s], scalar(c)) + finished = t + 1 + if finished == len(word["program"]): + assert active == word["final"] + [None] * word["owned_fields"] + assert requested == out.keys() + return out, finished + + +def main(): + deadline = monotonic() + 32 + root = Path(sys.argv[1]) + geom = checked(root, "inputs/GEOMETRY.json") + price = checked(root, "inputs/PRICE.json") + word = checked(root, "inputs/7334-WORD.json.gz") + assert geom["head"] == price["head"] == HEAD + assert geom["price_sha256"] == PINS["inputs/PRICE.json"] + assert all(P % i for i in range(2, isqrt(P) + 1)) + allowed = set(price["endpoint_cohort"]) + assert len(allowed) == 615 + chosen = {tuple(r["key"]): r for r in geom["selected"]} + keys = [tuple(k) for k in geom["unvisited_keys"]] + assert len(chosen) == 24 and len(set(keys)) == len(keys) == 4183 + assert set(keys) | chosen.keys() == {tuple(k) for k in geom["all_representative_keys"]} + checks = controls() + out, finished = sweep(word, list(chosen) + keys, allowed, deadline) + control_records = [] + for k, earlier in chosen.items(): + if k in out: + r = out[k] + assert r["disposition"] == "excluded" + assert all(r[f] == earlier[f] for f in ("public", "owned", "pivots")) + control_records.append(r) + tested = [out[k] for k in keys if k in out] + missing = [k for k in keys if k not in out] + print(json.dumps(dict(head=HEAD, pins=PINS, prime=P, phase="normalized rational cocharts", + limit_cases=4183, limit_seconds=32, events_processed=finished, + status="CAPPED" if missing or len(control_records) != 24 else "EXHAUSTED", + controls=checks, prior_controls=control_records, results=tested, + counts=Counter(r["disposition"] for r in tested), unvisited=missing, + rank_drops=[r["key"] for r in tested if r["disposition"] == "rank drop"]), + separators=(",", ":"), sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_rank.py b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_rank.py new file mode 100644 index 0000000000..b712cdb1f8 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_rank.py @@ -0,0 +1,187 @@ +"""Rational paired exclusion using wedge identities and a stacked rank check.""" +from collections import Counter +from fractions import Fraction as Q +from functools import cache +from gzip import decompress +from hashlib import sha256 +import json +from pathlib import Path +import sys +from time import monotonic + +GEOMETRY="4c349e06b22bfebb431fab1c9ae04f0e798f398acc6fdd99591b49b1c95ef6ca" +WORD="4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a" + + +@cache +def coefficient(s): + return Q(s) + + +def checked(path,digest): + data=path.read_bytes() + if sha256(data).hexdigest()!=digest: + raise ValueError(f"changed pin: {path.name}") + return data + + +def plus(row,other,q): + for i,x in other.items(): + v=row.get(i,0)+q*x + if v: + row[i]=v + else: + row.pop(i,None) + + +def null_pure(bank,rows,allowed): + """Eliminate exterior inputs, carrying coefficient vectors on the bank.""" + pivots={} + pure=[] + for r in bank: + row={i:x for i,x in rows[r].items() if i not in allowed} + u={r:Q(1)} + while row: + lead=max(row) + if lead not in pivots: + pivots[lead]=row,u + break + p,a=pivots[lead] + ratio=-row[lead]/p[lead] + plus(row,p,ratio) + plus(u,a,ratio) + else: + full={} + for i,x in u.items(): + plus(full,rows[i],x) + assert set(full)<=allowed + pure.append((u,full)) + assert len(pivots)+len(pure)==len(bank) + return pure + + +def rank(matrix): + basis={} + for source in matrix: + row=source.copy() + while row: + lead=max(row) + if lead not in basis: + basis[lead]=row + break + plus(row,basis[lead],-row[lead]/basis[lead][lead]) + return len(basis) + + +def pairing(B,D): + # No (x,y) with xBy=1 and xDy=0 iff each xB is proportional to xD + # and ker(x -> xD) lies inside ker(x -> xB). + rows=len(B) + cols=len(B[0]) if B else 0 + def wedge(b,d): + return any(b[i]*d[j]!=b[j]*d[i] for i in range(cols) for j in range(i)) + has_wedge=any(wedge(b,d) for b,d in zip(B,D,strict=True)) + if not has_wedge: + for i in range(rows): + for j in range(i): + if wedge([x+y for x,y in zip(B[i],B[j],strict=True)], + [x+y for x,y in zip(D[i],D[j],strict=True)]): + has_wedge=True + break + if has_wedge: + break + dr=rank([{i:x for i,x in enumerate(r) if x} for r in D]) + sr=rank([{i:x for i,x in enumerate(d+b) if x} for d,b in zip(D,B,strict=True)]) + return has_wedge,dr,sr + + +def side(word,banks,allowed,deadline,reverse): + n=word["public"] + tape=word["program"] + vectors=[{i:Q(1)} for i in range(n)]+[{} for _ in range(word["owned_fields"])] + rows={} + cuts=range(len(tape),min(banks)-1,-1) if reverse else range(0,max(banks)+1) + for t in cuts: + if t%128==0 and monotonic()>=deadline: + break + if t in banks: + rows[t]=null_pure(banks[t],vectors,allowed) + if t==0 and reverse: + break + op,d,*args=tape[t-1 if reverse else t] + if op=="MOVE": + continue + if op in ("INIT","CLEAR"): + vectors[d]={} + else: + q=coefficient(args[-2]) + source=d if op=="SCALE" else args[0] + assert op=="SCALE" or source!=d + if op=="SCALE": + vectors[d]={i:q*x for i,x in vectors[d].items()} + elif reverse: + plus(vectors[source],vectors[d],q) + if op=="COPY": + vectors[d]={} + elif op=="COPY": + vectors[d]={i:q*x for i,x in vectors[source].items()} + else: + assert op=="ADD" + plus(vectors[d],vectors[source],q) + return rows + + +def run(word,geom,keys): + deadline=monotonic()+32 + groups=Counter(k[0] for k in keys) + banks={row["cut"]:row["public_bank"] for row in geom["new"]["rows"] if row["cut"] in groups} + allowed=set(geom["endpoint_cohort"]) + forward=side(word,banks,allowed,deadline,False) + reverse=side(word,banks,allowed,deadline,True) + ans=[] + def dot(a,b): + return sum(x*b.get(i,0) for i,x in a.items()) + for t,n in sorted(groups.items()): + if t not in forward or t not in reverse or monotonic()>=deadline: + continue + F,R=forward[t],reverse[t] + w=dr=sr=None + if not any(c for a,c in F): + status="no nonzero pure prefix" + elif not any(d for b,d in R): + status="no nonzero pure suffix" + else: + B=[[dot(a,b) for b,d in R] for a,c in F] + C=[[dot(c,d) for b,d in R] for a,c in F] + D=[[x-y for x,y in zip(b,c,strict=True)] for b,c in zip(B,C,strict=True)] + w,dr,sr=pairing(B,D) + status="paired support unresolved" if w or dr!=sr else "no unit pairing" + ans.append(dict(cut=t,cases=n,status=status,prefix_dimension=len(F),suffix_dimension=len(R), + nonzero_wedge=w,exterior_rank=dr,stacked_rank=sr)) + missing=set(groups)-{r["cut"] for r in ans} + counts=Counter() + for row in ans: + counts[row["status"]]+=row["cases"] + return dict(cases=len(keys),rows=ans,counts=dict(counts), + unvisited=[key for key in keys if key[0] in missing]) + + +def main(): + root=Path(sys.argv[1]) + which=sys.argv[2] + assert which in ("first","remaining") + geom=json.loads(checked(root/"lead/OCCUPANCY.json",GEOMETRY)) + word=json.loads(decompress(checked(root/"inputs/7334-WORD.json.gz",WORD))) + assert pairing([[Q(1),Q(0)]],[[Q(0),Q(1)]])[0] + assert pairing([[Q(1)]],[[Q(2)]])==(False,1,1) + assert pairing([[Q(1)]],[[Q(0)]])==(False,0,1) + keys=geom["representative_keys" if which=="first" else "unvisited_keys"] + assert len(keys)==(128 if which=="first" else 18) + data=run(word,geom,keys) + print(json.dumps(data|dict(selection=which,word_sha256=WORD,geometry_sha256=GEOMETRY, + controls=["nonzero wedge","proportional equal rank","nonzero pairing on difference kernel"]), + indent=2,sort_keys=True)) + + +if __name__=="__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_support.py b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_support.py new file mode 100644 index 0000000000..46180f7b49 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/paired_support.py @@ -0,0 +1,356 @@ +"""Exact pure prefix/suffix and unit pairing for the #7334 chart-207 split.""" +from argparse import ArgumentParser +from collections import defaultdict +from fractions import Fraction as Q +from functools import cache +from gzip import decompress +from hashlib import sha256 +from json import dumps, loads +from pathlib import Path +from signal import SIGALRM, alarm, signal +from time import monotonic + +HEAD = 'aaeec8c0acf01e99a5f331ef363a698d9c084ace' +WORD = '4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a' +ADMISSION = 'c95300e9bca27e44a25c82d794f88cbf70757c142806b0e4c590ea29feb81a13' +PROTECTED = {319,863,1355,1568} +CAP = 128 + + +class Capped(Exception): + pass + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def check_time(deadline): + if monotonic() >= deadline: + raise Capped + + +def pinned(path, digest): + raw = path.read_bytes() + need(sha256(raw).hexdigest() == digest, f'Changed input {path.name}') + return raw + + +def unique(pairs): + doc = dict(pairs) + need(len(doc) == len(pairs), 'Duplicate receipt key') + return doc + + +def read(raw): + return loads(raw,object_pairs_hook=unique) + + +@cache +def rational(value): + return Q(value) + + +def axpy(dst, src, factor): + for j,v in src.items(): + value = dst.get(j,0) + factor*v + if value: + dst[j] = value + else: + dst.pop(j,None) + + +def dot(a,b): + return sum(v*b.get(j,0) for j,v in a.items()) + + +def compose(weights, rows): + vector = {} + for role, coefficient in weights.items(): + axpy(vector,rows[role],coefficient) + return vector + + +def pure_kernel(rows, allowed, deadline): + pivots, pure = {}, [] + for role,row in rows.items(): + check_time(deadline) + exterior = {j:v for j,v in row.items() if j not in allowed} + coeff = {role:Q(1)} + while exterior: + j = min(exterior) + if j not in pivots: + lead = exterior[j] + pivots[j] = ({k:v/lead for k,v in exterior.items()}, + {k:v/lead for k,v in coeff.items()}) + break + other, op = pivots[j] + factor = -exterior[j] + axpy(exterior,other,factor) + axpy(coeff,op,factor) + else: + projection = compose(coeff,rows) + assert projection.keys() <= allowed + pure.append((coeff,projection)) + assert len(pivots)+len(pure) == len(rows) + return sorted(pivots), pure + + +def solve_bilinear(B,D,deadline): + """Find x,y with xBy=1 and xDy=0, or prove no such rational pair.""" + n = len(B) + def trial(x): + bx,dx = compose(x,B),compose(x,D) + if not bx: + return None + if not dx: + j = min(bx) + return x,{j:1/bx[j]} + pivot = min(dx) + for j in sorted(bx.keys() | dx.keys()): + value = bx.get(j,0)*dx[pivot]-bx.get(pivot,0)*dx.get(j,0) + if value: + y = {j:dx[pivot]/value} + if dx.get(j,0): + y[pivot] = -dx[j]/value + assert dot(bx,y) == 1 and dot(dx,y) == 0 + return x,y + return None + for i in range(n): + check_time(deadline) + hit = trial({i:Q(1)}) + if hit: + return hit + # Each wedge coordinate is a homogeneous quadratic in x. Basis vectors + # and pair sums determine all coefficients over Q. + for i in range(n): + check_time(deadline) + for j in range(i+1,n): + hit = trial({i:Q(1),j:Q(1)}) + if hit: + return hit + # All wedges vanish. Only xD=0 but xB!=0 can give a pair. + _, kernel = pure_kernel(dict(enumerate(D)),set(),deadline) + for x,_ in kernel: + hit = trial(x) + if hit: + return hit + return None + + +def paired(prefix,suffix,deadline): + B,D = [],[] + for a,c in prefix: + check_time(deadline) + dot_boundary = {j:v for j,(_,d) in enumerate(suffix) if (v:=dot(c,d))} + dot_difference = {j:v for j,(b,_) in enumerate(suffix) if (v:=dot(a,b)-dot_boundary.get(j,0))} + B.append(dot_boundary); D.append(dot_difference) + hit = solve_bilinear(B,D,deadline) + if hit is None: + return None + x,y = hit + a,c = (compose(x,[pair[i] for pair in prefix]) for i in (0,1)) + b,d = (compose(y,[pair[i] for pair in suffix]) for i in (0,1)) + assert dot(a,b)==dot(c,d)==1 + return dict(a=a,b=b,c=c,d=d) + + +def initial_groups(word): + n = word['public'] + main = set(word['live']) | {r+112 for r in word['live']} + main.update(word['hosted']['X2']); main.update(word['hosted']['Y2']) + cohort = {r for r in range(n) if r not in main and (word['initial'][r],word['final'][r])==(3,127)} + return cohort-PROTECTED,cohort-PROTECTED + + +def prefix_rows(word, cuts, deadline): + n = word['public']; rows = [{r:Q(1)} for r in range(n)]+[None]*word['owned_fields'] + charts = word['initial']+[None]*word['owned_fields'] + banks, seen = {}, 0 + try: + for clock,event in enumerate(word['program']): + if clock%64 == 0 or clock in cuts: + check_time(deadline) + if clock in cuts: + banks[clock] = {r:rows[r].copy() for r in range(n) if charts[r]==207} + if clock >= max(cuts): + break + op,dst,*args = event + if op == 'MOVE': + old,new,owned = args + assert charts[dst] == old and owned==(dst>=n) + charts[dst]=new + elif op == 'INIT': + assert dst>=n and rows[dst] is None + rows[dst],charts[dst]={},args[0] + elif op == 'CLEAR': + assert dst>=n and charts[dst]==args[0] + rows[dst]=charts[dst]=None + elif op == 'SCALE': + assert charts[dst]==args[1] + rows[dst]={j:rational(args[0])*v for j,v in rows[dst].items()} + else: + src,q,chart=args + assert charts[dst]==charts[src]==chart and src!=dst and op in {'ADD','COPY'} + if op=='COPY': + assert dst>=n and not rows[dst], 'Dirty COPY' + axpy(rows[dst],rows[src],rational(q)) + seen=clock+1 + except Capped: + pass + return banks,seen + + +def suffix_rows(word,banks,deadline): + n=word['public']; cols=[{r:Q(1)} for r in range(n)]+[{} for _ in range(word['owned_fields'])] + snapshots,seen={},0 + try: + for clock in range(len(word['program']),min(banks)-1,-1): + if clock%64==0 or clock in banks: + check_time(deadline) + if clock in banks: + snapshots[clock]={r:cols[r].copy() for r in banks[clock]} + if clock==min(banks): + break + op,dst,*args=word['program'][clock-1] + if op in {'ADD','COPY'}: + src,q,_=args + axpy(cols[src],cols[dst],rational(q)) + if op=='COPY': + cols[dst]={} + elif op=='SCALE': + cols[dst]={j:rational(args[0])*v for j,v in cols[dst].items()} + elif op in {'INIT','CLEAR'}: + cols[dst]={} + else: + assert op=='MOVE' + seen+=1 + except Capped: + pass + return snapshots,seen + + +def geometry_keys(geometry): + if 'representative_keys' in geometry: + raw=geometry['representative_keys'] + elif 'keys' in geometry: + raw=geometry['keys'] + else: + raw=[(row['cut'],row['chart'],pivot) for row in geometry['segments'] for pivot in row['pivots']] + result=[tuple(row) if not isinstance(row,dict) else (row['cut'],row['chart'],row['pivot']) for row in raw] + need(len(result)==len(set(result)) and all(len(row)==3 and row[1]==207 and 44588<=row[0]<=44628 for row in result),'Wrong geometry key inventory') + return result + + +def audit(word,geometry,deadline): + all_keys=geometry_keys(geometry) + if not all_keys: + return dict(status='empty_geometry',selected=0,decisions=[],unresolved=[]) + keys=all_keys[:CAP] + cohort,pivots=initial_groups(word) + if 'endpoint_cohort' in geometry: + assert sorted(cohort)==geometry['endpoint_cohort'] + overflow=[tuple(key) for key in geometry.get('unvisited_keys',())] + assert len(overflow)==len(set(overflow)) and not set(overflow).intersection(all_keys) + bank_plan=defaultdict(list) + for cut,chart,pivot in keys: + need(pivot in pivots,'Protected or non-helper pivot') + bank_plan[cut].append(pivot) + banks,forward=prefix_rows(word,bank_plan,deadline) + decisions,opens={}, {} + try: + for cut,bank in banks.items(): + need(set(bank_plan[cut])<=bank.keys(),'Pivot absent from literal chart bank') + exterior,pure=pure_kernel(bank,cohort,deadline) + if any(c for _,c in pure): + opens[cut]=(exterior,pure) + else: + decisions[cut]=dict(status='no_nonzero_pure_prefix',public_bank=list(bank), + prefix_exterior_pivots=exterior,prefix_nullity=len(pure)) + except Capped: + pass + backward=0 + if opens: + snapshots,backward=suffix_rows(word,{c:banks[c] for c in opens},deadline) + try: + for cut,bank in snapshots.items(): + exterior,pure=pure_kernel(bank,cohort,deadline) + pre_rank,pre=opens[cut] + row=dict(public_bank=list(bank),prefix_exterior_pivots=pre_rank, + suffix_exterior_pivots=exterior,prefix_nullity=len(pre),suffix_nullity=len(pure)) + if not any(d for _,d in pure): + decisions[cut]=row|dict(status='no_nonzero_pure_suffix') + continue + witness=paired(pre,pure,deadline) + if witness is None: + decisions[cut]=row|dict(status='no_unit_pairing') + continue + assert compose(witness['a'],banks[cut])==witness['c'] + assert compose(witness['b'],bank)==witness['d'] + decisions[cut]=row|dict(status='exact_support_only',witness={k:{j:str(v) for j,v in value.items()} for k,value in witness.items()}) + except Capped: + pass + rows=[dict(key=key,**decisions[key[0]]) for key in keys if key[0] in decisions] + unresolved=[key for key in all_keys if key[0] not in decisions or key not in keys] + overflow + return dict(status='CAPPED' if unresolved else 'EXHAUSTED',selected=len(keys), + eligible_cohort=sorted(cohort),prefix_events=forward,suffix_events=backward, + decisions=rows,unresolved=unresolved,support_only=[row['key'] for row in rows if row['status']=='exact_support_only']) + + +def controls(): + inf=float('inf') + _,a=pure_kernel({4:{0:Q(1),2:Q(1)},5:{2:Q(1)}},{0},inf) + _,b=pure_kernel({4:{0:Q(1)},5:{3:Q(1)}},{0},inf) + hit=paired(a,b,inf) + assert hit and hit['a'][4] == -hit['a'][5] != 0 + assert dot(hit['a'],hit['b']) == dot(hit['c'],hit['d']) == 1 + _,wrong=pure_kernel({4:{0:Q(1),3:Q(1)},5:{3:Q(1)}},{0},inf) + assert paired(a,wrong,inf) is None + assert solve_bilinear([{0:Q(1)},{1:Q(1)}],[{0:Q(1)},{1:Q(2)}],inf)[0]=={0:Q(1),1:Q(1)} + assert solve_bilinear([{0:Q(1)},{0:Q(2)}],[{0:Q(1)},{0:Q(1)}],inf) is not None + return ['signed_unit_pair','unequal_pairing_rejected','quadratic_cross_term','left_kernel_D'] + + +def main(): + p=ArgumentParser(description=__doc__) + p.add_argument('--controls-only',action='store_true') + for key in ('word','price','geometry','admission'): + p.add_argument('--'+key,type=Path) + p.add_argument('--price-sha'); p.add_argument('--geometry-sha') + a=p.parse_args() + assert __debug__ + checks=controls() + if a.controls_only: + print(dumps(dict(controls=checks),indent=2,sort_keys=True)); return + need(all((a.word,a.price,a.geometry,a.admission,a.price_sha,a.geometry_sha)),'Sealed geometry and price are required') + price=read(pinned(a.price,a.price_sha)); geom=read(pinned(a.geometry,a.geometry_sha)) + admission=read(pinned(a.admission,ADMISSION)) + assert price['head']==admission['head']==HEAD and admission['exit']==0 + assert price['productive_delta']=={'1':17,'8':17,'9':-17} and not price['paid_delta'] + assert admission['inputs']['WORD.json.gz']==WORD + if 'price_sha256' in geom: + assert geom['price_sha256']==a.price_sha + if 'word_sha256' in geom: + assert geom['word_sha256']==WORD + keys=geometry_keys(geom) + if keys: + def watchdog(*_): + raise TimeoutError('hard support watchdog') + signal(SIGALRM,watchdog) + alarm(35) + try: + deadline=monotonic()+32 + result=audit(read(decompress(pinned(a.word,WORD))),geom,deadline) + finally: + alarm(0) + else: + result=dict(status='empty_geometry',selected=0,decisions=[],unresolved=[]) + result.update(head=HEAD,word_sha256=WORD,admission_sha256=ADMISSION,price_sha256=a.price_sha, + geometry_sha256=a.geometry_sha,cap=CAP,seconds_cap=35,controls=checks, + unvisited_credit_upper=price['one_edit_optimistic_credit'][1]) + print(dumps(result,indent=2,sort_keys=True)) + + +if __name__=='__main__': + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/inputs/reverse_engine.py b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/reverse_engine.py new file mode 100644 index 0000000000..ebfc82f83f --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/inputs/reverse_engine.py @@ -0,0 +1,148 @@ +"""Check the 2,128 frozen public banks by exact modular suffix minors.""" +from collections import Counter, defaultdict +from gzip import decompress +from hashlib import sha256 +import json +from pathlib import Path +from runpy import run_path +import sys +from time import monotonic + +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +PINS = { + "price/KEYS.json": "a131ec5bf96baac89f0f6623cf7d9dff06601b36ea720474311ee7ecb394f6e2", + "inputs/PRICE.json": "b4bf8e00a8289f03b1da731fb3ab563a771d88d875e0da73acf70954df2f2c56", + "inputs/7334-WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a", + "inputs/exterior_minor.py": "b25fef5432d8ea9cff9eecc422cf07ccf7473568084de3e8d3d1b5224793504d", +} + + +def authenticated(root): + raw = {} + for path, expected in PINS.items(): + raw[path] = (root / path).read_bytes() + if sha256(raw[path]).hexdigest() != expected: + raise ValueError(f"changed dependency: {path}") + return raw + + +def reverse_event(event, active, columns, public, scalar, plus, prime): + op, dst, *args = event + if op == "MOVE": + old, new, owned = args + assert active[dst] == new and owned == (dst >= public) + active[dst] = old + elif op == "CLEAR": + assert dst >= public and active[dst] is None and columns[dst] is None + active[dst], columns[dst] = args[0], {} + elif op == "INIT": + assert dst >= public and active[dst] == args[0] + active[dst] = columns[dst] = None + elif op == "SCALE": + coefficient, chart = args + assert active[dst] == chart + factor = scalar(coefficient) + columns[dst] = {k: factor * v % prime for k, v in columns[dst].items() + if factor * v % prime} + else: + src, coefficient, chart = args + assert op in ("ADD", "COPY") and dst != src + assert active[dst] == active[src] == chart + # The source contributes to both post-event fields. A guarded COPY + # replaces the destination, whose required pre-event value is zero. + plus(columns[src], columns[dst], scalar(coefficient)) + if op == "COPY": + assert dst >= public + columns[dst] = {} + + +def controls(engine): + scalar, plus, prime = (engine[name] for name in ("scalar", "plus", "P")) + active = [4, 4, None] + cols = [{0: 1}, {1: 1}, None] + tape = [ + ("ADD", 1, 0, "-3/2", 4), + ("SCALE", 0, "2", 4), + ("INIT", 2, 4), + ("COPY", 2, 1, "1", 4), + ("ADD", 0, 2, "5", 4), + ("CLEAR", 2, 4), + ] + for event in reversed(tape): + reverse_event(event, active, cols, 2, scalar, plus, prime) + assert cols == [{0: scalar("-11/2"), 1: scalar("-3/2")}, {0: 5, 1: 1}, None] + assert active == [4, 4, None] + minor = engine["exterior_minor"] + assert minor([0, 1], cols, set())["disposition"] == "excluded" + assert minor([0, 1], cols, {0})["disposition"] == "rank drop" + return ["signed two-output impulse with owned COPY and CLEAR", + "full exterior rank", "planted pure suffix", *engine["controls"]()] + + +def sweep(word, records, cohort, engine, deadline): + public = word["public"] + active = word["final"] + [None] * word["owned_fields"] + columns = [{i: 1} for i in range(public)] + [None] * word["owned_fields"] + requests = defaultdict(list) + for record in records: + requests[record["key"][0]].append(record) + scalar, plus, prime, minor = (engine[name] for name in ("scalar", "plus", "P", "exterior_minor")) + seen, visited = {}, 0 + for cut in range(len(word["program"]), -1, -1): + if (cut % 128 == 0 or cut in requests) and monotonic() >= deadline: + break + for record in requests.get(cut, ()): + chart = record["key"][1] + public_bank = [r for r in range(public) if active[r] == chart] + owned_bank = [r for r in range(public, len(active)) if active[r] == chart] + assert public_bank == record["public"] and owned_bank == record["owned"] + assert sorted(set(public_bank) & cohort) == record["pivots"] + result = minor(public_bank, columns, cohort) + seen[tuple(record["key"])] = { + "key": record["key"], "public": public_bank, "owned": owned_bank, + "pivots": record["pivots"], "prefix_rank_mod_65521": record["exterior_rank"], + "suffix_rank_mod_65521": result["exterior_rank"], "output_minor_rows": result["columns"], + "determinant_mod_65521": result["determinant"], "disposition": result["disposition"], + } + if not cut: + assert active == word["initial"] + [None] * word["owned_fields"] + break + reverse_event(word["program"][cut - 1], active, columns, public, scalar, plus, prime) + visited += 1 + return seen, visited + + +def main(): + assert __debug__ + deadline = monotonic() + 32 + root = Path(sys.argv[1]) + raw = authenticated(root) + engine = run_path(str(root / "inputs/exterior_minor.py")) + unique = engine["unique"] + frozen = json.loads(raw["price/KEYS.json"], object_pairs_hook=unique) + price = json.loads(raw["inputs/PRICE.json"], object_pairs_hook=unique) + word = json.loads(decompress(raw["inputs/7334-WORD.json.gz"]), object_pairs_hook=unique) + assert frozen["head"] == price["head"] == HEAD + assert frozen["source_sha256"]["inputs/7334-WORD.json.gz"] == PINS["inputs/7334-WORD.json.gz"] + assert frozen["source_sha256"]["inputs/PRICE.json"] == PINS["inputs/PRICE.json"] + records = frozen["keys"] + keys = [tuple(row["key"]) for row in records] + assert len(keys) == len(set(keys)) == frozen["reverse_case_cap"] == 2128 + cohort = set(price["endpoint_cohort"]) + assert len(cohort) == 615 + checks = controls(engine) + found, visited = sweep(word, records, cohort, engine, deadline) + results = [found[k] for k in keys if k in found] + pending = [list(k) for k in keys if k not in found] + print(json.dumps({ + "head": HEAD, "pins": PINS, "scope": "normalized suffix on the frozen public bank only", + "prime": engine["P"], "cases_cap": 2128, "seconds_cap": 32, "events_processed": visited, + "status": "CAPPED" if pending or visited != len(word["program"]) else "EXHAUSTED", + "controls": checks, "counts": Counter(row["disposition"] for row in results), + "results": results, "unvisited": pending, + "rank_drops": [row["key"] for row in results if row["disposition"] == "rank drop"], + }, separators=(",", ":"), sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7314-HELPERS.json.gz b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7314-HELPERS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..04698c94591c494881add22d169c0ecfa4785d0f GIT binary patch literal 19158 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 literal 0 HcmV?d00001 diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7334-CHANGED.json b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7334-CHANGED.json new file mode 100644 index 0000000000..b1644106d9 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/7334-CHANGED.json @@ -0,0 +1,72 @@ +{ + "body_clocks": [ + 40222, + 40840, + 42609, + 43022, + 43023, + 43024, + 43025, + 43026, + 43028, + 43030, + 43403, + 43491, + 43535, + 43696, + 43698, + 43887, + 45365, + 45396 + ], + "copy_and_chart_local_ownership_checked": true, + "dirty_readout": { + "319": 1 + }, + "exact_basis_columns": 14, + "forward_direction": { + "1081": -1, + "1467": 1 + }, + "literal_candidate_clocks": [ + 44588, + 44627 + ], + "paid_delta_per_word": { + "1": -1, + "5": -1, + "6": 1 + }, + "ranks": [ + 3, + 8, + 9 + ], + "roles": [ + 198, + 205, + 319, + 532, + 652, + 654, + 962, + 969, + 1081, + 1250, + 1303, + 1305, + 1453, + 1467 + ], + "scope": "Local normalized rational block, literal chart availability and nesting. Absolute Gaussian phase and whole caller separate.", + "status": "PASS_INDEPENDENT_319_BLOCK", + "window": [ + 44616, + 45718 + ], + "word_sha256": [ + "0358b9f6e0340fb3e5aa46c747c558b32a5280cbf9cd92c3b9de627dd18a9a4f", + "9aa8d6b054ba7eb2289d052c1079b16be518d2f0fbfb244569fa18e3733acdac" + ], + "wrong_sign_and_omitted_readout_rejected": true +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/ADMITTED.json b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/ADMITTED.json new file mode 100644 index 0000000000..464c89e45c --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/ADMITTED.json @@ -0,0 +1,58 @@ +{ + "assumptions": [ + "native_all_columns", + "owned_erasure", + "compiler", + "precision_tape", + "analytic_recovery" + ], + "base": "e54523517d0f03e58352e647c403a5af3e525a57", + "caller": "07a76c5e2738882c0cb322278e56f6cae3c9885d", + "caller_sha256": "255d89f38cd45e38e5770f559bc43dc217e989032359768cdc7e8cdfd64b47bc", + "crossing": [ + "0.00364665195644044790699554028334161", + "0.00364665195644044790699554028334162" + ], + "end": "2026-11-11T23:04:43Z", + "exit": 0, + "head": "aaeec8c0acf01e99a5f331ef363a698d9c084ace", + "hosted_at_admission": "plan and historical success; candidate replay in progress", + "inputs": { + "EARLY-RESULT.json": "ad1ca9b2e2febbf80d9bf8b6ceef14ff90fcc29ef9358310e551628eb1706649", + "INPUTS.json": "abedac59097a1c35c27d91cbdb07207bc562a64743bc406d13c94a8bc970592d", + "NATIVE-RESULT.json": "c6d1b00a83185ab0062397b363258b1f3f6685d755e9c1d4f7d3e7e511240812", + "PROPOSED-CLAIM.json": "6e31241944c123d2bd4aa8bc94d833b44b3d889bd6d9aafc579108f416b45f03", + "RESULT.json": "7f2d587c59f063b01f1e8b320084a7f0943f2f05d65e3e0f5e80448c6c8e8194", + "SOURCES.json": "ac7b4473035af648d6073e78b6c39675e706e8194b346bb55ed62a0adc81d593", + "VERIFY.json": "ede7dd2dd3733b9a73f72af9dd7edfe819b49b859c5c76e227ec82cb9c220513", + "WORD.json.gz": "4b9fd1187b34ed97c3ac0c760d73531735a5d0ebc5b4d4ab4377160b20d9bb2a" + }, + "kappa": "0.00364665195644", + "ours": "0", + "peer_gain": "0.000000430519994", + "prior_kappa": "0.003646221436446", + "receipt": { + "peer-prep/IDENTITIES.json": "f4d3f6ca2d87f8cd68c01ac9f77b69bd5a796f92bd567cea8afe3ac7c72e8e4b", + "peer-prep/STATIC.json": "500cc563b7dac8b1de1faf1dee9b820e73152dfddc15a650cd1191edd39e8c79", + "peer-price/RANK-STOCK.json": "4a7841699dd17688f6aada5c902a2a91e94558b2b1b4460c46b0e55aa95b3f9f", + "peer-price/READBACK.json": "337668788fb39ec9575887f9c5faf438a880471f78d936357dabf7deeac5de82", + "peer/COMMAND.txt": "714bfab024155d8216f3ef99f3ee7627ddc35ab341c486ac6bd53c476b757130", + "peer/COMMIT.stdout": "597470d8132a3812deb3624a859546c0c13d52b094fd6fc61e7416941130bd70", + "peer/END-UTC.txt": "9c46923c616c14da5b8ed503e1652021d7bd409a10ec91a78a03263013fba08a", + "peer/METADATA.stdout": "5873404cb4424dca918a00d503569f3c29a3190fd029a007e1afb2006399f647", + "peer/RUN.exit": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "peer/RUN.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "peer/RUN.stdout": "d589626c7581fbb9928bc615364cfee49deb62dfc0a39a903417ca62be89cf8c", + "peer/START-UTC.txt": "5b78fd6d42a2b42206891318c08e6014de57d7ca46b0201cd11a166f452210f7" + }, + "source_history": "exact anchored base and recursive package provenance, sparse shallow stock wrapper not executed", + "stages": { + "caller": "PASS_HELPER_319_FUSED_CALLER 91166298911/25000000000000", + "early": "PASS_HELPER_319_EXACT_NATIVE_AND_SIGNED_PRICE 0.00364665195644", + "frontier": "PASS_HELPER_319_FUSED_FRONTIER_PROPOSAL 91166298911/25000000000000", + "native": "PASS_HELPER_319_FUSED_NATIVE 3646017316711/1000000000000000" + }, + "start": "2026-11-11T22:54:48Z", + "status": "independently_reproduced_comparable", + "tree": "fa98712a459b20c10240450097c87de433f8a750" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/PR7319-SHA256.json b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/PR7319-SHA256.json new file mode 100644 index 0000000000..3a28905e8d --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/PR7319-SHA256.json @@ -0,0 +1,6 @@ +{ + "COMPARE.json": "58d851ca486ec84ea0d1f063eb427ed0204b1b1e49219376d0ab20f6692e043e", + "CONTACT.json": "6d6cb681db29501aec002bd620514b4c48db03424243bf71686ba023dd8d6507", + "PRICE.json": "8d70669e720faabc932366dafbc1bd1fdaef6f088c4eb02b0ea3707ba309ab53", + "REVERSE.json": "bf353b3e05d0bf5fe3e49c15673c4cb9203251329bd594009303541cf7fecc09" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/READBACK.json b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/READBACK.json new file mode 100644 index 0000000000..625b508eea --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/READBACK.json @@ -0,0 +1,188 @@ +{ + "assumptions": [ + "native_all_columns", + "owned_erasure", + "compiler", + "precision_tape", + "analytic_recovery" + ], + "bit_admitted": "12039/3125000", + "bit_claim_headroom": "3000951089/25000000000000", + "bit_premise": "376669/100000000", + "caller_head": "07a76c5e2738882c0cb322278e56f6cae3c9885d", + "claim": "91166298911/25000000000000", + "context_c": 2430, + "context_headroom": 1666, + "copies": 17, + "directed_bounds": { + "new_at_claim": [ + "347195197206460540909548691538238227127/2000000000000000000000000000000000000000000000000", + "1735975986032302704547743457691191192207/10000000000000000000000000000000000000000000000000" + ], + "new_at_old_crossing_upper": [ + "333717954993733063339209580360321337006028706669/2000000000000000000000000000000000000000000000000", + "1668589774968665316696047901801606685030143589709/10000000000000000000000000000000000000000000000000" + ], + "new_at_raw_lower": [ + "8890529086421014119/10000000000000000000000000000000000000000000000000", + "8890529086421080299/10000000000000000000000000000000000000000000000000" + ], + "new_at_raw_upper": [ + "-29866980917152322049/10000000000000000000000000000000000000000000000000", + "-29866980917152266101/10000000000000000000000000000000000000000000000000" + ], + "new_at_tested": [ + "1464673416007288863003441470091977383033/10000000000000000000000000000000000000000000000000", + "1464673416007288863003441470091977438357/10000000000000000000000000000000000000000000000000" + ], + "old_at_claim": [ + "-1668785950738799647054310634446839861363893886031/10000000000000000000000000000000000000000000000000", + "-66751438029551985882172425377873594454555753177/400000000000000000000000000000000000000000000000" + ], + "old_at_old_crossing_upper": [ + "-357270001119021587349/10000000000000000000000000000000000000000000000000", + "-357270001119021530951/10000000000000000000000000000000000000000000000000" + ] + }, + "empty_root_credits": 0, + "exact_gain": "215259997/500000000000000", + "exact_relative_percent": "21525999700/1823110718223", + "head": "aaeec8c0acf01e99a5f331ef363a698d9c084ace", + "incumbent": "1823110718223/500000000000000", + "main_boundaries": 104, + "native_grid": [ + 1125, + 25 + ], + "native_ingredient_claim": "3646017316711/1000000000000000", + "new_raw_interval": [ + "364665195644044790699554028334161/100000000000000000000000000000000000", + "182332597822022395349777014167081/50000000000000000000000000000000000" + ], + "old_raw_upper": "36462214364462343366888845568981/10000000000000000000000000000000000", + "ordinary": 782715464, + "ordinary_delta": 52088, + "ordinary_headroom": 217284536, + "outer_functional": 4, + "outer_strict": 54, + "outer_strict_slack": "299635334804355997/10000000000000000000000000000000000", + "owned_lifetimes": 73, + "owned_peak": 50, + "paid": { + "1": 68384, + "2": 14501, + "3": 14093, + "4": 3791, + "5": 5865, + "6": 238, + "7": 170, + "8": 741, + "9": 32, + "16": 416, + "24": 416, + "32": 416, + "40": 416, + "48": 416, + "56": 416, + "64": 208 + }, + "paid_delta": { + "1": -17, + "5": -17, + "6": 17 + }, + "paid_positions": 110519, + "parent": "9d0119eb12fbd9fa534b48cd37b68e7099757b91", + "path_pins": { + "dependencies/7298/pricing.py": { + "sha256": "f4d0b6c9314b838d882d6d06020f24881c19a3fda97a7c00df87b1e920785182" + }, + "dependencies/7314/NATIVE-RESULT.json": { + "sha256": "336f463da5afe5b60bfd3b9f0ce8aeea5a5feb1f854613bf4218ba0b28b3371b" + }, + "dependencies/7314/PROPOSED-CLAIM.json": { + "sha256": "41a08c4b7d0b2de4af22bc778948a143027eb3065fff47b0400b6ded1cc52778" + }, + "dependencies/7314/RESULT.json": { + "sha256": "432191ca572c9221935787ebe392699e3a1ef4512b0bf4fbc704657321cc87ca" + }, + "dependencies/round65/price.json": { + "sha256": "25205ad2cf4230bd2b2b704eec9f96ec4a5486fd575b5599861b28ffdd15b00b" + }, + "receipts/EARLY-RESULT.json": { + "git_blob": "675d6cf2374f3384019dfd53b2bdffd845005f13", + "sha256": "ad1ca9b2e2febbf80d9bf8b6ceef14ff90fcc29ef9358310e551628eb1706649" + }, + "receipts/INPUTS.json": { + "git_blob": "95c53f4594287a72d9b586f10ee136d0a1686984", + "sha256": "abedac59097a1c35c27d91cbdb07207bc562a64743bc406d13c94a8bc970592d" + }, + "receipts/NATIVE-RESULT.json": { + "git_blob": "eb101307d4d0399efed96d88cf6d4c01ec9c7369", + "sha256": "c6d1b00a83185ab0062397b363258b1f3f6685d755e9c1d4f7d3e7e511240812" + }, + "receipts/PROOF.md": { + "git_blob": "7644e5571d583183ee93b686612b5ec4555f6911", + "sha256": "560de573bfd4563c16ca3c7308fa729b4188fabe802d8830f343c3873f75b59d" + }, + "receipts/PROPOSED-CLAIM.json": { + "git_blob": "6b491894580741e3e2c11a453722a0302db7b5d6", + "sha256": "6e31241944c123d2bd4aa8bc94d833b44b3d889bd6d9aafc579108f416b45f03" + }, + "receipts/README.md": { + "git_blob": "b3a055f4e0d334ce2e7df3310caaa0849eb3eba1", + "sha256": "b4db0eb83ab6a2f7151bed2da955a487f4816ec9d1976eccc21e54c2725490b0" + }, + "receipts/REFERENCE.json": { + "git_blob": "8859e243cc39546bcb1e257d95c19a658c455dc7", + "sha256": "3e66e054b803551f18b8670da0b2990a7d0eeb689dfc45b56dbcba295551da70" + }, + "receipts/REPLAY.txt": { + "git_blob": "0b8d8048c18740060f4b7f6d380a5f3a0f30ee53", + "sha256": "230984f4b8206ae4d0c0f18fbba86ff43a1a9623f8ed337cf1285360f9a67c0c" + }, + "receipts/RESULT.json": { + "git_blob": "3034a490f5b0656ae71495c99493c4ab1ac1f5c6", + "sha256": "7f2d587c59f063b01f1e8b320084a7f0943f2f05d65e3e0f5e80448c6c8e8194" + }, + "receipts/SOURCES.json": { + "git_blob": "6b97e903a6df8de437068a0e2907823885928053", + "sha256": "ac7b4473035af648d6073e78b6c39675e706e8194b346bb55ed62a0adc81d593" + }, + "receipts/VERIFY.json": { + "git_blob": "cc98ee2a5c5a79e670094a6f55c7cacda8fd330c", + "sha256": "ede7dd2dd3733b9a73f72af9dd7edfe819b49b859c5c76e227ec82cb9c220513" + }, + "receipts/construct.py": { + "git_blob": "89e923bd738dfc404ca76b7ae36f13844ac4bfbb", + "sha256": "ecb39578063d7f09153a85370a3b9bb7cbf8b36ff9891033a1cce7a2fe7f7fda" + } + }, + "physical_maps": 3037, + "productive_fields": 22461, + "rank_surplus": 1424, + "raw_strict_separation": "43051999421357030665572644351/100000000000000000000000000000000000", + "scope": "Exact receipt and directed-price readback. No native or caller execution in this audit.", + "source_archive_sha256": "0589953b3886d96eacf3bda3d38d8d574bb739fba1056af7f32f56047b6061e2", + "targets": { + "1": 306, + "2": 357, + "3": 799, + "4": 3825, + "5": 1360, + "6": 731, + "7": 323, + "8": 544, + "9": 10888, + "17": 416, + "25": 416, + "33": 416, + "41": 416, + "49": 416, + "57": 416, + "65": 416, + "73": 208, + "137": 208 + }, + "tested": "364665195644007/100000000000000000" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/pricing.py b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/pricing.py new file mode 100644 index 0000000000..40ec194017 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/price/inputs/pricing.py @@ -0,0 +1,82 @@ +"""Directed interval arithmetic and the retained signed BIT invoice.""" +from collections import Counter +from fractions import Fraction +from functools import cache + +TARGET = "10018846261809/2500000000000000" +SCALE = 10**49 + + +def rounded(x, upper): + scaled = SCALE*x + if upper: + return Fraction(-((-scaled.numerator) // scaled.denominator), SCALE) + return Fraction(scaled.numerator // scaled.denominator, SCALE) + + +@cache +def log_bounds(x): + z = (x-1)/(x+1) + terms = 60 + exact_partial = 2*sum(z**(2*i+1)/(2*i+1) for i in range(terms)) + tail = 2*z**(2*terms+1)/((2*terms+1)*(1-z*z)) + return rounded(exact_partial, False), rounded(exact_partial+tail, True) + + +@cache +def power_bounds(rank, k): + binary = 2**(rank.bit_length()-1) + shift = binary.bit_length()-1 + l2, u2 = log_bounds(Fraction(2)) + lo, hi = log_bounds(Fraction(rank, binary)) + lo, hi = k*(lo+shift*l2), k*(hi+shift*u2) + assert 0 <= lo <= hi < 1 + + def exponential(z, terms): + total = term = Fraction(1) + for i in range(1, terms+1): + term *= -z/i + total += term + return total + + return rounded(rank*exponential(hi, 35), False), rounded(rank*exponential(lo, 34), True) + + +def cost(hist, k): + lower = upper = Fraction(0) + for r, n in hist.items(): + a, b = (n*x for x in power_bounds(r, k)) + lower += min(a, b) + upper += max(a, b) + return lower, upper + + +def profile(invoice, native, word, ranks): + copies = invoice["native_calls"] + assert copies == len(invoice["native_instances"]) == 36 + assert {tuple((r["stage"], r["copy"])) for r in invoice["native_instances"]} == { + (stage, which) for stage in range(1, 19) for which in (0, 1) + } + assert all(r["ports"] == 111 for r in invoice["native_instances"]) + assert native == Counter({int(r): n for r, n in invoice["native_paid"].items()}) + assert sum(native.values()) == 2871 + caller_paid = {1: 444, **{r: 444 for r in range(7, 57, 7)}} + assert invoice["event_counts"]["QUERY"]*111 == caller_paid[1] + assert invoice["event_counts"]["IDLE_ONE"]*111 == 8*444 + full_paid = Counter({r: copies*n for r, n in native.items()}) + full_paid.update(caller_paid) + + helpers = Counter(ranks[word["final"][j]]-ranks[word["start"][j]] + for j in range(222, word["public"])) + assert helpers == Counter({int(r): n for r, n in invoice["native_helpers"].items()}) + caller_targets = {**{r: 444 for r in range(8, 65, 7)}, 127: 222} + full_targets = Counter({r: copies*n for r, n in helpers.items()}) + full_targets.update(caller_targets) + assert full_paid == Counter({int(r): n for r, n in invoice["paid"].items()}) + assert full_targets == Counter({int(r): n for r, n in invoice["targets"].items()}) + assert sum(full_paid.values()) == invoice["paid_jobs"] + assert sum(full_targets.values()) == invoice["productive_fields"] + signed = full_targets.copy() + signed.subtract(full_paid) + assert sum(r*n for r, n in signed.items()) == invoice["rank_surplus"] + return signed, copies diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/price/quote.py b/research/p104-rank-eight-fixed-paid-bank-bound/price/quote.py new file mode 100644 index 0000000000..88d4fbf161 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/price/quote.py @@ -0,0 +1,70 @@ +"""Preprice fixed-paid rank-eight splits for the 3-to-245 helper cohort.""" +from collections import Counter +from fractions import Fraction as Q +from hashlib import sha256 +import json +from pathlib import Path +from runpy import run_path + +ROOT = Path(__file__).resolve().parent +PINS = { + "inputs/ADMITTED.json": "c95300e9bca27e44a25c82d794f88cbf70757c142806b0e4c590ea29feb81a13", + "inputs/READBACK.json": "337668788fb39ec9575887f9c5faf438a880471f78d936357dabf7deeac5de82", + "inputs/pricing.py": "f4d0b6c9314b838d882d6d06020f24881c19a3fda97a7c00df87b1e920785182", + "inputs/7314-HELPERS.json": "bf353b3e05d0bf5fe3e49c15673c4cb9203251329bd594009303541cf7fecc09", + "inputs/7334-CHANGED.json": "f4d3f6ca2d87f8cd68c01ac9f77b69bd5a796f92bd567cea8afe3ac7c72e8e4b", +} + + +def unique(pairs): + out = dict(pairs) + if len(out) != len(pairs): + raise ValueError("duplicate input key") + return out + + +def main(): + assert __debug__ + data = {} + for name, pin in PINS.items(): + raw = (ROOT / name).read_bytes() + if sha256(raw).hexdigest() != pin: + raise ValueError(f"changed dependency {name}") + if name.endswith(".json"): + data[Path(name).stem] = json.loads(raw, object_pairs_hook=unique) + a, b, h, x = (data[k] for k in ("ADMITTED", "READBACK", "7314-HELPERS", "7334-CHANGED")) + assert a["head"] == b["head"] == "aaeec8c0acf01e99a5f331ef363a698d9c084ace" + assert a["exit"] == 0 and a["caller"] == b["caller_head"] and b["copies"] == 17 + assert len(h["rows"]) == 1101 and h["complete"] and len(x["roles"]) == 14 + protected = set(x["roles"]) | {863, 1355, 1531, 1567, 1568} + cohort = sorted(r["role"] for r in h["rows"] if r["role"] not in protected + and (r["initial"], r["final"], r["old_productive_rank"]) == (3, 245, 8)) + assert len(cohort) == len(set(cohort)) == 15 + paid, target = [Counter({int(k): v for k, v in b[name].items()}) for name in ("paid", "targets")] + old = target.copy() + old.subtract(paid) + assert (sum(paid.values()),sum(target.values()),sum(k*v for k,v in old.items())) == (110519,22461,1424) + assert target[8] >= 17*len(cohort) and not b["empty_root_credits"] + change = {4:34,8:-17} + new = old.copy() + new.update(change) + cost = run_path(str(ROOT/"inputs/pricing.py"))["cost"] + crossing = Q(a["crossing"][1]) + probe = crossing + Q(1,10**9) + moonshot = Q("0.0040075385047236") + assert cost(old,probe)[1] < 0 < cost(new,probe)[0] + def price(k): + delta = cost(change,k) + incumbent = cost(old,k) + return {"old_margin":list(map(str,incumbent)), "gross_one":list(map(str,delta)), + "whole_15_upper":str(15*delta[1]),"complete_15_upper":str(incumbent[1]+15*delta[1])} + print(json.dumps({"head":a["head"],"caller":a["caller"],"pins":PINS,"cohort":cohort, + "word_sha256":a["inputs"]["WORD.json.gz"],"productive_delta":change,"paid_delta":{}, + "incumbent":str(crossing),"probe":str(probe),"moonshot":str(moonshot), + "at_incumbent":price(crossing),"at_target":price(moonshot), + "event_cap":76466,"geometry_runner_seconds":20,"support_cap":16,"support_runner_seconds":25, + "exact_cap":4,"exact_runner_seconds":35,"build_cap":1},indent=2,sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/receipts/SHA256.json b/research/p104-rank-eight-fixed-paid-bank-bound/receipts/SHA256.json new file mode 100644 index 0000000000..1db37e45ef --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/receipts/SHA256.json @@ -0,0 +1,19 @@ +{ + "independent/FOLLOWUP.json": "53906dcd9ee8b8c7b6a3389c2d1e5ff8157a3191a07bb0e3064b0d1f32bc16f5", + "independent/RESULT.json": "95d34e468683aa64e19d3e4d62745b9fc1d4305b00d25054b34bb5a668639b4b", + "input/independent/AGREEMENT.json": "c718a2444821abd8bbb46a8660a4a1f05922a1446c81353d6ed5df86b02e36e3", + "input/independent/PAIRINGS.json": "2b729494affa110063e329b4f50418ec2ad7d2f821425741bbba43dfb049c879", + "input/independent/RESULT.json": "69c694a17e562a6e6534406e252428ca081f8e2ac6673ec01cf21e77cb468b58", + "input/lead/EXACT.json": "362a879401158678c8a30ea0dbd4f919a9a0e907db2d2247ce96ac8724f68b14", + "input/lead/GEOMETRY.json": "c6f9f018df8b58fcdf4f44356bd59bcac6d411b7845104ff4ad372ed4a95cfbd", + "input/lead/REMAINING.json": "3597499663a57702856945e91214a65e1d0f94db8643b93c0234c2bbf9291b1a", + "input/lead/RESULT.json": "45b6c8992dcff04b7252dfec809fc64812b86f094531ed3964ff967408057ed2", + "input/lead/SELECTION.json": "b95765ffa0bd426b3dae781aaafc1c21e3b25bcebc71b71a3871824f9009fd5f", + "input/lead/SUFFIX.json": "77d78eb692bf6d3f0433730b48dbf8a0178c3288eeca961f94b2aaa6683eb59a", + "input/price/PRICE.json": "a78be64c3e3ae8a0e532237c4dd3541aa9ad3fcbbc3c25d79c8a03fb7e07c525", + "lead/CONTINUATION.json": "1f1b1db497436811c3d18219a2277fff6fedc8ad19b7e3c4a486fdfc53c7907a", + "lead/EXACT.json": "d2d034cb496ddbafdfcdcfe5a4fcb1e0a08c8349d2310c397e5fcb61b670f1d4", + "lead/SELECTION.json": "53f3a3b08bd6e97514e7077e7c0b55c9d272b0527f3a1b0e415f0924514fddf1", + "modular/AGREEMENT.json": "8b7fa3c3f7812c116e652cb7eefd571eeffb495e2c750309b553c457b1dfadc2", + "modular/RESULT.json": "6710e8711907a0c8412660696cf821e69fdc42bebf7fc24689fc3385fe7aabf3" +} diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/receipts/UNRESOLVED.json b/research/p104-rank-eight-fixed-paid-bank-bound/receipts/UNRESOLVED.json new file mode 100644 index 0000000000..7dbe8d9e30 --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/receipts/UNRESOLVED.json @@ -0,0 +1,118 @@ +[ + [ + 40244, + 242 + ], + [ + 40245, + 242 + ], + [ + 40246, + 242 + ], + [ + 40247, + 242 + ], + [ + 40248, + 242 + ], + [ + 41741, + 242 + ], + [ + 45267, + 242 + ], + [ + 45268, + 242 + ], + [ + 45270, + 242 + ], + [ + 45273, + 242 + ], + [ + 45277, + 242 + ], + [ + 45435, + 242 + ], + [ + 45467, + 242 + ], + [ + 45468, + 242 + ], + [ + 45469, + 242 + ], + [ + 45470, + 242 + ], + [ + 45471, + 242 + ], + [ + 45472, + 242 + ], + [ + 45676, + 1091 + ], + [ + 45677, + 1091 + ], + [ + 45678, + 1091 + ], + [ + 45679, + 1091 + ], + [ + 45680, + 1091 + ], + [ + 45681, + 1091 + ], + [ + 45682, + 1091 + ], + [ + 45683, + 1091 + ], + [ + 45684, + 1091 + ], + [ + 45685, + 1091 + ], + [ + 45686, + 1091 + ] +] diff --git a/research/p104-rank-eight-fixed-paid-bank-bound/replay.py b/research/p104-rank-eight-fixed-paid-bank-bound/replay.py new file mode 100644 index 0000000000..aa2033245f --- /dev/null +++ b/research/p104-rank-eight-fixed-paid-bank-bound/replay.py @@ -0,0 +1,250 @@ +"""Regenerate the two bounded rank-eight cochart screens and verify every receipt.""" +from argparse import ArgumentParser +from fractions import Fraction +from gzip import decompress +from hashlib import sha1, sha256 +from json import loads +from pathlib import Path, PurePosixPath +from shutil import copyfile, copytree +from subprocess import run +import sys +from tempfile import TemporaryDirectory + +HERE = Path(__file__).resolve().parent +HEAD = "aaeec8c0acf01e99a5f331ef363a698d9c084ace" +WORD = "7334-WORD.json.gz" + + +def unique(pairs): + obj = dict(pairs) + if len(obj) != len(pairs): + raise ValueError("duplicate JSON key") + return obj + + +def decode(raw): + return loads(raw, object_pairs_hook=unique) + + +def digest(raw): + return sha256(raw).hexdigest() + + +def relpath(name): + path = PurePosixPath(name) + if path.is_absolute() or path.as_posix() != name or ".." in path.parts: + raise ValueError("invalid package path: " + name) + return path + + +def authenticate(): + pins = decode((HERE / "LOCAL-PINS.json").read_bytes()) + for name, expected in pins.items(): + if digest((HERE / relpath(name)).read_bytes()) != expected: + raise ValueError("changed dependency: " + name) + provenance = decode((HERE / "PROVENANCE.json").read_bytes()) + for name, source in provenance["files"].items(): + raw = (HERE / relpath(name)).read_bytes() + assert pins[name] == source["sha256"] == digest(raw) + assert sha1(f"blob {len(raw)}\0".encode() + raw).hexdigest() == source["git_blob"] + for name, source in provenance["derived_inputs"].items(): + receipt = decode((HERE / relpath(source["receipt"])).read_bytes()) + for key in source["keys"]: + receipt = receipt[key] + if source.get("compression") == "gzip": + raw = decompress((HERE / relpath(name)).read_bytes()) + assert digest(raw) == receipt + else: + assert pins[name] == receipt + + +def command(script, *args, timeout=35, cwd=None, check=True): + return run([sys.executable, "-I", "-B", str(script), *map(str, args)], + capture_output=True, check=check, timeout=timeout, cwd=cwd) + + +def install(source, destination): + destination.parent.mkdir(parents=True, exist_ok=True) + copyfile(source, destination) + + +def rational_engine(destination, version): + suite = HERE / "engines/rational" + install(suite / f"{version}_independent.py", destination) + for name in ("exact_six.py", "rolling_exterior.py"): + install(suite / name, destination.parent / "reused" / name) + + +def rational_agreement(primary, independent, expected_counts): + rows = [row for result in independent for row in result["results"]] + assert len(rows) == len(primary["results"]) == 4 and not primary["selected_unresolved"] + assert all(not receipt["timeout"] and not receipt["selected_unvisited"] for receipt in independent) + assert primary["counts"] == expected_counts + for p, q in zip(primary["results"], rows, strict=True): + assert all(p[k] == q[k] for k in ("key", "public", "owned", "pivots")) + assert p["pure_prefix_dimension"] == q["prefix_nullity"] == 1 + assert p["nonzero_prefix_images"] == q["nonzero_prefix_basis_images"] + if p["status"] == "no unit pairing": + assert q["status"] == "no_exact_unit_pair" + assert p["pure_suffix_dimension"] == q["suffix_nullity"] == 1 + assert p["nonzero_suffix_images"] == q["nonzero_suffix_basis_images"] == 1 + assert q["cut_pairing_matrix"] == q["endpoint_pairing_matrix"] == [["0"]] + else: + assert p["status"] == "no nonzero pure prefix" + assert q["key"] == [45675, 1091] and q["owned"] == [1564, 1565] + assert q["status"] == "no_nonzero_pure_prefix" + assert q["nonzero_prefix_basis_images"] == 0 + assert q["prefix_pure_basis"][0]["a"] and not q["prefix_pure_basis"][0]["c"] + return [row["key"] for row in rows] + + +def replay(scratch, output): + authenticate() + expected = decode((HERE / "receipts/SHA256.json").read_bytes()) + generated = set() + + def record(name, raw): + if digest(raw) != expected[name]: + raise ValueError(f"changed receipt: {name}: {digest(raw)}") + assert name not in generated + generated.add(name) + destination = scratch / relpath(name) + destination.parent.mkdir(parents=True, exist_ok=True) + destination.write_bytes(raw) + return decode(raw) + + def stage(name, script, *args, timeout=35): + return record(name, command(script, *args, timeout=timeout).stdout) + + old = scratch / "input" + copytree(HERE / "inputs", old / "inputs") + old_engines = HERE / "engines/r96" + new_engines = HERE / "engines/r97" + rational = HERE / "engines/rational" + copytree(HERE / "price", old / "price") + compressed_census = old / "price/inputs/7314-HELPERS.json.gz" + compressed_census.with_suffix("").write_bytes(decompress(compressed_census.read_bytes())) + price = stage("input/price/PRICE.json", old / "price/quote.py", timeout=10) + assert price["head"] == HEAD and len(price["cohort"]) == 15 + assert price["productive_delta"] == {"4": 34, "8": -17} and not price["paid_delta"] + assert 0 < Fraction(price["at_incumbent"]["gross_one"][0]) < Fraction(price["at_incumbent"]["gross_one"][1]) < 1 + assert Fraction(price["at_target"]["complete_15_upper"]) < Fraction("-134.1394") + + geometry = stage("input/lead/GEOMETRY.json", old_engines / "geometry.py", old, timeout=20) + assert geometry["status"] == "EXHAUSTED" and geometry["visited_events"] == 76466 + assert geometry["eligible_bank_count"] == 326 and geometry["eligible_chart_count"] == 3 + assert {key[1] for key in geometry["all_representative_keys"]} == {242, 772, 1091} + prefix = stage("input/lead/RESULT.json", old_engines / "prefix.py", old, timeout=25) + assert prefix["counts"] == {"excluded": 9, "rank drop": 7} and not prefix["unvisited"] + suffix = stage("input/lead/SUFFIX.json", old_engines / "suffix.py", old, timeout=20) + assert suffix["counts"] == {"excluded": 1, "rank drop": 6} and not suffix["unvisited"] + stage("input/lead/SELECTION.json", old_engines / "select.py", old, timeout=10) + initial_exact = stage("input/lead/EXACT.json", old_engines / "exact_four.py", old) + assert initial_exact["counts"] == {"no unit pairing": 4} and not initial_exact["selected_unresolved"] + remaining = stage("input/lead/REMAINING.json", old_engines / "freeze_remaining.py", old, timeout=10) + assert remaining["unresolved"] == 312 and remaining["excluded"] == 14 + + first_rational = old / "independent" + first_sources = {"PRICE.json": old / "price/PRICE.json", WORD: old / "inputs" / WORD} + for name, label in (("GEOMETRY", "GEOMETRY"), ("SELECTION", "SELECTION"), + ("SUFFIX", "SUFFIX"), ("PRIMARY", "EXACT")): + first_sources[f"{name}.json"] = old / "lead" / f"{label}.json" + for name, path in first_sources.items(): + install(path, first_rational / "inputs" / name) + rational_engine(first_rational / "exact_four.py", "r96") + stage("input/independent/RESULT.json", first_rational / "exact_four.py") + agreed = stage("input/independent/AGREEMENT.json", rational / "r96_compare.py", + "--primary", first_rational / "inputs/PRIMARY.json", + "--independent", first_rational / "RESULT.json", timeout=10) + assert agreed["agree"] + obstruction = first_rational / "pairing_obstruction.py" + install(rational / "r96_pairing_obstruction.py", obstruction) + initial_forms = stage("input/independent/PAIRINGS.json", obstruction) + assert len(initial_forms["results"]) == 4 + assert all(row["cut_pairing"] == row["endpoint_pairing"] == "0" for row in initial_forms["results"]) + + continued = stage("lead/CONTINUATION.json", old_engines / "continue_modular.py", old, timeout=25) + assert continued["counts"] == {"prefix_exclusion": 279, "dual_drop": 31} + second_prime = new_engines / "second_prime.py" + modular = scratch / "modular" + for name in ("PRICE.json", WORD, "GEOMETRY.json", "REMAINING.json"): + source = first_sources[name] if name in first_sources else old / "lead" / name + install(source, modular / "inputs" / name) + other = stage("modular/RESULT.json", second_prime, "--root", modular, timeout=25) + assert other["complete"] and other["counts"] == continued["counts"] + modular_agreement = stage("modular/AGREEMENT.json", new_engines / "modular_compare.py", scratch, timeout=10) + assert modular_agreement["matched"] == 310 and modular_agreement["moduli"] == [65521, 65537] + + install(old_engines / "exact_four.py", old / "lead/exact_four.py") + frozen = command(new_engines / "freeze.py", timeout=10, cwd=scratch) + assert frozen.stdout.decode().strip() == expected["lead/SELECTION.json"] + selection_file = scratch / "lead/SELECTION.json" + selection = record("lead/SELECTION.json", selection_file.read_bytes()) + primary = stage("lead/EXACT.json", scratch / "lead/exact_four.py", old) + + second_rational = scratch / "independent" + rational_engine(second_rational / "exact_pairing.py", "r97") + for name, source in (("PRICE.json", first_sources["PRICE.json"]), (WORD, first_sources[WORD]), + ("REMAINING.json", old / "lead/REMAINING.json"), + ("PREFIX.json", old / "lead/RESULT.json"), ("SUFFIX.json", old / "lead/SUFFIX.json")): + install(source, second_rational / "inputs" / name) + independent_source = second_rational / "exact_pairing.py" + inherited = stage("independent/RESULT.json", independent_source) + follow_args = ("--only-followup", "--followup", selection_file, + "--followup-sha", expected["lead/SELECTION.json"]) + followup = stage("independent/FOLLOWUP.json", independent_source, *follow_args, timeout=34) + exact_keys = rational_agreement(primary, (inherited, followup), + {"no unit pairing": 3, "no nonzero pure prefix": 1}) + assert exact_keys == [row["key"] for row in selection["selected"]] + unresolved = decode((HERE / "receipts/UNRESOLVED.json").read_bytes()) + assert unresolved == selection["unselected"] == primary["unselected"] + assert len(unresolved) == len(set(map(tuple, unresolved))) == 29 + + def keys(rows, status, field="disposition"): + return {tuple(row["key"]) for row in rows if row[field] == status} + + excluded_sets = ( + keys(prefix["rows"], "excluded"), + keys(suffix["rows"], "excluded"), + keys(initial_exact["results"], "no unit pairing", "status"), + keys(continued["rows"], "prefix_exclusion", "status"), + set(map(tuple, exact_keys)), + ) + exclusions = set.union(*excluded_sets) + assert len(exclusions) == sum(map(len, excluded_sets)) == 297 + assert not exclusions.intersection(map(tuple, unresolved)) + assert exclusions | set(map(tuple, unresolved)) == set(map(tuple, geometry["all_representative_keys"])) + + damaged_selection = scratch / "bad-selection.json" + damaged_selection.write_bytes(selection_file.read_bytes() + b"\n") + negative = command(independent_source, "--only-followup", "--followup", damaged_selection, + "--followup-sha", expected["lead/SELECTION.json"], timeout=10, check=False) + assert negative.returncode == 1 and b"Changed input bad-selection.json" in negative.stderr and not negative.stdout + for name in ("REMAINING.json", WORD): + target = modular / "inputs" / name + original = target.read_bytes() + target.write_bytes(original + b"\n") + try: + bad = command(second_prime, "--root", modular, timeout=10, check=False) + assert bad.returncode == 1 and b"changed dependency:" in bad.stderr and not bad.stdout + finally: + target.write_bytes(original) + + assert generated == set(expected) + if output: + for name in sorted(generated): + install(scratch / relpath(name), output / relpath(name)) + print("PASS_P104_RANK_EIGHT_FIXED_PAID banks=326 excluded=297 unresolved=29 receipts=17") + + +def main(): + assert __debug__ and sys.version_info[:2] == (3, 12) + parser = ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, help="Optional root for regenerated JSON receipts") + args = parser.parse_args() + with TemporaryDirectory(prefix="rank-eight-replay-") as temporary: + replay(Path(temporary), args.output) + + +if __name__ == "__main__": + main()