private static List <Experiment> GetAveragedExperiments(IEnumerable <IGrouping <dynamic, Experiment> > groupedExperimentsCollection)
        {
            var averagedExperiments = new List <Experiment>();

            foreach (var groupedExperiments in groupedExperimentsCollection)
            {
                var parameters          = groupedExperiments.First().ExperimentParameters;
                var evolutionStatistics = new EvolutionStatistics
                {
                    BestFitnessScore = groupedExperiments.Average(g => g.Statistics.EvolutionStatistics.BestFitnessScore),
                    LastFitnessScore = groupedExperiments.Average(g => g.Statistics.EvolutionStatistics.LastFitnessScore),
                    NumberOfGenerationBestSolutionTakenFrom = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.EvolutionStatistics.NumberOfGenerationBestSolutionTakenFrom))
                };
                var statistics = new Statistics()
                {
                    Accuracy            = groupedExperiments.Average(g => g.Statistics.Accuracy),
                    EvolutionStatistics = evolutionStatistics,
                    F1Score             = groupedExperiments.Average(g => g.Statistics.F1Score),
                    FallOut             = groupedExperiments.Average(g => g.Statistics.FallOut),
                    FalseDiscoveryRate  = groupedExperiments.Average(g => g.Statistics.FalseDiscoveryRate),
                    FalseNegatives      = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.FalseNegatives)),
                    FalseOmissionRate   = groupedExperiments.Average(g => g.Statistics.FalseOmissionRate),
                    FalsePositives      = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.FalsePositives)),
                    JaccardIndex        = groupedExperiments.Average(g => g.Statistics.JaccardIndex),
                    MeanAngle           = groupedExperiments.Average(g => g.Statistics.MeanAngle),
                    MissRate            = groupedExperiments.Average(g => g.Statistics.MissRate),
                    //ModelEvaluationTime = modelEvaluationTime,
                    NegativePredictiveValue = groupedExperiments.Average(g => g.Statistics.NegativePredictiveValue),
                    //NegativeTrainingPointsGenerationTime = negativeTrainingPointsGenerationTime,
                    NumberOfConstraints = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.NumberOfConstraints)),
                    //PositiveTrainingPointsGenerationTime = positiveTrainingPointsGenerationTime,
                    Precision = groupedExperiments.Average(g => g.Statistics.Precision),
                    Recall    = groupedExperiments.Average(g => g.Statistics.Recall),
                    //RedundantConstraintsRemovingTime = redundantConstraintsRemovingTime,
                    Specificity = groupedExperiments.Average(g => g.Statistics.Specificity),
                    //TestPointsGenerationTime = testPointsGenerationTime,
                    //TotalSynthesisTime = totalSynthesisTime,
                    TrueNegatives = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.TrueNegatives)),
                    TruePositives = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.TruePositives)),
                };

                averagedExperiments.Add(new Experiment
                {
                    ExperimentParameters = parameters,
                    Statistics           = statistics
                });
            }

            return(averagedExperiments);
        }
 private static CSUSESStatistics GetStatistics(EvolutionStatistics evolutionStatistics)
 {
     return(new CSUSESStatistics()
     {
         NumberOfConstraints = GetInt(nameof(CSUSESStatistics.NumberOfConstraints)),
         MeanAngle = GetDouble(nameof(CSUSESStatistics.MeanAngle)),
         TruePositives = GetInt(nameof(CSUSESStatistics.TruePositives)),
         FalsePositives = GetInt(nameof(CSUSESStatistics.FalsePositives)),
         TrueNegatives = GetInt(nameof(CSUSESStatistics.TrueNegatives)),
         FalseNegatives = GetInt(nameof(CSUSESStatistics.FalseNegatives)),
         TotalSynthesisTime = TimeSpan.FromMilliseconds(GetInt(nameof(CSUSESStatistics.TotalSynthesisTime))),
         RedundantConstraintsRemovingTime = TimeSpan.FromMilliseconds(GetInt(nameof(CSUSESStatistics.RedundantConstraintsRemovingTime))),
         ModelEvaluationTime = TimeSpan.FromMilliseconds(GetInt(nameof(CSUSESStatistics.ModelEvaluationTime))),
         PositiveTrainingPointsGenerationTime = TimeSpan.FromMilliseconds(GetInt(nameof(CSUSESStatistics.PositiveTrainingPointsGenerationTime))),
         NegativeTrainingPointsGenerationTime = TimeSpan.FromMilliseconds(GetInt(nameof(CSUSESStatistics.NegativeTrainingPointsGenerationTime))),
         TestPointsGenerationTime = TimeSpan.FromMilliseconds(GetInt(nameof(CSUSESStatistics.TestPointsGenerationTime))),
         EvolutionStatistics = evolutionStatistics
     });
 }
        private static void TuningTable()
        {
            var groupedExperimentsCollection = Experiments
                                               .GroupBy(e => new
            {
                e.ExperimentParameters.NumberOfDimensions,
                e.ExperimentParameters.UseRedundantConstraintsRemoving,
                e.ExperimentParameters.UseDataNormalization,
                e.ExperimentParameters.AllowQuadraticTerms,
                e.ExperimentParameters.UseSeeding,
                e.ExperimentParameters.TypeOfBenchmark,

                e.ExperimentParameters.EvolutionParameters.BasePopulationSize,
                e.ExperimentParameters.EvolutionParameters.OffspringPopulationSize,
                e.ExperimentParameters.EvolutionParameters.NumberOfGenerations,

                //e.ExperimentParameters.MaximumNumberOfConstraints,
                //e.ExperimentParameters.NumberOfConstraintsCoefficients,
                //e.ExperimentParameters.TrackEvolutionSteps,
                //e.ExperimentParameters.BallnBoundaryValue,
                //e.ExperimentParameters.CubenBoundaryValue,
                //e.ExperimentParameters.SimplexnBoundaryValue,
                //e.ExperimentParameters.NumberOfDomainSamples,
                //e.ExperimentParameters.NumberOfTestPoints,
                //e.ExperimentParameters.NumberOfPositivePoints,
                //e.ExperimentParameters.NumberOfNegativePoints,
                //e.ExperimentParameters.DefaultDomainLowerLimit,
                //e.ExperimentParameters.DefaultDomainUpperLimit,
                //e.ExperimentParameters.MaxNumberOfPointsInSingleArray,

                //e.ExperimentParameters.EvolutionParameters.ObjectVectorSize,
                //e.ExperimentParameters.EvolutionParameters.OneFifthRuleCheckInterval,
                //e.ExperimentParameters.EvolutionParameters.OneFifthRuleScalingFactor,
                //e.ExperimentParameters.EvolutionParameters.NumberOfParentsSolutionsToSelect,
                //e.ExperimentParameters.EvolutionParameters.TypeOfParentsSelection,
                //e.ExperimentParameters.EvolutionParameters.TypeOfSurvivorsSelection,
                //e.ExperimentParameters.EvolutionParameters.GlobalLearningRate,
                //e.ExperimentParameters.EvolutionParameters.IndividualLearningRate,
                //e.ExperimentParameters.EvolutionParameters.StepThreshold,
                //e.ExperimentParameters.EvolutionParameters.RotationAngle,
                //e.ExperimentParameters.EvolutionParameters.TypeOfMutation,
                //e.ExperimentParameters.EvolutionParameters.UseRecombination,
                //e.ExperimentParameters.EvolutionParameters.TypeOfObjectsRecombination,
                //e.ExperimentParameters.EvolutionParameters.TypeOfStdDeviationsRecombination,
                //e.ExperimentParameters.EvolutionParameters.TypeOfRotationsRecombination,
            });

            var averagedExperiments = new List <Experiment>();

            foreach (var groupedExperiments in groupedExperimentsCollection)
            {
                var parameters          = groupedExperiments.First().ExperimentParameters;
                var evolutionStatistics = new EvolutionStatistics
                {
                    BestFitnessScore = groupedExperiments.Average(g => g.Statistics.EvolutionStatistics.BestFitnessScore),
                    LastFitnessScore = groupedExperiments.Average(g => g.Statistics.EvolutionStatistics.LastFitnessScore),
                    NumberOfGenerationBestSolutionTakenFrom = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.EvolutionStatistics.NumberOfGenerationBestSolutionTakenFrom))
                };
                var statistics = new Statistics()
                {
                    Accuracy            = groupedExperiments.Average(g => g.Statistics.Accuracy),
                    EvolutionStatistics = evolutionStatistics,
                    F1Score             = groupedExperiments.Average(g => g.Statistics.F1Score),
                    FallOut             = groupedExperiments.Average(g => g.Statistics.FallOut),
                    FalseDiscoveryRate  = groupedExperiments.Average(g => g.Statistics.FalseDiscoveryRate),
                    FalseNegatives      = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.FalseNegatives)),
                    FalseOmissionRate   = groupedExperiments.Average(g => g.Statistics.FalseOmissionRate),
                    FalsePositives      = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.FalsePositives)),
                    JaccardIndex        = groupedExperiments.Average(g => g.Statistics.JaccardIndex),
                    MeanAngle           = groupedExperiments.Average(g => g.Statistics.MeanAngle),
                    MissRate            = groupedExperiments.Average(g => g.Statistics.MissRate),
                    //ModelEvaluationTime = modelEvaluationTime,
                    NegativePredictiveValue = groupedExperiments.Average(g => g.Statistics.NegativePredictiveValue),
                    //NegativeTrainingPointsGenerationTime = negativeTrainingPointsGenerationTime,
                    NumberOfConstraints = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.NumberOfConstraints)),
                    //PositiveTrainingPointsGenerationTime = positiveTrainingPointsGenerationTime,
                    Precision = groupedExperiments.Average(g => g.Statistics.Precision),
                    Recall    = groupedExperiments.Average(g => g.Statistics.Recall),
                    //RedundantConstraintsRemovingTime = redundantConstraintsRemovingTime,
                    Specificity = groupedExperiments.Average(g => g.Statistics.Specificity),
                    //TestPointsGenerationTime = testPointsGenerationTime,
                    //TotalSynthesisTime = totalSynthesisTime,
                    TrueNegatives = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.TrueNegatives)),
                    TruePositives = (int)Math.Round(groupedExperiments.Average(g => g.Statistics.TruePositives)),
                };

                averagedExperiments.Add(new Experiment
                {
                    ExperimentParameters = parameters,
                    Statistics           = statistics
                });
            }

            SaveToFile("tuningTable.tex", CreateTuningTable(averagedExperiments));
        }