private static int Main(string[] args) { var customCulture = (System.Globalization.CultureInfo)Thread.CurrentThread.CurrentCulture.Clone(); customCulture.NumberFormat.NumberDecimalSeparator = "."; Thread.CurrentThread.CurrentCulture = customCulture; if (args.Length != 9) { DisplayUsage(); Console.ReadKey(); return(-1); } try { PrepareParameters(args); PrintParameters(args); if (DatabaseUtils.CheckIfExists(args)) { Console.WriteLine("Experiment already exists in database!"); return(0); } var sw = new Stopwatch(); sw.Start(); Console.WriteLine("----- Generating data ------"); var dataGenerator = new DataGenerator(); dataGenerator.GenerateTrainingData(); dataGenerator.GenerateTestData(); Console.WriteLine("----- Classification data ------"); var dataClassificator = new C45BinaryClassificator(dataGenerator.TrainingData.ToArray()); dataClassificator.Learn(); Console.WriteLine("----- Creating model ------"); var modelCreator = new ModelCreator(dataClassificator.OutputPath); modelCreator.Create(); sw.Stop(); Console.WriteLine("----- Calculating statistics ------"); // Calculating jaccard index for training data var statistics = new StatisticsCalculator(); statistics.CalculateStatistics(dataClassificator.DecisionTree, modelCreator.UniqueConstraints, dataGenerator); // Saving data to database DatabaseUtils.SaveToDatabase(dataClassificator, modelCreator, statistics, dataGenerator, sw.ElapsedMilliseconds); } catch (ArgumentException ex) { Console.WriteLine(ex.Message); DatabaseUtils.SaveErrorToDatabase(ex.Message); return(-1); } catch (FormatException) { const string message = "Error parsing input parameters"; DatabaseUtils.SaveErrorToDatabase(message); Console.WriteLine(message); return(-1); } return(0); }
/// <summary> /// Saves experiments data to database. Data is gathered from different program's classes given as parameters /// </summary> /// <param name="classificator">Instance of <see cref="C45BinaryClassificator"/>class /// (Used only for rules saving which is commented)</param> /// <param name="model"></param> /// <param name="statistics"></param> /// <param name="data"></param> /// <param name="executionTime"></param> public static void SaveToDatabase(C45BinaryClassificator classificator, ModelCreator model, StatisticsCalculator statistics, DataGenerator data, long executionTime) { Console.WriteLine(GlobalVariables.Dbpath); var db = new Database(GlobalVariables.Dbpath); var experiment = db.NewExperiment(); // Input variables experiment["Benchmark"] = GlobalVariables.BenchmarkName; experiment["FeasibleExamples"] = GlobalVariables.FeasibleExamplesCount; experiment["InfeasibleExamples"] = GlobalVariables.InfeasibleExamplesCount; experiment["Dimensions"] = GlobalVariables.Dimensions; experiment["K"] = GlobalVariables.K; experiment["Join"] = GlobalVariables.Join; experiment["MaxHeight"] = GlobalVariables.MaxHeight; experiment["Seed"] = GlobalVariables.Seed; experiment["Components"] = GlobalVariables.Components; experiment["ExperimentName"] = GlobalVariables.ExperimentName; // Sometimes is extending SQlite cell length limits which leads to damaging database //experiment["Rules"] = classificator.DecisionTree.ToRules().ToString(); // data experiment["Eps"] = data.BoundryRescaler.Eps; var sb = new StringBuilder(); for (var i = 0; i < data.NewBoundries.GetLength(0); i++) { sb.AppendLine($"{data.NewBoundries[i, 0]},{data.NewBoundries[i, 1]}"); } experiment["NewBoundries"] = sb.ToString(); // Gurobi model data experiment["Constraints"] = model.Constraints; experiment["Terms"] = model.Terms; // Same situaction as with "Rules" cell above //using ( var sr = new StreamReader(GlobalVariables.GurobiModelPath) ) //{ // experiment["GurobiModel"] = sr.ReadToEnd(); //} // Statistics experiment["FJaccard"] = statistics.FixedJaccardIndex; experiment["FAccuracy"] = statistics.FixedAccuracy; experiment["FTP"] = statistics.FixedTruePositive; experiment["FFP"] = statistics.FixedFalsePositive; experiment["FTN"] = statistics.FixedTrueNegative; experiment["FFN"] = statistics.FixedFalseNegative; experiment["HJaccard"] = statistics.HomogenousJaccardIndex; experiment["HAccuracy"] = statistics.HomogenousAccuracy; experiment["HTP"] = statistics.HomogenousTruePositive; experiment["HFP"] = statistics.HomogenousFalsePositive; experiment["HTN"] = statistics.HomogenousTrueNegative; experiment["HFN"] = statistics.HomogenousFalseNegative; experiment["Total"] = statistics.DataLength; experiment["MeanAngle"] = statistics.MeanAngle; experiment["StatisticsCalculationTime"] = statistics.ExecutionTime; experiment["ProcessingTime"] = executionTime; // Errors experiment["Errors"] = GlobalVariables.ErrorLog.ToString(); experiment.Save(); experiment.Dispose(); db.Dispose(); }