28 #ifndef DETAILEDTIMINGS_H_
29 #define DETAILEDTIMINGS_H_
33 #include <unordered_map>
50 requires std::is_enum_v<T>
60 const std::unordered_map<T, std::string_view>& timing_segment_names);
81 const T timing_segment,
82 const std::chrono::duration<double>& segment_time)
84 segment_timings_[timing_segment].push_back(segment_time);
94 std::chrono::duration<double>
MedianTiming(
const T run_segment_index)
const;
104 std::map<T, std::vector<std::chrono::duration<double>>> segment_timings_;
105 const std::unordered_map<T, std::string_view> timing_seg_to_str_;
109 template <
typename T>
110 requires std::is_enum_v<T>
112 const std::unordered_map<T, std::string_view>& timing_segment_names) :
113 timing_seg_to_str_{timing_segment_names}
115 std::ranges::transform(
117 std::inserter(segment_timings_, segment_timings_.end()),
118 [](
const auto& segment) ->
119 std::pair<T, std::vector<std::chrono::duration<double>>> {
120 return {segment.first, std::vector<std::chrono::duration<double>>()};
125 template <
typename T>
126 requires std::is_enum_v<T>
130 std::ranges::for_each(in_detailed_timings.segment_timings_,
131 [
this](
const auto& curr_segment_timings) {
132 const auto& [segment, segment_time_durations] = curr_segment_timings;
133 if (auto iter = this->segment_timings_.find(segment);
134 iter != this->segment_timings_.cend())
136 iter->second.insert(iter->second.cend(),
137 segment_time_durations.cbegin(),
138 segment_time_durations.cend());
141 this->segment_timings_.insert({segment, segment_time_durations});
148 template <
typename T>
149 requires std::is_enum_v<T>
151 const T run_segment_index)
const
153 if (segment_timings_.at(run_segment_index).size() > 0) {
154 std::vector<std::chrono::duration<double>> segment_timing_vect_copy(
155 segment_timings_.at(run_segment_index));
157 std::ranges::nth_element(
158 segment_timing_vect_copy,
159 segment_timing_vect_copy.begin() + segment_timing_vect_copy.size() / 2);
160 return (segment_timing_vect_copy[segment_timing_vect_copy.size() / 2]);
163 return std::chrono::duration<double>();
168 template <
typename T>
169 requires std::is_enum_v<T>
172 std::ranges::for_each(segment_timings_,
173 [
this, &timings_run_data](
auto current_timing) {
175 const std::string header =
176 std::string(timing_seg_to_str_.at(current_timing.first)) +
" " +
179 std::ranges::nth_element(
180 current_timing.second,
181 current_timing.second.begin() + current_timing.second.size() / 2);
182 if (current_timing.second.size() > 0) {
185 current_timing.second[current_timing.second.size() / 2].count());
188 return timings_run_data;
Declares class to store headers with data corresponding to current program run and evaluation.
Contains namespace with enums and constants for implementation run evaluation.
Class to store timings of one or more segments taken during the run(s) of an implementation or across...
std::chrono::duration< double > MedianTiming(const T run_segment_index) const
Get median timing for a specified segment that may have been run multiple times.
void ResetTiming()
Reset all timings.
DetailedTimings(const std::unordered_map< T, std::string_view > &timing_segment_names)
Construct a new DetailedTimings object where each timing segment is initialized.
void AddToCurrentTimings(const DetailedTimings &in_detailed_timings)
Add instance of DetailedTimings to current DetailedTimings.
RunData AsRunData() const
Return current timing data as a RunData object for evaluation.
void AddTiming(const T timing_segment, const std::chrono::duration< double > &segment_time)
Add timing by segment index.
Class to store headers with data corresponding to current program run and evaluation.
void AddDataWHeader(const std::string &header, const std::string &data)
Add string data with header describing added data.
constexpr std::string_view kMedianOfTestRunsDesc
Constant to describing timing as median across evaluation runs.