private static GeneticDistributionFilter PrepareGeneticDistributionFilter(GeneticDistributionFilterConfiguration configuration,
                                                                                  ILogger logger)
        {
            var handler = FunctionBuilder <double> .CreateFunction(configuration.TrunkThreshold);

            var geneticDistributionFilterParams = new GeneticDistributionFilterParams
            {
                DistributionResolution = configuration.DistributionResolution,
                GetTrunkThreshold      = height => handler(new object[] { height })
            };
            var geneticDistributionFilter = new GeneticDistributionFilter(geneticDistributionFilterParams);
            var compareCriteria           = new SimpleComparison <GeneticDistributionFitness>(EOptimizationMode.Minimize);
            var factory           = new CollectivePhenotypeFactory <ParabolicParameters>();
            var individualFactory =
                new IndividualFactory <CollectiveGenotype <ParabolicParameters>, CollectivePhenotype <ParabolicParameters>,
                                       GeneticDistributionFitness>
                    (factory);

            if (!File.Exists(configuration.GeneticAlgorithmConfigurationFile))
            {
                logger.Fatal("Genetic configuration file does not exist!");
                Environment.Exit(0);
            }

            var geneticAlgorithmConfigurationContent = File.ReadAllText(configuration.GeneticAlgorithmConfigurationFile);
            var geneticAlgorithmInfo = JsonConvert.DeserializeObject <DynamicObjectInfo>(geneticAlgorithmConfigurationContent);
            var geneticAlgorithm     = DynamicObjectFactory <GeneticAlgorithm> .Build(geneticAlgorithmInfo);

            geneticAlgorithm.Population.CompareCriteria   = compareCriteria;
            geneticAlgorithm.Population.IndividualFactory = individualFactory;
            geneticDistributionFilter.GeneticAlgorithm    = geneticAlgorithm;

            return(geneticDistributionFilter);
        }
        private static GeneticEllipseMatch PrepareGeneticEllipseMatchAlgorithm(EllipsisMatchFilterConfiguration configuration, ILogger logger)
        {
            var geneticEllipseMatch = new GeneticEllipseMatch
            {
                BufferWidth           = configuration.BufferWidth,
                EccentricityThreshold = configuration.InvalidEccentricityThreshold,
            };
            var factory           = new CollectivePhenotypeFactory <EllipticParameters>();
            var individualFactory =
                new IndividualFactory <CollectiveGenotype <EllipticParameters>, CollectivePhenotype <EllipticParameters>, EllipsisMatchFitness>(
                    factory);
            var compareCriteria = new SimpleComparison <EllipsisMatchFitness>(EOptimizationMode.Minimize);

            if (!File.Exists(configuration.GeneticAlgorithmConfigurationFile))
            {
                logger.Fatal("Genetic configuration file does not exist!");
                Environment.Exit(0);
            }

            var geneticAlgorithmConfigurationContent = File.ReadAllText(configuration.GeneticAlgorithmConfigurationFile);
            var geneticAlgorithmInfo = JsonConvert.DeserializeObject <DynamicObjectInfo>(geneticAlgorithmConfigurationContent);
            var geneticAlgorithm     = DynamicObjectFactory <GeneticAlgorithm> .Build(geneticAlgorithmInfo);

            geneticAlgorithm.Population.CompareCriteria   = compareCriteria;
            geneticAlgorithm.Population.IndividualFactory = individualFactory;
            geneticEllipseMatch.GeneticAlgorithm          = geneticAlgorithm;

            return(geneticEllipseMatch);
        }