示例#1
0
        /// <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));
        }
示例#2
0
        /// <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
            });
        }
示例#3
0
        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);
        }