Newer
Older
"""
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")
# Compteurs cumulés pour chaque queue
cumulative_arrivals_per_queue: Dict[str, List[int]] = Field(default_factory=dict, description="Cumulative arrivals per queue over time")
cumulative_departures_per_queue: Dict[str, List[int]] = Field(default_factory=dict, description="Cumulative departures per queue over time")
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
}
}
}