@@ -465,7 +465,7 @@ def evaluate(self, payload: SimulationPayload) -> MMcResults:
465465 # Observed KPIs → MMcResults (coerenti con definizioni sopra)
466466 # ────────────────────────────────────────────────────────────────────
467467
468- def _observed_kpis (
468+ def _observed_kpis ( # noqa: PLR0915
469469 self ,
470470 payload : SimulationPayload ,
471471 results_analyzer : ResultsAnalyzer ,
@@ -534,6 +534,8 @@ def _observed_kpis(
534534 )
535535
536536 else :
537+ # not FCFS → RANDOM
538+ # Wq̂: mean server waiting_time (independent of Lq)
537539 arrays_map = results_analyzer .get_server_event_arrays ()
538540 wait_sum = 0.0
539541 wait_count = 0
@@ -543,9 +545,37 @@ def _observed_kpis(
543545 wait_count += len (vals )
544546 wq_hat = (wait_sum / wait_count ) if wait_count > 0 else 0.0
545547
546- l_hat = lambda_hat * w_hat
547- lq_hat = lambda_hat * wq_hat
548- rho_hat = (
548+ # L̂: mean L_SYSTEM time-series (fallback to λ̂·Ŵ)
549+ lsys_map = results_analyzer .get_metric_map (SampledMetricName .L_SYSTEM )
550+ aid = payload .arrivals .id
551+ lsys_series = lsys_map .get (aid , [])
552+ l_hat = (
553+ (sum (lsys_series ) / len (lsys_series ))
554+ if lsys_series else (lambda_hat * w_hat )
555+ )
556+
557+ # Lq̂: sum over servers of mean LQ_SERVER (fallback to λ̂·Wq̂)
558+ lq_map = results_analyzer .get_metric_map (SampledMetricName .LQ_SERVER )
559+ lq_hat = 0.0
560+ have_any = False
561+ for sid in results_analyzer .list_server_ids ():
562+ series = lq_map .get (sid , [])
563+ if series :
564+ lq_hat += (sum (series ) / len (series ))
565+ have_any = True
566+ if not have_any :
567+ lq_hat = lambda_hat * wq_hat
568+
569+ # rho: mean SERVER_UTILIZATION across servers (fallback to λ̂/(c·μ̂))
570+ util_map = (results_analyzer .get_metric_map (
571+ SampledMetricName .SERVER_UTILIZATION )
572+ )
573+ total_busy = 0.0
574+ total_samples = 0
575+ for series in util_map .values ():
576+ total_busy += float (sum (series ))
577+ total_samples += len (series )
578+ rho_hat = (total_busy / total_samples ) if total_samples > 0 else (
549579 lambda_hat / (server_count * mu_hat )
550580 if mu_hat not in (0.0 , float ("inf" )) else 0.0
551581 )
0 commit comments