#!/usr/bin/env python3 """Test script to verify L total bug fixes.""" import sys sys.path.insert(0, 'apps/backend/src') from analytics.jackson import JacksonAnalyzer from analytics.comparison import compare_results from core.simulation import Simulator, SimulationConfig # Configuration from the user's JSON file config = SimulationConfig( arrival_rate=0.006, # λ₀ coordinator_service_rate=0.1, # μc coordinator_exit_probability=0.5, # p server_service_rates=[0.00833], # μ₁ server_routing_probs=[0.5], # q₁ warmup_time=1000, simulation_time=10000, # Shorter for quick test random_seed=42 ) print("=" * 80) print("TESTING L TOTAL BUG FIXES") print("=" * 80) # Run analytical analysis print("\n1. Running analytical analysis...") analyzer = JacksonAnalyzer( external_arrival_rate=config.arrival_rate, coordinator_service_rate=config.coordinator_service_rate, coordinator_exit_prob=config.coordinator_exit_probability, server_service_rates=config.server_service_rates, server_routing_probs=config.server_routing_probs ) analytical = analyzer.analyze() print(f" λ₀ (external) = {analytical.external_arrival_rate:.6f}") print(f" γ₀ (coordinator effective) = {analytical.coordinator.arrival_rate:.6f}") print(f" Analytical L_total = {analytical.total_average_customers:.4f}") print(f" Analytical W_total = {analytical.total_average_time:.4f}") # Run simulation print("\n2. Running simulation...") simulator = Simulator(config) results = simulator.run() print(f" Simulation W = {results.average_system_time:.4f}") print(f" Simulation L = {results.average_customers_in_system:.4f} ← Should NOT be 0!") # Verify Bug Fix #1: average_customers_in_system should be calculated expected_L = config.arrival_rate * results.average_system_time print(f"\n ✓ Expected L (λ₀ × W) = {expected_L:.4f}") if abs(results.average_customers_in_system - expected_L) < 0.01: print(f" ✅ BUG FIX #1 VERIFIED: average_customers_in_system is calculated correctly") else: print(f" ❌ BUG FIX #1 FAILED: Got {results.average_customers_in_system}, expected {expected_L}") # Run comparison print("\n3. Running comparison...") comparison = compare_results(analytical, results) print(f" Analytical L_total = {comparison.analytical_total_L:.4f}") print(f" Simulation L_total = {comparison.simulation_total_L:.4f}") print(f" Difference = {comparison.total_L_diff_percent:.2f}%") # Verify Bug Fix #2: comparison should use λ₀ not γ₀ expected_comparison_L = analytical.external_arrival_rate * results.average_system_time print(f"\n ✓ Expected comparison L (λ₀ × W) = {expected_comparison_L:.4f}") if abs(comparison.simulation_total_L - expected_comparison_L) < 0.01: print(f" ✅ BUG FIX #2 VERIFIED: Comparison uses λ₀ (not γ₀)") else: print(f" ❌ BUG FIX #2 FAILED: Got {comparison.simulation_total_L}, expected {expected_comparison_L}") # Final verification print("\n" + "=" * 80) print("SUMMARY") print("=" * 80) print(f"λ₀ (external arrival rate) = {analytical.external_arrival_rate:.6f}") print(f"γ₀ (coordinator effective rate) = {analytical.coordinator.arrival_rate:.6f}") print(f"Ratio γ₀/λ₀ = {analytical.coordinator.arrival_rate / analytical.external_arrival_rate:.2f} (should be 1/p = {1/config.coordinator_exit_probability:.2f})") print() print(f"Simulation L = {results.average_customers_in_system:.4f}") print(f"Comparison L = {comparison.simulation_total_L:.4f}") print(f"Analytical L = {comparison.analytical_total_L:.4f}") print() if abs(results.average_customers_in_system - comparison.simulation_total_L) < 0.01: print("✅ Both L values match!") else: print(f"⚠️ L values differ: simulation={results.average_customers_in_system:.4f} vs comparison={comparison.simulation_total_L:.4f}") print("\n" + "=" * 80)