Research source · python

verify_replay_slice.py

site/public/research-artifacts/adaptive-replay-slice/verify_replay_slice.py

186 lines. Source is displayed for inspection; it is not executed by this page.

File fingerprint

SHA-256: 91168a037ebd63fa0ae3036e43e83a58e496e8d63da6fff5f91d040d7191f144

#!/usr/bin/env python3
"""Exhaustive small-model falsifier for the adaptive replay-slice theorem.

The proof is the well-founded replay induction in the public note. This checker
enumerates every two-source, two-derived-cell adaptive history in a small model,
every observer, every source assignment, and every perturbation that agrees on
the computed replay slice. It also checks the exact old-history pullback law for
the split between the first and second derived cells.
"""

from __future__ import annotations

from itertools import product
import json


SOURCES = ("s0", "s1")
DERIVED = ("d0", "d1")


def specs(refs: tuple[str, ...]):
    return product(refs, repeat=3)


def run_adaptive(spec: tuple[str, str, str], values: dict[str, int]):
    selector, zero_ref, one_ref = spec
    selector_value = values[selector]
    chosen = one_ref if selector_value else zero_ref
    trace = (selector, chosen)
    return values[chosen] ^ selector_value, trace


def execute(
    source_values: tuple[int, int],
    d0_spec: tuple[str, str, str],
    d1_spec: tuple[str, str, str],
    observer_spec: tuple[str, str, str],
):
    values = dict(zip(SOURCES, source_values, strict=True))
    traces: dict[str, tuple[str, ...]] = {}
    values["d0"], traces["d0"] = run_adaptive(d0_spec, values)
    values["d1"], traces["d1"] = run_adaptive(d1_spec, values)
    output, observer_trace = run_adaptive(observer_spec, values)

    support = set(observer_trace)
    pending = [name for name in DERIVED if name in support]
    seen = set()
    while pending:
        name = pending.pop()
        if name in seen:
            continue
        seen.add(name)
        support.update(traces[name])
        pending.extend(
            ref for ref in traces[name] if ref in DERIVED and ref not in seen
        )

    return {
        "values": values,
        "traces": traces,
        "observer_trace": observer_trace,
        "output": output,
        "support": frozenset(support),
    }


def close_in_base(seeds: set[str], base_trace: tuple[str, ...]):
    closure = set(seeds)
    if "d0" in closure:
        closure.update(base_trace)
    return closure


def main():
    spec_count = 0
    executions = 0
    perturbation_pairs = 0
    supported_cell_checks = 0
    composition_checks = 0
    shallow_slice_failures = 0
    first_shallow_witness = None

    for d0_spec in specs(SOURCES):
        for d1_spec in specs(SOURCES + ("d0",)):
            for observer_spec in specs(SOURCES + DERIVED):
                spec_count += 1
                for source_values in product((0, 1), repeat=2):
                    executions += 1
                    left = execute(source_values, d0_spec, d1_spec, observer_spec)
                    supported_sources = left["support"].intersection(SOURCES)

                    for changed_values in product((0, 1), repeat=2):
                        if any(
                            changed_values[SOURCES.index(name)]
                            != source_values[SOURCES.index(name)]
                            for name in supported_sources
                        ):
                            continue
                        perturbation_pairs += 1
                        right = execute(
                            changed_values, d0_spec, d1_spec, observer_spec
                        )
                        assert right["output"] == left["output"]
                        assert right["observer_trace"] == left["observer_trace"]
                        assert right["support"] == left["support"]
                        for name in DERIVED:
                            if name in left["support"]:
                                supported_cell_checks += 1
                                assert right["values"][name] == left["values"][name]
                                assert right["traces"][name] == left["traces"][name]

                    # Composition split: H contains d0; K contains d1 and O.
                    continuation_supported = {
                        name for name in ("d1",) if name in left["support"]
                    }
                    old_cells = set(SOURCES + ("d0",))
                    old_demands = set(left["observer_trace"]).intersection(old_cells)
                    for name in continuation_supported:
                        old_demands.update(
                            set(left["traces"][name]).intersection(old_cells)
                        )
                    pulled_back = close_in_base(
                        old_demands, left["traces"]["d0"]
                    )
                    assert pulled_back == set(left["support"]).intersection(old_cells)
                    composition_checks += 1

                    # Negative control: direct observer queries alone are not a replay slice.
                    shallow_sources = set(left["observer_trace"]).intersection(SOURCES)
                    if shallow_sources != supported_sources:
                        for changed_values in product((0, 1), repeat=2):
                            if any(
                                changed_values[SOURCES.index(name)]
                                != source_values[SOURCES.index(name)]
                                for name in shallow_sources
                            ):
                                continue
                            right = execute(
                                changed_values, d0_spec, d1_spec, observer_spec
                            )
                            if (
                                right["output"] != left["output"]
                                or right["observer_trace"] != left["observer_trace"]
                                or right["support"] != left["support"]
                            ):
                                shallow_slice_failures += 1
                                if first_shallow_witness is None:
                                    first_shallow_witness = {
                                        "source": source_values,
                                        "changed": changed_values,
                                        "d0_spec": d0_spec,
                                        "d1_spec": d1_spec,
                                        "observer_spec": observer_spec,
                                        "observer_queries": left["observer_trace"],
                                        "full_support": sorted(left["support"]),
                                        "left_output": left["output"],
                                        "right_output": right["output"],
                                    }
                                break

    assert first_shallow_witness is not None
    report = {
        "ok": True,
        "model": {
            "source_cells": 2,
            "derived_cells": 2,
            "adaptive_program": "query selector, then one of two references",
        },
        "counts": {
            "program_observer_combinations": spec_count,
            "executions": executions,
            "slice_preserving_perturbation_pairs": perturbation_pairs,
            "supported_cell_checks": supported_cell_checks,
            "composition_pullback_checks": composition_checks,
            "shallow_slice_failures": shallow_slice_failures,
        },
        "negative_control": {
            "description": "Observer queries without transitive dependency closure are insufficient.",
            "first_witness": first_shallow_witness,
        },
    }
    print(json.dumps(report, indent=2, sort_keys=True))


if __name__ == "__main__":
    main()