"""Portable sigmoid calibration shared by training and inference."""
import numpy as np


def log_odds(probabilities):
    p = np.clip(np.asarray(probabilities, dtype=float), 1e-6, 1 - 1e-6)
    return np.log(p / (1 - p))


def apply_calibration(probabilities, calibration):
    p = np.asarray(probabilities, dtype=float)
    if not np.isfinite(p).all() or np.any((p < 0) | (p > 1)):
        raise ValueError("Invalid raw probabilities")
    method = calibration.get("method", "none")
    if method == "none":
        return p
    if method != "sigmoid_logit":
        raise ValueError(f"Unsupported calibration method: {method}")
    slope = float(calibration["slope"])
    intercept = float(calibration["intercept"])
    if not np.isfinite([slope, intercept]).all() or slope <= 0:
        raise ValueError("Invalid calibration parameters")
    z = np.clip(slope * log_odds(p) + intercept, -35, 35)
    return 1 / (1 + np.exp(-z))
