GCC Code Coverage Report


Directory: ./
File: tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp
Date: 2026-04-02 17:12:27
Exec Total Coverage
Lines: 47 49 95.9%
Functions: 7 7 100.0%
Branches: 33 54 61.1%

Line Branch Exec Source
1 #include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp"
2
3 #include <cmath>
4 #include <cstddef>
5 #include <vector>
6
7 #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp"
8
9 namespace smyshlaev_a_sle_cg_seq {
10
11 namespace {
12
13 double ComputeDotProduct(const std::vector<double> &v1, const std::vector<double> &v2) {
14 double result = 0.0;
15 size_t n = v1.size();
16
4/4
✓ Branch 0 taken 88 times.
✓ Branch 1 taken 32 times.
✓ Branch 2 taken 168 times.
✓ Branch 3 taken 64 times.
352 for (size_t i = 0; i < n; ++i) {
17 256 result += v1[i] * v2[i];
18 }
19 return result;
20 }
21
22 64 void ComputeAp(const std::vector<double> &matrix, const std::vector<double> &p, std::vector<double> &ap, size_t n) {
23
2/2
✓ Branch 0 taken 168 times.
✓ Branch 1 taken 64 times.
232 for (size_t i = 0; i < n; ++i) {
24 double sum = 0.0;
25
2/2
✓ Branch 0 taken 472 times.
✓ Branch 1 taken 168 times.
640 for (size_t j = 0; j < n; ++j) {
26 472 sum += matrix[(i * n) + j] * p[j];
27 }
28 168 ap[i] = sum;
29 }
30 64 }
31
32 64 double UpdateResultAndResidual(std::vector<double> &result, std::vector<double> &r, const std::vector<double> &p,
33 const std::vector<double> &ap, double alpha) {
34 double rs_new = 0.0;
35 size_t n = result.size();
36
2/2
✓ Branch 0 taken 168 times.
✓ Branch 1 taken 64 times.
232 for (size_t i = 0; i < n; ++i) {
37 168 result[i] += alpha * p[i];
38 168 r[i] -= alpha * ap[i];
39 168 rs_new += r[i] * r[i];
40 }
41 64 return rs_new;
42 }
43
44 void UpdateP(std::vector<double> &p, const std::vector<double> &r, double beta) {
45 size_t n = p.size();
46
2/2
✓ Branch 0 taken 80 times.
✓ Branch 1 taken 32 times.
112 for (size_t i = 0; i < n; ++i) {
47 80 p[i] = r[i] + (beta * p[i]);
48 }
49 }
50
51 } // namespace
52
53
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 SmyshlaevASleCgTaskSEQ::SmyshlaevASleCgTaskSEQ(const InType &in) {
54 SetTypeOfTask(GetStaticTypeOfTask());
55 GetInput() = in;
56 32 }
57
58
1/2
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
32 bool SmyshlaevASleCgTaskSEQ::ValidationImpl() {
59 const auto &a = GetInput().A;
60 const auto &b = GetInput().b;
61
2/4
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
32 if (a.empty() || b.empty()) {
62 return false;
63 }
64
1/2
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
32 if (a.size() != b.size()) {
65 return false;
66 }
67
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
32 if (a.size() != a[0].size()) {
68 return false;
69 }
70 return true;
71 }
72
73 32 bool SmyshlaevASleCgTaskSEQ::PreProcessingImpl() {
74 const auto &a = GetInput().A;
75 size_t n = a.size();
76 32 flat_A_.resize(n * n);
77
2/2
✓ Branch 0 taken 88 times.
✓ Branch 1 taken 32 times.
120 for (size_t i = 0; i < n; ++i) {
78
2/2
✓ Branch 0 taken 264 times.
✓ Branch 1 taken 88 times.
352 for (size_t j = 0; j < n; ++j) {
79 264 flat_A_[(i * n) + j] = a[i][j];
80 }
81 }
82
83 32 return true;
84 }
85
86 32 bool SmyshlaevASleCgTaskSEQ::RunImpl() {
87
1/2
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
32 const auto &b = GetInput().b;
88 size_t n = b.size();
89
90
1/2
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
32 if (n == 0) {
91 return true;
92 }
93
94 32 std::vector<double> r = b;
95
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 std::vector<double> p = r;
96
1/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
32 std::vector<double> ap(n, 0.0);
97
1/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
32 std::vector<double> result(n, 0.0);
98
99 double rs_old = ComputeDotProduct(r, r);
100
101 32 const int max_iterations = static_cast<int>(n) * 2;
102 const double epsilon = 1e-9;
103
104
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
32 if (std::sqrt(rs_old) < epsilon) {
105 GetOutput() = result;
106 return true;
107 }
108
109
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 for (int iter = 0; iter < max_iterations; ++iter) {
110 64 ComputeAp(flat_A_, p, ap, n);
111
112 double p_ap = ComputeDotProduct(p, ap);
113
114
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (std::abs(p_ap) < 1e-15) {
115 break;
116 }
117
118 64 double alpha = rs_old / p_ap;
119 64 double rs_new = UpdateResultAndResidual(result, r, p, ap, alpha);
120
121
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 32 times.
64 if (std::sqrt(rs_new) < epsilon) {
122 break;
123 }
124
125 32 double beta = rs_new / rs_old;
126 UpdateP(p, r, beta);
127
128 rs_old = rs_new;
129 }
130
131
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 GetOutput() = result;
132 return true;
133 }
134
135 32 bool SmyshlaevASleCgTaskSEQ::PostProcessingImpl() {
136 32 return true;
137 }
138
139 } // namespace smyshlaev_a_sle_cg_seq
140