results.py 4,24 ko
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")


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
            }
        }
    }