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 a9637b6dc4d81bfe415b106575d52af5134c5518 Mon Sep 17 00:00:00 2001 From: ToikY <27568617+ToikY@users.noreply.github.com> Date: Wed, 11 Nov 2026 07:19:46 -0800 Subject: [PATCH 3/3] Bound balanced BIT chart retargeting Credit #7001, #7209, #7244, #7258, #7260, #7264, #7271, #7272, #7273 and #7275. OpenAI Codex and subagents materially assisted the proof and replay. --- .../bit-balanced-retarget-bound/AUDIT.json | 132 + research/bit-balanced-retarget-bound/LICENSE | 201 + research/bit-balanced-retarget-bound/NOTICE | 20 + .../bit-balanced-retarget-bound/NOTICE-7001 | 26 + .../bit-balanced-retarget-bound/NOTICE-7244 | 13 + .../bit-balanced-retarget-bound/NOTICE-7271 | 21 + .../bit-balanced-retarget-bound/NOTICE-7272 | 20 + .../bit-balanced-retarget-bound/NOTICE-7273 | 18 + .../bit-balanced-retarget-bound/NOTICE-7275 | 19 + .../PEER-BIT-BLOBS.txt | 8 + research/bit-balanced-retarget-bound/PROOF.md | 33 + .../PROVENANCE.tsv | 28 + .../bit-balanced-retarget-bound/README.md | 28 + .../bit-balanced-retarget-bound/REPLAY.sha256 | 23 + .../bit-balanced-retarget-bound/RESULT.json | 1155 + .../bit-balanced-retarget-bound/SOURCES.json | 18 + .../bit-balanced-retarget-bound/SOURCES.tsv | 21 + .../bit-balanced-retarget-bound/TASK.json | 77 + .../bit-balanced-retarget-bound/VERIFY.json | 20 + research/bit-balanced-retarget-bound/audit.py | 345 + .../inputs/pr7209/RESULT.json | 3539 +++ .../inputs/pr7209/verify.py | 347 + .../inputs/pr7244/PROPOSED-CLAIM.json | 65 + .../inputs/pr7258/SUMMARY.json | 159 + .../paired-query-only-bit/EFREE-RESULT.json | 19787 ++++++++++++++++ .../independent/interval_gate.py | 127 + .../retained/inputs/BIT-NATIVE-WORD.json.gz | Bin 0 -> 111747 bytes .../predecessor/bit-price/verify.py | 77 + .../predecessor/round22/SOURCES.tsv | 6 + .../predecessor/round22/verify.py | 398 + .../predecessor/round23/SOURCES.tsv | 9 + .../predecessor/round23/verify.py | 272 + .../predecessor/round24/SOURCES.tsv | 13 + .../predecessor/round24/verify.py | 264 + .../predecessor/round25/AUDIT.json | 1 + .../predecessor/round25/SOURCES.tsv | 18 + .../predecessor/round25/audit.py | 191 + .../predecessor/round25/verify.py | 310 + .../bit-balanced-retarget-bound/replay.py | 145 + .../bit-balanced-retarget-bound/verify.py | 162 + 40 files changed, 28116 insertions(+) create mode 100644 research/bit-balanced-retarget-bound/AUDIT.json create mode 100644 research/bit-balanced-retarget-bound/LICENSE create mode 100644 research/bit-balanced-retarget-bound/NOTICE create mode 100644 research/bit-balanced-retarget-bound/NOTICE-7001 create mode 100644 research/bit-balanced-retarget-bound/NOTICE-7244 create mode 100644 research/bit-balanced-retarget-bound/NOTICE-7271 create mode 100644 research/bit-balanced-retarget-bound/NOTICE-7272 create mode 100644 research/bit-balanced-retarget-bound/NOTICE-7273 create mode 100644 research/bit-balanced-retarget-bound/NOTICE-7275 create mode 100644 research/bit-balanced-retarget-bound/PEER-BIT-BLOBS.txt create mode 100644 research/bit-balanced-retarget-bound/PROOF.md create mode 100644 research/bit-balanced-retarget-bound/PROVENANCE.tsv create mode 100644 research/bit-balanced-retarget-bound/README.md create mode 100644 research/bit-balanced-retarget-bound/REPLAY.sha256 create mode 100644 research/bit-balanced-retarget-bound/RESULT.json create mode 100644 research/bit-balanced-retarget-bound/SOURCES.json create mode 100644 research/bit-balanced-retarget-bound/SOURCES.tsv create mode 100644 research/bit-balanced-retarget-bound/TASK.json create mode 100644 research/bit-balanced-retarget-bound/VERIFY.json create mode 100644 research/bit-balanced-retarget-bound/audit.py create mode 100644 research/bit-balanced-retarget-bound/inputs/pr7209/RESULT.json create mode 100644 research/bit-balanced-retarget-bound/inputs/pr7209/verify.py create mode 100644 research/bit-balanced-retarget-bound/inputs/pr7244/PROPOSED-CLAIM.json create mode 100644 research/bit-balanced-retarget-bound/inputs/pr7258/SUMMARY.json create mode 100644 research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/EFREE-RESULT.json create mode 100644 research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/independent/interval_gate.py create mode 100644 research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz create mode 100644 research/bit-balanced-retarget-bound/predecessor/bit-price/verify.py create mode 100644 research/bit-balanced-retarget-bound/predecessor/round22/SOURCES.tsv create mode 100644 research/bit-balanced-retarget-bound/predecessor/round22/verify.py create mode 100644 research/bit-balanced-retarget-bound/predecessor/round23/SOURCES.tsv create mode 100644 research/bit-balanced-retarget-bound/predecessor/round23/verify.py create mode 100644 research/bit-balanced-retarget-bound/predecessor/round24/SOURCES.tsv create mode 100644 research/bit-balanced-retarget-bound/predecessor/round24/verify.py create mode 100644 research/bit-balanced-retarget-bound/predecessor/round25/AUDIT.json create mode 100644 research/bit-balanced-retarget-bound/predecessor/round25/SOURCES.tsv create mode 100644 research/bit-balanced-retarget-bound/predecessor/round25/audit.py create mode 100644 research/bit-balanced-retarget-bound/predecessor/round25/verify.py create mode 100644 research/bit-balanced-retarget-bound/replay.py create mode 100644 research/bit-balanced-retarget-bound/verify.py diff --git a/research/bit-balanced-retarget-bound/AUDIT.json b/research/bit-balanced-retarget-bound/AUDIT.json new file mode 100644 index 0000000000..dbb5edafe0 --- /dev/null +++ b/research/bit-balanced-retarget-bound/AUDIT.json @@ -0,0 +1,132 @@ +{ + "arrivals": 545, + "balanced_selections_including_identity": 1024, + "disjoint_exchange_blocks": 10, + "input_pins": { + "bit-price/RESULT.json": "3583ea672516c4def2d3973fcc5fd75e8903c2ad9f6c7154df4df1fd1bb349c7", + "bit-price/verify.py": "2a6eac8cdfd1c7d3a6caafca1adf103ebf84b3af26be214b99911fc4155f474c", + "pr7209/RESULT.json": "0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1", + "pr7209/verify.py": "e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94", + "pr7244/PROPOSED-CLAIM.json": "14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688", + "pr7258/SUMMARY.json": "b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0", + "research/paired-query-only-bit/EFREE-RESULT.json": "a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b", + "research/paired-query-only-bit/independent/interval_gate.py": "8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec", + "research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz": "51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78", + "round22/RESULT.json": "6f4c3afc1185668de6e98ea1608170ae9db8ee5c2c5318b5d5a6577d609252e3", + "round22/SOURCES.tsv": "963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6", + "round22/verify.py": "6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948", + "round23/RESULT.json": "16863072b372547b6a062210da4d338704ce680ec22cd5e4e6702560c93a1bf7", + "round23/SOURCES.tsv": "a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2", + "round23/verify.py": "b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2", + "round24/RESULT.json": "1acd03fec0213cda8c44f4914c4c0b0c2e2124d7a0dc0586689e80bbc0fb8646", + "round24/SOURCES.tsv": "d60d52cfb3f4ee7db18fac70cf94e93bae94e22974fcbc59403b353541bdab15", + "round24/verify.py": "80e4ca5de690c76b266888a9307874d07a4f90c11bba4e42f87ddb45f9221380", + "round25/RESULT.json": "42d7c43180690bcbd062fe011d3e4a0f12305d952e823afb34a1f76a4872b82b", + "round25/SOURCES.tsv": "f7d91bad2f7fb645e7d931a9aaeb1e572ed864c7d6057eae53c2f6eefa05a7e9", + "round25/verify.py": "4fb801c8219cf4f356b9eab7108a8f2497cc3bc49b089d87086b8ba3c8b13a84" + }, + "modes": { + "literal": { + "cyclic_arcs": 20, + "directed_price": { + "10018846261809/2500000000000000": [ + { + "h": 0, + "needed_singleton_expansions": 7, + "signed_upper": "-1772004970039110113046716152320388521663/1250000000000000000000000000000000000000", + "stock_upper": 14 + }, + { + "h": 1, + "needed_singleton_expansions": 5, + "signed_upper": "-1439655708336061151487016912281048710127/1250000000000000000000000000000000000000", + "stock_upper": 16 + }, + { + "h": 2, + "needed_singleton_expansions": 4, + "signed_upper": "-1107306446633012189927317672241708898591/1250000000000000000000000000000000000000", + "stock_upper": 18 + } + ], + "1002040748181/250000000000000": [ + { + "h": 0, + "needed_singleton_expansions": 8, + "signed_upper": "-8253003816815430250175871108279786227889/5000000000000000000000000000000000000000", + "stock_upper": 14 + }, + { + "h": 1, + "needed_singleton_expansions": 6, + "signed_upper": "-6923402583108672936960158588079805543011/5000000000000000000000000000000000000000", + "stock_upper": 16 + }, + { + "h": 2, + "needed_singleton_expansions": null, + "signed_upper": "-5593801349401915623744446067879824858133/5000000000000000000000000000000000000000", + "stock_upper": 18 + } + ] + }, + "excluded_nonnested_slots": 0, + "expanded_singleton_upper": 0, + "geometry_arcs": 20, + "timely_arcs": 20, + "timely_cyclic_arcs": 20 + }, + "quiet": { + "cyclic_arcs": 20, + "directed_price": { + "10018846261809/2500000000000000": [ + { + "h": 0, + "needed_singleton_expansions": 7, + "signed_upper": "-1772004970039110113046716152320388521663/1250000000000000000000000000000000000000", + "stock_upper": 14 + }, + { + "h": 1, + "needed_singleton_expansions": 5, + "signed_upper": "-1439655708336061151487016912281048710127/1250000000000000000000000000000000000000", + "stock_upper": 16 + }, + { + "h": 2, + "needed_singleton_expansions": 4, + "signed_upper": "-1107306446633012189927317672241708898591/1250000000000000000000000000000000000000", + "stock_upper": 18 + } + ], + "1002040748181/250000000000000": [ + { + "h": 0, + "needed_singleton_expansions": 8, + "signed_upper": "-8253003816815430250175871108279786227889/5000000000000000000000000000000000000000", + "stock_upper": 14 + }, + { + "h": 1, + "needed_singleton_expansions": 6, + "signed_upper": "-6923402583108672936960158588079805543011/5000000000000000000000000000000000000000", + "stock_upper": 16 + }, + { + "h": 2, + "needed_singleton_expansions": null, + "signed_upper": "-5593801349401915623744446067879824858133/5000000000000000000000000000000000000000", + "stock_upper": 18 + } + ] + }, + "excluded_nonnested_slots": 0, + "expanded_singleton_upper": 0, + "geometry_arcs": 20, + "timely_arcs": 20, + "timely_cyclic_arcs": 20 + } + }, + "source_target_pairs": 1200, + "status": "PASS_INDEPENDENT_GEOMETRY_CHRONOLOGY_QUOTIENT_AND_PRICE" +} diff --git a/research/bit-balanced-retarget-bound/LICENSE b/research/bit-balanced-retarget-bound/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/bit-balanced-retarget-bound/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/bit-balanced-retarget-bound/NOTICE b/research/bit-balanced-retarget-bound/NOTICE new file mode 100644 index 0000000000..bd3446eb35 --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE @@ -0,0 +1,20 @@ +This fixed-clock balanced BIT reassignment contribution is Apache-2.0. +OpenAI Codex and subagents materially assisted the proof, implementation, +independent audit and packaging. + +Jerry Chen / CubeJerry #7001 and #6726 supplied the retained native word, +complete invoice and directed interval implementation. NOTICE-7001 and LICENSE +preserve that attribution. #7209 supplied marked geometry and stock tariff. +#7258 supplied the fixed marked libraries. #7260 and #7271 supplied the +unmarked donor bound, split fee, paid ingress census and exact joint price. +#7272 supplied the frozen causal source bases and independent carrier audit. + +#7273 supplied the offline source lineage and late exterior compensation +comparison. #7275 supplied the exact public package closure and first-observer +comparison. NOTICE-7271, NOTICE-7272, NOTICE-7273 and NOTICE-7275 retain their +attribution. PROVENANCE.tsv identifies the inherited public blobs. + +Clear1nsight #7244 and #7274 supplied the complete comparable witnesses and +retained BIT premise. NOTICE-7244 and PEER-BIT-BLOBS.txt preserve the pinned +earlier attribution and retained input identity. Nick Petalas #7264 supplied +the abstract two-for-one sharpness comparison. diff --git a/research/bit-balanced-retarget-bound/NOTICE-7001 b/research/bit-balanced-retarget-bound/NOTICE-7001 new file mode 100644 index 0000000000..32c2936ea0 --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE-7001 @@ -0,0 +1,26 @@ +Paired E-free BIT specialization and complete accounting, with substantial +OpenAI Codex assistance, for the integer-multiplication research project. +Apache-2.0; LICENSE is retained from the source project. + +DreamingOfClouds (Claude Opus assistance) receives credit for #6834's chain-root +BIT caller, #6937's E-free roots and the underlying two-chain construction. +@CubeJerry (OpenAI assistance) receives credit for #6980's four-input three-query +identity, separated interval replacement and QUERY-only caller. The complete +#6980 proof is retained byte-for-byte in data/6980_PROOF.md. + +The new contribution specializes that existing caller to the actual #6726 BIT +native, supplies the parity-driven pairing of two real 111-port invocations, +and checks the complete E-free finite/compiler/ordinary budget from the selected +ordinary backend. No general QUERY-only mechanism, chain root or new raw kappa +is claimed as new here. + +independent/bit_review.py and independent/interval_gate.py were written by a +separate OpenAI Codex research worker for an implementation-independent scalar +and arithmetic audit. This is model-run checking, not external human review. + +zxv and retained predecessor authors receive credit for #6726's source-native +export, integer-before-mod2 transfer, complete source checking and admission +framework. Ali Romman and Cinna Davis retain the root/native lineage credit. +The copied arithmetic and native checker retain their original headers; see +retained/NOTICE. The selected .0034 backend retains the source and contributor +credits in data/selected_record.json and data/selected_review.md. diff --git a/research/bit-balanced-retarget-bound/NOTICE-7244 b/research/bit-balanced-retarget-bound/NOTICE-7244 new file mode 100644 index 0000000000..c31402a4fb --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE-7244 @@ -0,0 +1,13 @@ +Prepared for Clear1nsight with substantial OpenAI Codex and ChatGPT Pro +assistance. New work is Apache-2.0. + +ChatGPT Pro identified the symmetric and antisymmetric two-cut mechanism. +OpenAI Codex independently reconstructed the exact timed witness, emitted +the literal candidate, and adapted and executed the source-bound checks. +Credit the exact #7161 funded exit and #7164 application review, Rohan +Arun's #7156 and #7113, Ali Romman's causal-history owned-buffer identity, +Jerry Chen / CubeJerry's timing and exact replay, Matarener's kernels, +dillona's temporal constructor, and ToikY's exact pricing engines. The +selected framework retains the #7000/#7001 contributor and maintainer +credit. Source licenses and predecessor notices remain in the archive +and reference directory. diff --git a/research/bit-balanced-retarget-bound/NOTICE-7271 b/research/bit-balanced-retarget-bound/NOTICE-7271 new file mode 100644 index 0000000000..ffcf51dba1 --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE-7271 @@ -0,0 +1,21 @@ +This BIT funded-ingress census and separately charged split calculation is Apache-2.0. +OpenAI Codex and subagents materially assisted the construction audit, proof and replay. + +Jerry Chen / CubeJerry #7001 and #6726 supply the literal native word, full +invoice and directed interval implementation. NOTICE-7001 and LICENSE preserve +the original attribution and license. + +#7209 supplies the 22 marked banks, their literal rank-seven midpoint geometry, +and the directed stock tariff. #7258 supplies the fixed marked library and +quotient replay. #7260 supplies the 523-port same-chart old-payload census, the +unmarked donor and release argument, and the separate full-volume split tariff. +Exact published source and blob pins appear in PROVENANCE.tsv. + +Clear1nsight #7244 supplies the independently reproduced complete comparator and +retained BIT premise. NOTICE-7244 preserves the original attribution, and +PEER-BIT-BLOBS.txt records the identity of the three exact BIT inputs. + +Nick Petalas #7264 supplies the synthetic sharpness result for the abstract +two-for-one rank bound. This package checks literal old paid ingress and its +directed tariff for the fixed native, and adds the joint price threshold for +changed marked libraries. diff --git a/research/bit-balanced-retarget-bound/NOTICE-7272 b/research/bit-balanced-retarget-bound/NOTICE-7272 new file mode 100644 index 0000000000..9b832671d0 --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE-7272 @@ -0,0 +1,20 @@ +This BIT changed-carrier exterior rank certificate is Apache-2.0. +OpenAI Codex and subagents materially assisted the analysis, implementation and replay. + +Jerry Chen / CubeJerry #7001 and #6726 supply the literal native word, full +invoice and directed interval implementation. NOTICE-7001 and LICENSE preserve +its source attribution and license. #7209 supplies the marked midpoint geometry +and stock tariff. #7258 supplies the fixed marked library and quotient replay. +#7260 supplies the unmarked donor and release argument and full-volume split fee. + +#7271 supplies the 185-port fixed-payload funded-ingress receipt and joint price. +NOTICE-7271 preserves that predecessor's attribution. This package reconstructs +its receipts and uses its exact 60 old ingress events for a changed-payload test. +PROVENANCE.tsv gives the exact public commit, Git blob and SHA-256 of each copy. + +Clear1nsight #7244 supplies the independently reproduced complete comparator and +retained BIT premise. NOTICE-7244 preserves that attribution. PEER-BIT-BLOBS.txt +records the identity of the three exact BIT inputs. + +Nick Petalas #7264 supplies the synthetic sharpness result motivating the +algebra control. The exterior injectivity result uses the literal retained word. diff --git a/research/bit-balanced-retarget-bound/NOTICE-7273 b/research/bit-balanced-retarget-bound/NOTICE-7273 new file mode 100644 index 0000000000..6da58cb835 --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE-7273 @@ -0,0 +1,18 @@ +This late BIT compensation and fixed-prebirth certificate is Apache-2.0. +OpenAI Codex and subagents materially assisted the proof, implementation and audit. + +Jerry Chen / CubeJerry #7001 and #6726 supply the retained native word, complete +invoice and directed interval implementation. NOTICE-7001 and LICENSE preserve +that source attribution and license. #7209 supplies marked midpoint geometry and +the directed stock tariff. #7258 supplies the fixed marked libraries. #7260 +supplies the original unmarked donor bound and separately paid split fee. + +#7271 supplies the fixed-payload ingress census and exact joint price. #7272 +supplies the 60 exact changed ingress events, the coframed source bases and the +independent fixed-suffix impulse audit. NOTICE-7271 and NOTICE-7272 preserve +predecessor attribution. PROVENANCE.tsv records their public Git blobs. + +Clear1nsight #7244 supplies the complete comparable witness and retained BIT +premise. NOTICE-7244 preserves that attribution. PEER-BIT-BLOBS.txt records the +identity of the exact BIT input files. Nick Petalas #7264 supplies the abstract +two-for-one sharpness comparison. diff --git a/research/bit-balanced-retarget-bound/NOTICE-7275 b/research/bit-balanced-retarget-bound/NOTICE-7275 new file mode 100644 index 0000000000..092616fc50 --- /dev/null +++ b/research/bit-balanced-retarget-bound/NOTICE-7275 @@ -0,0 +1,19 @@ +This fixed first-observer BIT compensation result is Apache-2.0. +OpenAI Codex and subagents materially assisted the proof, implementation and audit. + +Jerry Chen / CubeJerry #7001 and #6726 supplied the retained native word, complete +invoice and directed interval implementation. NOTICE-7001 and LICENSE preserve +that attribution and license. #7209 supplied marked midpoint geometry and the +directed stock tariff. #7258 supplied the fixed marked libraries. #7260 supplied +the original unmarked donor bound and separately paid split fee. + +#7271 supplied the fixed-payload ingress census and exact joint price. #7272 +supplied the 60 exact changed ingress events, coframed source bases and independent +fixed-suffix impulse audit. #7273 supplied the offline dependency closure and late +compensation predecessor. NOTICE-7271, NOTICE-7272 and NOTICE-7273 preserve +predecessor attribution. PROVENANCE.tsv records the inherited public Git blobs. + +Clear1nsight #7244 supplied the complete comparable witness and retained BIT +premise. NOTICE-7244 preserves that attribution. PEER-BIT-BLOBS.txt records the +identity of the exact BIT input files. Nick Petalas #7264 supplied the abstract +two-for-one sharpness comparison. diff --git a/research/bit-balanced-retarget-bound/PEER-BIT-BLOBS.txt b/research/bit-balanced-retarget-bound/PEER-BIT-BLOBS.txt new file mode 100644 index 0000000000..a682360cd0 --- /dev/null +++ b/research/bit-balanced-retarget-bound/PEER-BIT-BLOBS.txt @@ -0,0 +1,8 @@ +e54523517d0f03e58352e647c403a5af3e525a57 +100644 blob 575f76487f9999ecc3e7b1b70f9f71bc582ef8a8 research/paired-query-only-bit/EFREE-RESULT.json +100644 blob 6d5a751dde7554b2bb3ccb9a958a3508d74ea155 research/paired-query-only-bit/independent/interval_gate.py +100644 blob b718d6b2848215ad785022106dfa9f871a3d1c0c research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +4156504fa39efb51c550d218a9b94fe69dbce8f6 +100644 blob 575f76487f9999ecc3e7b1b70f9f71bc582ef8a8 research/paired-query-only-bit/EFREE-RESULT.json +100644 blob 6d5a751dde7554b2bb3ccb9a958a3508d74ea155 research/paired-query-only-bit/independent/interval_gate.py +100644 blob b718d6b2848215ad785022106dfa9f871a3d1c0c research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz diff --git a/research/bit-balanced-retarget-bound/PROOF.md b/research/bit-balanced-retarget-bound/PROOF.md new file mode 100644 index 0000000000..adf0cc4645 --- /dev/null +++ b/research/bit-balanced-retarget-bound/PROOF.md @@ -0,0 +1,33 @@ +# Exact ceiling for balanced fixed-clock reassignment + +## Frozen question + +The paid source is the #7001/#6726 native BIT word at canonical commit e54523517d0f03e58352e647c403a5af3e525a57. The complete comparable #7244 witness and its independently reproduced #7274 successor use the same retained BIT premise of 0.00376669. This contribution prices the fixed campaign target κ = 10018846261809/2500000000000000 and a stricter trial of 1002040748181/250000000000000. There is no new κ claim. [#7244](https://github.com/CrocSwap/integer-mult-bounds/pull/7244) · [#7274](https://github.com/CrocSwap/integer-mult-bounds/pull/7274) + +Reassign only the 60 old paid ingress slots among the 20 fixed compatible rank-seven charts. The source frame must be nested inside the new frame with the same paid rank as the old transport. Preserve each chart's paid arrival count, every ingress clock, the frozen causal source bases and the old unmarked libraries. The deterministic cap is 1,200 incidence cases and 480 seconds. A cap hit records an incomplete status without a whole-stock exclusion. The actual run exhausted all cases and had zero unresolved. No individual site or physical prototype was run. + +## Balance before the clock filter + +A selected alternative is a directed arc from its old destination chart to its new destination chart. Chart-count preservation forces equal in- and out-degree at each vertex in the selected multigraph, so every selected arc belongs to a directed cycle. It suffices for an upper bound to retain every arc with a return path in the full geometric graph. This admits arcs that cannot occur together and ignores competition for any slot. For a marked recipient, the useful incoming arcs are the retained arcs whose arrival is no later than its literal or owner-quiet cutoff. Filtering the graph by arrival first would incorrectly eliminate early deliveries whose balance requires late returns. Both programs include a synthetic control of that case. + +All 60 original ingresses are nested. There are 20 alternative geometric arcs. Each forms a reciprocal pair within one of ten singleton banks. Each paid event and destination appears only once as an alternative, so every balanced selection is the union of a subset of the ten two-cycles. The combinatorial balance problem has 1,024 selections including identity. All 20 arcs are timely at both cutoffs. This enumeration grants physical feasibility for the bound. + +## Marked quotient and directed price + +The 545 audited terminal lineages span W of dimension 545. The 523 unmarked lines span U. For a singleton bank j, let U_j be U plus its old marked row, and let S_j contain its old library and all timely cyclic source directions. The grant keeps the old library even if an arrival is redirected. With U_j contained in W, the dimension of the extra directions is + +```text +dim(((S_j intersect W) + U_j) / U_j) + = dim(W) - dim(U_j) - rank(S_j + W) + rank(S_j + U_j) + = 21 - rank(S_j + W) + rank(S_j + U_j). +``` + +All ten singleton quotients have dimension zero at both clocks. The primary replay computes the intersection projection. The independent verifier reconstructs the 2,871 paid MOVE labels, 545 terminal lineages and 60 source spans from the literal word, tests chart containment using exact rational null normals, reconstructs cyclic arcs through transitive closure, and uses the rank identity above. + +At zero, one and two separately charged donor split fees, the old ideal donor grants give complete stock upper bounds 14, 16 and 18. Clearing the fixed target requires at least 7, 5 and 4 extra singleton libraries, respectively. The directed net upper endpoints are approximately −1.4176039760312882, −1.151724566668849 and −0.8858451573064098. Even the best total optimistic savings of approximately 59.218054061840945 are below the 60.10389921914735 required. The retarget mechanism adds zero to those old ideal grants. At three fees even the full 22-stock grant fails. For any additional fee, the term 36·(2^(1−κ)−2) is negative and stock remains at most 22, so the bound cannot improve. The independent directed audit uses rational power enclosures and checks all charged fees. The exact fractions are in the two replay receipts. [Primary receipt](RESULT.json) · [Independent audit](AUDIT.json) + +The optimistic cost grants all new retention, ownership, restoration, routing, precision, tape and ordinary work for free. A 545-port exact signed survivor test was reserved only for a target-clearing upper. The result leaves open changes to chart sets, arrival counts, unmarked libraries, availability after reassignment and paid routes with a different bill. + +## Evidence lineage + +#7273's late correction and #7275's first-observer correction retain the original paid destinations. This contribution allows the paid destinations themselves to change under fixed counts and tariffs. It reuses the exact public #7275 offline closure. The original Round 28 primary and audit receipts had four additional context-only pins for the prior late-compensation verifier, its source manifest, its generated result and a #7271 summary. The publication drops only those pins. The geometric, chronological, quotient and price fields are unchanged. The original receipt hashes were d25115f87982745be33123653ee60ec065296bace60944aad53595cd336d1377 and a2c08e9d277d6590be8a53d0a7ad177a7a3f12a973795e5ea0c332c3492b70c9. [#7273](https://github.com/CrocSwap/integer-mult-bounds/pull/7273) · [#7275](https://github.com/CrocSwap/integer-mult-bounds/pull/7275) · [Source lineage](PROVENANCE.tsv) diff --git a/research/bit-balanced-retarget-bound/PROVENANCE.tsv b/research/bit-balanced-retarget-bound/PROVENANCE.tsv new file mode 100644 index 0000000000..6e20eef465 --- /dev/null +++ b/research/bit-balanced-retarget-bound/PROVENANCE.tsv @@ -0,0 +1,28 @@ +LICENSE c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4 261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/LICENSE +NOTICE-7001 8c73eaf46327f01b4cfc18640b5e5f552648fc5e4427cbccd42af5e7ecd3b732 32c2936ea041e8f3e78638572a73f5f4079d4180 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/NOTICE-7001 +NOTICE-7244 3ed23f5fea64744747b3f03d85bcddee18a6fd52611733f34096c200547a2c8b c31402a4fb56f7e334722dd8cdc5313eaa104cfd https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/NOTICE-7244 +NOTICE-7271 faf69e7bd327f0f774e8d529ad086a22cf6f9a4194ac27e05cb2f04082915507 ffcf51dba1d3adc77f9e19fa7c60c56068553d7b https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/NOTICE-7271 +NOTICE-7272 ebaac21ca7c6bda5590252eb8d3c3dd55c04891021c4d520838c1dfb789abb61 9b832671d02daf46a8b7bd4843a7796782e7dfc7 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/NOTICE-7272 +NOTICE-7273 9b89d1786f35553379bd30e004294fbac68f840d7f50abdf4e3e0243fb14023d 6da58cb83523713ebd361edb6f508909a406a6b1 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/NOTICE-7273 +NOTICE-7275 e594610c2cfb6c1b776439bd61f50f94c5cd462ea80135c97cdbaaf1ccbfabf2 092616fc50325939b44b9a321fb00aaaa499b15b https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/NOTICE +PEER-BIT-BLOBS.txt d7da3234c9d61826d21e1af381dc94e6697519645cfdbf6ce10d31492fe826fe a682360cd040e1ba9cd24c9ed3ac42e4ccd27c5f https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/PEER-BIT-BLOBS.txt +SOURCES.json 0761fd793723c2df1e2ca51733251cfd597ff3e120f7e2ee8ebb8e10e8e98c08 5335fa97d97f6df5a917eea1ee2fcd01c082d261 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/SOURCES.json +SOURCES.tsv 8e6e9130231ef98d8034ba58a371278e926d699855a58ffcd8e0131c2fc2113a 596f4e28fdff1e851a10742e5005dffaea309c8f https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/SOURCES.tsv +inputs/pr7209/RESULT.json 0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 07664a3820ace218226f6e6ec6086068665f018a https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/pr7209/RESULT.json +inputs/pr7209/verify.py e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 f2460426f9f21d2ce65293f6bf28e7f00bb909ba https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/pr7209/verify.py +inputs/pr7244/PROPOSED-CLAIM.json 14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 786f5550a20184637fc1e05f99a0e28e0976e1a4 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/pr7244/PROPOSED-CLAIM.json +inputs/pr7258/SUMMARY.json b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0 1e215cd7e002638356fcc278a4620234511e8129 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/pr7258/SUMMARY.json +inputs/research/paired-query-only-bit/EFREE-RESULT.json a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b 575f76487f9999ecc3e7b1b70f9f71bc582ef8a8 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/research/paired-query-only-bit/EFREE-RESULT.json +inputs/research/paired-query-only-bit/independent/interval_gate.py 8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec 6d5a751dde7554b2bb3ccb9a958a3508d74ea155 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/research/paired-query-only-bit/independent/interval_gate.py +inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz 51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 b718d6b2848215ad785022106dfa9f871a3d1c0c https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +predecessor/bit-price/verify.py 2a6eac8cdfd1c7d3a6caafca1adf103ebf84b3af26be214b99911fc4155f474c 65966652bcfb4a625b266e48381a0639efbf38ce https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/bit-price/verify.py +predecessor/round22/SOURCES.tsv 963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6 d12b980b7ebf42f438f136ccf47335a55dfe4c02 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round22/SOURCES.tsv +predecessor/round22/verify.py 6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948 1a12b3b16122ad2fabb6dfd958d7db9cf0b62687 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round22/verify.py +predecessor/round23/SOURCES.tsv a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2 850072eb41fc3fee97d7493a2490cd660c01d529 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round23/SOURCES.tsv +predecessor/round23/verify.py b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2 97b5b52e37209e7ccd55d411d4836fbcfef24789 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round23/verify.py +predecessor/round24/SOURCES.tsv d60d52cfb3f4ee7db18fac70cf94e93bae94e22974fcbc59403b353541bdab15 d637b693dc5f83272b3857a97e404f48de23352f https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round24/SOURCES.tsv +predecessor/round24/verify.py 80e4ca5de690c76b266888a9307874d07a4f90c11bba4e42f87ddb45f9221380 74ec88d93e71fb112b16620d07a8ef7751526190 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round24/verify.py +predecessor/round25/AUDIT.json ae5657f8b8fe37aedee5e1dd659fbcd81fe0bf09c0d17734aaf2d559643b0513 e79e71a271b3a176a2af6d680716f9d184dc332d https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round25/AUDIT.json +predecessor/round25/SOURCES.tsv f7d91bad2f7fb645e7d931a9aaeb1e572ed864c7d6057eae53c2f6eefa05a7e9 9bd36d3284567e352a3bd88bfae51b9a49b66c38 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round25/SOURCES.tsv +predecessor/round25/audit.py c28d073ccd45991579384b1aa29cccc2fdf95c6edb0a492e8e203cb681aa486a a2195bedb8eafa0a7c0e0c923f5ee789a9e3fa90 https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round25/audit.py +predecessor/round25/verify.py 4fb801c8219cf4f356b9eab7108a8f2497cc3bc49b089d87086b8ba3c8b13a84 c43102089ed41eb55b723db46ac93c071861291d https://github.com/ToikY/integer-mult-bounds/blob/016b95e5192c4d785c3e80e55b129ca2d8865f44/research/bit-first-observer-compensation/predecessor/round25/verify.py diff --git a/research/bit-balanced-retarget-bound/README.md b/research/bit-balanced-retarget-bound/README.md new file mode 100644 index 0000000000..d3010bda62 --- /dev/null +++ b/research/bit-balanced-retarget-bound/README.md @@ -0,0 +1,28 @@ +# Fixed-clock BIT balanced chart reassignment ceiling + +The exact retained BIT word has 60 paid nested ingress slots and 20 compatible rank-seven destination charts. This package exhausts all 1,200 slot/chart pairs at the original clocks and tariffs. The 20 admissible arcs are ten disjoint two-cycles within individual singleton banks. Even granting every timely cyclic source to its recipient independently and retaining its old library for free, no bank gains a direction in the marked quotient. **Verified conditional κ change is 0%.** + +## Replay + +From the repository root in a clean checkout, use CPython 3.12 with assertions enabled. + +```sh +python3.12 -B scripts/research_package.py --package research/bit-balanced-retarget-bound +``` + +The standalone replay also works offline from an exported package. + +```sh +python3.12 -I -B research/bit-balanced-retarget-bound/replay.py --controls +``` + +The replay authenticates its bundled source closure by relative path and SHA-256, regenerates five pinned predecessor receipts and the independent carrier audit, and compares the census and independent price audit byte for byte. It checks an early delivery that relies on a late balancing arc. A changed native input and a fabricated cycle incidence must both fail. No package installation, mutable remote data or user-specific interpreter path is required. + +The proof describes the relaxation, exact bounds and remaining obligations. The two JSON receipts contain the full incidence, source and price evidence. [Proof](PROOF.md) · [Census](RESULT.json) · [Independent audit](AUDIT.json) · [Exact-source provenance](PROVENANCE.tsv) + +## Open next questions + +- Can coupled lineages preserve one intervening ADD while reducing the paid MOVE count? The separate local-only Round 29 unread-chain census exhausted all 2,871 paid MOVE paths and found every path a singleton. Start with the full census of consecutive same-lineage paid MOVE pairs with exactly one intervening coframed ADD. Cap at 2,871 pairs or 240 seconds. Track the other ADD operand at the cut, account for any paid transport needed to bring both operands into one chart and return them, and price disjoint savings across all 36 copies. A negative directed whole-word bound closes the scope. A survivor still requires an exact arbitrary-input signed, ownership and restoration check before a build. [Campaign handoff](https://github.com/CrocSwap/integer-mult-bounds/discussions/7111) +- Can a changed chart set, an altered arrival count or a different unmarked library enlarge the marked quotient? Recompute the complete cost of new delivery before testing a site. This proof fixes those inputs. A changed route also requires full signed and timing checks, erasure, precision and tape accounting. + +Jerry Chen / CubeJerry supplied the retained native word, invoice and interval implementation. The contribution builds on the marked geometry, source and tariff audits in #7209, #7258, #7260, #7271, #7272, #7273 and #7275. Nick Petalas supplied the stock sharpness comparison in #7264. Clear1nsight's #7244 and #7274 provide the complete peer comparisons and retained BIT premise. OpenAI Codex and subagents materially assisted the proof, implementation, audit and packaging. [Notice](NOTICE) diff --git a/research/bit-balanced-retarget-bound/REPLAY.sha256 b/research/bit-balanced-retarget-bound/REPLAY.sha256 new file mode 100644 index 0000000000..499da47b64 --- /dev/null +++ b/research/bit-balanced-retarget-bound/REPLAY.sha256 @@ -0,0 +1,23 @@ +0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 inputs/pr7209/RESULT.json +e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 inputs/pr7209/verify.py +14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 inputs/pr7244/PROPOSED-CLAIM.json +b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0 inputs/pr7258/SUMMARY.json +a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b inputs/research/paired-query-only-bit/EFREE-RESULT.json +8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec inputs/research/paired-query-only-bit/independent/interval_gate.py +51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +2a6eac8cdfd1c7d3a6caafca1adf103ebf84b3af26be214b99911fc4155f474c predecessor/bit-price/verify.py +963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6 predecessor/round22/SOURCES.tsv +6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948 predecessor/round22/verify.py +a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2 predecessor/round23/SOURCES.tsv +b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2 predecessor/round23/verify.py +d60d52cfb3f4ee7db18fac70cf94e93bae94e22974fcbc59403b353541bdab15 predecessor/round24/SOURCES.tsv +80e4ca5de690c76b266888a9307874d07a4f90c11bba4e42f87ddb45f9221380 predecessor/round24/verify.py +ae5657f8b8fe37aedee5e1dd659fbcd81fe0bf09c0d17734aaf2d559643b0513 predecessor/round25/AUDIT.json +f7d91bad2f7fb645e7d931a9aaeb1e572ed864c7d6057eae53c2f6eefa05a7e9 predecessor/round25/SOURCES.tsv +c28d073ccd45991579384b1aa29cccc2fdf95c6edb0a492e8e203cb681aa486a predecessor/round25/audit.py +4fb801c8219cf4f356b9eab7108a8f2497cc3bc49b089d87086b8ba3c8b13a84 predecessor/round25/verify.py +4b76ebf6f2a11d0a2f272939f2e9a113ac69940f3a4340d432e3ec3314d2d313 verify.py +f8b7d0c55cb999003adb6bc1e90c54fcf807548942a00554f0c7cfa82d2d6a33 audit.py +8e6e9130231ef98d8034ba58a371278e926d699855a58ffcd8e0131c2fc2113a SOURCES.tsv +3fd20d8b1130aa97e738e48e90a4fcf8f1a3f4fc05e6502dd1f4df3b10796a9b RESULT.json +928945d42b554adeed54cd6f0afc39983b2657af40784198412bcdc0724077d0 AUDIT.json diff --git a/research/bit-balanced-retarget-bound/RESULT.json b/research/bit-balanced-retarget-bound/RESULT.json new file mode 100644 index 0000000000..e5d68a3b5b --- /dev/null +++ b/research/bit-balanced-retarget-bound/RESULT.json @@ -0,0 +1,1155 @@ +{ + "clocks": [ + { + "all_balancing_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ], + "clock": "literal", + "cyclic_balancing_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ], + "expanded_singleton_upper": 0, + "nonnested_untested": [], + "price": { + "10018846261809/2500000000000000": [ + { + "affordable_upper": false, + "h": 0, + "net_upper": [ + "-35440099400782202260934323046407771172587938313721781806401684833362292952668813/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-7088019880156440452186864609281554234517587662744356361280336966672458588321253/5000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 7, + "stock_upper": 14 + }, + { + "affordable_upper": false, + "h": 1, + "net_upper": [ + "-28793114166721223029740338245620974942029749494541456104883184874631504526472607/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-28793114166721223029740338245620974942029749494541456104883184874631504515388981/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 5, + "stock_upper": 16 + }, + { + "affordable_upper": false, + "h": 2, + "net_upper": [ + "-22146128932660243798546353444834178711471560675361130403364684915900716100276401/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-22146128932660243798546353444834178711471560675361130403364684915900716089171697/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 4, + "stock_upper": 18 + } + ], + "1002040748181/250000000000000": [ + { + "affordable_upper": false, + "h": 0, + "net_upper": [ + "-515812738550964390635991944267486647976367743110280059743788133088792174226427/312500000000000000000000000000000000000000000000000000000000000000000000000000", + "-41265019084077151250879355541398931838109419448822404779503050647103373926916459/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 8, + "stock_upper": 14 + }, + { + "affordable_upper": false, + "h": 1, + "net_upper": [ + "-1081781653610730146400024779387469637919943565583825210895464333248143746199507/781250000000000000000000000000000000000000000000000000000000000000000000000000", + "-34617012915543364684800792940399028413438194098682406748654858663940599867165463/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 6, + "stock_upper": 16 + }, + { + "affordable_upper": false, + "h": 2, + "net_upper": [ + "-1748062921688098632420139396212445311797935546783900544862916667548614113665893/1562500000000000000000000000000000000000000000000000000000000000000000000000000", + "-27969006747009578118722230339399124988766968748542408717806666680777825807414467/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": null, + "stock_upper": 18 + } + ] + }, + "recipients": [ + { + "new_quotient_basis": [], + "singleton": 0, + "timely_retarget_slots": [ + 25555, + 25556 + ] + }, + { + "new_quotient_basis": [], + "singleton": 1, + "timely_retarget_slots": [ + 25673, + 25674 + ] + }, + { + "new_quotient_basis": [], + "singleton": 2, + "timely_retarget_slots": [ + 25873, + 25874 + ] + }, + { + "new_quotient_basis": [], + "singleton": 3, + "timely_retarget_slots": [ + 25933, + 25934 + ] + }, + { + "new_quotient_basis": [], + "singleton": 4, + "timely_retarget_slots": [ + 25995, + 25996 + ] + }, + { + "new_quotient_basis": [], + "singleton": 5, + "timely_retarget_slots": [ + 26112, + 26113 + ] + }, + { + "new_quotient_basis": [], + "singleton": 6, + "timely_retarget_slots": [ + 26204, + 26205 + ] + }, + { + "new_quotient_basis": [], + "singleton": 10, + "timely_retarget_slots": [ + 26367, + 26368 + ] + }, + { + "new_quotient_basis": [], + "singleton": 14, + "timely_retarget_slots": [ + 26544, + 26545 + ] + }, + { + "new_quotient_basis": [], + "singleton": 17, + "timely_retarget_slots": [ + 26680, + 26681 + ] + } + ], + "source_target_pairs": 1200, + "timely_cyclic_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ], + "timely_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ] + }, + { + "all_balancing_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ], + "clock": "quiet", + "cyclic_balancing_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ], + "expanded_singleton_upper": 0, + "nonnested_untested": [], + "price": { + "10018846261809/2500000000000000": [ + { + "affordable_upper": false, + "h": 0, + "net_upper": [ + "-35440099400782202260934323046407771172587938313721781806401684833362292952668813/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-7088019880156440452186864609281554234517587662744356361280336966672458588321253/5000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 7, + "stock_upper": 14 + }, + { + "affordable_upper": false, + "h": 1, + "net_upper": [ + "-28793114166721223029740338245620974942029749494541456104883184874631504526472607/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-28793114166721223029740338245620974942029749494541456104883184874631504515388981/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 5, + "stock_upper": 16 + }, + { + "affordable_upper": false, + "h": 2, + "net_upper": [ + "-22146128932660243798546353444834178711471560675361130403364684915900716100276401/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-22146128932660243798546353444834178711471560675361130403364684915900716089171697/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 4, + "stock_upper": 18 + } + ], + "1002040748181/250000000000000": [ + { + "affordable_upper": false, + "h": 0, + "net_upper": [ + "-515812738550964390635991944267486647976367743110280059743788133088792174226427/312500000000000000000000000000000000000000000000000000000000000000000000000000", + "-41265019084077151250879355541398931838109419448822404779503050647103373926916459/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 8, + "stock_upper": 14 + }, + { + "affordable_upper": false, + "h": 1, + "net_upper": [ + "-1081781653610730146400024779387469637919943565583825210895464333248143746199507/781250000000000000000000000000000000000000000000000000000000000000000000000000", + "-34617012915543364684800792940399028413438194098682406748654858663940599867165463/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": 6, + "stock_upper": 16 + }, + { + "affordable_upper": false, + "h": 2, + "net_upper": [ + "-1748062921688098632420139396212445311797935546783900544862916667548614113665893/1562500000000000000000000000000000000000000000000000000000000000000000000000000", + "-27969006747009578118722230339399124988766968748542408717806666680777825807414467/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "required_expansions": null, + "stock_upper": 18 + } + ] + }, + "recipients": [ + { + "new_quotient_basis": [], + "singleton": 0, + "timely_retarget_slots": [ + 25555, + 25556 + ] + }, + { + "new_quotient_basis": [], + "singleton": 1, + "timely_retarget_slots": [ + 25673, + 25674 + ] + }, + { + "new_quotient_basis": [], + "singleton": 2, + "timely_retarget_slots": [ + 25873, + 25874 + ] + }, + { + "new_quotient_basis": [], + "singleton": 3, + "timely_retarget_slots": [ + 25933, + 25934 + ] + }, + { + "new_quotient_basis": [], + "singleton": 4, + "timely_retarget_slots": [ + 25995, + 25996 + ] + }, + { + "new_quotient_basis": [], + "singleton": 5, + "timely_retarget_slots": [ + 26112, + 26113 + ] + }, + { + "new_quotient_basis": [], + "singleton": 6, + "timely_retarget_slots": [ + 26204, + 26205 + ] + }, + { + "new_quotient_basis": [], + "singleton": 10, + "timely_retarget_slots": [ + 26367, + 26368 + ] + }, + { + "new_quotient_basis": [], + "singleton": 14, + "timely_retarget_slots": [ + 26544, + 26545 + ] + }, + { + "new_quotient_basis": [], + "singleton": 17, + "timely_retarget_slots": [ + 26680, + 26681 + ] + } + ], + "source_target_pairs": 1200, + "timely_cyclic_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ], + "timely_incidences": [ + [ + 25555, + 516, + 588 + ], + [ + 25556, + 588, + 516 + ], + [ + 25673, + 566, + 607 + ], + [ + 25674, + 607, + 566 + ], + [ + 25873, + 513, + 591 + ], + [ + 25874, + 591, + 513 + ], + [ + 25933, + 551, + 619 + ], + [ + 25934, + 619, + 551 + ], + [ + 25995, + 569, + 609 + ], + [ + 25996, + 609, + 569 + ], + [ + 26112, + 518, + 617 + ], + [ + 26113, + 617, + 518 + ], + [ + 26204, + 514, + 585 + ], + [ + 26205, + 585, + 514 + ], + [ + 26367, + 567, + 601 + ], + [ + 26368, + 601, + 567 + ], + [ + 26544, + 623, + 625 + ], + [ + 26545, + 625, + 623 + ], + [ + 26680, + 543, + 613 + ], + [ + 26681, + 613, + 543 + ] + ] + } + ], + "new_sites": 0, + "pins": { + "bit-price/RESULT.json": "3583ea672516c4def2d3973fcc5fd75e8903c2ad9f6c7154df4df1fd1bb349c7", + "bit-price/verify.py": "2a6eac8cdfd1c7d3a6caafca1adf103ebf84b3af26be214b99911fc4155f474c", + "pr7209/RESULT.json": "0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1", + "pr7209/verify.py": "e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94", + "pr7244/PROPOSED-CLAIM.json": "14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688", + "pr7258/SUMMARY.json": "b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0", + "research/paired-query-only-bit/EFREE-RESULT.json": "a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b", + "research/paired-query-only-bit/independent/interval_gate.py": "8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec", + "research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz": "51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78", + "round22/RESULT.json": "6f4c3afc1185668de6e98ea1608170ae9db8ee5c2c5318b5d5a6577d609252e3", + "round22/SOURCES.tsv": "963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6", + "round22/verify.py": "6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948", + "round23/RESULT.json": "16863072b372547b6a062210da4d338704ce680ec22cd5e4e6702560c93a1bf7", + "round23/SOURCES.tsv": "a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2", + "round23/verify.py": "b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2", + "round24/RESULT.json": "1acd03fec0213cda8c44f4914c4c0b0c2e2124d7a0dc0586689e80bbc0fb8646", + "round24/SOURCES.tsv": "d60d52cfb3f4ee7db18fac70cf94e93bae94e22974fcbc59403b353541bdab15", + "round24/verify.py": "80e4ca5de690c76b266888a9307874d07a4f90c11bba4e42f87ddb45f9221380", + "round25/RESULT.json": "42d7c43180690bcbd062fe011d3e4a0f12305d952e823afb34a1f76a4872b82b", + "round25/SOURCES.tsv": "f7d91bad2f7fb645e7d931a9aaeb1e572ed864c7d6057eae53c2f6eefa05a7e9", + "round25/verify.py": "4fb801c8219cf4f356b9eab7108a8f2497cc3bc49b089d87086b8ba3c8b13a84" + }, + "scope": "nested same-rank target rebinds within fixed 60/20 stock and fixed unmarked libraries", + "seconds_cap": 480, + "status": "PASS_COMPLETE_STOCK_UPPER" +} diff --git a/research/bit-balanced-retarget-bound/SOURCES.json b/research/bit-balanced-retarget-bound/SOURCES.json new file mode 100644 index 0000000000..5335fa97d9 --- /dev/null +++ b/research/bit-balanced-retarget-bound/SOURCES.json @@ -0,0 +1,18 @@ +{ + "schema_version": 1, + "base_commit": "e54523517d0f03e58352e647c403a5af3e525a57", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "75d77b328ea02ded535e7f23aee5b1e55d0bb1a8", + "sha256": "154c3d30455d778fd3343b6b4851f0fa4665f0f7625b0adb3675e2bafbbf6bf1" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "3404fbdd5e7529a0674eef26114b5071e4586cec", + "sha256": "ead6cdc9d0af6d58e8a49744d8ec8c7c15e13d2ba93c276c434bcf9b51b93a81" + } + ] +} diff --git a/research/bit-balanced-retarget-bound/SOURCES.tsv b/research/bit-balanced-retarget-bound/SOURCES.tsv new file mode 100644 index 0000000000..596f4e28fd --- /dev/null +++ b/research/bit-balanced-retarget-bound/SOURCES.tsv @@ -0,0 +1,21 @@ +research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz 51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +research/paired-query-only-bit/independent/interval_gate.py 8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/research/paired-query-only-bit/independent/interval_gate.py +research/paired-query-only-bit/EFREE-RESULT.json a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/research/paired-query-only-bit/EFREE-RESULT.json +pr7209/verify.py e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/pr7209/verify.py +pr7209/RESULT.json 0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/pr7209/RESULT.json +pr7244/PROPOSED-CLAIM.json 14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/pr7244/PROPOSED-CLAIM.json +round22/verify.py 6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/round22/verify.py +round22/RESULT.json 6f4c3afc1185668de6e98ea1608170ae9db8ee5c2c5318b5d5a6577d609252e3 regenerated by predecessor/round22/verify.py +round22/SOURCES.tsv 963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/round22/SOURCES.tsv +round23/verify.py b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/round23/verify.py +round23/RESULT.json 16863072b372547b6a062210da4d338704ce680ec22cd5e4e6702560c93a1bf7 regenerated by predecessor/round23/verify.py +round23/SOURCES.tsv a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/round23/SOURCES.tsv +pr7258/SUMMARY.json b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/inputs/pr7258/SUMMARY.json +round24/verify.py 80e4ca5de690c76b266888a9307874d07a4f90c11bba4e42f87ddb45f9221380 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/round24/verify.py +round24/RESULT.json 1acd03fec0213cda8c44f4914c4c0b0c2e2124d7a0dc0586689e80bbc0fb8646 regenerated by predecessor/round24/verify.py +round24/SOURCES.tsv d60d52cfb3f4ee7db18fac70cf94e93bae94e22974fcbc59403b353541bdab15 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/round24/SOURCES.tsv +bit-price/RESULT.json 3583ea672516c4def2d3973fcc5fd75e8903c2ad9f6c7154df4df1fd1bb349c7 regenerated by predecessor/bit-price/verify.py +bit-price/verify.py 2a6eac8cdfd1c7d3a6caafca1adf103ebf84b3af26be214b99911fc4155f474c https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/predecessor/bit-price/verify.py +round25/verify.py 4fb801c8219cf4f356b9eab7108a8f2497cc3bc49b089d87086b8ba3c8b13a84 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/prior.py +round25/RESULT.json 42d7c43180690bcbd062fe011d3e4a0f12305d952e823afb34a1f76a4872b82b regenerated by predecessor/round25/verify.py +round25/SOURCES.tsv f7d91bad2f7fb645e7d931a9aaeb1e572ed864c7d6057eae53c2f6eefa05a7e9 https://github.com/ToikY/integer-mult-bounds/blob/a5de6fb272e58809ca95cc2c67919cab5e8b79bc/research/bit-late-exterior-compensation/SOURCES.tsv diff --git a/research/bit-balanced-retarget-bound/TASK.json b/research/bit-balanced-retarget-bound/TASK.json new file mode 100644 index 0000000000..90f174121f --- /dev/null +++ b/research/bit-balanced-retarget-bound/TASK.json @@ -0,0 +1,77 @@ +{ + "schema_version": 1, + "task_id": "bit-helper-contract", + "priority_revision": 8, + "base_commit": "e54523517d0f03e58352e647c403a5af3e525a57", + "original_card": { + "id": "bit-helper-contract", + "question": "Can a changed G20 helper path or independent-target split improve the complete BIT moment without losing its physical endpoint?", + "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/g20-helper-split/README.md", + "research/g20-conjugation-admission/README.md" + ], + "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." + ], + "acceptance_gate": "A full boundary contract and paid profile; unchanged scalar counts alone are insufficient. 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.", + "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." + }, + "first_experiment": "First read #5679/#5708 and their audits as pending component proposals. Choose one uncovered helper group/cut on an exact word; compare arbitrary-input native action, targets, owned storage, both orientations and full signed bill. Stop if the gain is only a scalar count or repaid by lost targets. Do not rerun the frozen #5609 common-frame domain without changing its hypothesis.", + "bottleneck_link": "Judge the actual current supplier contract and complete signed target/paid bill; frozen-profile ceilings require an applicability proof.", + "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." + ], + "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." + ], + "overlap_terms": [ + "G20", + "helper split", + "5679", + "5708", + "independent target" + ], + "existing_checks": [ + { + "scope": "Selected PR5599: complete helper-subspace construction and independent caller replay; five framework assumptions remain.", + "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.", + "status": "reviewed", + "source_commit": "09dd0965711ca7eeb169057a420abab1c9052137", + "selected_record_sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5" + } + ] + }, + "scope_status": "changed", + "actual_scope": "The complete 60-slot by 20-chart nested reassignment domain at the exact original BIT clocks, ranks and paid arrival counts, with frozen unmarked libraries.", + "scope_change_reason": "After #7275 held paid destinations fixed, balanced destination changes were the next exact paid-source delivery test under the retained BIT premise.", + "bottleneck_link": "The retained BIT invoice requires 7, 5 or 4 expanded singleton libraries at the fixed campaign target after zero, one or two separately charged split fees.", + "budget_minutes": 8, + "stop_rule": "Exhaust 1,200 slot/chart pairs or 480 seconds. Keep unvisited cases on a cap. Reconstruct the graph, clocks, ten quotient bounds and directed prices. Stop at a negative whole-stock upper. A surviving upper permits one five-minute 545-port signed action and restoration gate.", + "outcome": "negative-result", + "evidence": "PROOF.md, RESULT.json, AUDIT.json, PROVENANCE.tsv and registered offline replay with changed-source and forged-arc controls.", + "author": "ToikY", + "ai_assistance": "OpenAI Codex and subagents materially assisted proof, implementation, independent audit and packaging.", + "open_questions": [ + { + "question": "Can coupled lineages preserve one intervening ADD while reducing the whole paid MOVE bill?", + "why_it_matters": "Balanced retargeting adds zero marked directions. The separate local-only Round 29 unread-chain census exhausted all 2,871 paid MOVE paths, which were all singletons.", + "first_step": "Census all consecutive same-lineage paid MOVE pairs with exactly one intervening coframed ADD. Cap at 2,871 pairs or 240 seconds. Track the other operand, charge coframe transport and returns, and price only disjoint savings across all 36 copies before any site test.", + "blocked_by": "A surviving directed price still needs exact signed arbitrary-input action, ownership, restoration, precision and tape verification." + } + ] +} diff --git a/research/bit-balanced-retarget-bound/VERIFY.json b/research/bit-balanced-retarget-bound/VERIFY.json new file mode 100644 index 0000000000..e5b425383a --- /dev/null +++ b/research/bit-balanced-retarget-bound/VERIFY.json @@ -0,0 +1,20 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/replay.py", + "--controls" + ], + "timeout_seconds": 540, + "checks": "Authenticate bundled exact inputs, regenerate five predecessor receipts, replay all 1,200 balanced ingress pairs, independently check quotient and directed price, and reject changed source and forged arc." + } + ] +} diff --git a/research/bit-balanced-retarget-bound/audit.py b/research/bit-balanced-retarget-bound/audit.py new file mode 100644 index 0000000000..915bdf8980 --- /dev/null +++ b/research/bit-balanced-retarget-bound/audit.py @@ -0,0 +1,345 @@ +"""Independent exact certificate audit for balanced fixed-clock BIT reassignments.""" + +import argparse +from collections import Counter, defaultdict +from fractions import Fraction as Q +from functools import cache +import gzip +from hashlib import sha256 +import json +from pathlib import Path + +WORD = 'research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz' +INVOICE = 'research/paired-query-only-bit/EFREE-RESULT.json' +TARGET = '10018846261809/2500000000000000' +TRIAL = '1002040748181/250000000000000' +GRID = 10**40 + + +def authenticated(root): + data, pins = {}, {} + for line in (Path(__file__).with_name('SOURCES.tsv')).read_text().splitlines(): + name, digest, _ = line.split('\t') + path = Path(name) + if path.is_absolute() or '..' in path.parts or name in pins: + raise ValueError(f'ambiguous input path {name}') + raw = (root/path).read_bytes() + if sha256(raw).hexdigest() != digest: + raise ValueError(f'changed input {name}') + pins[name], data[name] = digest, raw + return pins, data + + +def bits(support): + assert len(support) == len(set(support)) + return sum(1 << i for i in support) + + +def add_binary(basis, v): + while v: + p = v.bit_length() - 1 + if p not in basis: + basis[p] = v + return + v ^= basis[p] + + +def basis_binary(rows): + basis = {} + for row in rows: + add_binary(basis, row) + return basis + + +def same_binary_space(left, right): + return len(left) == len(right) == len(basis_binary([*left.values(), *right.values()])) + + +def normal(frame): + """An exact rank-seven null vector using forward elimination/back substitution.""" + a = [list(map(Q, row)) for row in frame] + pivots = [] + for col in range(8): + i = len(pivots) + hit = next((j for j in range(i, 7) if a[j][col]), None) + if hit is None: + continue + a[i], a[hit] = a[hit], a[i] + for j in range(i + 1, 7): + m = a[j][col] / a[i][col] + if m: + a[j] = [x - m*y for x, y in zip(a[j], a[i], strict=True)] + pivots.append(col) + assert len(pivots) == 7 + free, = set(range(8)) - set(pivots) + v = [Q(0)]*8 + v[free] = Q(1) + for i, col in reversed(list(enumerate(pivots))): + v[col] = -sum(a[i][j]*v[j] for j in range(col+1, 8))/a[i][col] + assert any(v) + assert contains([list(map(Q, row)) for row in frame], v) + return v + + +def contains(frame, v): + return not any(sum(x*y for x,y in zip(row, v, strict=True)) for row in frame) + + +def closure(edges): + """Reachability via reflexive transitive matrix elimination.""" + nodes = sorted({x for _, a, b in edges for x in (a,b)}) + reach = {(x,x) for x in nodes} | {(a,b) for _,a,b in edges} + for k in nodes: + reach.update((i,j) for i in nodes if (i,k) in reach for j in nodes if (k,j) in reach) + return [e for e in edges if (e[2],e[1]) in reach] + + +def trace(word, selected=()): + selected = set(selected) + n = word['public'] + frames = word['start'] + [None]*word['owned_fields'] + lanes = [(frame, (1 << i) if i < n else 0, frozenset(), None) for i,frame in enumerate(frames)] + moves, touched, sources = {}, defaultdict(list), {} + for t,(op,i,*args) in enumerate(word['program']): + f,r,markers,birth = lanes[i] + touched[i].append(t) + if op == 'MOVE': + assert f == args[0] and f != 1 + g = args[1] + moves[t] = (i,f,g,r) + if t in selected: + peers = [(v, origins) for j,(h,v,origins,_) in enumerate(lanes) if j != i and h == f] + old = [r, *(v for v,_ in peers)] + prior = {e for _,origins in peers for e in origins} + extension = [v for e in prior for v in sources[e].values()] + sources[t] = basis_binary(old + extension) + markers = markers | {t} + lanes[i] = (g,r,markers,t if g == 1 else birth) + elif op == 'ADD': + j,declared = args + assert f == lanes[j][0] == declared + lanes[i] = (f,r ^ lanes[j][1],markers ^ lanes[j][2],birth) + touched[j].append(t) + elif op == 'SWAP': + j, = args + lanes[i],lanes[j] = lanes[j],lanes[i] + touched[j].append(t) + else: + assert op in ('INIT','CLEAR') and birth is None + g, = args + assert f == (None if op == 'INIT' else g) + lanes[i] = (g if op == 'INIT' else None, 0, frozenset(), None) + expected = [1 << i if i < n else 0 for i in range(len(lanes))] + for i in range(111): + expected[111+i] ^= 1 << i + assert [x[0] for x in lanes] == word['final'] + [None]*word['owned_fields'] + assert [x[1] for x in lanes] == expected + final_lineage = {birth: i for i,(f,_,_,birth) in enumerate(lanes) if f == 1} + terminal = {t:r for t,(_,_,g,r) in moves.items() if g == 1} + assert len(moves) == 2871 and len(terminal) == len(final_lineage) == 545 + assert set(terminal) == set(final_lineage) + assert same_binary_space(basis_binary(terminal.values()), basis_binary(lanes[i][1] for i in final_lineage.values())) + return moves,touched,sources,final_lineage + + +def enclose(x): + return Q(x*GRID//1, GRID), Q(-(-x*GRID//1),GRID) + + +@cache +def atanh(x): + terms = 45 + low = sum((2*x**(2*i+1)/(2*i+1) for i in range(terms)), Q(0)) + rest = 2*x**(2*terms+1)/((2*terms+1)*(1-x*x)) + return low,low+rest + + +@cache +def power(r,k): + assert r >= 1 and 0 < k < 1 + shift = r.bit_length()-1 + binary = 1 << shift + lo,hi = atanh(Q(r-binary,r+binary)) + l2,h2 = atanh(Q(1,3)) + left = enclose(k*(lo+shift*l2))[0] + right = enclose(k*(hi+shift*h2))[1] + assert 0 <= left <= right < 1 + + def polynomial(x, n): + value, term = Q(1), Q(1) + for i in range(1,n+1): + term *= -x/i + value += term + return value + + return enclose(r*polynomial(right,25))[0],enclose(r*polynomial(left,24))[1] + + +def price_shape(word,dims,invoice,moves,lineage): + signed = Counter({int(r):v for r,v in invoice['targets'].items()}) + signed.subtract({int(r):v for r,v in invoice['paid'].items()}) + helpers = Counter(dims[word['final'][j]]-dims[word['start'][j]] for j in range(222,word['public'])) + assert helpers == {2:1,4:25,6:1,8:410} == {int(r):v for r,v in invoice['native_helpers'].items()} + major = Counter(dims[moves[t][1]] for t,i in lineage.items() if i>=222 and word['start'][i]==0) + assert major == {2:2,4:2,6:138,7:268} + assert len(invoice['native_instances']) == 36 + + def evaluate(k, h, stock): + coeff = signed.copy() + constant = 0 + for r,n in helpers.items(): + if r < 8: + coeff[r] -= 36*n + constant += 36*n*r + for r,n in major.items(): + if r < 7: + quantity = n + (stock if r==6 else 0) + coeff[r+1] += 36*quantity + coeff[8-r] += 36*quantity + coeff[8] -= 36*quantity + constant -= 36*quantity + coeff[2] += 36*h + constant -= 72*h + lo = hi = Q(constant) + for r,n in coeff.items(): + ends = [n*x for x in power(r,k)] + lo += min(ends) + hi += max(ends) + return lo,hi + + return evaluate + + +def audit(root,receipt): + pins,data = authenticated(root) + assert receipt['status'] == 'PASS_COMPLETE_STOCK_UPPER' + assert receipt['pins'] == pins and receipt['new_sites'] == 0 + assert 1 <= receipt['seconds_cap'] <= 480 + word = json.loads(gzip.decompress(data[WORD])) + invoice = json.loads(data[INVOICE]) + old = json.loads(data['round25/RESULT.json']) + incidence = json.loads(data['round24/RESULT.json']) + original = json.loads(data['round22/RESULT.json']) + marked = [p for p in incidence['incidence'] if p['marked']] + assert [p['event'] for p in marked] == [p['event'] for p in json.loads(data['pr7209/RESULT.json'])['bank_maps']] + singleton = [b['banks'][0] for b in original['scope'][1]['endpoint_consistency']['blocks'] if len(b['banks']) == 1] + assert len(singleton) == 10 and len(marked) == 22 + dims = {int(f):raw['dim'] for f,raw in word['frames'].items()} + frames = {int(f):[list(map(Q,row)) for row in raw['B']] for f,raw in word['frames'].items()} + normals = {f:normal(frames[f]) for f,r in dims.items() if r == 7} + moves,touched,_,lineage = trace(word) + destinations, deadlines = {}, {} + for j in singleton: + row = marked[j] + t = row['event'] + i,f,g,v = moves[t] + assert g==1 and (i,f,bits(row['old_row'])) == (row['owner'],row['source_chart'],v) + successor = next((e for e in touched[i] if e > t),len(word['program'])) + assert successor == row['quiet_window'][1] + deadlines[j] = (t,successor) + charts = {h for h,z in normals.items() if contains(frames[f],z)} + assert charts == set(row['compatible_literal_charts']) + assert not charts & destinations.keys() + destinations.update({h:j for h in charts}) + assert len(destinations)==20 + carriers = [(e,i,f,g,v) for e,(i,f,g,v) in moves.items() + if g in destinations and v and e=7 or not contains(frames[f],normals[g]): + nonnested.append(e) + else: + edges.extend((e,g,h) for h in sorted(destinations) + if h != g and contains(frames[f],normals[h])) + cycles = closure(edges) + # Every feasible nonempty reassignment here exchanges a matched pair + # within one bank. Each paid event and destination occurs only once. + assert len(edges)==len(cycles)==20 + assert len({e for e,_,_ in edges})==20 and len({h for _,_,h in edges})==20 + arcs = {(g,h) for _,g,h in edges} + assert all((h,g) in arcs and destinations[g]==destinations[h] for g,h in arcs) + assert len({frozenset((g,h)) for g,h in arcs})==10 + marked_rows = [moves[row['event']][3] for row in marked] + unmarked_rows = [moves[e][3] for e in lineage if e not in {p['event'] for p in marked}] + w = basis_binary(unmarked_rows + marked_rows) + assert len(unmarked_rows) == 523 and len(w) == 545 + shape = price_shape(word,dims,invoice,moves,lineage) + result = {} + for mode,(name,claim) in enumerate(zip(('literal','quiet'),receipt['clocks'],strict=True)): + assert claim['clock']==name and claim['source_target_pairs']==60*20 + assert claim['nonnested_untested']==nonnested + timely = [e for e in edges if e[0]+1<=deadlines[destinations[e[2]]][mode]] + usable = [e for e in cycles if e[0]+1<=deadlines[destinations[e[2]]][mode]] + for key,actual in [('all_balancing_incidences',edges),('cyclic_balancing_incidences',cycles), + ('timely_incidences',timely),('timely_cyclic_incidences',usable)]: + assert claim[key]==[list(e) for e in actual], key + expanded = 0 + for j,receiver in zip(singleton,claim['recipients'],strict=True): + moves_in = [e for e,_,h in usable if destinations[h]==j] + assert receiver['singleton']==j and receiver['timely_retarget_slots']==moves_in + s = [bits(a['row']) for a in original['scope'][1]['banks'][j]['source_witnesses']] + s += [v for e in moves_in for v in sources[e].values()] + u = unmarked_rows + [marked_rows[j]] + su = basis_binary(s+u) + d = 21 - len(basis_binary(s+list(w.values()))) + len(su) + q = receiver['new_quotient_basis'] + assert d == len(q) == len(basis_binary(map(bits,q))) + for row in q: + lift = 0 + for k in row: + assert 0<=k0 + assert expanded==claim['expanded_singleton_upper'] + bounds = {} + for key in (TARGET,TRIAL): + k = Q(key) + assert shape(k,3,22)[1]<0 + claims = claim['price'][key] + assert len(claims)==3 + for h,price in enumerate(claims): + stock = min(22,12+expanded+2*(1+h)) + lo,hi = shape(k,h,stock) + plo,phi = map(Q,price['net_upper']) + assert (price['h'],price['stock_upper'])==(h,stock) + assert lo<=plo<=phi<=hi + first = next((n for n in range(23) if shape(k,h,n)[0]>0),None) + assert all(shape(k,h,n)[1]<0 for n in range(23 if first is None else first)) + required = first-12-2*(1+h) if first is not None else None + assert price['required_expansions']==required + assert price['affordable_upper'] == (hi>=0 and first is not None) + assert hi < 0 or lo > 0 + bounds.setdefault(key,[]).append({'h':h,'stock_upper':stock,'signed_upper':str(hi), + 'needed_singleton_expansions':required}) + result[name] = {'geometry_arcs':len(edges),'cyclic_arcs':len(cycles),'timely_arcs':len(timely), + 'timely_cyclic_arcs':len(usable),'excluded_nonnested_slots':len(nonnested), + 'expanded_singleton_upper':expanded,'directed_price':bounds} + return {'status':'PASS_INDEPENDENT_GEOMETRY_CHRONOLOGY_QUOTIENT_AND_PRICE', + 'input_pins':pins,'source_target_pairs':1200,'arrivals':len(lineage), + 'disjoint_exchange_blocks':10,'balanced_selections_including_identity':2**10,'modes':result} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('input_root',type=Path) + parser.add_argument('receipt',type=Path) + args = parser.parse_args() + late = [(1,1,2),(9,2,1),(3,2,3)] + assert closure(late) == late[:2] + assert [e for e in closure(late) if e[0]<5]==late[:1] + print(json.dumps(audit(args.input_root,json.loads(args.receipt.read_bytes())),indent=2,sort_keys=True)) + + +if __name__ == '__main__': + assert __debug__ + main() diff --git a/research/bit-balanced-retarget-bound/inputs/pr7209/RESULT.json b/research/bit-balanced-retarget-bound/inputs/pr7209/RESULT.json new file mode 100644 index 0000000000..07664a3820 --- /dev/null +++ b/research/bit-balanced-retarget-bound/inputs/pr7209/RESULT.json @@ -0,0 +1,3539 @@ +{ + "bank_maps": [ + { + "event": 25557, + "pivot_quiet_window": [ + 25554, + 28568 + ], + "prefix_input": [ + 21, + 23, + 33, + 43, + 48, + 52, + 77, + 91, + 102, + 280, + 300, + 322, + 343, + 411, + 440, + 462, + 504, + 533, + 553 + ], + "role": 68, + "suffix_response": [ + 47, + 322, + 332, + 333, + 343, + 367, + 488, + 489, + 499, + 533 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1/2", + "1/2", + "0", + "1/2", + "0", + "0", + "1/2" + ], + "outside_dual": [ + 47 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25441, + 25504, + 25557, + 31953, + 31975 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 516, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "1", + "0", + "0", + "1" + ], + "outside_dual": [ + 47 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25542, + 25557, + 25577, + 31953, + 31975 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "1", + "-1", + "2", + "1", + "0", + "0", + "1" + ], + "outside_dual": [ + 47 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25450, + 25495, + 25557, + 31953, + 31975 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 588, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "-1", + "1", + "-1", + "0", + "0", + "0", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25533, + 25557, + 25567, + 31953, + 31975 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 47 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25557, + 31953, + 31975 + ] + } + ], + "viable": false + }, + { + "event": 25675, + "pivot_quiet_window": [ + 25672, + 28489 + ], + "prefix_input": [ + 19, + 22, + 44, + 46, + 54, + 69, + 84, + 92, + 97, + 277, + 328, + 346, + 394, + 426, + 442, + 452, + 521, + 541, + 551 + ], + "role": 75, + "suffix_response": [ + 78, + 233, + 294, + 301, + 307, + 413, + 414, + 538, + 541, + 567, + 600, + 632 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 607, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "1", + "0", + "0", + "-1", + "1" + ], + "outside_dual": [ + 26, + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25660, + 25675, + 25685 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "-1", + "1", + "-2" + ], + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 21445, + 25623, + 25675, + 25729 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 566, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "1", + "0", + "0", + "-1", + "0", + "-1" + ], + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25641, + 25669, + 25675 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "2", + "1", + "0", + "-1", + "-1", + "0" + ], + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25596, + 25675, + 25701 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25675 + ] + } + ], + "viable": false + }, + { + "event": 25875, + "pivot_quiet_window": [ + 25872, + 28355 + ], + "prefix_input": [ + 8, + 10, + 46, + 60, + 69, + 72, + 107, + 110, + 365, + 392, + 400, + 472, + 478, + 563, + 617 + ], + "role": 65, + "suffix_response": [ + 46, + 290, + 324, + 328, + 329, + 330, + 338, + 365, + 377, + 438, + 528, + 537, + 559, + 594, + 606, + 617 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 513, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "-1", + "0", + "0", + "1", + "-1", + "0" + ], + "outside_dual": [ + 46 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25860, + 25869, + 25875 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "1", + "1", + "1", + "-1", + "1", + "-1" + ], + "outside_dual": [ + 46 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25777, + 25821, + 25875 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 591, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "1", + "0", + "0", + "-1" + ], + "outside_dual": [ + 46 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25875, + 25894, + 25904 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "1", + "-1", + "1", + "1", + "1", + "-1", + "-1" + ], + "outside_dual": [ + 46 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25768, + 25831, + 25875 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 46 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25875 + ] + } + ], + "viable": false + }, + { + "event": 25935, + "pivot_quiet_window": [ + 25932, + 28316 + ], + "prefix_input": [ + 23, + 33, + 43, + 48, + 52, + 61, + 68, + 77, + 91, + 280, + 300, + 322, + 343, + 367, + 387, + 411, + 440, + 499, + 504, + 553 + ], + "role": 102, + "suffix_response": [ + 281, + 450, + 467, + 503, + 504, + 533, + 564, + 585 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "1", + "-1", + "-1", + "1", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25935, + 25979, + 26031 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 551, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "-1", + "0", + "0", + "0", + "0", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25913, + 25935, + 25944 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "-1", + "1", + "1", + "-1", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25935, + 25988, + 26041 + ] + }, + { + "compulsory_suffix_group_span_rank": 3, + "literal_chart": 619, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "-1", + "-1", + "1", + "0", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25919, + 25935, + 25954 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 25935 + ] + } + ], + "viable": false + }, + { + "event": 25997, + "pivot_quiet_window": [ + 25991, + 28278 + ], + "prefix_input": [ + 17, + 27, + 36, + 56, + 62, + 72, + 80, + 89, + 266, + 288, + 307, + 353, + 370, + 399, + 417, + 436, + 496, + 522, + 538 + ], + "role": 80, + "suffix_response": [ + 266, + 294, + 307, + 353, + 496, + 508, + 522 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": 569, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "-1", + "0", + "0", + "-1", + "0", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25963, + 25988, + 25997 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "-1", + "1", + "2" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25944, + 25997, + 26050 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": 609, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "-1", + "0", + "0", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25979, + 25997, + 26006 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "-2", + "1", + "0", + "-1", + "-1", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 25919, + 25997, + 26025 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 25997 + ] + } + ], + "viable": false + }, + { + "event": 26114, + "pivot_quiet_window": [ + 26111, + 28197 + ], + "prefix_input": [ + 0, + 6, + 11, + 16, + 18, + 19, + 24, + 27, + 29, + 223, + 239, + 250, + 262, + 268, + 270, + 281, + 287, + 291, + 493, + 519, + 585, + 609 + ], + "role": 22, + "suffix_response": [ + 276, + 398, + 423, + 519, + 547, + 568 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 3, + "literal_chart": 617, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "-1", + "1", + "1", + "0", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26079, + 26098, + 26114 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "1", + "-1", + "0", + "-1", + "-2", + "0", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26114, + 26124, + 26181 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 518, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "-1", + "0", + "-1", + "0", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26088, + 26108, + 26114 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "1", + "1", + "-2", + "1", + "0", + "0", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26114, + 26171, + 26225 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26114 + ] + } + ], + "viable": false + }, + { + "event": 26206, + "pivot_quiet_window": [ + 26203, + 28135 + ], + "prefix_input": [ + 12, + 13, + 54, + 56, + 62, + 104, + 105, + 255, + 257, + 347, + 352, + 371, + 467, + 469, + 564, + 618 + ], + "role": 67, + "suffix_response": [ + 338, + 352, + 377, + 382, + 485, + 528, + 564, + 618 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "1", + "1", + "-1", + "1", + "1", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26098, + 26152, + 26206 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 514, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "0", + "0", + "1", + "1", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26181, + 26206, + 26215 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "1", + "1", + "-1", + "-1", + "-1", + "-1", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26088, + 26142, + 26206 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 585, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "1", + "1", + "-1", + "0", + "0", + "0", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26191, + 26206, + 26225 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26206 + ] + } + ], + "viable": false + }, + { + "event": 26269, + "pivot_quiet_window": [ + 26266, + 28093 + ], + "prefix_input": [ + 10, + 47, + 48, + 53, + 55, + 59, + 64, + 68, + 104, + 249, + 333, + 345, + 350, + 362, + 376, + 390, + 466, + 516, + 546, + 562 + ], + "role": 104, + "suffix_response": [ + 466, + 479, + 616, + 619 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 3, + "literal_chart": 632, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "1", + "1", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26253, + 26269, + 26275 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "1", + "-1", + "-1", + "-1", + "1", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26269, + 26294, + 26378 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 538, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "-1", + "0", + "-1", + "0", + "0", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26235, + 26263, + 26269 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "1", + "-1", + "1", + "1", + "1", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26269, + 26322, + 26350 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26269 + ] + } + ], + "viable": false + }, + { + "event": 26275, + "pivot_quiet_window": [ + 26272, + 28090 + ], + "prefix_input": [ + 1, + 2, + 4, + 7, + 9, + 10, + 11, + 13, + 225, + 227, + 232, + 241, + 247, + 248, + 252, + 256, + 561, + 579, + 597 + ], + "role": 13, + "suffix_response": [ + 35, + 105, + 247, + 248, + 252, + 303, + 304, + 305, + 408, + 431, + 468, + 469, + 510, + 554, + 579, + 597, + 620 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "0", + "0", + "1", + "0", + "0" + ], + "outside_dual": [ + 35 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26275, + 26285, + 26341 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 632, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "1", + "1", + "0" + ], + "outside_dual": [ + 35, + 37 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26253, + 26269, + 26275 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "0", + "1", + "0", + "0", + "-1", + "0" + ], + "outside_dual": [ + 35 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26275, + 26332, + 26388 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 629, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "1", + "-1", + "0" + ], + "outside_dual": [ + 35 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26244, + 26263, + 26275 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 35 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26275 + ] + } + ], + "viable": false + }, + { + "event": 26322, + "pivot_quiet_window": [ + 26316, + 28061 + ], + "prefix_input": [ + 20, + 25, + 32, + 47, + 58, + 61, + 68, + 83, + 90, + 100, + 273, + 298, + 359, + 367, + 387, + 423, + 438, + 458, + 568, + 593, + 606 + ], + "role": 83, + "suffix_response": [ + 367, + 402, + 423, + 499, + 593, + 628 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 559, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "-1", + "0", + "0", + "1", + "1", + "0", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26285, + 26313, + 26322 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "-1", + "1", + "1", + "1", + "-1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26244, + 26322, + 26378 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 610, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "-1", + "0", + "0", + "1", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26303, + 26322, + 26332 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "1", + "-1", + "1", + "1", + "1", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26269, + 26322, + 26350 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26322 + ] + } + ], + "viable": false + }, + { + "event": 26369, + "pivot_quiet_window": [ + 26363, + 28029 + ], + "prefix_input": [ + 16, + 29, + 37, + 46, + 54, + 62, + 72, + 81, + 88, + 101, + 263, + 309, + 328, + 346, + 370, + 399, + 420, + 433, + 461, + 483, + 589, + 610, + 624 + ], + "role": 79, + "suffix_response": [ + 39, + 94, + 260, + 312, + 313, + 356, + 363, + 446, + 447, + 483, + 501, + 529, + 536, + 558, + 575, + 610, + 624 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "1", + "-1", + "1", + "-1", + "1", + "-1", + "1" + ], + "outside_dual": [ + 39 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26263, + 26303, + 26369 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 567, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "-1", + "0", + "0", + "1", + "0", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26341, + 26369, + 26378 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "-1", + "-1", + "1", + "1", + "1", + "1" + ], + "outside_dual": [ + 39 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26253, + 26313, + 26369 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 601, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "1", + "-1", + "0", + "-1", + "0" + ], + "outside_dual": [ + 39 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26350, + 26369, + 26388 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 39 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26369 + ] + } + ], + "viable": false + }, + { + "event": 26425, + "pivot_quiet_window": [ + 26419, + 27991 + ], + "prefix_input": [ + 2, + 47, + 48, + 50, + 60, + 61, + 63, + 65, + 109, + 333, + 337, + 363, + 366, + 372, + 379, + 476, + 486, + 558, + 599 + ], + "role": 108, + "suffix_response": [ + 78, + 233, + 301, + 307, + 413, + 414, + 474, + 538, + 567, + 599, + 600, + 632 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "-1", + "-1", + "2" + ], + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26425, + 26468, + 26531 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": 532, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26397, + 26425, + 26434 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "-1", + "-1", + "-2" + ], + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26425, + 26477, + 26522 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 631, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "-1", + "-1", + "0" + ], + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26406, + 26425, + 26443 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 78 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26425 + ] + } + ], + "viable": false + }, + { + "event": 26434, + "pivot_quiet_window": [ + 26428, + 27985 + ], + "prefix_input": [ + 2, + 46, + 49, + 51, + 59, + 62, + 64, + 103, + 228, + 330, + 336, + 361, + 375, + 464, + 514, + 544, + 598 + ], + "role": 106, + "suffix_response": [ + 62, + 79, + 226, + 300, + 369, + 370, + 371, + 415, + 416, + 514, + 553, + 578, + 580, + 598 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "1", + "-1", + "2" + ], + "outside_dual": [ + 62 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26434, + 26459, + 26540 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 532, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "1" + ], + "outside_dual": [ + 62 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26397, + 26425, + 26434 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "1", + "-1", + "-2" + ], + "outside_dual": [ + 62 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26434, + 26487, + 26512 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 633, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "1", + "-1", + "0" + ], + "outside_dual": [ + 62 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26416, + 26434, + 26443 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 62 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26434 + ] + } + ], + "viable": false + }, + { + "event": 26477, + "pivot_quiet_window": [ + 26471, + 27957 + ], + "prefix_input": [ + 30, + 44, + 47, + 52, + 61, + 80, + 82, + 325, + 332, + 342, + 418, + 421, + 509, + 540 + ], + "role": 101, + "suffix_response": [ + 61, + 366, + 367, + 368, + 444, + 460, + 509, + 540, + 611, + 612 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 624, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "1", + "0", + "-1", + "0", + "-1" + ], + "outside_dual": [ + 61 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26459, + 26477, + 26497 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "-1", + "-1", + "-2" + ], + "outside_dual": [ + 61 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26425, + 26477, + 26522 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 554, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "-1", + "0", + "0", + "0", + "0", + "-1", + "-1" + ], + "outside_dual": [ + 61 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26449, + 26477, + 26487 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-2", + "0", + "-1", + "0", + "1", + "-1", + "0" + ], + "outside_dual": [ + 61 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26416, + 26477, + 26531 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 61 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26477 + ] + } + ], + "viable": false + }, + { + "event": 26546, + "pivot_quiet_window": [ + 26543, + 27909 + ], + "prefix_input": [ + 0, + 6, + 9, + 14, + 15, + 20, + 21, + 23, + 26, + 224, + 238, + 246, + 258, + 260, + 272, + 274, + 279, + 285, + 482, + 501, + 531, + 603 + ], + "role": 28, + "suffix_response": [ + 95, + 224, + 283, + 448, + 449, + 501, + 591, + 603, + 608 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 623, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "1", + "0", + "-1", + "0", + "1" + ], + "outside_dual": [ + 90, + 95 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26512, + 26531, + 26546 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "1", + "0", + "0", + "0", + "0", + "0", + "1" + ], + "outside_dual": [ + 95 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26397, + 26449, + 26546 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 625, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "-1", + "0", + "1", + "0", + "1" + ], + "outside_dual": [ + 20, + 95 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26522, + 26540, + 26546 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "0", + "1", + "0", + "-1", + "0", + "0" + ], + "outside_dual": [ + 95 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26443, + 26497, + 26546 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 95 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26546 + ] + } + ], + "viable": false + }, + { + "event": 26596, + "pivot_quiet_window": [ + 26593, + 27877 + ], + "prefix_input": [ + 1, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 225, + 241, + 243, + 247, + 248, + 252, + 254, + 256, + 561, + 579, + 615 + ], + "role": 4, + "suffix_response": [ + 108, + 232, + 247, + 252, + 474, + 475, + 561, + 579, + 584, + 597, + 615 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 628, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "1", + "1", + "0" + ], + "outside_dual": [ + 108 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26562, + 26580, + 26596 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "0", + "0", + "0", + "1", + "0" + ], + "outside_dual": [ + 108 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 21445, + 26596, + 26605, + 26657 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 634, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "-1", + "0", + "-1", + "1", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26571, + 26590, + 26596 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "0", + "1", + "0", + "1", + "0", + "0" + ], + "outside_dual": [ + 108 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26596, + 26648, + 26701 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 108 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26596 + ] + } + ], + "viable": false + }, + { + "event": 26648, + "pivot_quiet_window": [ + 26645, + 27843 + ], + "prefix_input": [ + 0, + 6, + 9, + 15, + 21, + 23, + 25, + 26, + 28, + 224, + 238, + 246, + 260, + 274, + 279, + 283, + 285, + 289, + 482, + 501, + 531, + 591 + ], + "role": 20, + "suffix_response": [ + 100, + 224, + 272, + 458, + 459, + 501, + 591, + 596, + 603 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 615, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "1", + "-1", + "1", + "0", + "0" + ], + "outside_dual": [ + 100 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26615, + 26633, + 26648 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "0", + "1", + "0", + "1", + "0", + "0" + ], + "outside_dual": [ + 100 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26596, + 26648, + 26701 + ] + }, + { + "compulsory_suffix_group_span_rank": 4, + "literal_chart": 620, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "-1", + "-1", + "-1", + "0", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26624, + 26642, + 26648 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "1", + "0", + "-1", + "0", + "0", + "0" + ], + "outside_dual": [ + 100 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 21445, + 26552, + 26648, + 26657 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 100 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26648 + ] + } + ], + "viable": false + }, + { + "event": 26682, + "pivot_quiet_window": [ + 26676, + 27824 + ], + "prefix_input": [ + 36, + 41, + 48, + 58, + 63, + 68, + 75, + 84, + 317, + 360, + 373, + 388, + 408, + 425, + 490, + 500, + 510, + 539 + ], + "role": 93, + "suffix_response": [ + 32, + 297, + 298, + 384, + 413, + 444, + 460, + 500, + 510, + 539, + 560, + 569, + 587, + 588, + 629 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "2", + "1", + "1", + "0" + ], + "outside_dual": [ + 32 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26580, + 26624, + 26682 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 543, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "-1", + "0", + "1", + "0", + "1", + "0" + ], + "outside_dual": [ + 29, + 32 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 21445, + 26657, + 26682, + 26691 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "0", + "-2", + "-1", + "0", + "-1", + "1", + "0" + ], + "outside_dual": [ + 32 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26571, + 26633, + 26682 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 613, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "1", + "1", + "1", + "0", + "0" + ], + "outside_dual": [ + 32 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26663, + 26682, + 26701 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 32 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26682 + ] + } + ], + "viable": false + }, + { + "event": 26735, + "pivot_quiet_window": [ + 26729, + 27789 + ], + "prefix_input": [ + 10, + 46, + 57, + 60, + 65, + 69, + 72, + 107, + 355, + 365, + 377, + 392, + 400, + 472, + 528, + 563 + ], + "role": 110, + "suffix_response": [ + 281, + 450, + 462, + 467, + 478, + 503, + 533, + 563, + 564, + 585 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 630, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "0", + "0", + "1", + "0", + "-1", + "1", + "0" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26720, + 26735, + 26754 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "1", + "1", + "-1", + "-1", + "1", + "1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26735, + 26788, + 26831 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": 537, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "-1", + "0", + "1", + "0", + "0", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26711, + 26735, + 26745 + ] + }, + { + "compulsory_suffix_group_span_rank": 2, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "1", + "-1", + "1", + "1", + "-1", + "1", + "-1" + ], + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26735, + 26782, + 26840 + ] + }, + { + "compulsory_suffix_group_span_rank": 1, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": null, + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26735 + ] + } + ], + "viable": false + }, + { + "event": 26788, + "pivot_quiet_window": [ + 26785, + 27751 + ], + "prefix_input": [ + 18, + 24, + 42, + 56, + 69, + 76, + 93, + 99, + 282, + 319, + 354, + 393, + 410, + 445, + 456, + 576, + 586, + 613 + ], + "role": 86, + "suffix_response": [ + 31, + 94, + 260, + 295, + 296, + 356, + 363, + 446, + 447, + 501, + 529, + 536, + 558, + 576 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "1", + "1", + "-1", + "-1", + "1", + "1" + ], + "outside_dual": [ + 31 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21445, + 26735, + 26788, + 26831 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 606, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "1", + "0", + "0", + "1", + "1" + ], + "outside_dual": [ + 10, + 31 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26772, + 26788, + 26806 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "1", + "-1", + "-1", + "-1", + "-1", + "-1", + "-1", + "-1" + ], + "outside_dual": [ + 31 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26726, + 26788, + 26840 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 562, + "midpoint_kind": "literal", + "midpoint_normal": [ + "1", + "-1", + "0", + "0", + "-1", + "-1", + "0", + "0" + ], + "outside_dual": [ + 31 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26763, + 26788, + 26797 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 31 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26788 + ] + } + ], + "viable": false + }, + { + "event": 26806, + "pivot_quiet_window": [ + 26800, + 27742 + ], + "prefix_input": [ + 0, + 5, + 9, + 11, + 30, + 31, + 36, + 37, + 41, + 44, + 223, + 235, + 245, + 250, + 293, + 295, + 306, + 308, + 316, + 324, + 481, + 507, + 537, + 621 + ], + "role": 37, + "suffix_response": [ + 79, + 226, + 250, + 295, + 300, + 415, + 416, + 477, + 493, + 507, + 553, + 578, + 580, + 601 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 606, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "1", + "0", + "0", + "1", + "1" + ], + "outside_dual": [ + 13, + 39, + 79 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26772, + 26788, + 26806 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "1", + "0", + "0", + "0", + "0", + "1" + ], + "outside_dual": [ + 79 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26711, + 26806, + 26816 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 611, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "0", + "1", + "-1", + "0", + "0", + "-1", + "1" + ], + "outside_dual": [ + 13, + 34, + 79 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26782, + 26797, + 26806 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "0", + "1", + "0", + "0", + "1", + "0" + ], + "outside_dual": [ + 79 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26754, + 26806, + 26856 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 79 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26806 + ] + } + ], + "viable": false + }, + { + "event": 26856, + "pivot_quiet_window": [ + 26853, + 27707 + ], + "prefix_input": [ + 0, + 5, + 33, + 35, + 38, + 43, + 236, + 299, + 303, + 310, + 320, + 525, + 552 + ], + "role": 45, + "suffix_response": [ + 0, + 41, + 85, + 222, + 223, + 224, + 236, + 316, + 317, + 427, + 428, + 471, + 511, + 552, + 567, + 572, + 582, + 627 + ], + "variants": [ + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "1", + "0", + "0", + "1", + "0", + "0", + "0" + ], + "outside_dual": [ + 0 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26711, + 26763, + 26856 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 598, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "1", + "1", + "0", + "1", + "0" + ], + "outside_dual": [ + 0 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26822, + 26840, + 26856 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "new_join", + "midpoint_normal": [ + "0", + "0", + "0", + "1", + "0", + "0", + "1", + "0" + ], + "outside_dual": [ + 0 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26754, + 26806, + 26856 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": 603, + "midpoint_kind": "literal", + "midpoint_normal": [ + "0", + "1", + "0", + "-1", + "1", + "0", + "-1", + "0" + ], + "outside_dual": [ + 0 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 21349, + 26831, + 26850, + 26856 + ] + }, + { + "compulsory_suffix_group_span_rank": null, + "literal_chart": null, + "midpoint_kind": "generic", + "midpoint_normal": null, + "outside_dual": [ + 0 + ], + "paired_support": false, + "prefix_group_rank": 0, + "virtual_bank_events": [ + 26856 + ] + } + ], + "viable": false + } + ], + "generic_new_midpoint_classes": 22, + "literal_midpoint_classes": 44, + "main_banks": 22, + "new_individual_sites": 0, + "new_rank7_join_classes": 44, + "pending_maps": 0, + "pins": { + "research/paired-query-only-bit/EFREE-RESULT.json": "a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b", + "research/paired-query-only-bit/independent/interval_gate.py": "8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec", + "research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz": "51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78" + }, + "price": { + "10018846261809/2500000000000000": { + "all_added_setup_and_ordinary_work_granted_free": true, + "compatible_stock_upper": 0, + "needed": 21, + "net_upper": [ + "-116920885236312151966669733026671746943354960998634112774448066617923843166741497/25000000000000000000000000000000000000000000000000000000000000000000000000000000", + "-116920885236312151966669733026671746943354960998634112774448066617923843155818557/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "still_negative": true + }, + "1002040748181/250000000000000": { + "all_added_setup_and_ordinary_work_granted_free": true, + "compatible_stock_upper": 0, + "needed": 22, + "net_upper": [ + "-61379195196405433164387604068841135185593457417758238625015446846091359378000429/12500000000000000000000000000000000000000000000000000000000000000000000000000000", + "-122758390392810866328775208137682270371186914835516477250030893692182718744942513/25000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "still_negative": true + } + }, + "qualifying_local_pairing_rank": 0, + "scope": "Fixed literal normalized operations and bank graph with virtual rank-one plus rank-one subdivision. Grant all literal coframe clocks and all 185 compatible virtual pivots, including all rank-seven rational chart classes. Mandatory own paid pivot coefficient and outside cancellation. New charts cannot acquire new literal occupants in this model.", + "seconds_cap": 480, + "status": "EXHAUSTED_ONE_STOCK_MAP", + "stock_upper": 0, + "target_group_origins": 410, + "tested_bank_maps": 22, + "viable_banks": [], + "virtual_public_banks": 185 +} diff --git a/research/bit-balanced-retarget-bound/inputs/pr7209/verify.py b/research/bit-balanced-retarget-bound/inputs/pr7209/verify.py new file mode 100644 index 0000000000..f2460426f9 --- /dev/null +++ b/research/bit-balanced-retarget-bound/inputs/pr7209/verify.py @@ -0,0 +1,347 @@ +"""One global main-terminal stock map, granting all old and virtual clocks.""" +from collections import Counter,defaultdict +from fractions import Fraction as Q +from functools import cache +import gzip +from hashlib import sha256 +from importlib.util import module_from_spec,spec_from_file_location +import json +from pathlib import Path +import sys +from time import monotonic + +PINS={ + "research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz":"51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78", + "research/paired-query-only-bit/independent/interval_gate.py":"8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec", + "research/paired-query-only-bit/EFREE-RESULT.json":"a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b", +} + + +def read(root,key): + b=(root/key).read_bytes() + if sha256(b).hexdigest()!=PINS[key]: + raise ValueError(f"SHA-256 mismatch: {key}") + return b + + +def check_time(deadline): + if monotonic()>=deadline: + raise TimeoutError("one stock map exceeded budget") + + +def rref(vectors): + basis={} + for x in vectors: + v=list(x) + for p,u in sorted(basis.items()): + if v[p]: + c=v[p] + v=[a-c*b for a,b in zip(v,u,strict=True)] + p=next((i for i,a in enumerate(v) if a),None) + if p is None: + continue + u=[a/v[p] for a in v] + for j,b in list(basis.items()): + if b[p]: + basis[j]=[a-b[p]*z for a,z in zip(b,u,strict=True)] + basis[p]=u + return tuple(tuple(basis[p]) for p in sorted(basis)) + + +@cache +def join(a,b): + return rref(a+b) + + +def positions(bits): + out=[] + while bits: + p=bits&-bits + out.append(p.bit_length()-1) + bits^=p + return out + + +def sweep(w,ranks,pivots,deadline,reverse=False): + n=w["public"] + frames=(w["final"] if reverse else w["start"])+[None]*w["owned_fields"] + rows=[1<=222 and w["start"][x["final_role"]]==0) + assert major=={2:2,4:2,6:138,7:268} + out={} + for k in (Q("0.0040075385047236"),Q("0.004008162992724")): + base=g.moment(signed,k) + minority=(0,0) + for r,n in helper.items(): + if r<8: + minority=g.add(minority,g.smul(g.sub(g.exact(r),g.power(r,k)),copies*n)) + def terminal(a): + return g.smul(g.add(g.sub(g.power(a+1,k),g.exact(1)), + g.sub(g.power(8-a,k),g.power(8,k))),copies) + own=g.add(base,minority) + for a,n in major.items(): + if a<7: + own=g.add(own,g.smul(terminal(a),n)) + one=terminal(6) + needed=next(n for n in range(23) if g.add(own,g.smul(one,n))[0]>0) + assert g.add(own,g.smul(one,needed-1))[1]<0 + total=g.add(own,g.smul(one,stock)) + out[str(k)]={"compatible_stock_upper":stock,"needed":needed, + "net_upper":g.show(total),"still_negative":total[1]<0, + "all_added_setup_and_ordinary_work_granted_free":True} + return out + + +def run(root,seconds): + deadline=monotonic()+seconds + control() + w=json.loads(gzip.decompress(read(root,"research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz"))) + invoice=json.loads(read(root,"research/paired-query-only-bit/EFREE-RESULT.json")) + assert (w["public"],w["owned_fields"],len(w["program"]))==(659,237,34137) + raw_frames={int(f):v for f,v in w["frames"].items()} + ranks={f:x["dim"] for f,x in raw_frames.items()} + frames={f:rref(tuple(map(Q,row)) for row in x["B"]) for f,x in raw_frames.items()} + assert len(set(frames.values()))==len(frames)==636 + assert all(len(frames[f])==r for f,r in ranks.items()) and ranks[1]==8 + chart={space:f for f,space in frames.items() if ranks[f]==7} + ledger=terminal_ledger(w,ranks) + live=[x for x in ledger if x["paid_rank"]>=2] + source={} + owner={} + for x in live: + i=x["move_event"] + op,j,a,b=w["program"][i] + assert op=="MOVE" and (j,b)==(x["bank_owner_at_move"],1) + assert ranks[a]==x["before_rank"] and i not in source + source[i]=frames[a] + owner[i]=j + main=sorted(x["move_event"] for x in live if x["final_role"]<222) + assert len(live)==len(source)==185 and len(main)==22 + pre,pi,touch=sweep(w,ranks,set(source),deadline) + post,si,_=sweep(w,ranks,set(source),deadline,reverse=True) + group=sum(1<2 else 480 + assert 0= 16^768 of their multiplicities", + "specialized_owned_fields": "D = 19950^768 - W", + "specialized_initial_and_final": 0, + "owned_allocation_records_bound": "2*19950^768", + "product_raw_invocation_count": "sum(i=0..767, 19950^(767-i)*107352^i)", + "split_paid_calls_upper": "292512^768", + "product_or_uniform_word_materialized": false, + "rank_mass_surplus": "positive by separated t-moment advantage; no discarded target mass retained as credit", + "construction": "chronological product; specialize low complete targets to owned zero; retain all original paid calls; split paid calls on disjoint axes", + "uniform_compiler": { + "uniform_saving": "38525299/10000000000", + "gap": "1/10000000000", + "theta": "42/43", + "logarithm_power": 610, + "eta": { + "lower": "0.000000593894111688079899290956", + "upper": "0.000000593894111688079899290957" + }, + "ordinary_base_bound": { + "lower": "1677314.946209111847437090130884726124", + "upper": "1677314.946209111847437090130884726125" + }, + "previous_logarithm_power_fails": true, + "H": 293160000000000, + "N": "2^293160000000000", + "integer_test_exponent": 29316, + "preceding_integer_grid_fails": true, + "proof": "retained separated finite compiler and logarithmic majorant, with all new owned fields charged" + } + }, + "independent_finite_ratios": [ + { + "lower": "0.9999999874567925184826207876", + "upper": "0.9999999874567925184826207877" + }, + { + "lower": "0.8732851491950378396086248370", + "upper": "0.8732851491950378396086248371" + }, + { + "lower": "0.9493708822913205830769062941", + "upper": "0.9493708822913205830769062942" + } + ], + "independent_normalized_upper": { + "lower": "0.9999903669098213250012570639", + "upper": "0.9999903669098213250012570640" + }, + "event_counts": { + "ADD": 362, + "SWAP": 364, + "LOCAL": 36, + "IDLE_ONE": 32, + "QUERY": 4 + }, + "events": 798, + "discarded_source_stream": { + "ADD": 1682, + "SCALE": 100, + "LAMBDA": 82, + "IDLE_ONE": 68, + "SWAP": 91, + "QUERY": 4 + }, + "empty_body_targets": { + "count": 0, + "rank1_productive_credit": 0 + }, + "ordinary_basis_records": 1291152, + "ordinary_visible_records": 363507600, + "whole_job_route_count": 569592, + "whole_job_route_records": 740743004160, + "ordinary_record_allowance": 1000000000000, + "owned_bank_bound": 6878988, + "compiler_constants": { + "U_raw": "sum(i=0..767,19950^(767-i)*107352^i)", + "D": "19950^768-W", + "O": "6878988*U_raw+D", + "G": "1000000000000*U_raw+8*R+2*19950^768", + "E": "64*(Z+N+P+G+1)^3", + "B_constant": "P+E", + "C0": "32*N*B_constant^2" + }, + "ordinary_bootstrap": [ + { + "previous": "17/5000", + "covered": "19262649/5000000000", + "atom": "1/250", + "envelope": "4813399601/1250000000000", + "admitted": "38507/10000000", + "strict_debit": "24601/1250000000000" + }, + { + "previous": "38507/10000000", + "covered": "19262649/5000000000", + "atom": "1/250", + "envelope": "4815653101/1250000000000", + "admitted": "12039/3125000", + "strict_debit": "53101/1250000000000" + } + ], + "negative_controls": { + "missing_LOCAL": "reverse coefficient 0,0", + "missing_QUERY": "reverse coefficient 0,0", + "missing_IDLE_ONE": "reverse coefficient 0,1", + "missing_ADD": "reverse coefficient 0,1", + "missing_SWAP": "reverse coefficient 1,0", + "missing_second_native_in_pair": "reverse coefficient 19,19", + "division_by2_after_specialization": "integral A coefficient after lambda removal", + "QUERY_replaced_by_ADD_despite_q1_pass": "reverse coefficient 1,0", + "root_header_target_declared_identity": "reverse coefficient 19,19" + }, + "odd_port_determinant": { + "ring": "F2[q]/(q^2-1)", + "q_ne_1": true, + "single_layer_root_targets": 2109, + "single_layer_target_determinant": "q", + "allowed_D1_gate_determinants": "1", + "doubled_root_targets": 4218, + "doubled_target_determinant": "1", + "scope": "Fixed19q-targets per chain,111ports,existing scalar caller operations; no extra target or QSELF/owned operator. Not a general obstruction on BIT algorithms." + }, + "assumptions": [ + "native_all_columns", + "owned_erasure", + "compiler", + "precision_tape", + "analytic_recovery" + ], + "scope": "Paired E-free BIT specialization of#6980 with two actual native copies per stage; removes empty-body credit with unchanged complete signed moment crossing of#6834; inherited framework; no new kappa or native theorem reproof.", + "new_global_kappa_claim": false, + "seconds": 11.418902893999984 +} diff --git a/research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/independent/interval_gate.py b/research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/independent/interval_gate.py new file mode 100644 index 0000000000..6d5a751dde --- /dev/null +++ b/research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/independent/interval_gate.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +"""Independent certified fixed-grid intervals (80 decimal places). +ln via 2 atanh after binary range reduction; exp(-x) via alternating +Taylor brackets. Uses only integer floor/ceiling, not Decimal transcendents. +""" +from fractions import Fraction as F +from functools import lru_cache +from pathlib import Path +import json,argparse +B=10**80 + +def ceildiv(a,b):return -((-a)//b) +def exact(q): + q=F(q);return q.numerator*B//q.denominator,ceildiv(q.numerator*B,q.denominator) +def add(a,b):return a[0]+b[0],a[1]+b[1] +def sub(a,b):return a[0]-b[1],a[1]-b[0] +def mul(a,b): + p=[a[i]*b[j] for i in (0,1) for j in (0,1)];return min(p)//B,ceildiv(max(p),B) +def div(a,b): + assert b[0]>0 + p=[F(a[i]*B,b[j]) for i in (0,1) for j in (0,1)] + return min(p).__floor__(),max(p).__ceil__() +def smul(a,q):return mul(a,exact(q)) +def atanh_log(y): + yi=exact(y);yy=mul(yi,yi);p=yi;s=(0,0) + for j in range(100):s=add(s,smul(p,F(2,2*j+1)));p=mul(p,yy) + # 0 <= tail <= 2 y^201/[201(1-y^2)] < 3*(1/3)^201. + return s[0],s[1]+ceildiv(3*B,3**201) +@lru_cache(None) +def log(r): + assert r>=1 + k=r.bit_length()-1;y=F(r-2**k,r+2**k) + a=atanh_log(y);b=atanh_log(F(1,3));return add(a,smul(b,k)) +def expminus(x): + assert 0<=x[0]<=x[1]0 and margins[str(hi)][1]<0 and margins[str(tested)][0]>0 + target=moment(T,tested);paid=moment(P,tested) + alpha=div(paid,target) + # Tail exponent = 1-tested+1/7; argument exp may not be negative. + # r^(1-tested+1/7)=r^(1-tested)* exp(log(r)/7). + def exppos(x): + assert 0<=x[0]<=x[1]0 and gap.numerator==1;step=gap.denominator + wins=lambda j:(step*j+1)**written<2**j + l,h=1,2 + while not wins(h):l,h=h,2*h + while h-l>1: + m=(l+h)//2 + if wins(m):h=m + else:l=m + assert wins(h) and not wins(h-1) + # Monotonicity: upper derivative bound on [0, cap]. + derivative=(0,0) + for rr in T.keys()|P.keys(): + c=T.get(rr,0)-P.get(rr,0);r=int(rr) + term=mul(power(r,cap if c>=0 else 0),log(r));derivative=add(derivative,smul(term,-c)) + assert derivative[1]<0 + result=dict(claim=str(claim),tested=str(tested),raw_bracket=[str(lo),str(hi)],moment_margins={k:show(v) for k,v in margins.items()},moment_margin_float={k:value(v) for k,v in margins.items()},derivative_upper=float(F(derivative[1],B)),alpha=value(alpha),gamma=value(gamma),delta=value(delta),minimum_log_power=lp,written_log_power=written,compiler_gap=str(gap),H=str(step*h),BIT_pin=str(cap),BIT_margin=str(cap-tested)) + # Outer formulas evaluated independently after algebraically substituting + # b=k+5g,a=k+4g,q=k+3g,epsilon=1-g,beta=1-3g. + k=claim;g=gap;b=k+5*g;a=k+4*g;q=k+3*g;ep=1-g;be=1-3*g;r0=g/10;stop=layout=g + sig=1-b;tau=1-a;internal=tau+(1-stop)*max(sig-tau,0);leaf=sig+stop*(1-sig);lam=1-(q+a)/2;xi=ep*(1+q)-F(3,32)+layout;key=be+1-ep + M=[ep*q,a,1-ep+q*be,1-ep+a*be,1-ep+be,F(3,32)+xi-ep,xi+F(1,2)-ep,ep,1-(ep+be+48-128+2)] + checks=[cap-a,b-a,q,b-q,a-q,stop,1-stop,(1-stop)*b-a,1-internal-q,1-leaf-q,lam-tau,lam-sig,lam-internal,1-q-lam,1-q-leaf,ep,1-ep,xi-F(1,2),ep-xi,be,ep-be,1-be,1-(2*xi-2)-r0-be,1-(2*xi-2)-be,1-ep-r0,1-ep,r0,1-key,1-be-2*(1-ep),128-48-be,layout,ep-a,F(1,32)-b,F(2**45-7**16),F(2),2-xi,F(5),1-be,1-be,1-ep,M[2]-M[0],g,k-F('.001730970419199163702738'),1-ep,F(11,2)]+[x-k for x in M] + functional=[1-be,be*(1-F(3,1000)),128-48-ep-be-1,be*(1-F(1,250))] + assert len(checks)==54 and len(functional)==4 and min(checks+functional)>0 + result['outer']=dict(strict_count=54,functional_count=4,minimum_margin=str(min(checks+functional)),BIT_just_below_effective_rejected=(a-F(1,10**12))-a<0) + # Input-lift is only needed on [1-tested_complex,1]. A stronger BIT + # pin is irrelevant to this interval; the source's crude BIT-wide bound + # is not imported beyond its valid range. + pos={7:1,3:1,5:1};neg={9:1,4:1,1:2};d1=(0,0);curvature=(0,0) + for hist,sign in ((pos,1),(neg,-1)): + for r,c in hist.items(): + d1=add(d1,smul(log(r),sign*c*r)) + curvature=add(curvature,smul(mul(log(r),log(r)),c*r)) + lift_cap=cap if cap<=F('.00376669') else tested + assert tested<=lift_cap and F(d1[1],B)+lift_cap*F(curvature[1],B)<0 + lifts={} + for price in (claim,tested): + lift=sub(moment(pos,price),moment(neg,price));assert lift[0]>0 + assert price*(-F(d1[1],B))-price*price*F(curvature[1],B)/2>0 + lifts[str(price)]=show(lift) + result['input_lift']=dict(margins=lifts,interval_kappa_cap=str(lift_cap),derivative_upper_on_required_interval=str(F(d1[1],B)+lift_cap*F(curvature[1],B)),source_BIT_wide_crude_bound_would_be=str(F(d1[1],B)+cap*F(curvature[1],B))) + return result +if __name__=='__main__': + p=argparse.ArgumentParser();p.add_argument('audit');p.add_argument('--claim',default='.00362852408');p.add_argument('--tested',default='.00362852408007');p.add_argument('--lower',default='.00362852408398727978896072723289');p.add_argument('--upper',default='.00362852408398727978896072723290');p.add_argument('--out',required=True);p.add_argument('--bit-pin',default='.00376669');a=p.parse_args() + r=gate(json.loads(Path(a.audit).read_text())['invoice'],a.claim,a.tested,a.lower,a.upper,a.bit_pin);Path(a.out).write_text(json.dumps(r,indent=2)+'\n');print(json.dumps(r,indent=2)) diff --git a/research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz b/research/bit-balanced-retarget-bound/inputs/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..b718d6b2848215ad785022106dfa9f871a3d1c0c GIT binary patch literal 111747 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%0DqyAfg6GH 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 0), None) + if n is None: + assert table[-1][1] < 0 + paid.append({"h": h, "unaffordable": True, "full_net_upper": str(table[-1][1])}) + else: + assert table[n - 1][1] < 0 < table[n][0] + paid.append({"h": h, "needed_marked_returns": n, + "needed_singleton_expansions": n - 12 - 2 * (1 + h), + "previous_net_upper": str(table[n - 1][1]), + "first_net_lower": str(table[n][0])}) + output[key] = paid + print(json.dumps(output, sort_keys=True, indent=2)) + + +if __name__ == "__main__": + assert __debug__ + main(Path(sys.argv[1]), Path(sys.argv[2])) diff --git a/research/bit-balanced-retarget-bound/predecessor/round22/SOURCES.tsv b/research/bit-balanced-retarget-bound/predecessor/round22/SOURCES.tsv new file mode 100644 index 0000000000..d12b980b7e --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round22/SOURCES.tsv @@ -0,0 +1,6 @@ +research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz 51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +research/paired-query-only-bit/independent/interval_gate.py 8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/independent/interval_gate.py +research/paired-query-only-bit/EFREE-RESULT.json a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/EFREE-RESULT.json +pr7209/verify.py e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/verify.py +pr7209/RESULT.json 0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/RESULT.json +pr7244/PROPOSED-CLAIM.json 14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/4156504fa39efb51c550d218a9b94fe69dbce8f6/research/p104-two-cut-funded-split/PROPOSED-CLAIM.json diff --git a/research/bit-balanced-retarget-bound/predecessor/round22/verify.py b/research/bit-balanced-retarget-bound/predecessor/round22/verify.py new file mode 100644 index 0000000000..1a12b3b161 --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round22/verify.py @@ -0,0 +1,398 @@ +"""Round 22 causal read-only prebirth stocks, exact F2 quotient and matroid gate.""" +from argparse import ArgumentParser +from collections import defaultdict, deque +import gzip +from hashlib import sha256 +from importlib.util import module_from_spec, spec_from_file_location +from itertools import product +import json +from pathlib import Path +from time import monotonic + + +NATIVE = "research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz" +INVOICE = "research/paired-query-only-bit/EFREE-RESULT.json" + + +def encoded(indices): + return sum(1 << i for i in indices) + + +def positions(value): + result = [] + while value: + bit = value & -value + result.append(bit.bit_length()-1) + value ^= bit + return result + + +def insert(basis, row, tag=0): + while row: + p = row.bit_length()-1 + if p not in basis: + basis[p] = row, tag + return True, tag + v, g = basis[p] + row ^= v + tag ^= g + return False, tag + + +def reduce(basis, row): + rem = tag = 0 + while row: + p = row.bit_length()-1 + if p in basis: + v, g = basis[p] + row ^= v + tag ^= g + else: + b = 1 << p + row ^= b + rem ^= b + return rem, tag + + +def rnk(rows): + basis = {} + for v in rows: + insert(basis, v) + return len(basis) + + +def intersection_projection(rows, terminal): + """Eliminate V's image outside W while retaining each literal row expression.""" + outside, quotient = {}, {} + for row in rows: + residual, _ = reduce(terminal, row) + independent, inside = insert(outside, residual, row) + if not independent: + rem, coeff = reduce(terminal, inside) + assert rem == 0 + insert(quotient, coeff, inside) + return len(rows)-len(outside), [quotient[k] for k in sorted(quotient)] + + +def transversal(bases): + """Matroid intersection. Return maximum independent representatives and Rado witness.""" + nodes = [(i, v, r) for i, part in enumerate(bases) for v, r in part] + by_part = defaultdict(list) + for e, (i, _, _) in enumerate(nodes): + by_part[i].append(e) + current = set() + while True: + represented = {nodes[e][0] for e in current} + linear = {} + for e in sorted(current): + assert insert(linear, nodes[e][1], 1 << e)[0] + pred = {e: None for e, (i, _, _) in enumerate(nodes) if i not in represented} + queue = deque(pred) + sink = None + while queue: + e = queue.popleft() + if e in current: + nxt = (f for f in by_part[nodes[e][0]] if f != e) + else: + rem, support = reduce(linear, nodes[e][1]) + if rem: + sink = e + break + nxt = positions(support) + for f in nxt: + if f not in pred: + pred[f] = e + queue.append(f) + if sink is None: + restricted = sorted((set(range(len(bases))) - represented) | + {nodes[e][0] for e in current if e in pred}) + restricted_rank = rnk(v for i in restricted for v, _ in bases[i]) + assert len(current) == len(bases)-len(restricted)+restricted_rank + return [nodes[e] for e in sorted(current)], restricted, restricted_rank + e = sink + before = len(current) + while e is not None: + current.symmetric_difference_update([e]) + e = pred[e] + assert len(current) == before+1 + assert len({nodes[e][0] for e in current}) == len(current) + assert rnk(nodes[e][1] for e in current) == len(current) + + +def endpoint_gate(bases, deadline): + """Exhaust every option within disjoint support blocks of the same map.""" + n = len(bases) + neighbors = [set([i]) for i in range(n)] + choices = [] + for i, part in enumerate(bases): + span = [0] + for v, _ in part: + span += [v ^ w for w in span] + for j in positions(v): + neighbors[i].add(j) + neighbors[j].add(i) + assert len(span) == len(set(span)) and 1 << i in span + choices.append(sorted(span)) + found = set() + blocks = [] + for i in range(n): + if i in found: + continue + block = {i} + todo = [i] + while todo: + new = neighbors[todo.pop()] - block + block.update(new) + todo.extend(sorted(new)) + found.update(block) + blocks.append(sorted(block)) + + reports = [] + for block in blocks: + tested = feasible = best_nz = best_rank = 0 + witness = tuple(0 for _ in block) + for delta in product(*(choices[i] for i in block)): + tested += 1 + if monotonic() >= deadline: + raise TimeoutError("same table endpoint consistency checks exceeded cap") + final = [(1 << i) ^ v for i, v in zip(block, delta)] + if rnk(final) != len(block): + continue + feasible += 1 + best_nz = max(best_nz, sum(bool(v) for v in delta)) + independent = rnk(delta) + if independent > best_rank: + best_rank = independent + witness = delta + assert feasible >= 1 and best_rank <= best_nz + reports.append({"banks": block, "tested_choices": tested, + "endpoint_preserving_choices": feasible, + "maximum_nonzero_changes": best_nz, + "maximum_independent_return_directions": best_rank, + "rank_attaining_deltas": [positions(v) for v in witness]}) + return {"blocks": reports, "endpoint_preserving_nonzero_upper": sum(b["maximum_nonzero_changes"] for b in reports), + "endpoint_preserving_independent_upper": sum(b["maximum_independent_return_directions"] for b in reports), + "singleton_own_pivot_only": sum(len(b["banks"]) == 1 for b in reports), + "own_pivot_only_delta_spaces": sum(len(part) == 1 for part in bases)} + + +def controls(): + # One initial greedy choice must be replaced to admit the second bank. + a = transversal([[(1, 1), (2, 2)], [(1, 1)]]) + assert len(a[0]) == 2 and (0, 2, 2) in a[0] + a = transversal([[(1, 1)], [(1, 1)], [], [(2, 2)]]) + assert len(a[0]) == 2 and len(a[1]) == 3 and a[2] == 1 + # Two raw outside-contaminated sources can yield one pure terminal direction. + w = {} + insert(w, 1, 0) + insert(w, 2, 1) + assert intersection_projection([5, 6], w) == (1, [(1, 3)]) + assert intersection_projection([5], w) == (0, []) + # Two rows differing by an unchanged arrival have the same quotient. + assert reduce(w, 3) == reduce(w, 2) == (0, 1) + # A bare own-pivot direction cancels the original row under additive replacement. + endpoint = endpoint_gate([[(1, 1)], [(2, 2), (1, 1)]], monotonic()+1) + assert endpoint["endpoint_preserving_independent_upper"] == 1 + assert endpoint["endpoint_preserving_nonzero_upper"] == 1 + # Invertible endpoint can permit two off-diagonal-looking changes only when + # their diagonal/cross-slot combination preserves the full row rank. + endpoint = endpoint_gate([[(1, 1), (2, 2)], [(1, 1), (2, 2)]], monotonic()+1) + assert endpoint["endpoint_preserving_independent_upper"] == 2 + + +def timeline(w, deadline): + n = w["public"] + q = w["start"]+[None]*w["owned_fields"] + x = [1 << j for j in range(n)]+[0]*w["owned_fields"] + chart = defaultdict(dict) + moves = {} + touch = defaultdict(list) + + def observe(j, cut, kind): + if x[j]: + chart[q[j]].setdefault((j, x[j]), (cut, kind)) + + for j in range(n): + observe(j, 0, "initial") + for t, (op, j, *a) in enumerate(w["program"]): + if t % 1024 == 0 and monotonic() >= deadline: + raise TimeoutError("one 22-bank prebirth map exceeded its cap") + touch[j].append(t) + if op == "MOVE": + f, g = a + assert q[j] == f and f != 1 + moves[t] = (j, f, g, x[j]) + q[j] = g + elif op == "ADD": + k, f = a + assert q[j] == q[k] == f + touch[k].append(t) + x[j] ^= x[k] + elif op == "SWAP": + k, = a + touch[k].append(t) + q[j], q[k] = q[k], q[j] + x[j], x[k] = x[k], x[j] + observe(k, t+1, op) + elif op == "INIT": + assert q[j] is None and a[0] != 1 + q[j], x[j] = a[0], 0 + else: + assert op == "CLEAR" and q[j] == a[0] != 1 + q[j], x[j] = None, 0 + observe(j, t+1, op) + endpoint = [1 << j for j in range(n)]+[0]*w["owned_fields"] + for j in range(111): + endpoint[111+j] ^= 1 << j + assert x == endpoint and q == w["final"]+[None]*w["owned_fields"] + assert len(moves) == 2871 + windows = {} + for t, (j, _, _, _) in moves.items(): + k = touch[j].index(t) + windows[t] = [touch[j][k-1]+1 if k else 0, + touch[j][k+1] if k+1 < len(touch[j]) else len(w["program"])] + return chart, moves, windows, endpoint + + +def library(mark, observations, moves, windows, retime): + t = mark["event"] + owner, source, target, original = moves[t] + assert target == 1 and original == encoded(mark["prefix_input"]) + assert mark["pivot_quiet_window"] == windows[t] + horizon = windows[t][1] if retime else t + seen = {} + routes = set() + + def add_chart(f): + for (j, row), (cut, kind) in observations.get(f, {}).items(): + if cut <= horizon and (f, j, row) != (source, owner, original): + witness = ("physical", f, cut, j, kind) + seen.setdefault(row, witness) + routes.add(witness) + + add_chart(source) + for variant in mark["variants"]: + f = variant["literal_chart"] + if f is not None: + add_chart(f) + for e in variant["virtual_bank_events"]: + if e == t: + continue + j, g, last, row = moves[e] + assert last == 1 + available = windows[e][0] if retime else e+1 + if available <= horizon: + witness = ("virtual", g, available, j, e) + seen.setdefault(row, witness) + routes.add(witness) + return seen, len(routes), horizon + + +def raw_basis(rows): + basis = {} + for row in rows: + insert(basis, row) + return [value for value, _ in basis.values()] + + +def scope(marks, observations, moves, windows, terminal, retime, deadline): + bank_rows, bases = [], [] + for mark in marks: + source, count, horizon = library(mark, observations, moves, windows, retime) + rows = raw_basis(sorted(source)) + inside, projected = intersection_projection(rows, terminal) + bases.append(projected) + digest = sha256(json.dumps(sorted((v, w) for v, w in source.items()), separators=(",", ":")).encode()).hexdigest() + # Physical caches are observations at specific clocks. Virtual entries + # are old paid input rows with an exact compatible midpoint certificate. + bank_rows.append({"event": mark["event"], "deadline_cut": horizon, + "observed_coefficient_rows": len(source), "route_observations": count, + "source_rank": len(rows), "source_intersection_terminal_rank": inside, + "projected_rank": len(projected), "source_provenance_sha256": digest, + "source_witnesses": [{"row": positions(v), "path": list(w)} + for v, w in sorted(source.items())], + "quotient_basis": [positions(c) for c, _ in projected]}) + if monotonic() >= deadline: + raise TimeoutError("one 22-bank prebirth map exceeded its cap") + assignment, restricted, subrank = transversal(bases) + endpoint = endpoint_gate(bases, deadline) + return {"scope": "quiet-window union" if retime else "literal birth clock", + "banks": bank_rows, "compatible_stock_upper": len(assignment), + "independent_assignment": [{"bank": i, "event": marks[i]["event"], + "quotient": positions(v), "terminal_row": positions(r)} + for i, v, r in assignment], + "rado_restricted_banks": restricted, "rado_restricted_rank": subrank, + "rado_exact_upper": len(marks)-len(restricted)+subrank, + "endpoint_consistency": endpoint, + "unresolved_target_clearing_assignments_within_scope": 0 if endpoint["endpoint_preserving_independent_upper"] < 21 else 22} + + +def main(root, seconds): + deadline = monotonic()+seconds + controls() + pins = {} + for line in Path(__file__).with_name("SOURCES.tsv").read_text().splitlines(): + name, digest, _ = line.split("\t") + if name in pins: + raise ValueError(f"duplicate source path {name}") + pins[name] = digest + + def read(name): + data = (root/name).read_bytes() + if sha256(data).hexdigest() != pins[name]: + raise ValueError(f"SHA-256 mismatch: {name}") + return data + + for key in pins: + read(key) + peer = json.loads(read("pr7244/PROPOSED-CLAIM.json")) + assert peer["kappa"] == "455671545979/125000000000000" + assert peer["complex_BIT_premise"] == "376669/100000000" + w = json.loads(gzip.decompress(read(NATIVE))) + invoice = json.loads(read(INVOICE)) + maps = json.loads(read("pr7209/RESULT.json"))["bank_maps"] + assert len(maps) == 22 + dims = {int(i): s["dim"] for i, s in w["frames"].items()} + assert [i for i in dims if dims[i] == 8] == [1] and 1 not in w["start"] + chart, moves, windows, endpoint = timeline(w, deadline) + arrivals = {e: row for e, (_, _, g, row) in moves.items() if g == 1} + chosen = [m["event"] for m in maps] + assert len(arrivals) == 545 and len(set(chosen)) == 22 + basis = {} + for t, row in arrivals.items(): + if t not in chosen: + assert insert(basis, row)[0] + assert len(basis) == 523 + for j, t in enumerate(chosen): + assert dims[moves[t][1]] == 6 + assert insert(basis, arrivals[t], 1 << j)[0] + assert len(basis) == 545 + assert all(not reduce(basis, row)[0] for f, row in zip(w["final"], endpoint) if f == 1) + assert rnk(row for f, row in zip(w["final"], endpoint) if f == 1) == 545 + literal = scope(maps, chart, moves, windows, basis, False, deadline) + quiet = scope(maps, chart, moves, windows, basis, True, deadline) + assert literal["compatible_stock_upper"] <= quiet["compatible_stock_upper"] + spec = spec_from_file_location("prior", root/"pr7209/verify.py") + p = module_from_spec(spec) + spec.loader.exec_module(p) + ledger = p.terminal_ledger(w, dims) + for s in (literal, quiet): + s["raw_quotient_price"] = p.prices(root, invoice, w, dims, ledger, s["compatible_stock_upper"]) + endpoint = s["endpoint_consistency"] + s["endpoint_preserving_price"] = p.prices(root, invoice, w, dims, ledger, endpoint["endpoint_preserving_independent_upper"]) + s["endpoint_preserving_nonzero_price"] = p.prices(root, invoice, w, dims, ledger, endpoint["endpoint_preserving_nonzero_upper"]) + return {"status": "NO VERIFIED GAIN", "seconds_cap": seconds, "pins": pins, + "target": "10018846261809/2500000000000000", "retained_BIT_premise": peer["complex_BIT_premise"], + "banks": len(maps), "pending_census_cases": 0, "new_sites": 0, + "unchanged_terminal_rank": 523, "required_terminal_rank": 545, + "scope": [literal, quiet]} + + +if __name__ == "__main__": + parser = ArgumentParser(description=__doc__) + parser.add_argument("root", type=Path) + parser.add_argument("--seconds", type=int, default=480) + args = parser.parse_args() + if not 1 <= args.seconds <= 480: + parser.error("--seconds must be in 1..480") + print(json.dumps(main(args.root, args.seconds), sort_keys=True, indent=2)) diff --git a/research/bit-balanced-retarget-bound/predecessor/round23/SOURCES.tsv b/research/bit-balanced-retarget-bound/predecessor/round23/SOURCES.tsv new file mode 100644 index 0000000000..850072eb41 --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round23/SOURCES.tsv @@ -0,0 +1,9 @@ +research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz 51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +research/paired-query-only-bit/independent/interval_gate.py 8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/independent/interval_gate.py +research/paired-query-only-bit/EFREE-RESULT.json a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/EFREE-RESULT.json +pr7209/verify.py e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/verify.py +pr7209/RESULT.json 0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/RESULT.json +pr7244/PROPOSED-CLAIM.json 14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/4156504fa39efb51c550d218a9b94fe69dbce8f6/research/p104-two-cut-funded-split/PROPOSED-CLAIM.json +round22/verify.py 6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948 local-only sealed Round 22 bit/verify.py +round22/RESULT.json 6f4c3afc1185668de6e98ea1608170ae9db8ee5c2c5318b5d5a6577d609252e3 local-only sealed Round 22 bit/RESULT.json +round22/SOURCES.tsv 963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6 local-only sealed Round 22 bit/SOURCES.tsv diff --git a/research/bit-balanced-retarget-bound/predecessor/round23/verify.py b/research/bit-balanced-retarget-bound/predecessor/round23/verify.py new file mode 100644 index 0000000000..97b5b52e37 --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round23/verify.py @@ -0,0 +1,272 @@ +"""Census of 523 unchanged-geometry BIT terminal donor ports.""" +from argparse import ArgumentParser +from collections import Counter, defaultdict +from fractions import Fraction +import gzip +from hashlib import sha256 +from importlib.util import module_from_spec, spec_from_file_location +import json +from pathlib import Path +from time import monotonic + + +NATIVE = 'research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz' +INVOICE = 'research/paired-query-only-bit/EFREE-RESULT.json' + + +def import_file(name, path): + spec = spec_from_file_location(name, path) + module = module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def read_pinned(root): + pins = {} + for line in Path(__file__).with_name('SOURCES.tsv').read_text().splitlines(): + name, digest, _ = line.split('\t') + if name in pins: + raise ValueError(f'duplicate dependency path: {name}') + pins[name] = digest + result = {} + for path, digest in pins.items(): + blob = (root/path).read_bytes() + if sha256(blob).hexdigest() != digest: + raise ValueError(f'SHA-256 mismatch: {path}') + result[path] = blob + return pins, result + + +def timeline(w, deadline): + n = w['public'] + frames = w['start'] + [None]*w['owned_fields'] + rows = [1 << i for i in range(n)] + [0]*w['owned_fields'] + observed = defaultdict(dict) + touches = defaultdict(list) + arrivals = {} + + def record(j, cut, op): + if rows[j]: + observed[frames[j]].setdefault((j, rows[j]), (cut, op)) + + for i in range(n): + record(i, 0, 'initial') + for t, (op, i, *args) in enumerate(w['program']): + if t % 1024 == 0 and monotonic() >= deadline: + raise TimeoutError('523-port donor census exceeded cap') + touches[i].append(t) + if op == 'MOVE': + f, g = args + assert frames[i] == f and f != 1 + if g == 1: + peers = {rows[j]: ('live', f, t, j) for j, chart in enumerate(frames) + if j != i and chart == f and rows[j]} + arrivals[t] = i, f, rows[i], peers + frames[i] = g + elif op == 'ADD': + j, f = args + assert frames[i] == frames[j] == f + touches[j].append(t) + rows[i] ^= rows[j] + elif op == 'SWAP': + j, = args + touches[j].append(t) + frames[i], frames[j] = frames[j], frames[i] + rows[i], rows[j] = rows[j], rows[i] + record(j, t+1, op) + else: + assert op in ('INIT', 'CLEAR') and args[0] != 1 + assert frames[i] == (None if op == 'INIT' else args[0]) + frames[i] = args[0] if op == 'INIT' else None + rows[i] = 0 + record(i, t+1, op) + want = [1 << i for i in range(n)] + [0]*w['owned_fields'] + for i in range(111): + want[111+i] ^= 1 << i + assert rows == want and frames == w['final'] + [None]*w['owned_fields'] + assert len(arrivals) == 545 + ends = {} + for t, (i, _, _, _) in arrivals.items(): + uses = touches[i] + j = uses.index(t) + ends[t] = uses[j+1] if j+1 < len(uses) else len(w['program']) + return arrivals, observed, ends, [row for f, row in zip(frames, rows) if f == 1] + + +def components(bases): + parent = list(range(len(bases))) + + def root(i): + while parent[i] != i: + parent[i] = parent[parent[i]] + i = parent[i] + return i + + for i, space in enumerate(bases): + for x, _ in space: + while x: + b = x & -x + j = b.bit_length()-1 + parent[root(j)] = root(i) + x ^= b + groups = defaultdict(list) + for i in range(len(bases)): + groups[root(i)].append(i) + return sorted(groups.values()) + + +def cap(support, shift, old_stock=12): + assert support <= shift <= 22 + return min(22, old_stock + support + shift) + + +def charged_refinements(root, price, word, dims, invoice): + """A separate full-volume positive-rank split for every new donor.""" + interval = import_file('interval', root/'research/paired-query-only-bit/independent/interval_gate.py') + ledger = price.terminal_ledger(word,dims) + copies = len(invoice['native_instances']) + assert copies == 36 + result = [] + for h in range(5): + stock = min(22,14+2*h) + relaxed = price.prices(root,invoice,word,dims,ledger,stock) + row = {'new_charged_donors': h, 'stock_upper': stock, 'also_bounds_all_larger_h': h == 4, + 'directed': {}} + for key, rec in relaxed.items(): + k = Fraction(key) + charge = interval.smul(interval.sub(interval.exact(2),interval.power(2,k)),copies) + lower, upper = map(Fraction,rec['net_upper']) + c0,c1 = map(Fraction,interval.show(charge)) + assert 0 < c0 <= c1 + net = lower-h*c1, upper-h*c0 + assert net[1] < 0 + row['directed'][key] = {'minimum_split_tariff_interval': [str(c0),str(c1)], + 'unbilled_net_upper_interval': [str(lower),str(upper)], + 'net_upper_after_split_lower_tariff': list(map(str,net))} + result.append(row) + return result + + +def run(root, seconds): + deadline = monotonic()+seconds + pins, data = read_pinned(root) + prev = import_file('round22', root/'round22/verify.py') + price = import_file('pr7209', root/'pr7209/verify.py') + assert cap(0, 0) == 12 and cap(4, 4) == 20 and cap(5, 5) == 22 + control = prev.transversal([[(1, 0), (2, 0)], [(1, 0)]]) + assert len(control[0]) == 2 + # An alternative leaving W cannot carry a valid new terminal payload. + example = {} + prev.insert(example, 1, 1) + assert prev.intersection_projection([2], example) == (0, []) + assert prev.intersection_projection([2, 3], example) == (1, [(1, 1)]) + word = json.loads(gzip.decompress(data[NATIVE])) + assert 1 not in word['start'] + dims = {int(f): x['dim'] for f, x in word['frames'].items()} + assert [f for f in dims if dims[f] == 8] == [1] + invoice = json.loads(data[INVOICE]) + peer = json.loads(data['pr7244/PROPOSED-CLAIM.json']) + assert peer['complex_BIT_premise'] == '376669/100000000' + marks = [x['event'] for x in json.loads(data['pr7209/RESULT.json'])['bank_maps']] + prev_result = json.loads(data['round22/RESULT.json']) + quiet = prev_result['scope'][1] + assert [v['event'] for v in quiet['banks']] == marks + old_gate = quiet['endpoint_consistency'] + assert old_gate['endpoint_preserving_independent_upper'] == 12 + singletons = [b['banks'][0] for b in old_gate['blocks'] if len(b['banks']) == 1] + assert len(singletons) == 10 + singleton_mask = prev.encoded(singletons) + arrivals, observed, ends, required = timeline(word, deadline) + donors = sorted(set(arrivals)-set(marks)) + assert len(donors) == 523 + order = donors+marks + marked_offset = len(donors) + W = {} + for i, t in enumerate(order): + assert prev.insert(W, arrivals[t][2], 1 << i)[0] + assert len(W) == prev.rnk(required) == 545 + assert all(not prev.reduce(W, x)[0] for x in required) + marked_spaces = [] + for i, entry in enumerate(quiet['banks']): + raw = prev.raw_basis(prev.encoded(x['row']) for x in entry['source_witnesses']) + _, space = prev.intersection_projection(raw, W) + assert prev.rnk(v >> marked_offset for v, _ in space) == entry['projected_rank'] + marked_spaces.append(space) + all_scopes = [] + for retime in (False, True): + donor_maps = [] + donor_spaces = [] + eligible = [] + full_bases = [] + single_bases = [] + donor_sets = [] + for i, t in enumerate(donors): + j, f, old, live = arrivals[t] + candidates = dict(live) + if retime: + for (owner, row), (cut, op) in observed[f].items(): + if cut <= ends[t] and (owner, row) != (j, old): + candidates.setdefault(row, ('cached', f, cut, owner, op)) + raw = prev.raw_basis(sorted(candidates)) + inside, space = prev.intersection_projection(raw, W) + assert inside == len(space) + donor_spaces.append(space) + coord_space = [(v, row) for v, row in space if v != 1 << i] + # A pure cancellation is infeasible alone. If a bank has more + # choices, its whole span is still a safe upper for its projection. + if coord_space: + eligible.append(i) + mark_b = {} + sing_b = {} + for v, row in space: + proj = v >> marked_offset + prev.insert(mark_b, proj, row) + prev.insert(sing_b, proj & singleton_mask, row) + full_bases.append(list(mark_b.values())) + single_bases.append(list(sing_b.values())) + if mark_b: + donor_sets.append(i) + donor_maps.append({'event': t, 'owner': j, 'source_chart': f, + 'horizon': ends[t] if retime else t, + 'old_row': prev.positions(old), + 'source_rows': [{'row': prev.positions(x), 'witness': path} + for x, path in sorted(candidates.items())], + 'V_intersection_W_rank': inside, + 'projection_marked_basis': [prev.positions(v) for v, _ in mark_b.values()], + 'projection_singleton_basis': [prev.positions(v) for v, _ in sing_b.values()], + 'full_terminal_basis': [prev.positions(v) for v, _ in space]}) + if monotonic() >= deadline: + raise TimeoutError('523-port donor census exceeded cap') + matches = [] + for choices in (full_bases, single_bases): + assignment, restricted, restricted_rank = prev.transversal(choices) + matches.append({'rank': len(assignment), + 'assignments': [{'donor_index': i, 'event': donors[i], 'projection': prev.positions(v), + 'delta': prev.positions(x)} for i, v, x in assignment], + 'rado_restricted': restricted, 'rado_restricted_rank': restricted_rank}) + t, s = (m['rank'] for m in matches) + group = components(donor_spaces+marked_spaces) + caps = cap(s,t) + all_scopes.append({'scope': 'same-chart historical/quiet cache' if retime else 'same-cut physical peers', + 'donors': donor_maps, 'possibly_changed_donors': len(eligible), + 'donors_with_nonzero_old_marked_projection': len(donor_sets), + 'marked_quotient_rank': matches[0], 'isolated_singleton_projection_rank': matches[1], + 'terminal_support_component_sizes': dict(sorted(Counter(map(len,group)).items())), + 'maximum_component': max(map(len,group)), + 'components_with_marks': [[order[k] for k in g] for g in group if any(k>=523 for k in g)], + 'raw_stock_upper': caps, + 'price_upper': price.prices(root, invoice, word, dims, price.terminal_ledger(word,dims),caps)}) + return {'status':'NO VERIFIED GAIN','pins':pins,'seconds_cap':seconds,'completed_donor_slots':523, + 'pending_donor_slots':0,'new_sites':0,'quiet_singleton_mark_positions':singletons, + 'target':'10018846261809/2500000000000000','scopes':all_scopes, + 'one_separately_charged_split_per_additional_donor': charged_refinements(root,price,word,dims,invoice)} + + +if __name__ == '__main__': + p = ArgumentParser(description=__doc__) + p.add_argument('input_root',type=Path) + p.add_argument('--seconds',type=int,default=480) + args = p.parse_args() + if not 1 <= args.seconds <= 480: + p.error('--seconds must be in 1..480') + print(json.dumps(run(args.input_root,args.seconds),sort_keys=True,indent=2)) diff --git a/research/bit-balanced-retarget-bound/predecessor/round24/SOURCES.tsv b/research/bit-balanced-retarget-bound/predecessor/round24/SOURCES.tsv new file mode 100644 index 0000000000..d637b693dc --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round24/SOURCES.tsv @@ -0,0 +1,13 @@ +research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz 51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +research/paired-query-only-bit/independent/interval_gate.py 8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/independent/interval_gate.py +research/paired-query-only-bit/EFREE-RESULT.json a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/EFREE-RESULT.json +pr7209/verify.py e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/verify.py +pr7209/RESULT.json 0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/RESULT.json +pr7244/PROPOSED-CLAIM.json 14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/4156504fa39efb51c550d218a9b94fe69dbce8f6/research/p104-two-cut-funded-split/PROPOSED-CLAIM.json +round22/verify.py 6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948 local-only sealed Round 22 bit/verify.py +round22/RESULT.json 6f4c3afc1185668de6e98ea1608170ae9db8ee5c2c5318b5d5a6577d609252e3 local-only sealed Round 22 bit/RESULT.json +round22/SOURCES.tsv 963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6 local-only sealed Round 22 bit/SOURCES.tsv +round23/verify.py b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2 local sealed Round 23 bit/verify.py +round23/RESULT.json 16863072b372547b6a062210da4d338704ce680ec22cd5e4e6702560c93a1bf7 local sealed Round 23 bit/RESULT.json +round23/SOURCES.tsv a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2 local sealed Round 23 bit/SOURCES.tsv +pr7258/SUMMARY.json b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/90a63fbefcf79c3e0c0453ef0741dff8517b6167/research/bit-fixed-payload-quotient-bound/SUMMARY.json diff --git a/research/bit-balanced-retarget-bound/predecessor/round24/verify.py b/research/bit-balanced-retarget-bound/predecessor/round24/verify.py new file mode 100644 index 0000000000..74ec88d93e --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round24/verify.py @@ -0,0 +1,264 @@ +"""One exact 185-port BIT incidence census for old funded rank-seven ingress.""" +from argparse import ArgumentParser +from collections import defaultdict +from fractions import Fraction +import gzip +from hashlib import sha256 +from importlib.util import module_from_spec, spec_from_file_location +import json +from math import lcm +from pathlib import Path +from time import monotonic + +NATIVE = 'research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz' +INVOICE = 'research/paired-query-only-bit/EFREE-RESULT.json' +TARGET = '10018846261809/2500000000000000' +TRIAL = '1002040748181/250000000000000' + + +def load_code(name, path): + s = spec_from_file_location(name,path) + m = module_from_spec(s) + s.loader.exec_module(m) + return m + + +def read(root): + pins, source = {}, {} + for line in Path(__file__).with_name('SOURCES.tsv').read_text().splitlines(): + name,digest,_ = line.split('\t') + if name in pins: + raise ValueError(f'duplicate dependency path: {name}') + pins[name] = digest + data = (root/name).read_bytes() + if sha256(data).hexdigest() != digest: + raise ValueError(f'SHA-256 mismatch: {name}') + source[name] = data + return pins,source + + +def primitive(row): + scale = lcm(*(x.denominator for x in row)) + return tuple(int(x*scale) for x in row) + + +def contains(rows, normal): + return all(sum(a*b for a,b in zip(row,normal,strict=True)) == 0 for row in rows) + + +def paid_timeline(w, deadline): + n = w['public'] + chart = w['start']+[None]*w['owned_fields'] + rows = [1<= deadline: + raise TimeoutError('185-port paid incidence exceeded cap') + touches[i].append(t) + if op == 'MOVE': + f,g = args + assert chart[i] == f and f != 1 + moves[t] = i,f,g,rows[i] + chart[i] = g + elif op == 'ADD': + j,f = args + assert chart[i] == chart[j] == f + touches[j].append(t) + rows[i] ^= rows[j] + elif op == 'SWAP': + j, = args + touches[j].append(t) + chart[i],chart[j] = chart[j],chart[i] + rows[i],rows[j] = rows[j],rows[i] + observe(j,t+1,op) + else: + assert op in ('INIT','CLEAR') and args[0] != 1 + assert chart[i] == (None if op == 'INIT' else args[0]) + chart[i],rows[i] = (args[0] if op == 'INIT' else None),0 + observe(i,t+1,op) + want = [1<>523 + lin.insert(marked,outside,row) + lin.insert(singleton,outside&mask,row) + return list(marked.values()),list(singleton.values()) + + +def rank_receipt(parts,events,lin): + assigned,subset,rank = lin.transversal(parts) + return {'rank':len(assigned),'rado_subset':subset,'rado_subset_rank':rank, + 'directions':[{'port':events[i],'projection':lin.positions(v),'source_row':lin.positions(row)} + for i,v,row in assigned]} + + +def bill(root,pricing,word,dims,invoice,t,s): + g = load_code('price_intervals',root/'research/paired-query-only-bit/independent/interval_gate.py') + ledger = pricing.terminal_ledger(word,dims) + copies = len(invoice['native_instances']) + assert copies == 36 + upper,need = [],[] + for h in range(6): + stock = min(22,12+min(22,t+h)+min(10,s+h)) + raw = pricing.prices(root,invoice,word,dims,ledger,stock) + full = pricing.prices(root,invoice,word,dims,ledger,22) + prices,requirements = {},{} + for key in (TARGET,TRIAL): + charge = g.smul(g.sub(g.exact(2),g.power(2,Fraction(key))),copies) + c0,c1 = map(Fraction,g.show(charge)) + p0,p1 = map(Fraction,raw[key]['net_upper']) + f0,f1 = map(Fraction,full[key]['net_upper']) + assert 0= 0: + requirements[key] = max(0,raw[key]['needed']-12-2*(t+h)) + upper.append({'additional_separately_charged_donors':h,'stock_upper':stock, + 'also_covers_more_charged_donors':h==5,'directed':prices}) + if requirements: + need.append({'additional_separately_charged_donors':h, + 'minimum_changed_singleton_marked_libraries':requirements}) + assert upper[-1]['stock_upper']==22 + return upper,need + + +def run(root,seconds): + deadline = monotonic()+seconds + pins,data = read(root) + lin = load_code('round22',root/'round22/verify.py') + pricing = load_code('pr7209',root/'pr7209/verify.py') + assert contains([(1,0)],(0,1)) and not contains([(1,1)],(0,1)) + prior = json.loads(data['round23/RESULT.json']) + local22 = json.loads(data['round22/RESULT.json']) + public22 = json.loads(data['pr7258/SUMMARY.json']) + peer = json.loads(data['pr7244/PROPOSED-CLAIM.json']) + assert prior['target'] == public22['target'] == TARGET + assert peer['complex_BIT_premise'] == public22['retained_BIT_premise'] == '376669/100000000' + assert public22['receipt_sha256'] == sha256(data['round22/RESULT.json']).hexdigest() + assert public22['scopes'][1]['endpoint_preserving_independent_stock'] == 12 + mark_maps = json.loads(data['pr7209/RESULT.json'])['bank_maps'] + marks = [m['event'] for m in mark_maps] + word = json.loads(gzip.decompress(data[NATIVE])) + invoice = json.loads(data[INVOICE]) + assert 1 not in word['start'] + dims = {int(f):x['dim'] for f,x in word['frames'].items()} + rows = {int(f):[primitive(tuple(Fraction(v) for v in r)) for r in x['B']] for f,x in word['frames'].items()} + normal = {f:primitive(tuple(Fraction(v) for v in pricing.normal(pricing.rref([tuple(map(Fraction,r)) for r in rows[f]])))) + for f in rows if dims[f]==7} + assert len(normal)==120 and [f for f in dims if dims[f]==8]==[1] + paid,window,history,required = paid_timeline(word,deadline) + terminal = {t:v for t,(_,_,g,v) in paid.items() if g==1} + donors = sorted(set(terminal)-set(marks)) + cohort = [t for t in sorted(terminal) if dims[paid[t][1]]<=6] + assert len(terminal)==545 and len(donors)==523 and len(cohort)==185 + assert set(marks)<=set(cohort) + W = {} + for i,t in enumerate(donors+marks): + assert lin.insert(W,terminal[t],1<= deadline: + raise TimeoutError('185-port paid incidence exceeded cap') + i,f,g,old = paid[t] + assert g==1 + mids = [mid for mid,n in normal.items() if contains(rows[f],n)] + if t in marks: + known = [v['literal_chart'] for v in mark_maps[marks.index(t)]['variants'] if v['literal_chart'] is not None] + assert sorted(mids)==sorted(known) + incidence[t] = {'event':t,'owner':i,'source_chart':f,'source_rank':dims[f], + 'paid_rank':8-dims[f],'quiet_window':window[t], 'marked':t in marks, + 'old_row':lin.positions(old),'compatible_literal_charts':mids, 'clocks':[]} + scopes = [] + for retime in (False,True): + all_m,all_s = [],[] + funded_useful, any_useful = [],[] + for t in sorted(terminal): + raw = baseline.get(t,set()) + funded = set() + grant = set() + if t in incidence: + cut = window[t][1] if retime else t + choices = [] + for mid in incidence[t]['compatible_literal_charts']: + paid_rows = [(e,i,f,row) for e,i,f,row in incoming[mid] if e=0 for x in bills) and len(funded_useful)>=2, + 'aggregate_stricter_survives': any(Fraction(x['directed'][TRIAL]['charged_net_upper'][1])>=0 for x in bills) and len(funded_useful)>=3}) + return {'status':'NO VERIFIED GAIN','pins':pins,'target':TARGET,'trial':TRIAL,'seconds_cap':seconds, + 'paid_moves':len(paid),'terminal_arrivals':len(terminal),'completed_incidence_ports':len(cohort), + 'pending_incidence_ports':0,'marked_ports_held_fixed':22,'unmarked_incidence_ports':163, + 'new_sites':0,'scopes':scopes,'incidence':list(incidence.values())} + + +if __name__=='__main__': + cli = ArgumentParser(description=__doc__) + cli.add_argument('input_root',type=Path) + cli.add_argument('--seconds',type=int,default=480) + args = cli.parse_args() + if not 1<=args.seconds<=480: + cli.error('--seconds must be in 1..480') + print(json.dumps(run(args.input_root,args.seconds),sort_keys=True,indent=2)) diff --git a/research/bit-balanced-retarget-bound/predecessor/round25/AUDIT.json b/research/bit-balanced-retarget-bound/predecessor/round25/AUDIT.json new file mode 100644 index 0000000000..e79e71a271 --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round25/AUDIT.json @@ -0,0 +1 @@ +{"carrier_impulses": 60, "exterior_outputs": 114, "protected_paid_contacts": 2266, "scopes": [{"exterior_rank": 88, "joint_rank": 88, "paid_only_rank": 24, "singleton_expansions": 0, "source_scope": "literal other-owner source rows", "variables": 88, "zero_leak_kernel_dimension": 0}, {"exterior_rank": 88, "joint_rank": 88, "paid_only_rank": 24, "singleton_expansions": 0, "source_scope": "causal earlier-carrier closure", "variables": 88, "zero_leak_kernel_dimension": 0}, {"exterior_rank": 148, "joint_rank": 148, "paid_only_rank": 36, "singleton_expansions": 0, "source_scope": "arbitrary current coframed replacement", "variables": 148, "zero_leak_kernel_dimension": 0}], "status": "PASS"} diff --git a/research/bit-balanced-retarget-bound/predecessor/round25/SOURCES.tsv b/research/bit-balanced-retarget-bound/predecessor/round25/SOURCES.tsv new file mode 100644 index 0000000000..9bd36d3284 --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round25/SOURCES.tsv @@ -0,0 +1,18 @@ +research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz 51203e7fc75ba10bd3ac3f8e675759f47e13d262bea66b6600d1e515095cad78 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz +research/paired-query-only-bit/independent/interval_gate.py 8dc2bc4c64cba3f83c664373984a075f1a14b4d53958084091345c8cab189dec https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/independent/interval_gate.py +research/paired-query-only-bit/EFREE-RESULT.json a46b6c6040f75184cab5467656811ad988c216e3bc8e44d595a5015b6e49620b https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/e54523517d0f03e58352e647c403a5af3e525a57/research/paired-query-only-bit/EFREE-RESULT.json +pr7209/verify.py e153760831952878b5def1776811ea182ea6f3876f09262f7e81a10991ddbd94 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/verify.py +pr7209/RESULT.json 0cba78ea171cea0327bb59d95fd4e7ddb45ce004a7966de763e3f18346e1aea1 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/77feabfe187c669545908f6225dfb7f711d7360c/research/bit-terminal-main-bank-stock/RESULT.json +pr7244/PROPOSED-CLAIM.json 14e52a8a25f8f47fa8a9b1429246fa73f047707b4cc51a575154b60788b9e688 https://raw.githubusercontent.com/CrocSwap/integer-mult-bounds/4156504fa39efb51c550d218a9b94fe69dbce8f6/research/p104-two-cut-funded-split/PROPOSED-CLAIM.json +round22/verify.py 6c911eb044f9342459be2e21ef6c9c27d1c1fd47e58be87873c6e9656047c948 local-only sealed Round 22 bit/verify.py +round22/RESULT.json 6f4c3afc1185668de6e98ea1608170ae9db8ee5c2c5318b5d5a6577d609252e3 local-only sealed Round 22 bit/RESULT.json +round22/SOURCES.tsv 963e6412a7d3c6fdca55bfb5c7cddcf80c21f2a5ac99162a2c20ffb00bfe77e6 local-only sealed Round 22 bit/SOURCES.tsv +round23/verify.py b5b776fe7a5b9a99c256bf6a013831c9707ff54fb1df28f0867acc3a5b2e0ad2 local sealed Round 23 bit/verify.py +round23/RESULT.json 16863072b372547b6a062210da4d338704ce680ec22cd5e4e6702560c93a1bf7 local sealed Round 23 bit/RESULT.json +round23/SOURCES.tsv a528875c1092556b60bb77af66ca85b2a8302ea12ae4e4b746891c37fc605dc2 local sealed Round 23 bit/SOURCES.tsv +pr7258/SUMMARY.json b4f35a88da911a3b935aa3f4bbf3c921906d60df147e068bacb5b5ca66b0bfa0 https://raw.githubusercontent.com/ToikY/integer-mult-bounds/90a63fbefcf79c3e0c0453ef0741dff8517b6167/research/bit-fixed-payload-quotient-bound/SUMMARY.json +round24/verify.py 80e4ca5de690c76b266888a9307874d07a4f90c11bba4e42f87ddb45f9221380 local sealed Round 24 bit/verify.py +round24/RESULT.json 1acd03fec0213cda8c44f4914c4c0b0c2e2124d7a0dc0586689e80bbc0fb8646 local sealed Round 24 bit/RESULT.json +round24/SOURCES.tsv d60d52cfb3f4ee7db18fac70cf94e93bae94e22974fcbc59403b353541bdab15 local sealed Round 24 bit/SOURCES.tsv +bit-price/RESULT.json 3583ea672516c4def2d3973fcc5fd75e8903c2ad9f6c7154df4df1fd1bb349c7 local sealed Round 24 bit-price/RESULT.json +bit-price/verify.py 2a6eac8cdfd1c7d3a6caafca1adf103ebf84b3af26be214b99911fc4155f474c local sealed Round 24 bit-price/verify.py diff --git a/research/bit-balanced-retarget-bound/predecessor/round25/audit.py b/research/bit-balanced-retarget-bound/predecessor/round25/audit.py new file mode 100644 index 0000000000..a2195bedb8 --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round25/audit.py @@ -0,0 +1,191 @@ +"""Independent single-carrier impulse replay and column-rank proof.""" +from fractions import Fraction +import gzip +from hashlib import sha256 +import json +from pathlib import Path +import sys + +root,receipt=map(Path,sys.argv[1:]) +r=json.loads(receipt.read_bytes()) +pins={} +for line in Path(__file__).with_name('SOURCES.tsv').read_text().splitlines(): + path,digest,_=line.split('\t') + assert path not in pins + pins[path]=digest +assert pins==r['pins'] + + +def read(path): + raw=(root/path).read_bytes() + assert sha256(raw).hexdigest()==pins[path] + return raw + + +def span(seq): + pivot={} + for v in seq: + while v: + i=min(v) + if i not in pivot: + pivot[i]=v + break + v^=pivot[i] + return pivot + + +def agree(actual,given): + a=span(actual) + b=span(given) + assert len(a)==len(b)==len(span([*a.values(),*b.values()])) + + +w=json.loads(gzip.decompress(read('research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz'))) +R24=json.loads(read('round24/RESULT.json')) +R22=json.loads(read('round22/RESULT.json')) +price=json.loads(read('bit-price/RESULT.json')) +singletons=[b['banks'][0] for b in R22['scope'][1]['endpoint_consistency']['blocks'] if len(b['banks'])==1] +marked=[x for x in R24['incidence'] if x['marked']] +spec={v['event']:(v['owner'],v['source_chart'],c['chart'],frozenset(v['row']),j) + for j in singletons for c in marked[j]['clocks'][1]['compatible_charts'] for v in c['paid_ingress']} +carriers={a['event']:a for a in r['carriers']} +events=sorted(spec) +assert list(carriers)==events and len(events)==60 +for e,(owner,source,target,row,j) in spec.items(): + a=carriers[e] + assert (a['owner'],a['source_chart'],a['target_chart'],frozenset(a['old_row']),a['recipient'])==(owner,source,target,row,j) + assert a['index']==events.index(e) and a['after_cut']==e+1 +n=w['public'] +size=n+w['owned_fields'] +state=[frozenset([i]) for i in range(n)]+[frozenset()]*w['owned_fields'] +frames=w['start']+[None]*w['owned_fields'] +protected,terminal={},{} +source_rows={} +for t,item in enumerate(w['program']): + op,i=item[:2] + if op=='MOVE': + a,b=item[2:] + assert frames[i]==a and a!=1 + if t in spec: + assert spec[t][:4]==(i,a,b,state[i]) + source_rows[t]={j:state[j] for j,f in enumerate(frames) if j!=i and f==a} + assert source_rows[t]=={x['owner']:frozenset(x['row']) for x in carriers[t]['live_other_coframed_sources']} + elif b!=1: + protected[t]=i + if b==1: + terminal[t]=i + frames[i]=b + elif op=='ADD': + j,a=item[2:] + assert frames[i]==frames[j]==a + state[i]^=state[j] + elif op=='SWAP': + j=item[2] + state[i],state[j]=state[j],state[i] + frames[i],frames[j]=frames[j],frames[i] + else: + assert op in ('INIT','CLEAR') and item[2]!=1 + assert frames[i]==(None if op=='INIT' else item[2]) + frames[i]=item[2] if op=='INIT' else None + state[i]=frozenset() +assert frames==w['final']+[None]*w['owned_fields'] +assert state==[frozenset([i-111,i]) if 111<=i<222 else frozenset([i]) for i in range(n)]+[frozenset()]*w['owned_fields'] +outside=[j for j,f in enumerate(frames[:n]) if f!=1] +assert len(outside)==r['protected_exterior_output_count']==114 +assert len(protected)==r['protected_paid_contact_count']==2266 +assert len(terminal)==r['terminal_arrival_inputs_deferred']==545 + + +def impulse(e): + v=[0]*size + p=[] + peer_changes={} + for t,item in enumerate(w['program']): + op,j=item[:2] + if op=='MOVE': + if t in protected and v[j]: + p.append(t) + if t in spec: + peer_changes[t]=[k for k in source_rows[t] if v[k]] + if t==e: + v[j]^=1 + elif op=='ADD': + v[j]^=v[item[2]] + elif op=='SWAP': + k=item[2] + v[j],v[k]=v[k],v[j] + else: + v[j]=0 + return p,[j for j in outside if v[j]],peer_changes + + +paid_marks={} +exterior_marks={} +paid_columns=[] +exterior_columns=[] +carriers_with_other_old_rows=0 +for k,e in enumerate(events): + p,q,peers=impulse(e) + assert not any(peers.values()) + for j in p: + paid_marks.setdefault(j,[]).append(k) + for j in q: + exterior_marks.setdefault(j,[]).append(k) + paid_columns.append(frozenset(p)) + exterior_columns.append(frozenset(q)) + carriers_with_other_old_rows+=bool(span(source_rows[e].values())) +assert {str(k):v for k,v in paid_marks.items()}==r['nonzero_protected_contact_markers'] +assert {str(k):v for k,v in exterior_marks.items()}==r['nonzero_exterior_markers'] +assert all(not peer['earlier_carriers'] for a in carriers.values() for peer in a['live_other_coframed_sources']) +assert carriers_with_other_old_rows==60 +summary=[] +for s in r['scopes']: + p,q,joint,witness=[],[],[],[] + variables=0 + subset=set(s['exterior_basis_roles']) + for k,(e,rows) in enumerate(zip(events,s['carrier_source_bases'],strict=True)): + assert e==rows['event'] + terms=[frozenset(v) for v in rows['rows']] + other=list(source_rows[e].values()) + if s['source_scope']=='arbitrary current coframed replacement': + other.append(spec[e][3]) + agree(other,terms) + assert len(span(terms))==len(terms) + variables+=len(terms) + for delta in terms: + x=frozenset((0,t,a) for t in paid_columns[k] for a in delta) + y=frozenset((1,t,a) for t in exterior_columns[k] for a in delta) + p.append(x) + q.append(y) + joint.append(x|y) + witness.append(frozenset(k for k in y if k[1] in subset)) + expected=148 if s['source_scope']=='arbitrary current coframed replacement' else 88 + assert variables==s['variables']==expected + assert len(span(p))==s['protected_only_coefficient_rank'] + assert len(span(q))==s['exterior_only_coefficient_rank']==expected + assert len(span(joint))==s['equation_rank']==expected + assert len(span(witness))==expected + assert len(span(frozenset(v) for v in exterior_marks.values()))==s['exterior_scalar_marker_rank']==20 + assert len(subset)==20 and subset<=set(outside) + assert s['joint_kernel_dimension']==0 and not s['kernel_coefficients'] and not s['joint_live_carrier_events'] + for d in s['recipients']: + if 'bank_index' in d: + j=d['bank_index'] + old=R22['scope'][1]['banks'][j] + assert old['quotient_basis']==[[j]] + assert not d['nonzero_joint_response_rows'] and not d['new_quotient_basis'] + else: + assert d['expanded_singleton_upper']==d['independent_recipient_direction_upper']==0 + for trial,entries in d['price'].items(): + for item,threshold in zip(entries,price[trial],strict=True): + h=item['h'] + old=R24['scopes'][1]['paid_refinement_price'][h]['directed'][trial] + assert item['stock_upper']==14+2*h + assert item['net_upper']==old['charged_net_upper'] and Fraction(item['net_upper'][1])<0 + assert item['required_expansions']==threshold.get('needed_singleton_expansions') + assert not item['affordable_upper'] + summary.append({'source_scope':s['source_scope'],'variables':variables,'joint_rank':len(span(joint)), + 'exterior_rank':len(span(q)),'paid_only_rank':len(span(p)), + 'zero_leak_kernel_dimension':variables-len(span(joint)), 'singleton_expansions':0}) +print(json.dumps({'status':'PASS','carrier_impulses':len(events),'protected_paid_contacts':len(protected), + 'exterior_outputs':len(outside),'scopes':summary},sort_keys=True)) diff --git a/research/bit-balanced-retarget-bound/predecessor/round25/verify.py b/research/bit-balanced-retarget-bound/predecessor/round25/verify.py new file mode 100644 index 0000000000..c43102089e --- /dev/null +++ b/research/bit-balanced-retarget-bound/predecessor/round25/verify.py @@ -0,0 +1,310 @@ +"""Joint 60-carrier literal BIT perturbation and endpoint quotient gate.""" +from argparse import ArgumentParser +from collections import defaultdict +from fractions import Fraction +import gzip +from hashlib import sha256 +from importlib.util import module_from_spec,spec_from_file_location +import json +from pathlib import Path +from time import monotonic + +NATIVE='research/paired-query-only-bit/retained/inputs/BIT-NATIVE-WORD.json.gz' +INVOICE='research/paired-query-only-bit/EFREE-RESULT.json' +TARGET='10018846261809/2500000000000000' +TRIAL='1002040748181/250000000000000' + + +def load(name,path): + s=spec_from_file_location(name,path) + m=module_from_spec(s) + s.loader.exec_module(m) + return m + + +def read(root): + data,pins={},{} + for line in Path(__file__).with_name('SOURCES.tsv').read_text().splitlines(): + name,digest,_=line.split('\t') + if name in pins: + raise ValueError(f'duplicate dependency path: {name}') + blob=(root/name).read_bytes() + if sha256(blob).hexdigest()!=digest: + raise ValueError(f'SHA-256 mismatch: {name}') + data[name],pins[name]=blob,digest + return data,pins + + +def xor(values): + q=0 + for v in values: + q^=v + return q + + +def record_timeline(word,carriers,watch,virtual,deadline): + n=word['public'] + chart=word['start']+[None]*word['owned_fields'] + old=[1<=deadline: + raise TimeoutError('60-carrier cap expired') + if op=='MOVE': + f,g=a + assert chart[i]==f and f!=1 + if g==1: + terminal[t]=old[i] + for j,mode,mid in virtual.get(t,()): + if mark[i]: + seen[mode][j].setdefault(mark[i],('virtual',t,i,mid)) + elif t not in carriers: + protected[t]=mark[i] + if t in carriers: + e=carriers[t] + assert (e['owner'],e['source_chart'],e['target_chart'],e['old_row'])==(i,f,g,old[i]) + sources[t]=[(k,old[k],mark[k]) for k,c in enumerate(chart) if k!=i and c==f] + mark[i]^=1<=0 and not entry.get('unaffordable',False)}) + return result + + +def run(root,seconds): + deadline=monotonic()+seconds + data,pins=read(root) + lin=load('round22',root/'round22/verify.py') + pricing=load('pr7209',root/'pr7209/verify.py') + controls(lin) + r24=json.loads(data['round24/RESULT.json']) + r22=json.loads(data['round22/RESULT.json']) + tariff=json.loads(data['bit-price/RESULT.json']) + assert [x.get('needed_singleton_expansions') for x in tariff[TARGET]]==[7,5,4] + assert [x.get('needed_singleton_expansions') for x in tariff[TRIAL]]==[8,6,None] + peer=json.loads(data['pr7244/PROPOSED-CLAIM.json']) + assert peer['complex_BIT_premise']=='376669/100000000' + assert r24['scopes'][1]['t']['rank']==r24['scopes'][1]['s']['rank']==1 + marked=[p for p in r24['incidence'] if p['marked']] + marks=[p['event'] for p in marked] + port_window={p['event']:p['quiet_window'] for p in r24['incidence']} + markmap=json.loads(data['pr7209/RESULT.json'])['bank_maps'] + assert [p['event'] for p in markmap]==marks + r22map=r22['scope'][1]['banks'] + singleton=[b['banks'][0] for b in r22['scope'][1]['endpoint_consistency']['blocks'] if len(b['banks'])==1] + assert singleton==[0,1,2,3,4,5,6,10,14,17] + carriers,watch,virtual={},defaultdict(list),defaultdict(set) + for j in singleton: + p=marked[j] + bounds=p['event'],p['quiet_window'][1] + for f in set([p['source_chart'],*p['compatible_literal_charts']]): + watch[f].append((j,bounds)) + for c in p['clocks'][1]['compatible_charts']: + for e in c['paid_ingress']: + t=e['event'] + assert t not in carriers + carriers[t]={'event':t,'after_cut':e['after_cut'],'owner':e['owner'],'source_chart':e['source_chart'], + 'target_chart':c['chart'],'old_row':lin.encoded(e['row']),'recipient':j} + # Also grant changed literal terminal operands along every compatible + # old virtual prefix from the fixed-library predecessor. + for v in markmap[j]['variants']: + for e in v['virtual_bank_events']: + for mode,lim in enumerate(bounds): + eligible=e<=lim if mode==0 else port_window[e][0]<=lim + if eligible: + virtual[e].add((j,mode,v['literal_chart'])) + events=sorted(carriers) + for i,t in enumerate(events): + carriers[t]['index']=i + assert len(events)==60 and len({e['target_chart'] for e in carriers.values()})==20 + word=json.loads(gzip.decompress(data[NATIVE])) + invoice=json.loads(data[INVOICE]) + dims={int(f):v['dim'] for f,v in word['frames'].items()} + source,protected,exterior,terminal,required,seen=record_timeline(word,carriers,watch,virtual,deadline) + donors=sorted(set(terminal)-set(marks)) + assert len(donors)==523 + W={} + for i,t in enumerate(donors+marks): + assert lin.insert(W,terminal[t],1<>523)&~(1<=deadline: + return incomplete('geometric_incidence',tested) + if nested and h!=g and price.join(frames[f],frames[h])==frames[h]: + geometry.append((e,g,h)) + tested+=1 + assert tested==1200 + # Even a late delivery may balance an early rebind. First grant all + # geometric cycles, then filter which arrivals can help each recipient. + cyclic=cycle_edges(geometry) + trial=[] + for quiet in (False,True): + cutoff=lambda h: (marks[targets[h]]['quiet_window'][1] + if quiet else marks[targets[h]]['event']) + edges=[(e,g,h) for e,g,h in geometry if e+1<=cutoff(h)] + usable=[(e,g,h) for e,g,h in cyclic if e+1<=cutoff(h)] + receivers=[] + for j in singletons: + moves=[e for e,_,h in usable if targets[h]==j] + raw_rows={lin.encoded(v['row']) for v in R22['scope'][1]['banks'][j]['source_witnesses']} + raw_rows.update(v for e in moves for v in source[e]) + _,inside=lin.intersection_projection(lin.raw_basis(sorted(raw_rows)),W) + expanded={} + for q,v in inside: + lin.insert(expanded,(q>>523)&~(1<=deadline: + return incomplete('projection_and_price',tested) + return {'status':'PASS_COMPLETE_STOCK_UPPER', + 'scope':'nested same-rank target rebinds within fixed 60/20 stock and fixed unmarked libraries', + 'pins':pins,'new_sites':0,'seconds_cap':seconds,'clocks':trial} + + +if __name__=='__main__': + p=ArgumentParser(description=__doc__) + p.add_argument('root',type=Path,nargs='?') + p.add_argument('--seconds',type=int,default=480) + p.add_argument('--self-test',action='store_true') + a=p.parse_args() + control() + if a.self_test: + print('PASS synthetic circulation controls') + elif a.root is None or not 1<=a.seconds<=480: + p.error('explicit root and 1..480 seconds required') + else: + print(json.dumps(run(a.root,a.seconds),sort_keys=True,indent=2))