"""Recompute every headline number of F0003 from data/ and assert it matches the recorded values (finding.yaml in the findings repo, expected_numbers.json in a downloaded copy). python check.py # assert python check.py --print # show computed values (for authoring) """ import csv import json import statistics as st import sys from pathlib import Path HERE = Path(__file__).parent def pct(k, n): return round(100 * k / n, 1) def compute(): rows = list(csv.DictReader(open(HERE / "data" / "scores.csv", newline=""))) out = {} for s, tag in (("reaction_qm", "rqm"), ("geodesic", "geo")): r = [x for x in rows if x["set"] == s] by = {o: [x for x in r if x["outcome"] == o] for o in ("lower", "matched", "higher", "no_channel")} withch = len(r) - len(by["no_channel"]) lo = [float(x["lower_by_kcal"]) for x in by["lower"]] out.update({ f"{tag}_n": len(r), f"{tag}_with_channel": withch, f"{tag}_lower": len(by["lower"]), f"{tag}_matched": len(by["matched"]), f"{tag}_higher": len(by["higher"]), f"{tag}_no_channel": len(by["no_channel"]), f"{tag}_lower_pct_of_set": pct(len(by["lower"]), len(r)), f"{tag}_lower_pct_of_with_channel": pct(len(by["lower"]), withch), f"{tag}_lower_single_step": sum(x["best_kind"] == "channel" for x in by["lower"]), f"{tag}_lower_multistep": sum(x["best_kind"] == "alternate" for x in by["lower"]), f"{tag}_lower_median_kcal": round(st.median(lo), 2), f"{tag}_lower_max_kcal": round(max(lo), 2), f"{tag}_not_finished": sum(x["returncode"] != "0" for x in r), }) rqm = [x for x in rows if x["set"] == "reaction_qm"] for b in ("1", "2"): rb = [x for x in rqm if x["batch"] == b] out[f"rqm_batch{b}_n"] = len(rb) out[f"rqm_batch{b}_lower"] = sum(x["outcome"] == "lower" for x in rb) return out def recorded_numbers() -> dict: if (HERE / "finding.yaml").exists(): import yaml return yaml.safe_load((HERE / "finding.yaml").read_text())["evidence"]["numbers"] return json.loads((HERE / "expected_numbers.json").read_text()) if __name__ == "__main__": computed = compute() if "--print" in sys.argv: print(json.dumps(computed, indent=1)) sys.exit() numbers = recorded_numbers() bad = [f"{k}: computed {computed.get(k)!r}, recorded {v!r}" for k, v in numbers.items() if computed.get(k) != v] if bad: sys.exit("mismatch:\n " + "\n ".join(bad)) print(f"ok: {len(numbers)} numbers recomputed from data/")