GCC Code Coverage Report


Directory: ./
File: tasks/khruev_a_gauss_jordan/seq/src/ops_seq.cpp
Date: 2026-01-10 02:40:41
Exec Total Coverage
Lines: 67 70 95.7%
Functions: 10 10 100.0%
Branches: 62 92 67.4%

Line Branch Exec Source
1 #include "khruev_a_gauss_jordan/seq/include/ops_seq.hpp"
2
3 #include <algorithm>
4 #include <cmath>
5 #include <cstddef>
6 #include <utility>
7 #include <vector>
8
9 #include "khruev_a_gauss_jordan/common/include/common.hpp"
10
11 namespace khruev_a_gauss_jordan {
12
13 namespace {
14
15 constexpr double kTol = 1e-10;
16
17 bool NearZero(double x) {
18
6/8
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 96 times.
✓ Branch 2 taken 96 times.
✓ Branch 3 taken 128 times.
✓ Branch 4 taken 96 times.
✓ Branch 5 taken 128 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
672 return std::fabs(x) < kTol;
19 }
20
21 int SelectPivot(const std::vector<std::vector<double>> &a, int start_row, int col) {
22 int best = -1;
23 double max_val = 0.0;
24
25
2/2
✓ Branch 0 taken 224 times.
✓ Branch 1 taken 128 times.
352 for (int i = start_row; std::cmp_less(i, static_cast<int>(a.size())); ++i) {
26
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 96 times.
224 double v = std::fabs(a[i][col]);
27
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 96 times.
224 if (v > max_val) {
28 max_val = v;
29 best = i;
30 }
31 }
32
1/2
✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
128 return (max_val > kTol) ? best : -1;
33 }
34
35 void Normalize(std::vector<double> &row, int pivot_col) {
36 128 double p = row[pivot_col];
37
1/2
✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
128 if (NearZero(p)) {
38 return;
39 }
40
2/2
✓ Branch 0 taken 448 times.
✓ Branch 1 taken 128 times.
576 for (double &x : row) {
41 448 x /= p;
42 }
43 }
44
45 void Eliminate(std::vector<double> &row, const std::vector<double> &pivot, double factor) {
46
2/2
✓ Branch 0 taken 184 times.
✓ Branch 1 taken 56 times.
240 for (size_t j = 0; j < row.size(); ++j) {
47 184 row[j] -= factor * pivot[j];
48 }
49 }
50
51 bool RowIsZero(const std::vector<double> &row, int until) {
52
2/4
✓ Branch 0 taken 224 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 224 times.
✗ Branch 3 not taken.
448 for (int j = 0; j < until; ++j) {
53
4/4
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 128 times.
✓ Branch 2 taken 96 times.
✓ Branch 3 taken 128 times.
448 if (!NearZero(row[j])) {
54 return false;
55 }
56 }
57 return true;
58 }
59
60 } // namespace
61
62
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 KhruevAGaussJordanSEQ::KhruevAGaussJordanSEQ(const InType &in) {
63 SetTypeOfTask(GetStaticTypeOfTask());
64
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 InType tmp(in);
65 GetInput().swap(tmp);
66 56 }
67
68
1/2
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
56 bool KhruevAGaussJordanSEQ::ValidationImpl() {
69
1/2
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
56 if (GetInput().empty()) {
70 return true;
71 }
72
73 size_t cols = GetInput()[0].size();
74
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 56 times.
184 for (const auto &r : GetInput()) {
75
1/2
✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
128 if (r.size() != cols) {
76 return false;
77 }
78 }
79
80
2/4
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 56 times.
✗ Branch 3 not taken.
56 return GetOutput().empty() && cols > 0;
81 }
82
83
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
56 bool KhruevAGaussJordanSEQ::PreProcessingImpl() {
84 GetOutput().clear();
85 56 return true;
86 }
87
88 56 void KhruevAGaussJordanSEQ::ToReducedForm(std::vector<std::vector<double>> &a) {
89 56 int n = static_cast<int>(a.size());
90 56 int m = static_cast<int>(a[0].size());
91
92 int row = 0;
93
3/4
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 56 times.
✓ Branch 2 taken 128 times.
✗ Branch 3 not taken.
184 for (int col = 0; col < m - 1 && row < n; ++col) {
94 int pivot = 0;
95 pivot = SelectPivot(a, row, col);
96
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 128 times.
128 if (pivot == -1) {
97 continue;
98 }
99
100
1/2
✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
128 std::swap(a[row], a[pivot]);
101 Normalize(a[row], col);
102
103
2/2
✓ Branch 0 taken 320 times.
✓ Branch 1 taken 128 times.
448 for (int i = 0; i < n; ++i) {
104
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 192 times.
320 if (i == row) {
105 128 continue;
106 }
107
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 136 times.
192 double factor = a[i][col];
108
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 136 times.
192 if (!NearZero(factor)) {
109 Eliminate(a[i], a[row], factor);
110 }
111 }
112 128 ++row;
113 }
114 56 }
115
116 56 bool KhruevAGaussJordanSEQ::DetectInconsistency(const std::vector<std::vector<double>> &a) {
117 56 const int m = static_cast<int>(a[0].size());
118
119 return std::ranges::any_of(
120
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 128 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
256 a, [m](const std::vector<double> &row) { return RowIsZero(row, m - 1) && !NearZero(row[m - 1]); });
121 }
122
123 56 int KhruevAGaussJordanSEQ::ComputeRank(const std::vector<std::vector<double>> &a) {
124 int rank = 0;
125 56 int m = static_cast<int>(a[0].size());
126
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 56 times.
184 for (const auto &row : a) {
127
1/2
✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
256 if (!RowIsZero(row, m - 1)) {
128 128 ++rank;
129 }
130 }
131 56 return rank;
132 }
133
134 56 std::vector<double> KhruevAGaussJordanSEQ::RecoverSolution(const std::vector<std::vector<double>> &a) {
135 56 int n = static_cast<int>(a.size());
136 56 int m = static_cast<int>(a[0].size());
137
138 56 std::vector<double> sol(m - 1, 0.0);
139
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 56 times.
184 for (int i = 0; i < std::min(n, m - 1); ++i) {
140
1/2
✓ Branch 0 taken 224 times.
✗ Branch 1 not taken.
224 for (int j = 0; j < m - 1; ++j) {
141
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 96 times.
224 if (!NearZero(a[i][j])) {
142 128 sol[j] = a[i][m - 1];
143 128 break;
144 }
145 }
146 }
147 56 return sol;
148 }
149
150
1/2
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
56 bool KhruevAGaussJordanSEQ::RunImpl() {
151
1/2
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
56 if (GetInput().empty()) {
152 return true;
153 }
154 56 auto a = GetInput();
155 56 ToReducedForm(a);
156
157
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
56 if (DetectInconsistency(a)) {
158 GetOutput().clear();
159 return false;
160 }
161
162 int rank = 0;
163
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
56 rank = ComputeRank(a);
164
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56 if (rank < static_cast<int>(a[0].size()) - 1 && std::cmp_less(rank, static_cast<int>(a.size()))) {
165 GetOutput().clear();
166 return false;
167 }
168
169
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 GetOutput() = RecoverSolution(a);
170 56 return true;
171 56 }
172
173 56 bool KhruevAGaussJordanSEQ::PostProcessingImpl() {
174 56 return true;
175 }
176
177 } // namespace khruev_a_gauss_jordan
178