From f4e24928fc6da0d37aa3f388f008c09c8ece0cec Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Tue, 24 Feb 2026 13:46:06 +0300 Subject: [PATCH 1/7] first commmit --- .../common/include/common.hpp | 24 ++++ tasks/smyshlaev_a_sle_cg_seq/info.json | 9 ++ tasks/smyshlaev_a_sle_cg_seq/report.md | 0 .../seq/include/ops_seq.hpp | 23 ++++ tasks/smyshlaev_a_sle_cg_seq/seq/report.md | 0 .../seq/src/ops_seq.cpp | 116 ++++++++++++++++++ tasks/smyshlaev_a_sle_cg_seq/settings.json | 10 ++ .../tests/functional/main.cpp | 89 ++++++++++++++ .../tests/performance/main.cpp | 87 +++++++++++++ 9 files changed, 358 insertions(+) create mode 100644 tasks/smyshlaev_a_sle_cg_seq/common/include/common.hpp create mode 100644 tasks/smyshlaev_a_sle_cg_seq/info.json create mode 100644 tasks/smyshlaev_a_sle_cg_seq/report.md create mode 100644 tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp create mode 100644 tasks/smyshlaev_a_sle_cg_seq/seq/report.md create mode 100644 tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp create mode 100644 tasks/smyshlaev_a_sle_cg_seq/settings.json create mode 100644 tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp create mode 100644 tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp diff --git a/tasks/smyshlaev_a_sle_cg_seq/common/include/common.hpp b/tasks/smyshlaev_a_sle_cg_seq/common/include/common.hpp new file mode 100644 index 00000000..40b83210 --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/common/include/common.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +#include "task/include/task.hpp" + +namespace smyshlaev_a_sle_cg_seq { + +using CGVector = std::vector; +using CGMatrix = std::vector; + +struct InputType { + CGMatrix A; + CGVector b; +}; + +using InType = InputType; +using OutType = CGVector; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace smyshlaev_a_sle_cg_seq diff --git a/tasks/smyshlaev_a_sle_cg_seq/info.json b/tasks/smyshlaev_a_sle_cg_seq/info.json new file mode 100644 index 00000000..170da60c --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/info.json @@ -0,0 +1,9 @@ +{ + "student": { + "first_name": "Александр", + "group_number": "3823Б1ФИ2", + "last_name": "Смышляев", + "middle_name": "Павлович", + "task_number": "1" + } +} diff --git a/tasks/smyshlaev_a_sle_cg_seq/report.md b/tasks/smyshlaev_a_sle_cg_seq/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp b/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp new file mode 100644 index 00000000..3115c354 --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace smyshlaev_a_sle_cg_seq { + +class SmyshlaevASleCgTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit SmyshlaevASleCgTaskSEQ(const InType &in); + + private: + std::vector flat_A; + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace smyshlaev_a_sle_cg_seq diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/report.md b/tasks/smyshlaev_a_sle_cg_seq/seq/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp new file mode 100644 index 00000000..f37f30b7 --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp @@ -0,0 +1,116 @@ +#include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" + +#include +#include + +#include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" + +namespace smyshlaev_a_sle_cg_seq { + +SmyshlaevASleCgTaskSEQ::SmyshlaevASleCgTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool SmyshlaevASleCgTaskSEQ::ValidationImpl() { + const auto &A = GetInput().A; + const auto &b = GetInput().b; + if (A.empty() || b.empty()) { + return false; + } + if (A.size() != b.size()) { + return false; + } + if (A.size() != A[0].size()) { + return false; + } + return true; +} + +bool SmyshlaevASleCgTaskSEQ::PreProcessingImpl() { + const auto &A = GetInput().A; + int n = A.size(); + flat_A.resize(n * n); + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + flat_A[i * n + j] = A[i][j]; + } + } + + return true; +} + +bool SmyshlaevASleCgTaskSEQ::RunImpl() { + const auto &b = GetInput().b; + int n = b.size(); + + std::vector r = b; + std::vector p = r; + std::vector Ap(n, 0.0); + std::vector result(n, 0.0); + + double rs_old = 0.0; + for (int i = 0; i < n; ++i) { + rs_old += r[i] * r[i]; + } + + const int max_iterations = n * 2; + const double epsilon = 1e-9; + + // Если сразу всё хорошо — отдаём результат и выходим (не забываем GetOutput) + if (std::sqrt(rs_old) < epsilon) { + GetOutput() = result; + return true; + } + + for (int iter = 0; iter < max_iterations; ++iter) { + // Ap = A * p + for (int i = 0; i < n; ++i) { + Ap[i] = 0.0; + for (int j = 0; j < n; ++j) { + Ap[i] += flat_A[i * n + j] * p[j]; + } + } + + // Скалярное произведение p * Ap + double pAp = 0.0; + for (int i = 0; i < n; ++i) { + pAp += p[i] * Ap[i]; + } + + // Защита от деления на ноль на случай плохой матрицы + if (std::abs(pAp) < 1e-15) { + break; + } + + double alpha = rs_old / pAp; + double rs_new = 0.0; + + // Обновляем вектора (без лишних аллокаций памяти) + for (int i = 0; i < n; ++i) { + result[i] += alpha * p[i]; + r[i] -= alpha * Ap[i]; + rs_new += r[i] * r[i]; + } + + if (std::sqrt(rs_new) < epsilon) { + break; + } + + double beta = rs_new / rs_old; + for (int i = 0; i < n; ++i) { + p[i] = r[i] + beta * p[i]; + } + + rs_old = rs_new; + } + + GetOutput() = result; + return true; +} + +bool SmyshlaevASleCgTaskSEQ::PostProcessingImpl() { + return true; +} + +} // namespace smyshlaev_a_sle_cg_seq \ No newline at end of file diff --git a/tasks/smyshlaev_a_sle_cg_seq/settings.json b/tasks/smyshlaev_a_sle_cg_seq/settings.json new file mode 100644 index 00000000..0be0208f --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/settings.json @@ -0,0 +1,10 @@ +{ + "tasks": { + "all": "enabled", + "omp": "enabled", + "seq": "enabled", + "stl": "enabled", + "tbb": "enabled" + }, + "tasks_type": "threads" +} diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp new file mode 100644 index 00000000..a7d10393 --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp @@ -0,0 +1,89 @@ +#include +#include + +#include +#include +#include + +#include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" +#include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace smyshlaev_a_sle_cg_seq { + +class SmyshlaevASleCgFuncTests : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + } + + protected: + void SetUp() override { + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + int test_id = std::get<0>(params); + + if (test_id == 1) { + input_data_.A = {{4.0, 1.0}, {1.0, 3.0}}; + input_data_.b = {9.0, 5.0}; + expected_x_ = {2.0, 1.0}; + } else if (test_id == 2) { + input_data_.A = {{10.0, -1.0, 2.0}, {-1.0, 11.0, -1.0}, {2.0, -1.0, 10.0}}; + input_data_.b = {14.0, 18.0, 30.0}; + expected_x_ = {1.0, 2.0, 3.0}; + } else if (test_id == 3) { + input_data_.A = {{1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0}}; + input_data_.b = {5.0, -2.0, 8.0, 1.0}; + expected_x_ = {5.0, -2.0, 8.0, 1.0}; + } + } + + bool CheckTestOutputData(OutType &output_data) final { + if (output_data.size() != expected_x_.size()) { + return false; + } + const double epsilon = 1e-6; + for (size_t i = 0; i < output_data.size(); ++i) { + if (std::fabs(output_data[i] - expected_x_[i]) > epsilon) { + return false; + } + } + return true; + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_; + OutType expected_x_; +}; + +namespace { + +TEST_P(SmyshlaevASleCgFuncTests, SleCgSeqTests) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = { + std::make_tuple(1, "Simple2x2"), + std::make_tuple(2, "Medium3x3"), + std::make_tuple(3, "IdentityMatrix4x4") +}; + +const auto kTestTasksList = std::tuple_cat( + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_sle_cg_seq)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = SmyshlaevASleCgFuncTests::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(SleCgSeqFunctionalTests, SmyshlaevASleCgFuncTests, kGtestValues, kPerfTestName); + +} // namespace +} // namespace smyshlaev_a_sle_cg_seq \ No newline at end of file diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp new file mode 100644 index 00000000..6dc2eb87 --- /dev/null +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include + +#include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" +#include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace smyshlaev_a_sle_cg_seq { + +class SmyshlaevASleCgPerfTests : public ppc::util::BaseRunPerfTests { + static constexpr int kSystemSize = 512; + InType input_data_{}; + OutType expected_x_{}; + + void SetUp() override { + std::mt19937 gen(1337); + std::uniform_real_distribution dis(-1.0, 1.0); + + CGMatrix A(kSystemSize, CGVector(kSystemSize, 0.0)); + expected_x_.assign(kSystemSize, 1.0); + CGVector b(kSystemSize, 0.0); + + for (int i = 0; i < kSystemSize; ++i) { + for (int j = i + 1; j < kSystemSize; ++j) { + double val = dis(gen); + A[i][j] = val; + A[j][i] = val; + } + } + + for (int i = 0; i < kSystemSize; ++i) { + double row_sum = 0.0; + for (int j = 0; j < kSystemSize; ++j) { + if (i != j) { + row_sum += std::abs(A[i][j]); + } + } + A[i][i] = row_sum + 1.0; + } + + for (int i = 0; i < kSystemSize; ++i) { + for (int j = 0; j < kSystemSize; ++j) { + b[i] += A[i][j] * expected_x_[j]; + } + } + + input_data_.A = std::move(A); + input_data_.b = std::move(b); + } + + bool CheckTestOutputData(OutType &output_data) final { + if (output_data.size() != expected_x_.size()) { + return false; + } + const double epsilon = 1e-6; + for (int i = 0; i < output_data.size(); ++i) { + if (std::isnan(output_data[i]) || std::fabs(output_data[i] - expected_x_[i]) > epsilon) { + return false; + } + } + return true; + } + + InType GetTestInputData() final { + return input_data_; + } +}; + +TEST_P(SmyshlaevASleCgPerfTests, RunPerfModes) { + ExecuteTest(GetParam()); +} + +namespace { + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_smyshlaev_a_sle_cg_seq); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = SmyshlaevASleCgPerfTests::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, SmyshlaevASleCgPerfTests, kGtestValues, kPerfTestName); + +} // namespace +} // namespace smyshlaev_a_sle_cg_seq \ No newline at end of file From 7a7e44de7ff718c88b9501738249cbcd83a58842 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Tue, 24 Feb 2026 13:50:44 +0300 Subject: [PATCH 2/7] pre-commit --- .../seq/src/ops_seq.cpp | 2 +- .../tests/functional/main.cpp | 19 ++++++------------- .../tests/performance/main.cpp | 9 +++++---- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp index f37f30b7..5ec1d1ac 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp @@ -113,4 +113,4 @@ bool SmyshlaevASleCgTaskSEQ::PostProcessingImpl() { return true; } -} // namespace smyshlaev_a_sle_cg_seq \ No newline at end of file +} // namespace smyshlaev_a_sle_cg_seq diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp index a7d10393..0c281b75 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp @@ -1,9 +1,9 @@ #include -#include -#include +#include #include #include +#include #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" #include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" @@ -20,7 +20,6 @@ class SmyshlaevASleCgFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); int test_id = std::get<0>(params); @@ -33,10 +32,7 @@ class SmyshlaevASleCgFuncTests : public ppc::util::BaseRunFuncTests kTestParam = { - std::make_tuple(1, "Simple2x2"), - std::make_tuple(2, "Medium3x3"), - std::make_tuple(3, "IdentityMatrix4x4") -}; +const std::array kTestParam = {std::make_tuple(1, "Simple2x2"), std::make_tuple(2, "Medium3x3"), + std::make_tuple(3, "IdentityMatrix4x4")}; const auto kTestTasksList = std::tuple_cat( ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_sle_cg_seq)); @@ -86,4 +79,4 @@ const auto kPerfTestName = SmyshlaevASleCgFuncTests::PrintFuncTestName + #include -#include #include +#include #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" #include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" @@ -37,7 +38,7 @@ class SmyshlaevASleCgPerfTests : public ppc::util::BaseRunPerfTests Date: Tue, 24 Feb 2026 14:25:38 +0300 Subject: [PATCH 3/7] fix type --- tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp index 523b43ea..b1246853 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -56,7 +57,7 @@ class SmyshlaevASleCgPerfTests : public ppc::util::BaseRunPerfTests epsilon) { return false; } From d8bac74b91d6f015e9846595700110ea3f4b3dec Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Tue, 24 Feb 2026 14:54:25 +0300 Subject: [PATCH 4/7] clang --- .../seq/include/ops_seq.hpp | 4 +- .../seq/src/ops_seq.cpp | 107 +++++++++++------- .../tests/functional/main.cpp | 2 + .../tests/performance/main.cpp | 20 ++-- 4 files changed, 81 insertions(+), 52 deletions(-) diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp b/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp index 3115c354..d0addd6a 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" #include "task/include/task.hpp" @@ -13,7 +15,7 @@ class SmyshlaevASleCgTaskSEQ : public BaseTask { explicit SmyshlaevASleCgTaskSEQ(const InType &in); private: - std::vector flat_A; + std::vector flat_A_; bool ValidationImpl() override; bool PreProcessingImpl() override; bool RunImpl() override; diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp index 5ec1d1ac..729e8d23 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp @@ -1,39 +1,82 @@ #include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" #include +#include #include #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" namespace smyshlaev_a_sle_cg_seq { +namespace { + +double ComputeDotProduct(const std::vector &v1, const std::vector &v2) { + double result = 0.0; + size_t n = v1.size(); + for (size_t i = 0; i < n; ++i) { + result += v1[i] * v2[i]; + } + return result; +} + +void ComputeAp(const std::vector &matrix, const std::vector &p, std::vector &ap, size_t n) { + for (size_t i = 0; i < n; ++i) { + double sum = 0.0; + for (size_t j = 0; j < n; ++j) { + sum += matrix[(i * n) + j] * p[j]; + } + ap[i] = sum; + } +} + +double UpdateResultAndResidual(std::vector &result, std::vector &r, const std::vector &p, + const std::vector &ap, double alpha) { + double rs_new = 0.0; + size_t n = result.size(); + for (size_t i = 0; i < n; ++i) { + result[i] += alpha * p[i]; + r[i] -= alpha * ap[i]; + rs_new += r[i] * r[i]; + } + return rs_new; +} + +void UpdateP(std::vector &p, const std::vector &r, double beta) { + size_t n = p.size(); + for (size_t i = 0; i < n; ++i) { + p[i] = r[i] + (beta * p[i]); + } +} + +} // namespace + SmyshlaevASleCgTaskSEQ::SmyshlaevASleCgTaskSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; } bool SmyshlaevASleCgTaskSEQ::ValidationImpl() { - const auto &A = GetInput().A; + const auto &a = GetInput().A; const auto &b = GetInput().b; - if (A.empty() || b.empty()) { + if (a.empty() || b.empty()) { return false; } - if (A.size() != b.size()) { + if (a.size() != b.size()) { return false; } - if (A.size() != A[0].size()) { + if (a.size() != a[0].size()) { return false; } return true; } bool SmyshlaevASleCgTaskSEQ::PreProcessingImpl() { - const auto &A = GetInput().A; - int n = A.size(); - flat_A.resize(n * n); + const auto &a = GetInput().A; + int n = a.size(); + flat_A_.resize(static_cast(n * n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { - flat_A[i * n + j] = A[i][j]; + flat_A_[(i * n) + j] = a[i][j]; } } @@ -42,65 +85,45 @@ bool SmyshlaevASleCgTaskSEQ::PreProcessingImpl() { bool SmyshlaevASleCgTaskSEQ::RunImpl() { const auto &b = GetInput().b; - int n = b.size(); + size_t n = b.size(); + + if (n == 0) { + return true; + } std::vector r = b; std::vector p = r; - std::vector Ap(n, 0.0); + std::vector ap(n, 0.0); std::vector result(n, 0.0); - double rs_old = 0.0; - for (int i = 0; i < n; ++i) { - rs_old += r[i] * r[i]; - } + double rs_old = ComputeDotProduct(r, r); - const int max_iterations = n * 2; + const int max_iterations = static_cast(n) * 2; const double epsilon = 1e-9; - // Если сразу всё хорошо — отдаём результат и выходим (не забываем GetOutput) if (std::sqrt(rs_old) < epsilon) { GetOutput() = result; return true; } for (int iter = 0; iter < max_iterations; ++iter) { - // Ap = A * p - for (int i = 0; i < n; ++i) { - Ap[i] = 0.0; - for (int j = 0; j < n; ++j) { - Ap[i] += flat_A[i * n + j] * p[j]; - } - } + ComputeAp(flat_A_, p, ap, n); - // Скалярное произведение p * Ap - double pAp = 0.0; - for (int i = 0; i < n; ++i) { - pAp += p[i] * Ap[i]; - } + double p_ap = ComputeDotProduct(p, ap); - // Защита от деления на ноль на случай плохой матрицы - if (std::abs(pAp) < 1e-15) { + if (std::abs(p_ap) < 1e-15) { break; } - double alpha = rs_old / pAp; - double rs_new = 0.0; - - // Обновляем вектора (без лишних аллокаций памяти) - for (int i = 0; i < n; ++i) { - result[i] += alpha * p[i]; - r[i] -= alpha * Ap[i]; - rs_new += r[i] * r[i]; - } + double alpha = rs_old / p_ap; + double rs_new = UpdateResultAndResidual(result, r, p, ap, alpha); if (std::sqrt(rs_new) < epsilon) { break; } double beta = rs_new / rs_old; - for (int i = 0; i < n; ++i) { - p[i] = r[i] + beta * p[i]; - } + UpdateP(p, r, beta); rs_old = rs_new; } diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp index 0c281b75..16a7e46c 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp @@ -1,6 +1,8 @@ #include +#include #include +#include #include #include #include diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp index b1246853..73a1f2c6 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" @@ -14,21 +15,22 @@ namespace smyshlaev_a_sle_cg_seq { class SmyshlaevASleCgPerfTests : public ppc::util::BaseRunPerfTests { static constexpr int kSystemSize = 512; InType input_data_{}; - OutType expected_x_{}; + OutType expected_x_; void SetUp() override { - std::mt19937 gen(1337); + std::random_device rd; + std::mt19937 gen(rd()); std::uniform_real_distribution dis(-1.0, 1.0); - CGMatrix A(kSystemSize, CGVector(kSystemSize, 0.0)); + CGMatrix a(kSystemSize, CGVector(kSystemSize, 0.0)); expected_x_.assign(kSystemSize, 1.0); CGVector b(kSystemSize, 0.0); for (int i = 0; i < kSystemSize; ++i) { for (int j = i + 1; j < kSystemSize; ++j) { double val = dis(gen); - A[i][j] = val; - A[j][i] = val; + a[i][j] = val; + a[j][i] = val; } } @@ -36,19 +38,19 @@ class SmyshlaevASleCgPerfTests : public ppc::util::BaseRunPerfTests Date: Tue, 24 Feb 2026 15:49:01 +0300 Subject: [PATCH 5/7] clang --- tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp | 6 +++--- tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp | 1 - tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp index 729e8d23..69eac955 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp @@ -72,10 +72,10 @@ bool SmyshlaevASleCgTaskSEQ::ValidationImpl() { bool SmyshlaevASleCgTaskSEQ::PreProcessingImpl() { const auto &a = GetInput().A; - int n = a.size(); + size_t n = a.size(); flat_A_.resize(static_cast(n * n)); - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { + for (size_t i = 0; i < n; ++i) { + for (size_t j = 0; j < n; ++j) { flat_A_[(i * n) + j] = a[i][j]; } } diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp index 16a7e46c..945f6f67 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" #include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp index 73a1f2c6..004e2714 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/performance/main.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include "smyshlaev_a_sle_cg_seq/common/include/common.hpp" #include "smyshlaev_a_sle_cg_seq/seq/include/ops_seq.hpp" From 0edf929e03677482b1dab3019ce614bce789865c Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Tue, 24 Feb 2026 16:07:46 +0300 Subject: [PATCH 6/7] clang tidy --- tasks/smyshlaev_a_sle_cg_seq/report.md | 0 tasks/smyshlaev_a_sle_cg_seq/seq/report.md | 0 tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 tasks/smyshlaev_a_sle_cg_seq/report.md delete mode 100644 tasks/smyshlaev_a_sle_cg_seq/seq/report.md diff --git a/tasks/smyshlaev_a_sle_cg_seq/report.md b/tasks/smyshlaev_a_sle_cg_seq/report.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/report.md b/tasks/smyshlaev_a_sle_cg_seq/seq/report.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp index 69eac955..c044c2d4 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/seq/src/ops_seq.cpp @@ -73,7 +73,7 @@ bool SmyshlaevASleCgTaskSEQ::ValidationImpl() { bool SmyshlaevASleCgTaskSEQ::PreProcessingImpl() { const auto &a = GetInput().A; size_t n = a.size(); - flat_A_.resize(static_cast(n * n)); + flat_A_.resize(n * n); for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < n; ++j) { flat_A_[(i * n) + j] = a[i][j]; From 00375e37d0ad379957fe09c6a1a1330766cad5c8 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Tue, 24 Feb 2026 16:54:53 +0300 Subject: [PATCH 7/7] add test --- tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp index 945f6f67..f1ef7c21 100644 --- a/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_sle_cg_seq/tests/functional/main.cpp @@ -36,6 +36,10 @@ class SmyshlaevASleCgFuncTests : public ppc::util::BaseRunFuncTests kTestParam = {std::make_tuple(1, "Simple2x2"), std::make_tuple(2, "Medium3x3"), - std::make_tuple(3, "IdentityMatrix4x4")}; +const std::array kTestParam = {std::make_tuple(1, "Simple2x2"), std::make_tuple(2, "Medium3x3"), + std::make_tuple(3, "IdentityMatrix4x4"), std::make_tuple(4, "Harder2x2")}; const auto kTestTasksList = std::tuple_cat( ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_sle_cg_seq));