Biomni_Comparative_Experiments / experiments /lab_bench /summarize_labbench_repeats.py
czty's picture
Add files using upload-large-folder tool
9473841 verified
Raw
History Blame Contribute Delete
1.98 kB
#!/usr/bin/env python3
"""Summarize repeated LAB-Bench runs by averaging metrics."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from statistics import mean, stdev
from typing import Any
def load_json(path: Path) -> dict[str, Any]:
return json.loads(path.read_text(encoding="utf-8"))
def summarize_group(paths: list[Path]) -> dict[str, Any]:
payloads = [load_json(path) for path in paths]
metric_keys = sorted(payloads[0]["metrics_all"])
summary = {
"run_count": len(payloads),
"files": [str(path) for path in paths],
"metrics_all_mean": {},
"metrics_all_std": {},
}
for key in metric_keys:
values = [payload["metrics_all"][key] for payload in payloads if isinstance(payload["metrics_all"].get(key), (int, float))]
if not values:
continue
summary["metrics_all_mean"][key] = mean(values)
summary["metrics_all_std"][key] = stdev(values) if len(values) > 1 else 0.0
return summary
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--results-root", type=Path, required=True)
parser.add_argument("--out", type=Path, required=True)
args = parser.parse_args()
groups: dict[str, list[Path]] = {}
for path in sorted(args.results_root.glob("*.json")):
stem = path.stem
if "_run" not in stem:
continue
group = stem.rsplit("_run", 1)[0]
groups.setdefault(group, []).append(path)
payload = {"results_root": str(args.results_root), "groups": {}}
for group, paths in sorted(groups.items()):
payload["groups"][group] = summarize_group(paths)
args.out.parent.mkdir(parents=True, exist_ok=True)
args.out.write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8")
print(json.dumps(payload["groups"], indent=2, ensure_ascii=False))
return 0
if __name__ == "__main__":
raise SystemExit(main())