Improve plotting

This commit is contained in:
2024-03-31 23:08:19 +02:00
parent 8cad89d649
commit 30e775d8a2
122 changed files with 4639 additions and 1148 deletions
+61 -13
View File
@@ -17,6 +17,25 @@ template <class T> class StatusVector {
mutable std::mutex m;
std::map<uint32_t, T > content;
uint32_t max_id = 0;
MultiLinePlot GeneratePlot(const std::vector<float> &status, int32_t bin_size) const {
MultiLinePlot ret(1);
if (status.size() == 1) {
ret[0].x = {max_id / 2.0f};
ret[0].y = {status[0]};
} else if (!status.empty()) {
ret[0].y = status;
ret[0].x.resize(status.size());
if (bin_size == 1) {
for (int i = 0; i < status.size(); i++)
ret[0].x[i] = i;
} else {
for (int i = 0; i < status.size(); i++)
ret[0].x[i] = bin_size * (i + 0.5f);
}
}
return ret;
}
public:
void AddElement(uint32_t id, T val) {
std::unique_lock<std::mutex> ul(m);
@@ -26,6 +45,14 @@ public:
}
[[nodiscard]] std::vector<T> ExportArray(T def_value) const {
std::unique_lock<std::mutex> ul(m);
std::vector<T> ret(max_id + 1, def_value);
for (auto &[x,y]: content)
ret[x] = y;
return ret;
}
[[nodiscard]] float Mean() const {
std::unique_lock<std::mutex> ul(m);
size_t count = content.size();
@@ -39,7 +66,7 @@ public:
return NAN;
}
[[nodiscard]] std::vector<float> GetStatus(int32_t bin_size) const {
[[nodiscard]] std::vector<float> GetMeanPerBin(int32_t bin_size) const {
std::unique_lock<std::mutex> ul(m);
if (bin_size <= 0)
@@ -73,22 +100,43 @@ public:
return ret;
}
Plot GetPlot(int64_t bin_size) const {
// GetStatus has mutex, no need to lock again
auto status = GetStatus(bin_size);
[[nodiscard]] std::vector<float> GetMaxPerBin(int32_t bin_size, float default_val = 0.0) const {
std::unique_lock<std::mutex> ul(m);
Plot ret;
if (status.size() == 1) {
ret.x = {max_id / 2.0f};
ret.y = {status[0]};
} else if (!status.empty()) {
ret.y = status;
ret.x.resize(status.size());
for (int i = 0; i < status.size(); i++)
ret.x[i] = bin_size * (i + 0.5f);
if (bin_size <= 0)
throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds,
"Bin number must be greater than zero");
std::vector<float> ret;
size_t elems = (max_id + 1) / bin_size + (((max_id + 1) % 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;
}
}
}
}
return ret;
}
MultiLinePlot GetMeanPlot(int64_t bin_size) const {
// GetStatus has mutex, no need to lock again
return GeneratePlot(GetMeanPerBin(bin_size), bin_size);
}
MultiLinePlot GetMaxPlot(int64_t bin_size) const {
return GeneratePlot(GetMaxPerBin(bin_size), bin_size);
}
};