import { useEffect } from 'react'; import { Container, Typography, Paper, Table, TableBody, TableCell, TableHead, TableRow, Checkbox, Button, Box, Stack, Divider } from '@mui/material'; import { CompareArrows as CompareIcon } from '@mui/icons-material'; import { useComparisonStore } from '../store/comparisonStore'; import { useSimulationStore } from '../store/simulationStore'; export default function ComparaisonPage() { const { simulations, selectedIds, comparisonData, fetchSimulations, toggleSelection, compareSelected, clearComparison } = useComparisonStore(); const { timeUnit } = useSimulationStore(); useEffect(() => { fetchSimulations(); }, [fetchSimulations]); return ( Comparaison de Simulations {/* Table de sélection */} Sélectionner les simulations à comparer (2 minimum) Date λ (taux d'arrivée) Requêtes traitées Stable {simulations.map((sim) => ( toggleSelection(sim.session_id)} /> {new Date(sim.created_at).toLocaleString()} {sim.arrival_rate} {sim.total_requests} {sim.is_stable ? '✓' : '✗'} ))}
{comparisonData.length > 0 && ( )}
{/* Tableau de comparaison détaillé */} {comparisonData.length > 0 && ( Résultats de la comparaison {/* Configuration */} Configuration Métrique {comparisonData.map((sim, idx) => ( Simulation {idx + 1}
{new Date(sim.created_at).toLocaleString()}
))}
λ (taux d'arrivée) {comparisonData.map((sim, idx) => ( {sim.config.arrival_rate.toFixed(4)} req/{timeUnit} ))} μ coordinateur {comparisonData.map((sim, idx) => ( {sim.config.coordinator_service_rate.toFixed(4)} req/{timeUnit} ))} p (sortie coordinateur) {comparisonData.map((sim, idx) => ( {(sim.config.coordinator_exit_probability * 100).toFixed(1)}% ))} Nombre de serveurs {comparisonData.map((sim, idx) => ( {sim.config.servers.length} ))}
{/* Métriques globales */} Métriques globales du système Requêtes arrivées {comparisonData.map((sim, idx) => ( {sim.config.simulation_time || 'N/A'} {timeUnit} ))} Requêtes traitées {comparisonData.map((sim, idx) => ( {sim.total_requests_completed} ))} W total (temps moyen système) {comparisonData.map((sim, idx) => ( {sim.average_system_time.toFixed(2)} {timeUnit} ))} L (clients moyens dans système) {comparisonData.map((sim, idx) => ( {sim.average_customers_in_system?.toFixed(2) || 'N/A'} ))}
{/* Coordinateur */} Coordinateur Utilisation (ρ) {comparisonData.map((sim, idx) => ( {(sim.coordinator_stats.utilization * 100).toFixed(1)}% ))} Temps d'attente moyen {comparisonData.map((sim, idx) => ( {sim.coordinator_stats.average_wait_time.toFixed(2)} {timeUnit} ))} Temps de service moyen {comparisonData.map((sim, idx) => ( {sim.coordinator_stats.average_service_time.toFixed(2)} {timeUnit} ))} Temps système moyen {comparisonData.map((sim, idx) => ( {sim.coordinator_stats.average_system_time.toFixed(2)} {timeUnit} ))} Requêtes traitées {comparisonData.map((sim, idx) => ( {sim.coordinator_stats.total_departures} ))}
{/* Serveurs */} Serveurs (moyennes) Utilisation moyenne (ρ) {comparisonData.map((sim, idx) => { const serverStats = Object.values(sim.server_stats); const avgUtil = serverStats.reduce((sum: number, s: any) => sum + s.utilization, 0) / serverStats.length; return {(avgUtil * 100).toFixed(1)}%; })} Temps d'attente moyen {comparisonData.map((sim, idx) => { const serverStats = Object.values(sim.server_stats); const avgWait = serverStats.reduce((sum: number, s: any) => sum + s.average_wait_time, 0) / serverStats.length; return {avgWait.toFixed(2)} {timeUnit}; })} Temps de service moyen {comparisonData.map((sim, idx) => { const serverStats = Object.values(sim.server_stats); const avgService = serverStats.reduce((sum: number, s: any) => sum + s.average_service_time, 0) / serverStats.length; return {avgService.toFixed(2)} {timeUnit}; })} Requêtes traitées (total) {comparisonData.map((sim, idx) => { const serverStats = Object.values(sim.server_stats); const totalDepartures = serverStats.reduce((sum: number, s: any) => sum + s.total_departures, 0); return {totalDepartures}; })}
{/* Détail par serveur */} {comparisonData.length > 0 && Object.keys(comparisonData[0].server_stats).length > 0 && ( <> Détail par serveur {Object.keys(comparisonData[0].server_stats).map((serverId) => ( {serverId.replace('_', ' ')} Utilisation (ρ) {comparisonData.map((sim, idx) => ( {(sim.server_stats[serverId].utilization * 100).toFixed(1)}% ))} Temps système {comparisonData.map((sim, idx) => ( {sim.server_stats[serverId].average_system_time.toFixed(2)} {timeUnit} ))} Requêtes traitées {comparisonData.map((sim, idx) => ( {sim.server_stats[serverId].total_departures} ))}
))} )}
)}
); }