/// <summary> /// Runs the tests. /// </summary> /// <param name="harmonySearcher">The harmony searcher.</param> /// <param name="infoDataTable">The information data table.</param> /// <param name="resultPath">The result path.</param> /// <returns>Tests result</returns> private HarmonySearchAverageTestResult RunTests(IHarmonySearcher <StopTimeInfo> harmonySearcher, DataTable infoDataTable, string resultPath) { var testResults = new List <HarmonySearchTestResult>(IterationCount); for (var iteration = 1; iteration <= IterationCount; iteration++) { harmonySearcher.Reset(); var singleIterationTestResult = RunSingleTest(harmonySearcher); testResults.Add(singleIterationTestResult); _logger.LogInformation($"Finished testing {harmonySearcher.Type.ToString()} HS, generator {harmonySearcher.HarmonyGeneratorType}, function {harmonySearcher.ObjectiveFunctionType}, iteration {iteration} in {singleIterationTestResult.Time.TotalSeconds} s"); } var parameterDataTable = DataTableUtils.GetParameterDataTable(harmonySearcher); var solutionsDataTable = DataTableUtils.GetSolutionsDataTable(testResults.Cast <TestResult>().ToList()); // Export test results to file var filePath = Path.Combine(resultPath, "details", $"{harmonySearcher.Type}_{harmonySearcher.HarmonyGeneratorType}_{harmonySearcher.ObjectiveFunctionType}_TestResults"); _excelExportService.ExportToExcel(infoDataTable, parameterDataTable, solutionsDataTable, filePath); _logger.LogInformation($"Saved file under path: {filePath}"); // Return the average results return(new HarmonySearchAverageTestResult(harmonySearcher.Type, harmonySearcher.HarmonyGeneratorType, harmonySearcher.ObjectiveFunctionType, testResults)); }
/// <summary> /// Runs the single HS test. /// </summary> /// <param name="harmonySearcher">The harmony searcher.</param> /// <returns>Test result</returns> private HarmonySearchTestResult RunSingleTest(IHarmonySearcher <StopTimeInfo> harmonySearcher) { Harmony <StopTimeInfo> bestHarmony = null; var elapsedTime = _actionTimer.MeasureTime(() => { bestHarmony = harmonySearcher.SearchForHarmony(); }); return(new HarmonySearchTestResult { HarmonySearchType = harmonySearcher.Type, ObjectiveFunctionType = harmonySearcher.ObjectiveFunctionType, HarmonyGeneratorType = harmonySearcher.HarmonyGeneratorType, Solution = bestHarmony, Time = elapsedTime, ImprovisationCount = harmonySearcher.ImprovisationCount }); }
public static DataTable ToDataTable <T>(this IHarmonySearcher <T> harmonySearcher) { var dataTable = new DataTable(); dataTable.Columns.Add("Property", typeof(string)); dataTable.Columns.Add("Value", typeof(string)); dataTable.Rows.Add(nameof(harmonySearcher.Type), harmonySearcher.Type.ToString()); dataTable.Rows.Add(nameof(harmonySearcher.HarmonyGeneratorType), harmonySearcher.HarmonyGeneratorType); dataTable.Rows.Add(nameof(harmonySearcher.ObjectiveFunctionType), harmonySearcher.ObjectiveFunctionType); dataTable.Rows.Add(nameof(harmonySearcher.MaxImprovisationCount), harmonySearcher.MaxImprovisationCount); dataTable.Rows.Add("HarmonyMemorySize", harmonySearcher.HarmonyMemory.MaxCapacity); switch (harmonySearcher.Type) { case HarmonySearchType.Standard: case HarmonySearchType.Divided: dataTable.Rows.Add(nameof(IParameterProvider.HarmonyMemoryConsiderationRatio), harmonySearcher.ParameterProvider.PitchAdjustmentRatio); dataTable.Rows.Add(nameof(IParameterProvider.PitchAdjustmentRatio), harmonySearcher.ParameterProvider.PitchAdjustmentRatio); break; case HarmonySearchType.ImprovedDivided: case HarmonySearchType.Improved: var dynamicParProvider = harmonySearcher.ParameterProvider as DynamicPitchAdjustmentRatioProvider; dataTable.Rows.Add(nameof(IParameterProvider.HarmonyMemoryConsiderationRatio), dynamicParProvider.HarmonyMemoryConsiderationRatio); dataTable.Rows.Add($"{nameof(dynamicParProvider.MinPitchAdjustmentRatio)}", dynamicParProvider.MinPitchAdjustmentRatio); dataTable.Rows.Add($"{nameof(dynamicParProvider.MaxPitchAdjustmentRatio)}", dynamicParProvider.MaxPitchAdjustmentRatio); break; case HarmonySearchType.Dynamic: case HarmonySearchType.DynamicDivided: dataTable.Rows.Add(nameof(IParameterProvider.HarmonyMemoryConsiderationRatio), "Dynamic"); dataTable.Rows.Add(nameof(IParameterProvider.PitchAdjustmentRatio), "Dynamic"); break; } return(dataTable); }