test_all_scenarios.py 4,76 ko
Newer Older
"""
Test all 5 predefined scenarios from the project requirements.
"""
from src.core.simulation import Simulator
from src.core.scenarios import (
    get_scenario_1, get_scenario_2, get_scenario_3,
    get_scenario_4, get_scenario_5_variations
)


def print_separator(char="=", length=80):
    """Print a separator line."""
    print(char * length)


def print_results(scenario_name: str, results, config):
    """Print simulation results in a formatted way."""
    print(f"\n{scenario_name}")
    print_separator("-")

    print(f"\n📊 Configuration:")
    print(f"  λ = {config.arrival_rate:.6f} req/ms")
    print(f"  μc = {config.coordinator_service_rate:.6f} req/ms")
    print(f"  p = {config.coordinator_exit_probability:.3f}")
    print(f"  Servers: {len(config.server_service_rates)}")
    for i, (mu, q) in enumerate(zip(config.server_service_rates, config.server_routing_probs)):
        print(f"    Server {i+1}: μ={mu:.6f}, q={q:.3f}")

    # Theoretical utilizations
    lambda_ext = config.arrival_rate
    rho_c = lambda_ext / config.coordinator_service_rate
    print(f"\n📐 Theoretical Utilizations:")
    print(f"  ρc = {rho_c:.4f}")

    for i, (mu, q) in enumerate(zip(config.server_service_rates, config.server_routing_probs)):
        lambda_i = lambda_ext * q
        rho_i = lambda_i / mu
        status = "✅ STABLE" if rho_i < 1 else "❌ UNSTABLE"
        print(f"  ρ{i+1} = {rho_i:.4f} {status}")

    # Simulation results
    print(f"\n📈 Simulation Results:")
    print(f"  Requests completed: {results.total_requests_completed}")
    print(f"  Average system time: {results.average_system_time:.2f} ms")

    print(f"\n  Coordinator:")
    coord = results.coordinator_stats
    print(f"    Utilization: {coord['utilization']:.4f}")
    print(f"    Avg wait: {coord['average_wait_time']:.2f} ms")
    print(f"    Avg service: {coord['average_service_time']:.2f} ms")

    for server_id, stats in results.server_stats.items():
        print(f"\n  {server_id}:")
        print(f"    Utilization: {stats['utilization']:.4f}")
        print(f"    Avg wait: {stats['average_wait_time']:.2f} ms")
        print(f"    Avg service: {stats['average_service_time']:.2f} ms")
        print(f"    Requests processed: {stats['total_departures']}")


def main():
    print_separator()
    print("QUEUEING NETWORK SIMULATION - ALL SCENARIOS TEST")
    print_separator()

    # Scenario 1
    print("\n\n🔴 SCENARIO 1: Single Fast Server (Instability Test)")
    print_separator()
    config1 = get_scenario_1()
    sim1 = Simulator(config1)
    results1 = sim1.run()
    print_results("Scenario 1 Results", results1, config1)

    # Scenario 2
    print("\n\n🟡 SCENARIO 2: Fast + Slow Server")
    print_separator()
    config2 = get_scenario_2()
    sim2 = Simulator(config2)
    results2 = sim2.run()
    print_results("Scenario 2 Results", results2, config2)

    # Scenario 3
    print("\n\n🟢 SCENARIO 3: Three Slow Servers")
    print_separator()
    config3 = get_scenario_3()
    sim3 = Simulator(config3)
    results3 = sim3.run()
    print_results("Scenario 3 Results", results3, config3)

    # Scenario 4
    print("\n\n🔵 SCENARIO 4: Fast + Medium Server")
    print_separator()
    config4 = get_scenario_4()
    sim4 = Simulator(config4)
    results4 = sim4.run()
    print_results("Scenario 4 Results", results4, config4)

    # Scenario 5 - Parameter variations
    print("\n\n🟣 SCENARIO 5: Parameter Sensitivity Analysis")
    print_separator()
    variations = get_scenario_5_variations()

    for desc, config5 in variations:
        print(f"\n\n  Variation: {desc}")
        print("  " + "-" * 76)
        sim5 = Simulator(config5)
        results5 = sim5.run()
        print_results(f"  {desc}", results5, config5)

    # Summary comparison
    print("\n\n" + "=" * 80)
    print("SUMMARY COMPARISON (Scenarios 1-4)")
    print("=" * 80)

    scenarios_data = [
        ("Scenario 1", results1, config1),
        ("Scenario 2", results2, config2),
        ("Scenario 3", results3, config3),
        ("Scenario 4", results4, config4),
    ]

    print(f"\n{'Scenario':<15} {'Servers':<10} {'Avg Time (ms)':<15} {'Completed':<12} {'Coord ρ':<10} {'Max Server ρ':<15}")
    print("-" * 80)

    for name, results, config in scenarios_data:
        num_servers = len(config.server_service_rates)
        avg_time = results.average_system_time
        completed = results.total_requests_completed
        coord_util = results.coordinator_stats['utilization']
        max_server_util = max(s['utilization'] for s in results.server_stats.values())

        print(f"{name:<15} {num_servers:<10} {avg_time:<15.2f} {completed:<12} {coord_util:<10.4f} {max_server_util:<15.4f}")

    print("\n" + "=" * 80)
    print("✅ All scenarios completed successfully!")
    print("=" * 80)


if __name__ == "__main__":
    main()