File size: 2,843 Bytes
0ffbb74 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | """Run one baseline strategy on one scenario and print the run.
Prints the tool log (tool, arguments, reason and a short result), the final
report, and then the revealed ground truth.
Usage::
.venv\\Scripts\\python.exe scripts\\run_baseline.py clean scripted_iso
.venv\\Scripts\\python.exe scripts\\run_baseline.py clean naive_uniform -s 2
"""
from __future__ import annotations
import argparse
import json
from typing import Any
from beampilot.baselines import naive_uniform, scripted_iso
from beampilot.session import SCENARIOS, MeasurementSession, reveal_truth
STRATEGIES = {"naive_uniform": naive_uniform, "scripted_iso": scripted_iso}
def short_result(result: dict[str, Any]) -> str:
"""One-line summary of a tool result."""
if "error" in result or "internal_error" in result:
return json.dumps(result, ensure_ascii=False)
if "measurement_id" in result and "flags" in result:
flags = [name for name, value in result["flags"].items() if value]
return (
f"{result['measurement_id']}: d_x {result['d_x_um']['mean']} um, "
f"d_y {result['d_y_um']['mean']} um, peak "
f"{result['details']['peak_counts']}, flags {flags or 'none'}, "
f"suggested {result['suggested_verdict']}"
)
if "status" in result and "x" in result:
return (
f"M²x {result['x']['m2']}, M²y {result['y']['m2']}, "
f"z0 {result['x']['z0_mm']}/{result['y']['z0_mm']} mm, "
f"coverage met {result['iso_coverage_met']}"
)
if "report" in result:
return f"verdict {result['report']['verdict']}"
return json.dumps(result, ensure_ascii=False)
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
parser.add_argument("scenario", choices=sorted(SCENARIOS))
parser.add_argument("strategy", choices=sorted(STRATEGIES))
parser.add_argument("-s", "--seed", type=int, default=0)
args = parser.parse_args()
session = MeasurementSession(SCENARIOS[args.scenario](seed=args.seed))
STRATEGIES[args.strategy](session)
print(f"== Tool log: {args.strategy} on {args.scenario} (seed {args.seed})")
for i, entry in enumerate(session.log, start=1):
arguments = {
k: v for k, v in entry["arguments"].items() if k not in ("reason",)
}
print(f"{i:3d}. {entry['tool']}({arguments})")
print(f" reason: {entry['reason']}")
print(f" result: {short_result(entry['result'])}")
print("\n== Report")
print(json.dumps(session.report, indent=2, ensure_ascii=False))
print("\n== Revealed truth")
print(json.dumps(reveal_truth(session), indent=2, ensure_ascii=False))
if __name__ == "__main__":
main()
|