"""Shared utility functions for SolarWine.""" from __future__ import annotations from typing import Optional def cwsi_from_delta_t( leaf_temp_c: Optional[float] = None, air_temp_c: Optional[float] = None, *, delta_t: Optional[float] = None, ) -> float: """Compute CWSI proxy from leaf–air temperature differential. Scale: 0°C delta → CWSI=0, 10°C delta → CWSI=1. Clamped to [0.0, 1.0]. Can be called with (leaf_temp_c, air_temp_c) or with delta_t= directly. """ if delta_t is None: if leaf_temp_c is None or air_temp_c is None: raise ValueError("Provide (leaf_temp_c, air_temp_c) or delta_t=") delta_t = leaf_temp_c - air_temp_c return max(0.0, min(1.0, delta_t / 10.0))