Source code for perda.core_data_structures.single_run_data
from typing import Dict, List, Union
from pydantic import BaseModel, ConfigDict, Field
from ..units import Timescale
from .data_instance import DataInstance
[docs]
class SingleRunData(BaseModel):
"""Pydantic model to store parsed CSV data with dictionary-like lookup."""
model_config = ConfigDict(arbitrary_types_allowed=True)
# Core data storage
id_to_instance: Dict[int, DataInstance] = Field(
description="Mapping from variable ID to DataInstance"
)
cpp_name_to_id: Dict[str, int] = Field(
description="Mapping from variable name to variable ID"
)
id_to_cpp_name: Dict[int, str] = Field(
description="Mapping from variable ID to variable name"
)
id_to_descript: Dict[int, str] = Field(
description="Mapping from variable ID to variable description"
)
# Metadata
total_data_points: int = Field(
description="Total number of data points across all variables"
)
data_start_time: int = Field(description="Start timestamp in log timestamp unit")
data_end_time: int = Field(description="End timestamp in log timestamp unit")
timestamp_unit: Timescale = Field(
default=Timescale.MS,
description="Timestamp logging unit for this run (ms/us)",
)
concat_boundaries: List[int] = Field(
default_factory=list,
description="Timestamps where concatenated runs begin (post-shift)",
)
def __getitem__(
self, input_var_id_name: Union[str, int, DataInstance]
) -> DataInstance:
"""
Dictionary-like access to DataInstance by variable ID or variable name.
Parameters
----------
input_var_id_name : Union[str, int, DataInstance]
Variable ID (int), variable name (str), or DataInstance to retrieve
Returns
-------
DataInstance
DataInstance corresponding to the input
"""
# Dummy return for plotting function for convenience
if isinstance(input_var_id_name, DataInstance):
return input_var_id_name
# If input is a variable ID
if isinstance(input_var_id_name, int):
if input_var_id_name not in self.id_to_instance:
raise KeyError(f"Cannot find variable ID: {input_var_id_name}")
return self.id_to_instance[input_var_id_name]
# If input is variable name
elif isinstance(input_var_id_name, str):
if input_var_id_name not in self.cpp_name_to_id:
raise KeyError(f"Cannot find variable name: {input_var_id_name}")
return self.id_to_instance[self.cpp_name_to_id[input_var_id_name]]
else:
raise ValueError("Input must be a string, int, or DataInstance.")
def __contains__(self, input_var_id_name: Union[str, int]) -> bool:
"""
Check if variable ID or variable name exists in the data.
Parameters
----------
input_var_id_name : Union[str, int]
Variable ID or variable name to check
Returns
-------
bool
True if the variable ID or variable name exists in the data
"""
try:
self[input_var_id_name]
return True
except (KeyError, AttributeError):
return False