Improve plotting
This commit is contained in:
+61
-13
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user