"""Metric helpers for object-based validation.""" from __future__ import annotations def safe_div(num: float, den: float, default: float | None = None) -> float | None: if den == 0: return default return float(num) / float(den) def compute_scores(hits: int, misses: int, falses: int) -> dict: """Return POD/FAR/CSI/F1 from hit/miss/false counts.""" hits = int(hits) misses = int(misses) falses = int(falses) return { "hits": hits, "misses": misses, "falses": falses, "POD": safe_div(hits, hits + misses, default=None), "FAR": safe_div(falses, hits + falses, default=None), "CSI": safe_div(hits, hits + misses + falses, default=None), "F1": safe_div(2 * hits, 2 * hits + misses + falses, default=None), } def leadtime_pod(hits: int, misses: int) -> float | None: return safe_div(hits, hits + misses, default=None)