Source: scripts/run_dynamic_ttt_pilot.py · Plain text

scripts/run_dynamic_ttt_pilot.py

"""Run modular untrained train/dev controls; never use this as a final test entry point."""

import argparse
import json
from pathlib import Path

from mcss.data.pilot_provenance import validate_pilot_entries, write_pilot_provenance
from mcss.evaluation.streaming_report import run_pilot


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--index", type=Path, required=True)
    parser.add_argument("--output", type=Path, required=True)
    parser.add_argument("--device", default="cpu")
    parser.add_argument("--seed", type=int, default=17)
    parser.add_argument("--max-episodes", type=int)
    parser.add_argument(
        "--policies",
        nargs="+",
        default=["OFF", "FUSE", "COMPLETE", "ALL"],
        choices=["OFF", "FUSE", "COMPLETE", "ALL", "RESIDUAL_THRESHOLD"],
    )
    args = parser.parse_args()
    data = json.loads(args.index.read_text(encoding="utf-8"))
    index = data["episodes"] if isinstance(data, dict) else data
    if args.max_episodes is not None:
        if args.max_episodes < 1:
            parser.error("--max-episodes must be positive")
        index = index[: args.max_episodes]
    provenance = validate_pilot_entries(index)
    report = run_pilot(
        index, args.output, device=args.device, seed=args.seed, policies=args.policies
    )
    provenance_path = write_pilot_provenance(args.output / "manifest_provenance.json", provenance)
    print(
        json.dumps(
            {
                "status": report["status"],
                "runs": report["runs"],
                "report": str(args.output / "report.json"),
                "manifest_provenance": str(provenance_path),
            }
        )
    )


if __name__ == "__main__":
    main()