/** * Analytical Preview - Shows Jackson's theorem calculations BEFORE simulation */ import { useEffect, useState } from 'react'; import { Box, Typography, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Alert, AlertTitle, CircularProgress, Divider, } from '@mui/material'; import { CheckCircle as CheckCircleIcon, Warning as WarningIcon, Error as ErrorIcon, Assessment as AssessmentIcon, } from '@mui/icons-material'; import { useSimulationStore } from '../../store/simulationStore'; import { formatTime, formatRate } from '../../utils/timeFormat'; import api from '../../services/api'; import type { NetworkAnalytics } from '../../types/simulation'; export default function AnalyticalPreview() { const { config, timeUnit } = useSimulationStore(); const [analytics, setAnalytics] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!config) { setAnalytics(null); return; } const fetchAnalytics = async () => { try { setLoading(true); setError(null); const result = await api.analyzeWithJackson(config); setAnalytics(result); } catch (err) { setError(err instanceof Error ? err.message : 'Erreur de calcul analytique'); } finally { setLoading(false); } }; fetchAnalytics(); }, [config]); if (!config) { return null; } if (loading) { return ( Calcul analytique en cours... ); } if (error) { return ( Erreur {error} ); } if (!analytics) { return null; } return ( Analyse Théorique (Théorème de Jackson) {/* Stability Alert */} : } sx={{ mb: 3 }} > {analytics.is_stable ? 'Système Stable' : 'Système Instable'} {analytics.instability_reason && ( {analytics.instability_reason} )} {/* Global Metrics */} Métriques Globales du Réseau Nombre moyen de clients (L) {analytics.total_average_customers.toFixed(4)} clients dans le système Temps moyen (W) {formatTime(analytics.total_average_time, timeUnit)} temps dans le système {/* Coordinator Details */} 🔵 COORDINATEUR Paramètre Symbole Valeur Description Arrivée externe λ {formatRate(config.arrival_rate, timeUnit)} Taux d'arrivée externe (Poisson) Probabilité de sortie p {config.coordinator_exit_probability.toFixed(3)} Clients sortant après le coordinateur Taux effectif coordinateur γ0 {formatRate(analytics.coordinator.arrival_rate, timeUnit)} λ / p (externe + retours des serveurs) Taux de service μc {formatRate(analytics.coordinator.service_rate, timeUnit)} Capacité de service du coordinateur Utilisation ρc {analytics.coordinator.utilization.toFixed(4)} {analytics.coordinator.utilization < 1 ? ( Stable (ρ < 1) ) : ( Instable (ρ ≥ 1) )} Nombre moyen clients Lc {(analytics.coordinator.average_customers ?? 0).toFixed(4)} Clients dans le coordinateur (file + service) Temps moyen système Wc {formatTime(analytics.coordinator.average_time ?? 0, timeUnit)} Attente + Service Temps d'attente Wq,c {formatTime(analytics.coordinator.average_wait_time ?? 0, timeUnit)} Temps dans la file seulement
{/* Servers Details */} {Object.entries(analytics.servers).map(([serverId, serverAnalytics], index) => ( 🟢 SERVEUR {index + 1} Paramètre Symbole Valeur Description Taux d'arrivée λ{index + 1} {formatRate(serverAnalytics.arrival_rate, timeUnit)} Depuis coordinateur: γ0 × q{index + 1} = (λ / p) × q{index + 1} Taux de service μ{index + 1} {formatRate(serverAnalytics.service_rate, timeUnit)} Capacité de service du serveur Utilisation ρ{index + 1} {serverAnalytics.utilization.toFixed(4)} {serverAnalytics.utilization < 1 ? ( Stable (ρ < 1) ) : ( Instable (ρ ≥ 1) )} Nombre moyen clients L{index + 1} {(serverAnalytics.average_customers ?? 0).toFixed(4)} Clients dans le serveur (file + service) Temps moyen système W{index + 1} {formatTime(serverAnalytics.average_time ?? 0, timeUnit)} Attente + Service Temps d'attente Wq,{index + 1} {formatTime(serverAnalytics.average_wait_time ?? 0, timeUnit)} Temps dans la file seulement
))} {/* Formulas Reference */} 📐 Formules utilisées (Théorème de Jackson): Équations de trafic (avec boucle de retour): • γ0 = λ + Σγi (coordinateur reçoit externe + retours) • γi = qi × γ0 (routage vers serveur i) Solution: γ0 = λ / p, γi = (λ / p) × qi Métriques par file M/M/1: • ρ = λ/μ (Utilisation) • L = ρ/(1-ρ) (Nombre moyen de clients) • W = 1/(μ-λ) (Temps moyen dans le système) • Wq = W - 1/μ (Temps d'attente) • Ltotal = Σ Li (Loi de Little globale)
); }