public bool Exists(ExperimentParameters experimentParameters)
        {
            var controlQuery = $"SELECT name FROM sqlite_master WHERE name = '{nameof(_versions).Replace("_", string.Empty)}'";

            var result = _databaseEngine.PrepareStatement(controlQuery).ExecuteReader();

            if (!result.HasRows)
            {
                return(false);
            }

            var query = $"SELECT * FROM {nameof(_versions).Replace("_", string.Empty)} " +
                        $"WHERE {nameof(Version.ExperimentParametersHashString)} = '{experimentParameters.GetHashString()}'";

            result = _databaseEngine.PrepareStatement(query).ExecuteReader();

            return(result.HasRows);
        }
        static void Main(string[] args)
        {
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;//CultureInfo.GetCultureInfo("en-US");

            var dbPath          = Path.GetFullPath("Database test.db");
            var databaseContext = new DatabaseContext(dbPath);

            //var experimentParameters = Arguments.GetExperimentParameters();

            var experimentParameters = new ExperimentParameters(2, 10,
                                                                typeOfMutation: ExperimentParameters.MutationType.Correlated,
                                                                typeOfBenchmark: ExperimentParameters.BenchmarkType.Simplexn,
                                                                stepThreshold: 0.1, numberOfGenerations: 1,
                                                                basePopulationSize: 15,
                                                                //basePopulationSize: 3,
                                                                offspringPopulationSize: 100,
                                                                //offspringPopulationSize: 20,
                                                                globalLerningRate: 1 / Math.Sqrt(2 * 2),
                                                                //globalLerningRate: 0.7,
                                                                individualLearningRate: 1 / Math.Sqrt(2 * Math.Sqrt(2)),
                                                                //individualLearningRate: 0.8,
                                                                numberOfPositivePoints: 10,
                                                                numberOfNegativePoints: 10,
                                                                ballnBoundaryValue: 2,
                                                                //simplexnBoundaryValue: 2,
                                                                seed: 1,
                                                                useRecombination: false,
                                                                numberOfParentsSolutionsToSelect: 5
                                                                //domainSamplingStep: 1
                                                                );

            if (databaseContext.Exists(experimentParameters))
            {
                return;
            }

            if (experimentParameters.TypeOfBenchmark == ExperimentParameters.BenchmarkType.Other)
            {
                experimentParameters.ConstraintsToPointsGeneration = ReferenceModelsExamples.Example1;
            }

            var version            = new Version(DateTime.Now, experimentParameters.GetHashString());
            var stoper             = new Stopwatch();
            var distanceCalculator = new CanberraDistanceCalculator();

            var engine = EngineFactory.GetEngine(experimentParameters);

            stoper.Restart();

            var positivePointsGenerator = new PositivePointsGenerator();
            var positiveTrainingPoints  = positivePointsGenerator.GeneratePoints(experimentParameters.NumberOfPositivePoints, engine.Benchmark);

            stoper.Stop();
            engine.Statistics.PositiveTrainingPointsGenerationTime = stoper.Elapsed;
            stoper.Restart();

            var negativePointsGenerator = new NegativePointsGenerator(positiveTrainingPoints, distanceCalculator, new NearestNeighbourDistanceCalculator(distanceCalculator));
            var negativeTrainingPoints  = negativePointsGenerator.GeneratePoints(experimentParameters.NumberOfNegativePoints, engine.Benchmark);

            stoper.Stop();
            engine.Statistics.NegativeTrainingPointsGenerationTime = stoper.Elapsed;

            var trainingPoints = positiveTrainingPoints.Concat(negativeTrainingPoints).ToArray();

            var mathModel = engine.SynthesizeModel(trainingPoints);

            stoper.Restart();

            var positiveTestPoints = positivePointsGenerator.GeneratePoints(experimentParameters.NumberOfPositivePoints, engine.Benchmark);

            var negativeTestPoints = negativePointsGenerator.GeneratePoints(experimentParameters.NumberOfNegativePoints, engine.Benchmark);

            var testPoints = positiveTestPoints.Concat(negativeTestPoints).ToArray();

            stoper.Stop();
            engine.Statistics.TestPointsGenerationTime = stoper.Elapsed;

            var statistics = engine.EvaluateModel(testPoints);

            databaseContext.Insert(version);
            databaseContext.Insert(experimentParameters);
            databaseContext.Insert(statistics);
            databaseContext.Insert(mathModel);
            databaseContext.Save();
            databaseContext.Dispose();

            TryGetVisibleResults(engine, positiveTrainingPoints, negativeTrainingPoints);
        }