"""Defines the top-level dataclass for the histopathology
simulation model configuration parameters.
"""
from typing import Self
import pydantic as pyd
from openpyxl import Workbook
from .arrivals import ArrivalSchedules
from .batching import BatchSizes
from .global_vars import Globals
from .resources import ResourcesInfo
from .runners import RunnerTimesConfig
from .tasks import TaskDurationsInfo
[docs]
class Config(pyd.BaseModel):
    """Top-level config dataclass for the histopathology simulation model."""
    arrivals: ArrivalSchedules
    batch_sizes: BatchSizes
    global_vars: Globals
    resources: ResourcesInfo
    runner_times: RunnerTimesConfig
    task_durations: TaskDurationsInfo
    sim_hours: pyd.PositiveFloat
    num_reps: pyd.PositiveInt
[docs]
    @staticmethod
    def from_workbook(
        wbook: Workbook,
        sim_hours: float,
        num_reps: int,
        runner_speed: float | None = None
    ) -> Self:
        """Load a config from an Excel workbook.
        Args:
            wbook: The configuration file (an Excel workbook).
            sim_hours: Number of hours to run the simulation.
            num_reps: Number of times to run the simulation.
            runner_speed:
                Runner speed in m/s. If None, default to the value found in the Excel file.
        Returns:
            Config: The configuration as a Pydantic dataclass.
        """
        arrival_schedules = ArrivalSchedules.from_workbook(wbook)
        resources = ResourcesInfo.from_workbook(wbook)
        task_durations = TaskDurationsInfo.from_workbook(wbook)
        batch_sizes = BatchSizes.from_workbook(wbook)
        global_vars = Globals.from_workbook(wbook)
        runner_cfg = RunnerTimesConfig.from_workbook(wbook, speed=runner_speed)
        return Config(
            arrivals=arrival_schedules,
            batch_sizes=batch_sizes,
            global_vars=global_vars,
            resources=resources,
            runner_times=runner_cfg,
            task_durations=task_durations,
            sim_hours=sim_hours,
            num_reps=num_reps
        )