Brettapps's picture
Add Brettapps/trifecta-bro/v1 v1.0.0 trifecta predictor (rule-based)
bbddeaa verified
Raw
History Blame
2.27 kB
#!/usr/bin/env python3
"""CLI for Brettapps/trifecta-bro-v1.
Usage:
# Run on the bundled sample race
python -m trifecta_bro_v1.main
# Run on a Trifecta-Bro predictions JSON file
python -m trifecta_bro_v1.main --data /path/to/predictions-2026-08-10.json
"""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
from .artifact import predict_race, race_from_payload
from .predictor import TrifectaPredictor
# A tiny self-contained demo race so the package is runnable with no inputs.
SAMPLE = {
"date": "2026-08-10",
"track": "Dubbo",
"track_slug": "dubbo",
"race_number": "3",
"race_name": "Aqua West Country Boosted BM58 Handicap",
"distance": "1620m",
"condition": "Soft 5",
"weather": "Showers",
"race_class": "BM58",
"start_time": "2026-08-10T04:40:00Z",
"prize_money": "30000",
"number_of_runners": 3,
"form": {
"runners": [
{"number": 1, "name": "Boncapo", "form": "X1241", "stats": {"overall": {"winPercent": 0.25, "placePercent": 0.5}}},
{"number": 14, "name": "Bill Peyto", "form": "36412", "stats": {"overall": {"winPercent": 0.07, "placePercent": 0.35}}},
{"number": 7, "name": "Casterly Rock", "form": "23939", "stats": {"overall": {"winPercent": 0.06, "placePercent": 0.48}}},
]
},
}
def main(argv: list[str] | None = None) -> int:
p = argparse.ArgumentParser(description="Brettapps/trifecta-bro/v1 predictor")
p.add_argument("--data", help="Path to a Trifecta-Bro predictions JSON file")
p.add_argument("--race", type=int, default=0, help="1-based race index when --data is given")
args = p.parse_args(argv)
if args.data:
payload = json.loads(Path(args.data).read_text())
races = payload.get("races", [payload])
idx = max(0, args.race - 1)
if idx >= len(races):
print(f"Race index {args.race} out of range (have {len(races)})", file=sys.stderr)
return 2
race = race_from_payload(races[idx])
else:
race = race_from_payload(SAMPLE)
pred = TrifectaPredictor().predict(race)
print(json.dumps(pred, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())