Source code for suboptimumg.yaml
import yaml
from .compsim import Competition
from .compsim.models import CompetitionScoring
from .track import CornerListInput, from_corners
from .vehicle import Car
from .vehicle.irl_vehicle import IrlCar
from .vehicle.vehicle_models import AnyVehicleModel, ExtendedVehicleModel
def _competition_from_car_and_comp_dict(car: Car, comp_dict: dict) -> Competition:
"""
Create a Competition object from a Car instance and competition configuration dictionary.
Parameters
----------
car : Car
comp_dict : dict
The competition configuration dictionary.
Returns
-------
Competition
"""
distance_step = comp_dict["simulation"]["distance_step"]
accel_config = comp_dict["tracks"]["accel"]
accel_config["distance_step"] = distance_step
accel_track = from_corners(CornerListInput.model_validate(accel_config))
skidpad_config = comp_dict["tracks"]["skidpad"]
skidpad_config["distance_step"] = distance_step
skidpad_track = from_corners(CornerListInput.model_validate(skidpad_config))
autoX_config = comp_dict["tracks"]["autoX"]
autoX_config["distance_step"] = distance_step
autoX_track = from_corners(CornerListInput.model_validate(autoX_config))
endurance_config = comp_dict["tracks"]["endurance"]
endurance_config["distance_step"] = distance_step
endurance_track = from_corners(CornerListInput.model_validate(endurance_config))
scoring = CompetitionScoring.model_validate(comp_dict["scoring"])
return Competition(
car,
accel_track,
skidpad_track,
autoX_track,
endurance_track,
scoring,
)
[docs]
def load_car_from_yaml(yaml_path: str) -> Car | IrlCar:
"""Load a vehicle configuration and return a Car or IrlCar instance.
The YAML type is determined by the ``type`` field:
- ``type: base`` (or omitted) → :class:`~suboptimumg.vehicle.vehicle.Car`
- ``type: irl_setup`` → :class:`~suboptimumg.vehicle.complex_vehicle.IrlCar`
Parameters
----------
yaml_path : str
Path to the YAML configuration file.
Returns
-------
Car or IrlCar
"""
with open(yaml_path, "r") as file:
config = yaml.safe_load(file)
vehicle_model = AnyVehicleModel.validate_python(config)
if isinstance(vehicle_model, ExtendedVehicleModel):
return IrlCar(vehicle_model=vehicle_model)
return Car(vehicle_model=vehicle_model)
[docs]
def load_competition_from_yaml(car_yaml_path: str, comp_yaml_path: str) -> Competition:
"""
Create a Competition object from YAML configuration files.
Parameters
----------
car_yaml_path : str
The file path to the vehicle configuration YAML file.
comp_yaml_path : str
The file path to the competition configuration YAML file.
Returns
-------
Competition
"""
car = load_car_from_yaml(car_yaml_path)
with open(comp_yaml_path, "r") as file:
comp_config = yaml.safe_load(file)
return _competition_from_car_and_comp_dict(car, comp_config)
[docs]
def load_competition_from_dicts(car_config: dict, comp_config: dict) -> Competition:
"""
Create a Competition object from configuration dictionaries.
Parameters
----------
car_config : dict
The vehicle configuration dictionary.
comp_config : dict
The competition configuration dictionary.
Returns
-------
Competition
"""
vehicle_model = AnyVehicleModel.validate_python(car_config)
car = (
IrlCar(vehicle_model=vehicle_model)
if isinstance(vehicle_model, ExtendedVehicleModel)
else Car(vehicle_model=vehicle_model)
)
return _competition_from_car_and_comp_dict(car, comp_config)