/** * Results display component with Material-UI - shows simulation results, analytical results, and comparison. */ import { useState } from 'react'; import { Box, Tabs, Tab, Typography, CircularProgress, Alert, AlertTitle, Stack, } from '@mui/material'; import { Assessment as AssessmentIcon, BarChart as BarChartIcon, CompareArrows as CompareArrowsIcon, } from '@mui/icons-material'; import { useSimulationStore } from '../../store/simulationStore'; import MetricsCard from './MetricsCard'; import ComparisonTable from './ComparisonTable'; import NetworkDiagram from '../visualization/NetworkDiagram'; import UtilizationChart from '../visualization/UtilizationChart'; import MetricsComparisonChart from '../visualization/MetricsComparisonChart'; import TimeSeriesChart from '../visualization/TimeSeriesChart'; import ProcessingTimeHistogram from '../visualization/ProcessingTimeHistogram'; import SteadyStateChart from '../visualization/SteadyStateChart'; import QueueEvolutionChart from '../visualization/QueueEvolutionChart'; export default function ResultsDisplay() { const { config, simulationResults, analyticalResults, comparisonResults, isLoading, timeUnit, } = useSimulationStore(); const [activeTab, setActiveTab] = useState(0); if (isLoading) { return ( Calcul en cours... ); } if (!simulationResults && !analyticalResults) { return ( Aucun résultat disponible Lancez une simulation pour voir les résultats ); } return ( {/* Tabs */} setActiveTab(newValue)}> } iconPosition="start" label="Métriques" /> } iconPosition="start" label="Visualisations" /> } iconPosition="start" label="Comparaison" /> {/* Stability indicator */} {(simulationResults || analyticalResults) && ( {(simulationResults?.is_stable ?? analyticalResults?.is_stable) ? 'Système stable' : 'Système instable'} {!simulationResults?.is_stable && simulationResults?.stability_notes && ( {simulationResults.stability_notes} )} {!analyticalResults?.is_stable && analyticalResults?.instability_reason && ( {analyticalResults.instability_reason} )} )} {/* Metrics Tab */} {activeTab === 0 && ( {/* Simulation results */} {simulationResults && ( Résultats de simulation {/* Coordinator stats */} Coordinateur {/* Server stats */} {Object.entries(simulationResults.server_stats).map(([serverId, stats]) => ( {serverId.replace('_', ' ').charAt(0).toUpperCase() + serverId.replace('_', ' ').slice(1)} ))} )} {/* Analytical results */} {analyticalResults && ( Résultats analytiques (Théorème de Jackson) {/* Coordinator analytics */} Coordinateur {/* Server analytics */} {Object.entries(analyticalResults.servers).map(([serverId, analytics]) => ( {serverId.replace('_', ' ').charAt(0).toUpperCase() + serverId.replace('_', ' ').slice(1)} ))} )} )} {/* Visualizations Tab */} {activeTab === 1 && ( {/* Queue evolution chart - N(t) par file */} {simulationResults?.time_series && ( )} {/* Steady state detection chart */} {simulationResults?.time_series && config && ( )} {/* Time series chart */} {simulationResults?.time_series && ( )} {/* Processing time histogram */} {simulationResults?.processing_time_histogram && ( )} {/* Network diagram */} {config && ( )} {/* Utilization chart */} {(simulationResults || analyticalResults) && ( )} {/* Metrics charts */} {analyticalResults && ( )} {(simulationResults || analyticalResults) && ( )} )} {/* Comparison Tab */} {activeTab === 2 && ( {comparisonResults ? ( <> Comparaison Analytique vs Simulation {/* Visualization of comparison */} ) : ( Lancez une simulation pour voir la comparaison avec les résultats analytiques )} )} ); }