diff --git a/src/MedWNetworkSim.App/Services/NetworkSimulationEngine.cs b/src/MedWNetworkSim.App/Services/NetworkSimulationEngine.cs index e0f93e0..f2571f2 100644 --- a/src/MedWNetworkSim.App/Services/NetworkSimulationEngine.cs +++ b/src/MedWNetworkSim.App/Services/NetworkSimulationEngine.cs @@ -204,10 +204,13 @@ private static void AddReachabilityWarnings(NetworkModel network, RoutingTraffic var adjacency = BuildAdjacency(network); var permissionResolver = new EdgeTrafficPermissionResolver(); + // Bolt: Extract ToDictionary to avoid O(N) allocation inside the double loop (O(P*C)) of producer/consumer checks + var edgesById = network.Edges.ToDictionary(edge => edge.Id, Comparer); + foreach (var producerNodeId in producers) { var hasReachableConsumer = consumers.Any(consumerNodeId => - HasPermittedPath(network, context, adjacency, permissionResolver, producerNodeId, consumerNodeId)); + HasPermittedPath(network, context, adjacency, edgesById, permissionResolver, producerNodeId, consumerNodeId)); if (!hasReachableConsumer) { context.Notes.Add( @@ -218,7 +221,7 @@ private static void AddReachabilityWarnings(NetworkModel network, RoutingTraffic foreach (var consumerNodeId in consumers) { var hasReachableProducer = producers.Any(producerNodeId => - HasPermittedPath(network, context, adjacency, permissionResolver, producerNodeId, consumerNodeId)); + HasPermittedPath(network, context, adjacency, edgesById, permissionResolver, producerNodeId, consumerNodeId)); if (!hasReachableProducer) { context.Notes.Add( @@ -231,6 +234,7 @@ private static bool HasPermittedPath( NetworkModel network, RoutingTrafficContext context, IReadOnlyDictionary> adjacency, + IReadOnlyDictionary edgesById, EdgeTrafficPermissionResolver permissionResolver, string producerNodeId, string consumerNodeId) @@ -240,7 +244,6 @@ private static bool HasPermittedPath( return true; } - var edgesById = network.Edges.ToDictionary(edge => edge.Id, Comparer); var queue = new Queue(); var visited = new HashSet(Comparer) { producerNodeId }; queue.Enqueue(producerNodeId);