42 const std::filesystem::path& imp_results_file_path,
43 const std::vector<std::string>& eval_across_runs_top_text,
44 const std::vector<std::string>& eval_across_runs_in_params_show)
const
48 const std::vector<std::string> run_names =
49 GetRunNames(imp_results_file_path);
52 std::map<std::string, RunResultsSpeedups> run_results_by_name;
53 for (
const auto& run_name : run_names) {
54 run_results_by_name.insert(
63 GenEvalAcrossRunsData(
65 eval_across_runs_in_params_show);
69 std::vector<std::string> run_names_ordered =
70 OrderedRunNames(eval_data);
76 std::back_inserter(run_names_ordered),
77 [&run_names_ordered](
const auto& run_name) {
81 run_name) == run_names_ordered.end());
85 WriteEvalAcrossRunsToFile(
86 imp_results_file_path,
87 eval_across_runs_top_text,
88 eval_across_runs_in_params_show,
102 const std::map<std::string, RunResultsSpeedups>& run_results_by_name,
103 const std::vector<std::string>& eval_across_runs_in_params_show)
const
106 for (
const auto& [run_name, run_results] : run_results_by_name)
110 run_results.Speedups()});
114 const auto& inputs_to_runtimes = run_results.InputsToKeyVal(
118 for (
const auto& [input_sig, _] : inputs_to_runtimes) {
122 {input_sig, std::vector<std::string>()});
124 for (
const auto& disp_param : eval_across_runs_in_params_show) {
126 run_results.DataForInput(input_sig).at(disp_param));
132 const auto run_speedups_ordered = run_results.SpeedupHeadersOrder();
133 for (
auto run_speedup_iter = run_speedups_ordered.cbegin();
134 run_speedup_iter < run_speedups_ordered.cend();
138 if (std::ranges::all_of(
140 [](
unsigned char c){
return std::isspace(c); }))
147 [run_speedup_iter](
const auto& header) {
148 return (header == *run_speedup_iter);
152 auto iter_prev_ordered_header = run_speedup_iter;
153 while (iter_prev_ordered_header != run_speedups_ordered.cbegin())
155 iter_prev_ordered_header--;
157 *iter_prev_ordered_header) !=
167 if (iter_prev_ordered_header != run_speedups_ordered.cbegin())
173 *iter_prev_ordered_header) + 1),
200 std::vector<std::string> EvaluateAcrossRuns::OrderedRunNames(
202 const std::optional<std::string>& speedup_header)
const
206 const std::string speedup_ordering =
212 std::vector<std::pair<
214 std::reference_wrapper<const decltype(eval_data.speedup_results_name_to_data)::mapped_type>>>
218 std::ranges::transform(
220 std::back_inserter(runs_w_speedup_data),
221 [](
const auto& run_name_w_speedup) -> decltype(runs_w_speedup_data)::value_type {
222 return {run_name_w_speedup.first, std::cref(run_name_w_speedup.second)};
229 [&speedup_ordering](
const auto& run_name_w_speedup) {
230 if (!(run_name_w_speedup.second.get().contains(speedup_ordering))) {
234 return std::ranges::all_of(
235 run_name_w_speedup.second.get().at(speedup_ordering).at(0),
236 [](unsigned char c) { return isspace(c); });
242 std::ranges::sort(runs_w_speedup_data, std::ranges::greater{},
243 [&speedup_ordering](
const auto& run_w_speedups) {
244 return std::stof(run_w_speedups.second.get().at(speedup_ordering).at(0));
249 std::vector<std::string> ordered_run_names;
250 std::ranges::transform(
252 std::back_inserter(ordered_run_names),
253 [](
const auto& run_name_speedup) {
return run_name_speedup.first; });
256 return ordered_run_names;
293 void EvaluateAcrossRuns::WriteEvalAcrossRunsToFile(
294 const std::filesystem::path& imp_results_file_path,
295 const std::vector<std::string>& eval_across_runs_top_text,
296 const std::vector<std::string>& eval_across_runs_in_params_show,
298 const std::vector<std::string>& run_names_ordered)
const
302 const std::filesystem::path results_across_run_fp =
303 imp_results_file_path /
308 std::ofstream eval_results_across_run_str(results_across_run_fp);
311 for (
const auto& comp_file_top_text_line : eval_across_runs_top_text) {
312 eval_results_across_run_str << comp_file_top_text_line << std::endl;
314 eval_results_across_run_str << std::endl;
317 for (
const auto& input_param_disp_header : eval_across_runs_in_params_show) {
318 eval_results_across_run_str << input_param_disp_header <<
',';
322 for (
const auto& run_name : run_names_ordered) {
323 eval_results_across_run_str << run_name <<
',';
325 eval_results_across_run_str << std::endl;
329 for (
const auto& [input_sig, params_display_ordered] :
332 for (
const auto& param_val_disp : params_display_ordered) {
333 eval_results_across_run_str << param_val_disp <<
',';
335 for (
const auto& run_name : run_names_ordered)
338 run_name).contains(input_sig))
340 eval_results_across_run_str <<
343 eval_results_across_run_str <<
',';
345 eval_results_across_run_str << std::endl;
347 eval_results_across_run_str << std::endl;
351 eval_results_across_run_str <<
"Average Speedups" << std::endl;
354 if (!(speedup_header.empty())) {
355 eval_results_across_run_str << speedup_header <<
',';
358 for (
size_t i = 1; i < eval_across_runs_in_params_show.size(); i++) {
359 eval_results_across_run_str <<
',';
363 for (
const auto& run_name : run_names_ordered) {
367 eval_results_across_run_str <<
369 speedup_header).at(0) <<
',';
372 eval_results_across_run_str <<
',';
376 eval_results_across_run_str << std::endl;
382 eval_results_across_run_str << std::endl;
383 eval_results_across_run_str <<
"Runs ordered by speedup (highest to lowest)" << std::endl;
386 if (!(speedup_header.empty())) {
387 eval_results_across_run_str << speedup_header <<
',';
389 const auto ordered_runs_speedup =
393 for (
const auto& run_name : ordered_runs_speedup) {
394 const auto& speedup =
396 speedup_header).at(0);
397 eval_results_across_run_str << run_name <<
" - " << std::setprecision(3)
398 << std::fixed << std::stof(speedup) <<
',';
402 eval_results_across_run_str << std::endl;
406 std::cout <<
"Evaluation of results across all runs in "
407 << results_across_run_fp << std::endl;
412 std::vector<std::string> EvaluateAcrossRuns::GetRunNames(
413 const std::filesystem::path& imp_results_file_path)
const
417 std::filesystem::directory_iterator results_files_iter =
418 std::filesystem::directory_iterator(
420 std::vector<std::string> run_names;
421 for (
const auto& results_fp : results_files_iter)
425 std::string file_name_no_ext = results_fp.path().stem();
426 if (file_name_no_ext.ends_with(
429 const std::string run_name =
430 file_name_no_ext.substr(
432 file_name_no_ext.find(
434 run_names.push_back(run_name);
441 for (
auto run_names_iter = run_names.cbegin();
442 run_names_iter != run_names.cend();)
444 const std::filesystem::path run_speedup_fp =
446 (std::string(*run_names_iter) +
'_' +
451 if ((!(std::filesystem::exists(run_speedup_fp))) ||
452 (!(std::filesystem::is_regular_file(run_speedup_fp))))
455 run_names.erase(std::ranges::find(run_names, *run_names_iter));
Declares class with operator function to evaluate implementation runs across multiple architectures....
void operator()(const std::filesystem::path &imp_results_file_path, const std::vector< std::string > &eval_across_runs_top_text, const std::vector< std::string > &eval_across_runs_in_params_show) const
Evaluate all runs with results in specified file path and generate csv file with evaluation of result...
Class to load and store run results data including speedups from evaluation.
constexpr std::string_view kImpResultsRunDataFolderName
constexpr std::string_view kEvalAcrossRunsFileName
constexpr std::string_view kCsvFileExtension
constexpr std::string_view kSpeedupsDescFileName
constexpr std::string_view kRunResultsDescFileName
constexpr std::string_view kOptimizedRuntimeHeader
constexpr std::string_view kImpResultsSpeedupsFolderName
Structure to store data with mappings for evaluating results across runs as well as speedup headers i...
std::map< std::string, std::map< InputSignature, std::string > > input_to_runtime_across_archs
std::map< std::string, std::map< std::string, std::vector< std::string > > > speedup_results_name_to_data
std::map< InputSignature, std::vector< std::string > > inputs_to_params_disp_ordered
std::vector< std::string > speedup_headers