public GeneratorData GetAverageStatistics(DataSplit dataSplit)
        {
            var data = generatorData
                       .Skip(Math.Min(generatorData.Count - 1, (int)(generatorData.Count * dataSplit.Start)))
                       .Take(Math.Max(1, (int)(generatorData.Count * (dataSplit.End - dataSplit.Start))))
                       .ToList();
            var averageData = new GeneratorData();

            for (int i = 0; i < data[0].ChainsStats.Count; i++)
            {
                averageData.ChainsStats.Add(new ChainStats()
                {
                    AttemptsOnSuccess                = data.Average(x => x.ChainsStats[i].AttemptsOnSuccess),
                    FailedRuns                       = data.Average(x => x.ChainsStats[i].FailedRuns),
                    RandomRestarts                   = data.Average(x => x.ChainsStats[i].RandomRestarts),
                    OutOfIterations                  = data.Average(x => x.ChainsStats[i].OutOfIterations),
                    Iterations                       = data.Average(x => x.ChainsStats[i].Iterations),
                    MaxIterationsOnSuccess           = data.Max(x => x.ChainsStats[i].MaxIterationsOnSuccess),
                    AverageIterationsOnSuccess       = data.Average(x => x.ChainsStats[i].AverageIterationsOnSuccess),
                    AverageStageTwoFailuresOnSuccess = data.Average(x => x.ChainsStats[i].AverageStageTwoFailuresOnSuccess),
                    MaxStageTwoFailuresOnSuccess     = data.Max(x => x.ChainsStats[i].MaxStageTwoFailuresOnSuccess),
                });
            }

            averageData.Iterations = data.Average(x => x.Iterations);
            averageData.Time       = data.Average(x => x.Time);

            return(averageData);
        }
        private GeneratorData AnalyzeRun(IGeneratorRun <TRunData> run)
        {
            var generatorData = new GeneratorData()
            {
                Iterations = run.Iterations,
                Time       = run.Time,
            };

            var simulatedAnnealingEvents = run.AdditionalData.SimulatedAnnealingEventArgs;
            var chainsCount = simulatedAnnealingEvents.Max(x => x.ChainNumber) + 1;

            for (int i = 0; i < chainsCount; i++)
            {
                generatorData.ChainsStats.Add(AnalyzeChain(i, simulatedAnnealingEvents));
            }

            return(generatorData);
        }