/// <inheritdoc /> public async Task <OutputDataModel> ProcessAsync(InputDataModel input, InsightsModel graphModel) { return(await Task.Run( () => { var outputDataModel = new OutputDataModel(); var intersWithIncomStreets = input.Streets.Values .Select(street => (street.EndIntersection, street.Name)) .GroupBy(tuple => tuple.EndIntersection, tuple => tuple.Name) .ToList(); outputDataModel.Intersections = intersWithIncomStreets .Select( grouping => new IntersectionOptions { Id = grouping.Key, IncomingStreets = grouping .Select( s => new StreetOptions { GreenLightDuration = RandomDuration, StreetName = s }) .ToList() }) .ToDictionary(options => options.Id, options => options); return outputDataModel; })); }
static async Task Main(string[] args) { Console.WriteLine("Program started...\n"); foreach (var inputFile in InputFiles) { var inputModel = await InputHelper.InitAsync(inputFile); var insightsModel = new InsightsModel(inputModel); var outputTasks = AllProcessors .Select(async processor => await processor.ProcessAsync(inputModel, insightsModel)) .ToList(); await Task.WhenAll(outputTasks); var outputs = outputTasks.Select(task => task.Result).ToList(); IAggregator aggregator = new FirstPrevailsAndApplyAverageAggregator(); var finalOutput = await aggregator.AggregateAsync(outputs); IOptimizer optimizer = new IntersectionsWithoutTrafficOptimizer(); //await optimizer.OptimizeAsync(inputModel, insightsModel, finalOutput); await OutputHelper.PrintAsync($"{inputFile}.out", finalOutput); Console.WriteLine("\nProgram finished!"); } }
/// <inheritdoc /> public async Task OptimizeAsync(InputDataModel inputModel, InsightsModel insightsModel, OutputDataModel outputModel) { await Task.Run( () => { outputModel.Intersections.Values .ToList() .ForEach( intersectionOptions => intersectionOptions.IncomingStreets = intersectionOptions.IncomingStreets .Where( street => insightsModel.TotalCarsPassByStreet.TryGetValue(street.StreetName, out var totalCars) && totalCars > 0) .ToList()); outputModel.Intersections = outputModel.Intersections .Where(pair => pair.Value.IncomingStreets.Any()) .ToDictionary(pair => pair.Key, pair => pair.Value); }); }