GCC Code Coverage Report


Directory: ./
File: tasks/zyazeva_s_graham_scheme/mpi/src/ops_mpi.cpp
Date: 2026-01-27 01:59:34
Exec Total Coverage
Lines: 61 61 100.0%
Functions: 6 6 100.0%
Branches: 67 158 42.4%

Line Branch Exec Source
1 #include "zyazeva_s_graham_scheme/mpi/include/ops_mpi.hpp"
2
3 #include <mpi.h>
4
5 #include <algorithm>
6 #include <cstddef>
7 #include <utility>
8 #include <vector>
9
10 #include "zyazeva_s_graham_scheme/common/include/common.hpp"
11
12 namespace zyazeva_s_graham_scheme {
13
14 namespace {
15
16 int Cross(const Point &origin, const Point &a, const Point &b) {
17 46 return ((a.x - origin.x) * (b.y - origin.y)) - ((a.y - origin.y) * (b.x - origin.x));
18 }
19
20 10 void BuildConvexHullInPlace(std::vector<Point> &pts) {
21 10 std::ranges::sort(pts.begin(), pts.end(),
22
12/78
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 66 taken 2 times.
✓ Branch 67 taken 28 times.
✓ Branch 68 taken 5 times.
✓ Branch 69 taken 23 times.
✓ Branch 70 taken 1 times.
✓ Branch 71 taken 4 times.
✓ Branch 72 taken 14 times.
✓ Branch 73 taken 29 times.
✓ Branch 74 taken 7 times.
✓ Branch 75 taken 22 times.
✓ Branch 76 taken 2 times.
✓ Branch 77 taken 5 times.
73 [](const Point &a, const Point &b) { return a.x < b.x || (a.x == b.x && a.y < b.y); });
23
24 10 std::vector<Point> hull;
25
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 10 times.
50 for (auto &p : pts) {
26
4/4
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 33 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 7 times.
56 while (hull.size() >= 2 && Cross(hull[hull.size() - 2], hull.back(), p) <= 0) {
27 hull.pop_back();
28 }
29 hull.push_back(p);
30 }
31 size_t lower_size = hull.size();
32
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 10 times.
40 for (int i = static_cast<int>(pts.size()) - 2; i >= 0; --i) {
33 30 auto &p = pts[i];
34
4/4
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 11 times.
41 while (hull.size() > lower_size && Cross(hull[hull.size() - 2], hull.back(), p) <= 0) {
35 hull.pop_back();
36 }
37 hull.push_back(p);
38 }
39
40 hull.pop_back();
41 pts = std::move(hull);
42 10 }
43
44 } // namespace
45
46
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 ZyazevaSGrahamSchemeMPI::ZyazevaSGrahamSchemeMPI(const InType &in) {
47 SetTypeOfTask(GetStaticTypeOfTask());
48
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 GetInput() = in;
49 GetOutput().clear();
50 16 }
51
52
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 12 times.
16 bool ZyazevaSGrahamSchemeMPI::ValidationImpl() {
53
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 12 times.
16 if (GetInput().size() < 3) {
54 GetOutput().clear();
55 }
56 16 return true;
57 }
58
59 16 bool ZyazevaSGrahamSchemeMPI::PreProcessingImpl() {
60 16 return true;
61 }
62
63 16 bool ZyazevaSGrahamSchemeMPI::RunImpl() {
64 16 int rank = 0;
65 16 int size = 1;
66 16 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
67 16 MPI_Comm_size(MPI_COMM_WORLD, &size);
68
69 16 int n = 0;
70
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (rank == 0) {
71 8 n = static_cast<int>(GetInput().size());
72 }
73 16 MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
74
75
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 12 times.
16 if (n < 3) {
76
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (rank == 0) {
77 GetOutput().clear();
78 }
79 4 return true;
80 }
81 12 MPI_Datatype mpi_point = MPI_DATATYPE_NULL;
82 12 MPI_Type_contiguous(2, MPI_INT, &mpi_point);
83 12 MPI_Type_commit(&mpi_point);
84
85 12 std::vector<int> sendcounts(size);
86
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<int> displs(size);
87 12 int base = n / size;
88 12 int rem = n % size;
89
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 12 times.
36 for (int i = 0; i < size; ++i) {
90
4/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 12 times.
40 sendcounts[i] = base + (i < rem ? 1 : 0);
91
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 displs[i] = (i == 0 ? 0 : displs[i - 1] + sendcounts[i - 1]);
92 }
93
94
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 int local_n = sendcounts[rank];
95
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<Point> local_points(local_n);
96
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
18 MPI_Scatterv(rank == 0 ? GetInput().data() : nullptr, sendcounts.data(), displs.data(), mpi_point,
97 local_points.data(), local_n, mpi_point, 0, MPI_COMM_WORLD);
98
99
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
12 if (local_points.size() >= 3) {
100
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 BuildConvexHullInPlace(local_points);
101 }
102
103 12 int local_size = static_cast<int>(local_points.size());
104
2/6
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12 std::vector<int> recv_sizes(size);
105
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 MPI_Gather(&local_size, 1, MPI_INT, recv_sizes.data(), 1, MPI_INT, 0, MPI_COMM_WORLD);
106
107
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<int> displs_hull(size, 0);
108 int total = 0;
109
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (rank == 0) {
110
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 for (int i = 0; i < size; ++i) {
111 12 displs_hull[i] = total;
112 12 total += recv_sizes[i];
113 }
114 }
115
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<Point> gathered_hulls(total);
116
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 MPI_Gatherv(local_points.data(), local_size, mpi_point, gathered_hulls.data(), recv_sizes.data(), displs_hull.data(),
117 mpi_point, 0, MPI_COMM_WORLD);
118
119
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (rank == 0) {
120
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 BuildConvexHullInPlace(gathered_hulls); // 3
121 GetOutput() = std::move(gathered_hulls);
122 }
123
124
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 MPI_Type_free(&mpi_point);
125 return true;
126 }
127
128 16 bool ZyazevaSGrahamSchemeMPI::PostProcessingImpl() {
129 16 return true;
130 }
131
132 } // namespace zyazeva_s_graham_scheme
133