You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

43 lines
1.4 KiB

"""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