GCC Code Coverage Report


Directory: ./
File: tasks/kruglova_a_conjugate_gradient_sle/omp/src/ops_omp.cpp
Date: 2026-04-02 17:12:27
Exec Total Coverage
Lines: 30 31 96.8%
Functions: 5 5 100.0%
Branches: 11 22 50.0%

Line Branch Exec Source
1 #include "kruglova_a_conjugate_gradient_sle/omp/include/ops_omp.hpp"
2
3 #include <cmath>
4 #include <cstddef>
5 #include <vector>
6
7 #include "kruglova_a_conjugate_gradient_sle/common/include/common.hpp"
8
9 namespace kruglova_a_conjugate_gradient_sle {
10
11 namespace {
12 void MatrixVectorMultiply(const std::vector<double> &a, const std::vector<double> &p, std::vector<double> &ap, int n) {
13 132 #pragma omp parallel for default(none) shared(a, p, ap, n)
14 for (int i = 0; i < n; ++i) {
15 ap[i] = 0.0;
16 for (int j = 0; j < n; ++j) {
17 ap[i] += a[(static_cast<size_t>(i) * n) + j] * p[j];
18 }
19 }
20 }
21 } // namespace
22
23
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 KruglovaAConjGradSleOMP::KruglovaAConjGradSleOMP(const InType &in) {
24 SetTypeOfTask(GetStaticTypeOfTask());
25 GetInput() = in;
26 24 }
27
28 24 bool KruglovaAConjGradSleOMP::ValidationImpl() {
29 const auto &in = GetInput();
30
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if (in.size <= 0) {
31 return false;
32 }
33
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if (in.A.size() != static_cast<size_t>(in.size) * static_cast<size_t>(in.size)) {
34 return false;
35 }
36
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (in.b.size() != static_cast<size_t>(in.size)) {
37 return false;
38 }
39 return true;
40 }
41
42 24 bool KruglovaAConjGradSleOMP::PreProcessingImpl() {
43 24 GetOutput().assign(GetInput().size, 0.0);
44 24 return true;
45 }
46
47 24 bool KruglovaAConjGradSleOMP::RunImpl() {
48 24 const auto &a = GetInput().A;
49 24 const auto &b = GetInput().b;
50 24 int n = GetInput().size;
51 auto &x = GetOutput();
52
53 24 std::vector<double> r = b;
54
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::vector<double> p = r;
55
1/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
24 std::vector<double> ap(n, 0.0);
56
57 double rsold = 0.0;
58 24 #pragma omp parallel for default(none) shared(r, n) reduction(+ : rsold)
59 for (int i = 0; i < n; ++i) {
60 rsold += r[i] * r[i];
61 }
62
63 const double tolerance = 1e-8;
64
65
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 for (int iter = 0; iter < n * 2; ++iter) {
66 MatrixVectorMultiply(a, p, ap, n);
67
68 double p_ap = 0.0;
69
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 #pragma omp parallel for default(none) shared(p, ap, n) reduction(+ : p_ap)
70 for (int i = 0; i < n; ++i) {
71 p_ap += p[i] * ap[i];
72 }
73
74
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (std::abs(p_ap) < 1e-15) {
75 break;
76 }
77
78 132 double alpha = rsold / p_ap;
79
80 132 #pragma omp parallel for default(none) shared(x, r, ap, p, alpha, n)
81 for (int i = 0; i < n; ++i) {
82 x[i] += alpha * p[i];
83 r[i] -= alpha * ap[i];
84 }
85
86 double rsnew = 0.0;
87 132 #pragma omp parallel for default(none) shared(r, n) reduction(+ : rsnew)
88 for (int i = 0; i < n; ++i) {
89 rsnew += r[i] * r[i];
90 }
91
92
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 24 times.
132 if (std::sqrt(rsnew) < tolerance) {
93 break;
94 }
95
96 108 double beta = rsnew / rsold;
97 108 #pragma omp parallel for default(none) shared(p, r, beta, n)
98 for (int i = 0; i < n; ++i) {
99 p[i] = r[i] + (beta * p[i]);
100 }
101 rsold = rsnew;
102 }
103 24 return true;
104 }
105
106 24 bool KruglovaAConjGradSleOMP::PostProcessingImpl() {
107 24 return true;
108 }
109
110 } // namespace kruglova_a_conjugate_gradient_sle
111