Skip to content

Commit 6ee9474

Browse files
committed
DPL GUI: improved metrics plots
1 parent 66ffeb8 commit 6ee9474

File tree

5 files changed

+331
-85
lines changed

5 files changed

+331
-85
lines changed

Framework/Core/include/Framework/DeviceMetricsInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ struct DeviceMetricsInfo {
4545
std::vector<std::array<size_t, 1024>> timestamps;
4646
std::vector<float> max;
4747
std::vector<float> min;
48+
std::vector<size_t> minDomain;
49+
std::vector<size_t> maxDomain;
4850
std::vector<std::pair<std::string, size_t>> metricLabelsIdx;
4951
std::vector<MetricInfo> metrics;
5052
};

Framework/Core/src/DeviceMetricsInfo.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ bool DeviceMetricsHelper::processMetric(const std::smatch& match,
108108
info.timestamps.emplace_back(std::array<size_t, 1024>{});
109109
info.max.push_back(std::numeric_limits<float>::lowest());
110110
info.min.push_back(std::numeric_limits<float>::max());
111+
info.maxDomain.push_back(std::numeric_limits<size_t>::lowest());
112+
info.minDomain.push_back(std::numeric_limits<size_t>::max());
111113

112114
// Add the index by name in the correct position
113115
// this will require moving the tail of the index,
@@ -131,6 +133,8 @@ bool DeviceMetricsHelper::processMetric(const std::smatch& match,
131133
MetricInfo &metricInfo = info.metrics[metricIndex];
132134

133135
auto mod = info.timestamps[metricIndex].size();
136+
info.minDomain[metricIndex] = std::min(info.minDomain[metricIndex], (size_t)timestamp);
137+
info.maxDomain[metricIndex] = std::max(info.maxDomain[metricIndex], (size_t)timestamp);
134138

135139
switch(metricInfo.type) {
136140
case MetricType::Int: {

Framework/Core/src/FrameworkGUIDebugger.cxx

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ struct MultiplotData {
3636
int mod;
3737
size_t first;
3838
size_t size;
39-
const void* points;
39+
const void* Y;
40+
const void* X;
4041
MetricType type;
4142
};
4243
} // namespace framework
@@ -163,6 +164,15 @@ void displayDeviceMetrics(const char* label, ImVec2 canvasSize, std::string cons
163164
size_t rangeBegin, size_t rangeEnd, size_t bins, bool useHistos,
164165
std::vector<DeviceSpec> const& specs, std::vector<DeviceMetricsInfo> const& metricsInfos)
165166
{
167+
static std::vector<ImColor> palette = {
168+
ImColor{ 218, 124, 48 },
169+
ImColor{ 62, 150, 81 },
170+
ImColor{ 204, 37, 41 },
171+
ImColor{ 83, 81, 84 },
172+
ImColor{ 107, 76, 154 },
173+
ImColor{ 146, 36, 40 },
174+
ImColor{ 148, 139, 61 }
175+
};
166176
std::vector<void const*> metricsToDisplay;
167177
std::vector<const char*> deviceNames;
168178
std::vector<MultiplotData> userData;
@@ -172,6 +182,8 @@ void displayDeviceMetrics(const char* label, ImVec2 canvasSize, std::string cons
172182
assert(specs.size() == metricsInfos.size());
173183
float maxValue = std::numeric_limits<float>::lowest();
174184
float minValue = 0;
185+
size_t maxDomain = std::numeric_limits<size_t>::lowest();
186+
size_t minDomain = std::numeric_limits<size_t>::max();
175187

176188
for (int mi = 0; mi < metricsInfos.size(); ++mi) {
177189
auto vi = DeviceMetricsHelper::metricIdxByName(selectedMetricName, metricsInfos[mi]);
@@ -180,24 +192,27 @@ void displayDeviceMetrics(const char* label, ImVec2 canvasSize, std::string cons
180192
}
181193
auto& metric = metricsInfos[mi].metrics[vi];
182194
deviceNames.push_back(specs[mi].name.c_str());
183-
colors.emplace_back(220, 220, 220);
195+
colors.push_back(palette[mi % palette.size()]);
184196
metricType = metric.type;
185197
MultiplotData data;
186198
data.mod = metricsInfos[mi].timestamps[vi].size();
187199
data.first = metric.pos - data.mod;
200+
data.X = metricsInfos[mi].timestamps[vi].data();
188201
minValue = std::min(minValue, metricsInfos[mi].min[vi]);
189202
maxValue = std::max(maxValue, metricsInfos[mi].max[vi]);
203+
minDomain = std::min(minDomain, metricsInfos[mi].minDomain[vi]);
204+
maxDomain = std::max(maxDomain, metricsInfos[mi].maxDomain[vi]);
190205
switch (metric.type) {
191206
case MetricType::Int: {
192207
data.size = metricsInfos[mi].intMetrics[metric.storeIdx].size();
193-
data.points = metricsInfos[mi].intMetrics[metric.storeIdx].data();
208+
data.Y = metricsInfos[mi].intMetrics[metric.storeIdx].data();
194209
data.type = MetricType::Int;
195210
metricType = MetricType::Int;
196211
metricSize = metricsInfos[mi].intMetrics[metric.storeIdx].size();
197212
} break;
198213
case MetricType::Float: {
199214
data.size = metricsInfos[mi].floatMetrics[metric.storeIdx].size();
200-
data.points = metricsInfos[mi].floatMetrics[metric.storeIdx].data();
215+
data.Y = metricsInfos[mi].floatMetrics[metric.storeIdx].data();
201216
data.type = MetricType::Float;
202217
metricType = MetricType::Float;
203218
metricSize = metricsInfos[mi].floatMetrics[metric.storeIdx].size();
@@ -207,41 +222,58 @@ void displayDeviceMetrics(const char* label, ImVec2 canvasSize, std::string cons
207222
}
208223
userData.emplace_back(data);
209224
}
225+
226+
maxDomain = std::max(minDomain + 1024, maxDomain);
227+
210228
for (size_t ui = 0; ui < userData.size(); ++ui) {
211229
metricsToDisplay.push_back(&(userData[ui]));
212230
}
213-
auto getter = [](const void* hData, int idx) -> float {
231+
auto getterY = [](const void* hData, int idx) -> float {
214232
auto histoData = reinterpret_cast<const MultiplotData*>(hData);
215233
size_t pos = (histoData->first + static_cast<size_t>(idx)) % histoData->mod;
234+
// size_t pos = (static_cast<size_t>(idx)) % histoData->mod;
216235
assert(pos >= 0 && pos < 1024);
217236
if (histoData->type == MetricType::Int) {
218-
return static_cast<const int*>(histoData->points)[pos];
237+
return static_cast<const int*>(histoData->Y)[pos];
219238
}
220-
return static_cast<const float*>(histoData->points)[pos];
239+
return static_cast<const float*>(histoData->Y)[pos];
240+
};
241+
auto getterX = [](const void* hData, int idx) -> size_t {
242+
auto histoData = reinterpret_cast<const MultiplotData*>(hData);
243+
size_t pos = (histoData->first + static_cast<size_t>(idx)) % histoData->mod;
244+
//size_t pos = (static_cast<size_t>(idx)) % histoData->mod;
245+
assert(pos >= 0 && pos < 1024);
246+
return static_cast<const size_t*>(histoData->X)[pos];
221247
};
222248
if (useHistos) {
223249
ImGui::PlotMultiHistograms(
224250
label,
225251
userData.size(),
226252
deviceNames.data(),
227253
colors.data(),
228-
getter,
254+
getterY,
255+
getterX,
229256
metricsToDisplay.data(),
230257
metricSize,
231258
minValue,
232259
maxValue * 1.2f,
260+
minDomain,
261+
maxDomain,
233262
canvasSize);
234263
} else {
235264
ImGui::PlotMultiLines(
236265
label,
237266
userData.size(),
238267
deviceNames.data(),
239268
colors.data(),
240-
getter,
269+
getterY,
270+
getterX,
241271
metricsToDisplay.data(),
242272
metricSize,
243273
minValue,
244274
maxValue * 1.2f,
275+
minDomain,
276+
maxDomain,
245277
canvasSize);
246278
}
247279
}
@@ -396,7 +428,7 @@ void displayDeviceHistograms(gui::WorkspaceGUIState& state,
396428
ImGui::EndGroup();
397429
if (!currentMetricName.empty()) {
398430
if (currentStyle == 0 || currentStyle == 1) {
399-
displayDeviceMetrics("##Metrics", ImVec2(ImGui::GetIO().DisplaySize.x - 10, state.bottomPaneSize - ImGui::GetItemRectSize().y - 20), currentMetricName, minTime, maxTime, 1024, currentStyle, devices, metricsInfos);
431+
displayDeviceMetrics("Metrics", ImVec2(ImGui::GetIO().DisplaySize.x - 10, state.bottomPaneSize - ImGui::GetItemRectSize().y - 20), currentMetricName, minTime, maxTime, 1024, currentStyle, devices, metricsInfos);
400432
} else {
401433
ImGui::BeginChild("##ScrollingRegion", ImVec2(ImGui::GetIO().DisplaySize.x + state.leftPaneSize + state.rightPaneSize - 10, -ImGui::GetItemsLineHeightWithSpacing()), false,
402434
ImGuiWindowFlags_HorizontalScrollbar);

Framework/DebugGUI/include/DebugGUI/imgui_extras.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
namespace ImGui
77
{
8+
89
// Start PlotMultiLines(...) and PlotMultiHistograms(...)------------------------
9-
// by @JaapSuter and @maxint (please see: https://github.com/ocornut/imgui/issues/632)
10+
// heavily modivied version starting from code of @JaapSuter and @maxint (please see: https://github.com/ocornut/imgui/issues/632)
1011
static inline ImU32 InvertColorU32(ImU32 in)
1112
{
1213
ImVec4 in4 = ColorConvertU32ToFloat4(in);
@@ -21,23 +22,29 @@ void PlotMultiLines(
2122
int num_datas,
2223
const char** names,
2324
const ImColor* colors,
24-
float (*getter)(const void* data, int idx),
25+
float (*getterY)(const void* data, int idx),
26+
size_t (*getterX)(const void* data, int idx),
2527
const void* const* datas,
2628
int values_count,
2729
float scale_min,
2830
float scale_max,
31+
size_t domain_min,
32+
size_t domain_max,
2933
ImVec2 graph_size);
3034

3135
void PlotMultiHistograms(
3236
const char* label,
3337
int num_hists,
3438
const char** names,
3539
const ImColor* colors,
36-
float (*getter)(const void* data, int idx),
40+
float (*getterY)(const void* data, int idx),
41+
size_t (*getterX)(const void* data, int idx),
3742
const void* const* datas,
3843
int values_count,
3944
float scale_min,
4045
float scale_max,
46+
size_t domain_min,
47+
size_t domain_max,
4148
ImVec2 graph_size);
4249

4350
// End PlotMultiLines(...) and PlotMultiHistograms(...)--------------------------

0 commit comments

Comments
 (0)