Source code for passengersim.config.speed_limits

from pydantic import BaseModel


[docs] class SpeedLimits(BaseModel): SHORT_HAUL_MAX_DISTANCE: float = 500 """Short haul legs are all legs less than this distance (in miles).""" LONG_HAUL_MIN_DISTANCE: float = 1500 """Long haul legs are all legs greater than this distance (in miles).""" # speed limits in miles per hour SHORT_HAUL_MINIMUM_SPEED: float = 50.0 SHORT_HAUL_MAXIMUM_SPEED: float = 400.0 LONG_HAUL_MINIMUM_SPEED: float = 300.0 LONG_HAUL_MAXIMUM_SPEED: float = 700.0
def get_speed_limits(distance: float, limits: SpeedLimits | None = None) -> tuple[str, float, float]: """Get lower and upper bounds on reasonable leg speeds.""" if limits is None: limits = SpeedLimits() if distance < limits.SHORT_HAUL_MAX_DISTANCE: return "SHORT", limits.SHORT_HAUL_MINIMUM_SPEED, limits.SHORT_HAUL_MAXIMUM_SPEED if distance > limits.LONG_HAUL_MIN_DISTANCE: return "LONG", limits.LONG_HAUL_MINIMUM_SPEED, limits.LONG_HAUL_MAXIMUM_SPEED # between the thresholds, interpolate position = (distance - limits.SHORT_HAUL_MAX_DISTANCE) / ( limits.LONG_HAUL_MIN_DISTANCE - limits.SHORT_HAUL_MAX_DISTANCE ) inv_position = 1.0 - position mid_haul_minimum_speed = inv_position * limits.SHORT_HAUL_MINIMUM_SPEED + position * limits.LONG_HAUL_MINIMUM_SPEED mid_haul_maximum_speed = inv_position * limits.SHORT_HAUL_MAXIMUM_SPEED + position * limits.LONG_HAUL_MAXIMUM_SPEED return "MID", mid_haul_minimum_speed, mid_haul_maximum_speed # def clear_speed_limits(): # global SHORT_HAUL_MINIMUM_SPEED, SHORT_HAUL_MAXIMUM_SPEED, LONG_HAUL_MINIMUM_SPEED, LONG_HAUL_MAXIMUM_SPEED # SHORT_HAUL_MINIMUM_SPEED = 0 # SHORT_HAUL_MAXIMUM_SPEED = 9e9 # LONG_HAUL_MINIMUM_SPEED = 0 # LONG_HAUL_MAXIMUM_SPEED = 9e9