internal async Task <bool> CreateMLConfig(MLConfigController mlconfig)
        {
            //save project with new created mlconfig
            await Save();

            //create model name
            string modelName = $"MLConfig{Models.Count}";

            //Define ml data file paths
            var strModelFolder     = Project.GetMLConfigFolder(Settings, modelName);
            var strModelDataFolder = Project.GetMLConfigDataFolder(Settings, modelName);


            //check if model folder exists
            if (!Directory.Exists(strModelFolder))
            {
                Directory.CreateDirectory(strModelFolder);
            }
            //check if data folder exists
            if (!Directory.Exists(strModelDataFolder))
            {
                Directory.CreateDirectory(strModelDataFolder);
            }

            //model name and settings
            mlconfig.Name     = modelName;
            mlconfig.Settings = Settings;

            //load project file in order to get settings information and data description needed for data transformation
            var strPPath = Path.Combine(Settings.ProjectFolder, Settings.ProjectFile);
            var proj     = new Project();

            proj.Load(strPPath);

            //ToDo: optimizes code for huge dataset
            if (Settings.ProjectType == ProjectType.Default)
            {
                createDefaultDataSets(DataSet, modelName, proj.Descriptor);
            }
            else if (Settings.ProjectType == ProjectType.ImageClassification)
            {
                createImgClassificationDataSets(DataSet, modelName, proj.Descriptor);
            }
            else
            {
                ;
            }


            //create mlconfig file
            Project.NewMLConfigFile(proj, modelName, DataSet);

            //initialize model
            mlconfig.Init();

            //add newly created model in to Model collection of the project
            Models.Add(mlconfig);

            //save project with new created mlconfig
            return(await Save());
        }
        internal void CreateMLConfig(MLConfigController mlconfig)
        {
            //save project with new created mlconfig
            Save();

            //create model name
            string modelName = $"MLConfig{Models.Count}";

            //Define ml data file paths
            var strModelFolder     = Project.GetMLConfigFolder(Settings, modelName);
            var strModelDataFolder = Project.GetMLConfigDataFolder(Settings, modelName);
            var strPathTrain       = Project.GetDefaultMLDatasetPath(Settings, modelName, true);
            var strPathValid       = Project.GetDefaultMLDatasetPath(Settings, modelName, false);

            //check if model folder exists
            if (!Directory.Exists(strModelFolder))
            {
                Directory.CreateDirectory(strModelFolder);
            }
            //check if data folder exists
            if (!Directory.Exists(strModelDataFolder))
            {
                Directory.CreateDirectory(strModelDataFolder);
            }

            //get dataset based on options
            var ds = DataSet.GetDataSet(DataSet.RandomizeData);

            //we want whole data set later the data will be split
            ds.TestRows = 0;
            //create experiment based created dataset
            var exp  = new Experiment(ds);
            var data = ExportData.PrepareDataSet(exp);

            //calculate validation and training rows
            int validCount = DataSet.IsPrecentige ? (int)(DataSet.TestRows * data.Count / 100.0) : DataSet.TestRows;

            //in case of empty validation data set skip file creation
            if (validCount == 0)
            {
                strPathValid = "";
            }

            //create training ml ready dataset file
            int trainCount = data.Count - validCount;

            if (trainCount <= 0)
            {
                throw new Exception("Train dataset is empty. Split data set on correct parts.");
            }
            File.WriteAllLines(strPathTrain, data.Take(trainCount).ToList());

            //in case of empty validation data set skip file creation
            if (validCount > 0)
            {
                var d = data.Skip(trainCount).Take(validCount).ToList();
                File.WriteAllLines(strPathValid, d);
            }

            //model name and settings
            mlconfig.Name     = modelName;
            mlconfig.Settings = Settings;

            //load project file in order to get settings information and data description needed for data transformation
            var strPPath = Path.Combine(Settings.ProjectFolder, Settings.ProjectFile);
            var proj     = new Project();

            proj.Load(strPPath);

            //enumerate all column and setup column information needed for mlconfig creation
            foreach (var c in proj.Descriptor.Columns.Where(x => x.Type == DataType.Category && x.Kind != DataKind.None))
            {
                var cc = exp.GetColumns().Where(x => x.Name == c.Name && x.ColumnDataType == ColumnType.Category).FirstOrDefault();
                if (cc == null)
                {
                    throw new Exception("Column not found!");
                }

                c.Classes = cc.Statistics.Categories.ToArray();
            }

            //create mlconfig file
            Project.NewMLConfigFile(proj, modelName);

            //initialize model
            mlconfig.Init();

            //add newly created model in to Model collection of the project
            Models.Add(mlconfig);

            //save project with new created mlconfig
            Save();
        }