"""Pure Phase 4 yaw and turn-level rules.""" from .config_loader import TurnDetectionSettings from .models import TurnLevel LEVEL_ORDER = { TurnLevel.NONE.value: 0, TurnLevel.FACE_APPEARED.value: 0, TurnLevel.SUBTLE.value: 1, TurnLevel.WEAK.value: 2, TurnLevel.MEDIUM.value: 3, TurnLevel.STRONG.value: 4, TurnLevel.NOT_EVALUABLE.value: -1, } def yaw_delta_toward_signage(current_yaw: float, baseline_yaw: float, direction: str) -> tuple[float, float]: """Return raw delta and a delta whose positive sign points toward signage.""" if direction not in {"positive", "negative"}: raise ValueError("direction must be positive or negative") raw = current_yaw - baseline_yaw return raw, raw if direction == "positive" else -raw def classify_turn_level(delta: float, config: TurnDetectionSettings) -> str: if delta < config.subtle_threshold_deg: return TurnLevel.NONE.value if delta < config.weak_threshold_deg: return TurnLevel.SUBTLE.value if delta < config.medium_threshold_deg: return TurnLevel.WEAK.value if delta < config.strong_threshold_deg: return TurnLevel.MEDIUM.value return TurnLevel.STRONG.value def is_weak_or_higher(level: str) -> bool: return LEVEL_ORDER.get(level, -1) >= LEVEL_ORDER[TurnLevel.WEAK.value] def stronger_level(first: str, second: str) -> str: return second if LEVEL_ORDER.get(second, -1) > LEVEL_ORDER.get(first, -1) else first