46 auto edges = get_edges();
47 auto &ghost_layer = edges.ghost_layer;
49 std::vector<u64_3> debug_infos;
50 ghost_layer.patchdatas.for_each(
52 debug_infos.push_back(u64_3{sender, receiver, pdat.
get_obj_cnt()});
54 std::vector<u64_3> collected;
57 std::vector<u64_3> object_counts;
58 edges.object_counts.values.for_each([&](
u64 id,
u64 count) {
61 std::vector<u64_3> collected_object_counts;
63 object_counts, collected_object_counts, MPI_COMM_WORLD);
65 auto compute_threshold = [&]() -> std::tuple<u64, u64, u64> {
66 std::vector<u64> values;
67 values.reserve(collected.size());
69 for (
const u64_3 &info : collected) {
70 values.push_back(info.z());
73 std::sort(values.begin(), values.end());
75 auto percentile = [&](
double p) ->
u64 {
76 size_t idx =
static_cast<size_t>(p * (values.size() - 1));
80 u64 p50 = percentile(0.50);
81 u64 p80 = percentile(0.80);
82 u64 p95 = percentile(0.95);
84 return {p50, p80, p95};
87 auto [p50, p80, p95] = compute_threshold();
92 =
" --- ExchangeGhostLayerDebugDotGraph debug infos (comm sizes) --- \n";
104 u32 current_subgraph = 0;
105 log += sham::format("subgraph cluster_{0} {{\n", current_subgraph);
107 for (u64_3 &info : collected_object_counts) {
108 if (info.z() != current_subgraph) {
110 current_subgraph = info.z();
111 log += sham::format(
"subgraph cluster_{0} {{\n", current_subgraph);
113 log += sham::format(
"p_{0} [label=\"Patch {0} N={1}\"];\n", info.x(), info.y());
118 for (u64_3 &info : collected) {
120 const char *edge_color =
"green";
121 if (info.z() >= p95) {
123 }
else if (info.z() >= p80) {
124 edge_color =
"darkgoldenrod";
125 }
else if (info.z() >= p50) {
130 "p_{0} -> p_{1} [xlabel={2}, color={3}, fontcolor={3}];\n",