File size: 1,372 Bytes
ff34739
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""``python -m sim run --config <yaml>`` — run the failure simulator."""

from __future__ import annotations

import argparse
import json

from sim.config import load_config
from sim.engine import run_simulation
from sim.registry import known_modes


def cmd_run(args: argparse.Namespace) -> int:
    manifest = run_simulation(load_config(args.config))
    print(json.dumps({
        "name": manifest["name"],
        "n_pairs": manifest["n_pairs"],
        "label_counts": manifest["label_counts"],
        "label_fractions": manifest["label_fractions"],
        "r1_byte_identical": manifest["r1_byte_identical"],
        "outputs": manifest["outputs"],
    }, indent=2))
    return 0


def cmd_modes(args: argparse.Namespace) -> int:
    print("\n".join(known_modes()))
    return 0


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(prog="sim", description="Seqcolyte failure simulator")
    sub = parser.add_subparsers(dest="cmd", required=True)
    rp = sub.add_parser("run", help="run a simulation from a YAML config")
    rp.add_argument("--config", required=True)
    rp.set_defaults(func=cmd_run)
    mp = sub.add_parser("modes", help="list registered failure modes")
    mp.set_defaults(func=cmd_modes)
    args = parser.parse_args(argv)
    return args.func(args)


if __name__ == "__main__":
    raise SystemExit(main())