#!/usr/bin/env python3 """Evaluate MapGS and write the ยง4 protocol-template report. python scripts/eval.py --config configs/synthetic_smoke.yaml --ckpt runs/mapgs_synth/ckpt_final.pt """ import argparse import torch from mapgs.config import load_config from mapgs.data import build_dataset from mapgs.eval import Evaluator, write_report from mapgs.model import MapGS def main(): ap = argparse.ArgumentParser() ap.add_argument("--config", type=str, default=None) ap.add_argument("--override", nargs="*", default=[]) ap.add_argument("--ckpt", type=str, default=None) ap.add_argument("--split", type=str, default="val") ap.add_argument("--out", type=str, default="eval_report.md") ap.add_argument("--max-scenes", type=int, default=50) ap.add_argument("--tt", action="store_true", help="apply test-time token tuning") args = ap.parse_args() cfg = load_config(args.config, args.override) model = MapGS(cfg).to(cfg.device) if args.ckpt: ckpt = torch.load(args.ckpt, map_location=cfg.device, weights_only=False) model.load_state_dict(ckpt["model"]) print(f"loaded {args.ckpt}") model.eval() dataset = build_dataset(cfg, args.split) ev = Evaluator(model, cfg, device=cfg.device) interp = ev.interpolation(dataset, max_scenes=args.max_scenes) print("interpolation:", interp) sweep = ev.extrapolation_sweep(dataset, max_scenes=min(args.max_scenes, 30)) for sh, m in sweep.items(): print(f" shift {sh}m:", m) lane = ev.lane_consistency(dataset, max_scenes=min(args.max_scenes, 30)) print("lane:", lane) write_report(args.out, interpolation={cfg.data.name: interp}, extrapolation=sweep, lane=lane) print(f"report written to {args.out}") if __name__ == "__main__": main()