Source code for pitcp.utils._metrics

import numpy as np
from sklearn.utils.validation import check_array, check_consistent_length, column_or_1d


[docs] def coverage_gap( labels: np.typing.ArrayLike, covered: np.typing.ArrayLike ) -> float | np.ndarray: """Computes the range of empirical coverage across labeled groups. Args: labels (np.typing.ArrayLike): Group labels with shape ``(n_samples,)``. covered (np.typing.ArrayLike): Boolean mask with shape ``(n_samples,)`` or ``(n_samples, n_levels)``. Returns: float | np.ndarray: Maximum minus minimum group coverage. A scalar is returned for one coverage mask and an array for multiple masks. Raises: ValueError: If inputs are empty, have invalid dimensions, or contain different sample counts. """ groups = column_or_1d(labels) mask = np.asarray(check_array(covered, ensure_2d=False, dtype=bool)) check_consistent_length(groups, mask) if mask.ndim == 1: mask = mask[:, None] rates = np.stack( [mask[groups == label].mean(axis=0) for label in np.unique(groups)] ) gap = np.ptp(rates, axis=0) return float(gap[0]) if gap.size == 1 else gap