diff --git a/common/StatusVector.h b/common/StatusVector.h index 00daa7e3..31fa2f93 100644 --- a/common/StatusVector.h +++ b/common/StatusVector.h @@ -15,13 +15,13 @@ template class StatusVector { mutable std::mutex m; - std::map content; - uint32_t max_id = 0; + std::vector content; + std::vector present; MultiLinePlot GeneratePlot(const std::vector &status, int32_t bin_size) const { MultiLinePlot ret(1); if (status.size() == 1) { - ret[0].x = {max_id / 2.0f}; + ret[0].x = {(content.size() - 1) / 2.0f}; ret[0].y = {status[0]}; } else if (!status.empty()) { ret[0].y = status; @@ -39,26 +39,32 @@ template class StatusVector { public: void AddElement(uint32_t id, T val) { std::unique_lock ul(m); + if (id >= content.size()) { + content.resize(id + 1); + present.resize(id + 1); + } content[id] = val; - if (id > max_id) - max_id = id; - + present[id] = 1; } [[nodiscard]] std::vector ExportArray(T def_value) const { std::unique_lock ul(m); - std::vector ret(max_id + 1, def_value); - for (auto &[x,y]: content) - ret[x] = y; + std::vector ret(content.size(), def_value); + for (int i = 0; i < content.size(); i++) { + if (present[i]) + ret[i] = content[i]; + } return ret; } [[nodiscard]] float Mean() const { std::unique_lock ul(m); - size_t count = content.size(); + size_t count = 0; double sum = 0; - for (auto &[x,y]: content) - sum += y; + for (int i = 0; i < content.size(); i++) { + sum += present[i] * content[i]; + count += present[i]; + } if (count > 0) return static_cast(sum / count); @@ -75,7 +81,7 @@ public: std::vector ret; - size_t elems = (max_id + 1) / bin_size + (((max_id + 1) % bin_size > 0) ? 1 : 0); + size_t elems = content.size() / bin_size + ((content.size() % bin_size > 0) ? 1 : 0); ret.resize(elems); if (!content.empty()) { @@ -83,14 +89,11 @@ public: double sum = 0; int64_t count = 0; - auto it_start = content.lower_bound(bin * bin_size); - auto it_end = content.upper_bound((bin + 1) * bin_size); - if ((it_start != content.end()) && (it_start->first < (bin + 1) * bin_size)) { - for (auto it = it_start; it != it_end; it++) { - sum += it->second; - count++; - } + for (int i = bin * bin_size; (i < (bin + 1) * bin_size) && (i < content.size()); i++) { + sum += present[i] * content[i]; + count += present[i]; } + if (count > 0) ret[bin] = static_cast(sum / static_cast(count)); else @@ -109,20 +112,16 @@ public: std::vector ret; - size_t elems = (max_id + 1) / bin_size + (((max_id + 1) % bin_size > 0) ? 1 : 0); + size_t elems = content.size() / bin_size + ((content.size() % bin_size > 0) ? 1 : 0); ret.resize(elems); if (!content.empty()) { for (int bin = 0; bin < elems; bin++) { ret[bin] = default_val; - auto it_start = content.lower_bound(bin * bin_size); - auto it_end = content.upper_bound((bin + 1) * bin_size); - if ((it_start != content.end()) && (it_start->first < (bin + 1) * bin_size)) { - for (auto it = it_start; it != it_end; it++) { - if (ret[bin] < it->second) - ret[bin] = it->second; - } + for (int i = bin * bin_size; (i < (bin + 1) * bin_size) && (i < content.size()); i++) { + if (present[i] && (content[i] > ret[bin])) + ret[bin] = content[i]; } } }