""" Pydantic models for simulation results. """ from typing import List, Dict, Optional from pydantic import BaseModel, Field class QueueStatisticsModel(BaseModel): """Statistics for a single queue.""" queue_id: str = Field(..., description="Queue identifier") service_rate: float = Field(..., description="Service rate μ") total_arrivals: int = Field(..., description="Total arrivals to this queue") total_departures: int = Field(..., description="Total departures from this queue") average_wait_time: float = Field(..., description="Average waiting time in queue") average_service_time: float = Field(..., description="Average service time") average_system_time: float = Field(..., description="Average total time in queue (wait + service)") utilization: float = Field(..., description="Server utilization (ρ = busy time / total time)") class TimeSeriesDataModel(BaseModel): """Time series data showing evolution over time.""" timestamps: List[float] = Field(default_factory=list, description="Time points") customers_in_system: List[int] = Field(default_factory=list, description="Total customers in system at each time") customers_per_queue: Dict[str, List[int]] = Field(default_factory=dict, description="Customers per queue over time") class HistogramDataModel(BaseModel): """Histogram data for processing time distribution.""" bins: List[float] = Field(default_factory=list, description="Bin edges") frequencies: List[int] = Field(default_factory=list, description="Frequency in each bin") min_value: float = Field(0.0, description="Minimum value") max_value: float = Field(0.0, description="Maximum value") mean: float = Field(0.0, description="Mean value") std_dev: float = Field(0.0, description="Standard deviation") class SimulationResultsModel(BaseModel): """Complete results from a simulation run.""" # Configuration echo config: Dict = Field(..., description="Configuration used for this simulation") # Request tracking total_requests_arrived: int = Field(..., description="Total requests that entered the system") total_requests_completed: int = Field(..., description="Requests completed after warmup period") # System-wide metrics average_system_time: float = Field(..., description="Average time requests spend in system (W)") average_customers_in_system: float = Field(0.0, description="Average number of customers in system (L)") # Per-queue statistics coordinator_stats: QueueStatisticsModel = Field(..., description="Coordinator queue statistics") server_stats: Dict[str, QueueStatisticsModel] = Field(..., description="Server queue statistics by ID") # Time series (optional) time_series: Optional[TimeSeriesDataModel] = Field(None, description="Time series data if collected") # Histograms (optional) processing_time_histogram: Optional[HistogramDataModel] = Field(None, description="Processing time distribution") # Stability analysis is_stable: bool = Field(True, description="Whether system appears stable") stability_notes: Optional[str] = Field(None, description="Notes about stability") model_config = { "json_schema_extra": { "example": { "config": {}, "total_requests_arrived": 800, "total_requests_completed": 320, "average_system_time": 1250.5, "average_customers_in_system": 10.2, "coordinator_stats": { "queue_id": "coordinator", "service_rate": 0.1, "total_arrivals": 640, "total_departures": 640, "average_wait_time": 2.5, "average_service_time": 10.1, "average_system_time": 12.6, "utilization": 0.81 }, "server_stats": {}, "is_stable": True } } }