Log in
scripts/power_check.py 53 lines · 1.7 KB · python Blame
1
#!/usr/bin/env python3
2
"""Print smallest-detectable-delta and required-n guidance for benchmark cells."""
3
4
from __future__ import annotations
5
6
import argparse
7
import json
8
import sys
9
from pathlib import Path
10
from typing import Any
11
12
ROOT = Path(__file__).resolve().parents[1]
13
sys.path.insert(0, str(ROOT / "scripts"))
14
15
from oakbench.stats import required_n_for_relative_delta  # noqa: E402
16
17
18
def parse_args() -> argparse.Namespace:
19
    parser = argparse.ArgumentParser(description=__doc__)
20
    parser.add_argument("--noise-floor-pct", type=float, required=True)
21
    parser.add_argument("--target-delta-pct", type=float, required=True)
22
    parser.add_argument("--current-n", type=int, required=True)
23
    parser.add_argument("--json", action="store_true")
24
    return parser.parse_args()
25
26
27
def main() -> int:
28
    args = parse_args()
29
    required = required_n_for_relative_delta(args.noise_floor_pct, args.target_delta_pct, args.current_n)
30
    row: dict[str, Any] = {
31
        "noise_floor_pct": args.noise_floor_pct,
32
        "target_delta_pct": args.target_delta_pct,
33
        "current_n": args.current_n,
34
        "required_n": required,
35
        "undecidable": required is None,
36
    }
37
    if args.json:
38
        print(json.dumps(row, sort_keys=True))
39
    else:
40
        if required is None:
41
            print("Target delta must be positive; cell is undecidable.")
42
        elif required <= args.current_n:
43
            print(f"current n={args.current_n} can resolve target delta {args.target_delta_pct:.2f}%")
44
        else:
45
            print(
46
                f"current n={args.current_n} is underpowered for target delta "
47
                f"{args.target_delta_pct:.2f}%; estimated required n={required}"
48
            )
49
    return 0
50
51
52
if __name__ == "__main__":
53
    raise SystemExit(main())