Source: scripts/initialize_optimization_bounds_reproduction.py · Plain text

scripts/initialize_optimization_bounds_reproduction.py

"""Initialize an empty run from the frozen 16-grid bounds protocol; no media reads."""

import argparse
import gzip
import hashlib
import json
from pathlib import Path

from mcss.mechanism_pilot.small_training import sha, write_json

FILES = (
    "preregistration.json",
    "config.json",
    "state_plan.json",
    "scene_manifest.json",
    "bounds_contract.json",
    "bounds_lock.json",
    "optimization_budget_lock.json",
    "decision_rules.json",
    "train_depth_prior.json",
    "baseline_results.json",
    "baseline_reproduction.json",
    "audit/analysis_source_lock.json",
    "audit/previous_experiment_seal.json",
)


def reference_bytes(reference, name):
    path = reference / name
    if path.is_file():
        return path.read_bytes()
    compressed = Path(str(path) + ".gz")
    if compressed.is_file():
        return gzip.decompress(compressed.read_bytes())
    raise FileNotFoundError(path)


def initialize(reference, output):
    reference, output = Path(reference), Path(output)
    if output.exists():
        raise FileExistsError("A new empty run directory is required")
    payloads = {name: reference_bytes(reference, name) for name in FILES}
    prereg = json.loads((reference / "preregistration.json").read_text())
    for name, digest in prereg["locked_file_sha256"].items():
        if sha(reference / name) != digest:
            raise PermissionError(f"Frozen protocol changed: {name}")
    for record in ("config.json", "audit/analysis_source_lock.json"):
        for path, digest in json.loads((reference / record).read_text())["source_sha256"].items():
            if sha(Path(path)) != digest:
                raise PermissionError(f"Frozen source changed: {path}")
    if json.loads((reference / "baseline_reproduction.json").read_text())["status"] != "PASS":
        raise PermissionError("Baseline reproduction must pass")
    output.mkdir(parents=True)
    for name in FILES:
        destination = output / name
        destination.parent.mkdir(parents=True, exist_ok=True)
        destination.write_bytes(payloads[name])
    for name in ("raw", "checkpoints", "figures"):
        (output / name).mkdir()
    write_json(
        output / "audit/reproduction_provenance.json",
        {
            "reference": str(reference.resolve()),
            "copied_file_sha256": {
                name: hashlib.sha256(payloads[name]).hexdigest() for name in FILES
            },
            "historical_baseline_and_bounds_reused": True,
            "new_optimization_required": True,
            "media_read": False,
            "historical_timestamps_not_reproduced": True,
        },
    )
    return output


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--reference", required=True)
    parser.add_argument("--output", required=True)
    args = parser.parse_args()
    print(initialize(args.reference, args.output))