diff --git a/tasks/luzan_e_double_sparse_matrix_mult/common/include/common.hpp b/tasks/luzan_e_double_sparse_matrix_mult/common/include/common.hpp new file mode 100644 index 000000000..2f040cab9 --- /dev/null +++ b/tasks/luzan_e_double_sparse_matrix_mult/common/include/common.hpp @@ -0,0 +1,250 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "task/include/task.hpp" + +namespace luzan_e_double_sparse_matrix_mult { + +const double kEPS = 1e-8; + +struct SparseMatrix { + std::vector value; + std::vector row; + std::vector col_index; + + unsigned cols; + unsigned rows; + + SparseMatrix(unsigned rows_out, unsigned cols_out) : cols(cols_out), rows(rows_out) { + col_index.clear(); + row.clear(); + value.clear(); + } + + SparseMatrix() : cols(0), rows(0) { + col_index.clear(); + row.clear(); + value.clear(); + } + + SparseMatrix(const std::vector &matrix, unsigned rows_out, unsigned cols_out) + : cols(cols_out), rows(rows_out) { + col_index.clear(); + row.clear(); + value.clear(); + + Sparse(matrix); + } + + void GenLineMatrix(unsigned rows_out, unsigned cols_out) { + col_index.clear(); + row.clear(); + value.clear(); + + rows = rows_out; + cols = cols_out; + + col_index.push_back(0); + for (unsigned j = 0; j < cols; j++) { + for (unsigned i = 0; i < rows; i++) { + if (i % 5 == 0) { + value.push_back(1.0); + row.push_back(i); + } + } + col_index.push_back(value.size()); + } + } + + void GenColsMatrix(unsigned rows_out, unsigned cols_out) { + col_index.clear(); + row.clear(); + value.clear(); + + rows = rows_out; + cols = cols_out; + col_index.push_back(0); + + for (unsigned j = 0; j < cols; j++) { + if (j % 5 == 0) { + for (unsigned i = 0; i < rows; i++) { + value.push_back(1.0); + row.push_back(i); + } + } + + col_index.push_back(value.size()); + } + } + + void GenPerfAns(unsigned n, unsigned m, unsigned k) { + col_index.clear(); + row.clear(); + value.clear(); + rows = n; + cols = m; + + col_index.push_back(0); + for (unsigned j = 0; j < m; j++) { + if (j % 5 == 0) // только чётные столбцы ненулевые + { + for (unsigned i = 0; i < n; i++) { + if (i % 5 == 0) // только чётные строки + { + value.push_back(static_cast(k)); + row.push_back(i); + } + } + } + + col_index.push_back(value.size()); + } + } + + [[nodiscard]] unsigned GetCols() const { + return cols; + } + + [[nodiscard]] unsigned GetRows() const { + return rows; + } + + [[nodiscard]] std::vector GetVal() const { + return value; + } + + bool operator==(const SparseMatrix &b) const { + bool tmp = false; + if (value.size() == b.value.size()) { + tmp = true; + for (size_t long_i = 0; long_i < value.size(); long_i++) { + if (fabs(value[long_i] - b.value[long_i]) > kEPS) { + tmp = false; + break; + } + } + } + + return tmp && (row == b.row) && (col_index == b.col_index) && (cols == b.cols) && (rows == b.rows); + } + + double GetXy(unsigned x = 1, unsigned y = 2) { + for (unsigned verylongs = col_index[y]; verylongs < col_index[y + 1]; verylongs++) { + if (row[verylongs] == x) { + return value[verylongs]; + } + } + return 0.0; + } + void Sparse(const std::vector &matrix) { + col_index.push_back(0); + bool flag = false; + for (unsigned j = 0; j < cols; j++) { + col_index.push_back(value.size()); + + for (unsigned i = 0; i < rows; i++) { + if (fabs(matrix[(i * cols) + j]) > kEPS) { + value.push_back(matrix[(i * cols) + j]); + row.push_back(i); + flag = true; + } + } + if (flag) { + col_index.pop_back(); + col_index.push_back(value.size()); + flag = false; + } + } + } + + SparseMatrix operator*(const SparseMatrix &b) const { + SparseMatrix c(rows, b.cols); + c.col_index.push_back(0); + + for (unsigned b_col = 0; b_col < b.cols; b_col++) { + std::vector tmp_col(rows, 0); + unsigned b_rows_start = b.col_index[b_col]; + unsigned b_rows_end = b.col_index[b_col + 1]; + + for (unsigned b_pos = b_rows_start; b_pos < b_rows_end; b_pos++) { + double b_val = b.value[b_pos]; + unsigned b_row = b.row[b_pos]; + + unsigned a_rows_start = col_index[b_row]; + unsigned a_rows_end = col_index[b_row + 1]; + + for (unsigned a_pos = a_rows_start; a_pos < a_rows_end; a_pos++) { + double a_val = value[a_pos]; + unsigned a_row = row[a_pos]; + tmp_col[a_row] += a_val * b_val; + } + } + for (unsigned i = 0; i < rows; i++) { + if (fabs(tmp_col[i]) > kEPS) { + c.value.push_back(tmp_col[i]); + c.row.push_back(i); + } + } + c.col_index.push_back(c.value.size()); + } + return c; + } + + void GetSparsedMatrixFromFile(std::ifstream &file) { + if (!file) { + throw std::runtime_error("Cannot open file with sparsed matrix"); + } + value.clear(); + row.clear(); + col_index.clear(); + unsigned n = 0; + file >> n >> rows >> cols; + + double tmp_val = 0; + for (unsigned i = 0; i < n; i++) { + file >> tmp_val; + value.push_back(tmp_val); + } + + unsigned tmp = 0; + for (unsigned i = 0; i < n; i++) { + file >> tmp; + row.push_back(tmp); + } + + for (unsigned i = 0; i < cols + 1; i++) { + file >> tmp; + col_index.push_back(tmp); + } + } +}; + +inline SparseMatrix GetFromFile(std::ifstream &file) { + size_t r = 0; + size_t c = 0; + file >> r >> c; + + std::vector dense(r * c); + + for (unsigned i = 0; i < r; i++) { + for (unsigned j = 0; j < c; j++) { + file >> dense[(i * c) + j]; + } + } + SparseMatrix a(dense, r, c); + return a; +}; + +using InType = std::tuple; +using OutType = SparseMatrix; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace luzan_e_double_sparse_matrix_mult diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_1.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_1.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_1.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_1.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_2.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_2.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_2.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_2.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_3.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_3.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_3.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_3.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_4.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_4.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_4.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_4.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_5.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_5.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_5.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_5.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_6.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_6.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/ans_test_6.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/ans_test_6.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_1.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/test_1.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_1.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/test_1.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_2.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/test_2.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_2.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/test_2.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_3.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/test_3.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_3.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/test_3.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_4.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/test_4.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_4.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/test_4.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_5.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/test_5.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_5.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/test_5.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_6.txt b/tasks/luzan_e_double_sparse_matrix_mult/data/test_6.txt similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/data/test_6.txt rename to tasks/luzan_e_double_sparse_matrix_mult/data/test_6.txt diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/info.json b/tasks/luzan_e_double_sparse_matrix_mult/info.json similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/info.json rename to tasks/luzan_e_double_sparse_matrix_mult/info.json diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/seq/include/ops_seq.hpp b/tasks/luzan_e_double_sparse_matrix_mult/seq/include/ops_seq.hpp similarity index 70% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/seq/include/ops_seq.hpp rename to tasks/luzan_e_double_sparse_matrix_mult/seq/include/ops_seq.hpp index d930b32da..f58a00789 100644 --- a/tasks/luzan_e_double_sparse_matrix_mult_seq/seq/include/ops_seq.hpp +++ b/tasks/luzan_e_double_sparse_matrix_mult/seq/include/ops_seq.hpp @@ -1,9 +1,9 @@ #pragma once -#include "luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp" +#include "luzan_e_double_sparse_matrix_mult/common/include/common.hpp" #include "task/include/task.hpp" -namespace luzan_e_double_sparse_matrix_mult_seq { +namespace luzan_e_double_sparse_matrix_mult { class LuzanEDoubleSparseMatrixMultSeq : public BaseTask { public: @@ -19,4 +19,4 @@ class LuzanEDoubleSparseMatrixMultSeq : public BaseTask { bool PostProcessingImpl() override; }; -} // namespace luzan_e_double_sparse_matrix_mult_seq +} // namespace luzan_e_double_sparse_matrix_mult diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/seq/src/ops_seq.cpp b/tasks/luzan_e_double_sparse_matrix_mult/seq/src/ops_seq.cpp similarity index 75% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/seq/src/ops_seq.cpp rename to tasks/luzan_e_double_sparse_matrix_mult/seq/src/ops_seq.cpp index 6dc7a5e79..4a947e36c 100644 --- a/tasks/luzan_e_double_sparse_matrix_mult_seq/seq/src/ops_seq.cpp +++ b/tasks/luzan_e_double_sparse_matrix_mult/seq/src/ops_seq.cpp @@ -1,9 +1,9 @@ -#include "luzan_e_double_sparse_matrix_mult_seq/seq/include/ops_seq.hpp" +#include "luzan_e_double_sparse_matrix_mult/seq/include/ops_seq.hpp" -#include "luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp" +#include "luzan_e_double_sparse_matrix_mult/common/include/common.hpp" // #include "util/include/util.hpp" -namespace luzan_e_double_sparse_matrix_mult_seq { +namespace luzan_e_double_sparse_matrix_mult { LuzanEDoubleSparseMatrixMultSeq::LuzanEDoubleSparseMatrixMultSeq(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); @@ -33,4 +33,4 @@ bool LuzanEDoubleSparseMatrixMultSeq::PostProcessingImpl() { return true; } -} // namespace luzan_e_double_sparse_matrix_mult_seq +} // namespace luzan_e_double_sparse_matrix_mult diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/settings.json b/tasks/luzan_e_double_sparse_matrix_mult/settings.json similarity index 100% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/settings.json rename to tasks/luzan_e_double_sparse_matrix_mult/settings.json diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/tests/functional/main.cpp b/tasks/luzan_e_double_sparse_matrix_mult/tests/functional/main.cpp similarity index 85% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/tests/functional/main.cpp rename to tasks/luzan_e_double_sparse_matrix_mult/tests/functional/main.cpp index c252af9c7..7c0651af8 100644 --- a/tasks/luzan_e_double_sparse_matrix_mult_seq/tests/functional/main.cpp +++ b/tasks/luzan_e_double_sparse_matrix_mult/tests/functional/main.cpp @@ -8,12 +8,12 @@ #include #include -#include "luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp" -#include "luzan_e_double_sparse_matrix_mult_seq/seq/include/ops_seq.hpp" +#include "luzan_e_double_sparse_matrix_mult/common/include/common.hpp" +#include "luzan_e_double_sparse_matrix_mult/seq/include/ops_seq.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" -namespace luzan_e_double_sparse_matrix_mult_seq { +namespace luzan_e_double_sparse_matrix_mult { class LuzanEDoubleSparseMatrixMultSeqestsThreads : public ppc::util::BaseRunFuncTests { public: @@ -26,7 +26,7 @@ class LuzanEDoubleSparseMatrixMultSeqestsThreads : public ppc::util::BaseRunFunc TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); std::string file_name = std::get<0>(params); std::string abs_path = - ppc::util::GetAbsoluteTaskPath(std::string(PPC_ID_luzan_e_double_sparse_matrix_mult_seq), file_name); + ppc::util::GetAbsoluteTaskPath(std::string(PPC_ID_luzan_e_double_sparse_matrix_mult), file_name); std::ifstream test_file(abs_path); if (!test_file) { throw std::runtime_error("Cannot open task file"); @@ -39,7 +39,7 @@ class LuzanEDoubleSparseMatrixMultSeqestsThreads : public ppc::util::BaseRunFunc input_data_ = std::make_tuple(a, b); file_name = "ans_" + std::get<0>(params); - abs_path = ppc::util::GetAbsoluteTaskPath(std::string(PPC_ID_luzan_e_double_sparse_matrix_mult_seq), file_name); + abs_path = ppc::util::GetAbsoluteTaskPath(std::string(PPC_ID_luzan_e_double_sparse_matrix_mult), file_name); std::ifstream ans_file(abs_path); if (!ans_file) { throw std::runtime_error("Cannot open asn file"); @@ -72,7 +72,7 @@ const std::array kTestParam = {std::make_tuple("test_1.txt", "01"), std::make_tuple("test_5.txt", "05"), std::make_tuple("test_6.txt", "06")}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask( - kTestParam, PPC_SETTINGS_luzan_e_double_sparse_matrix_mult_seq)); + kTestParam, PPC_SETTINGS_luzan_e_double_sparse_matrix_mult)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); @@ -83,4 +83,4 @@ INSTANTIATE_TEST_SUITE_P(FuncTests, LuzanEDoubleSparseMatrixMultSeqestsThreads, } // namespace -} // namespace luzan_e_double_sparse_matrix_mult_seq +} // namespace luzan_e_double_sparse_matrix_mult diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/tests/performance/main.cpp b/tasks/luzan_e_double_sparse_matrix_mult/tests/performance/main.cpp similarity index 81% rename from tasks/luzan_e_double_sparse_matrix_mult_seq/tests/performance/main.cpp rename to tasks/luzan_e_double_sparse_matrix_mult/tests/performance/main.cpp index d129dd3a1..801568ac5 100644 --- a/tasks/luzan_e_double_sparse_matrix_mult_seq/tests/performance/main.cpp +++ b/tasks/luzan_e_double_sparse_matrix_mult/tests/performance/main.cpp @@ -3,11 +3,11 @@ #include #include -#include "luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp" -#include "luzan_e_double_sparse_matrix_mult_seq/seq/include/ops_seq.hpp" +#include "luzan_e_double_sparse_matrix_mult/common/include/common.hpp" +#include "luzan_e_double_sparse_matrix_mult/seq/include/ops_seq.hpp" #include "util/include/perf_test_util.hpp" -namespace luzan_e_double_sparse_matrix_mult_seq { +namespace luzan_e_double_sparse_matrix_mult { class LuzanEDoubleSparseMatrixMultSeqPerfTestThreads : public ppc::util::BaseRunPerfTests { const int kCount_ = 2500; @@ -46,7 +46,7 @@ TEST_P(LuzanEDoubleSparseMatrixMultSeqPerfTestThreads, RunPerfModes) { namespace { const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( - PPC_SETTINGS_luzan_e_double_sparse_matrix_mult_seq); + PPC_SETTINGS_luzan_e_double_sparse_matrix_mult); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); @@ -56,4 +56,4 @@ INSTANTIATE_TEST_SUITE_P(RunModeTests, LuzanEDoubleSparseMatrixMultSeqPerfTestTh } // namespace -} // namespace luzan_e_double_sparse_matrix_mult_seq +} // namespace luzan_e_double_sparse_matrix_mult diff --git a/tasks/luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp b/tasks/luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp deleted file mode 100644 index 72d63eb51..000000000 --- a/tasks/luzan_e_double_sparse_matrix_mult_seq/common/include/common.hpp +++ /dev/null @@ -1,247 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include "task/include/task.hpp" - -namespace luzan_e_double_sparse_matrix_mult_seq { - -const double kEPS = 1e-8; - -class SparseMatrix { - std::vector value_; - std::vector row_; - std::vector col_index_; - - unsigned cols_; - unsigned rows_; - - public: - SparseMatrix(unsigned rows, unsigned cols) : cols_(cols), rows_(rows) { - col_index_.clear(); - row_.clear(); - value_.clear(); - } - - SparseMatrix() : cols_(0), rows_(0) { - col_index_.clear(); - row_.clear(); - value_.clear(); - } - - SparseMatrix(const std::vector &matrix, unsigned rows, unsigned cols) : cols_(cols), rows_(rows) { - col_index_.clear(); - row_.clear(); - value_.clear(); - - Sparse(matrix); - } - - void GenLineMatrix(unsigned rows, unsigned cols) { - col_index_.clear(); - row_.clear(); - value_.clear(); - - rows_ = rows; - cols_ = cols; - - col_index_.push_back(0); - for (unsigned j = 0; j < cols_; j++) { - for (unsigned i = 0; i < rows_; i++) { - if (i % 5 == 0) { - value_.push_back(1.0); - row_.push_back(i); - } - } - col_index_.push_back(value_.size()); - } - } - - void GenColsMatrix(unsigned rows, unsigned cols) { - col_index_.clear(); - row_.clear(); - value_.clear(); - - rows_ = rows; - cols_ = cols; - col_index_.push_back(0); - - for (unsigned j = 0; j < cols_; j++) { - if (j % 5 == 0) { - for (unsigned i = 0; i < rows_; i++) { - value_.push_back(1.0); - row_.push_back(i); - } - } - - col_index_.push_back(value_.size()); - } - } - - void GenPerfAns(unsigned n, unsigned m, unsigned k) { - col_index_.clear(); - row_.clear(); - value_.clear(); - rows_ = n; - cols_ = m; - - col_index_.push_back(0); - for (unsigned j = 0; j < m; j++) { - if (j % 5 == 0) // только чётные столбцы ненулевые - { - for (unsigned i = 0; i < n; i++) { - if (i % 5 == 0) // только чётные строки - { - value_.push_back(static_cast(k)); - row_.push_back(i); - } - } - } - - col_index_.push_back(value_.size()); - } - } - - [[nodiscard]] unsigned GetCols() const { - return cols_; - } - - [[nodiscard]] unsigned GetRows() const { - return rows_; - } - - std::vector GetVal() { - return value_; - } - - bool operator==(const SparseMatrix &b) const { - bool tmp = false; - if (value_.size() == b.value_.size()) { - tmp = true; - for (size_t long_i = 0; long_i < value_.size(); long_i++) { - if (fabs(value_[long_i] - b.value_[long_i]) > kEPS) { - tmp = false; - break; - } - } - } - - return tmp && (row_ == b.row_) && (col_index_ == b.col_index_) && (cols_ == b.cols_) && (rows_ == b.rows_); - } - - double GetXy(unsigned x = 1, unsigned y = 2) { - for (unsigned verylongs = col_index_[y]; verylongs < col_index_[y + 1]; verylongs++) { - if (row_[verylongs] == x) { - return value_[verylongs]; - } - } - return 0.0; - } - void Sparse(std::vector matrix) { - col_index_.push_back(0); - bool flag = false; - for (unsigned j = 0; j < cols_; j++) { - col_index_.push_back(value_.size()); - - for (unsigned i = 0; i < rows_; i++) { - if (fabs(matrix[(i * cols_) + j]) > kEPS) { - value_.push_back(matrix[(i * cols_) + j]); - row_.push_back(i); - flag = true; - } - } - if (flag) { - col_index_.pop_back(); - col_index_.push_back(value_.size()); - flag = false; - } - } - } - - SparseMatrix operator*(const SparseMatrix &b) const { - SparseMatrix c(rows_, b.cols_); - c.col_index_.push_back(0); - - for (unsigned b_col = 0; b_col < b.cols_; b_col++) { - std::vector tmp_col(rows_, 0); - unsigned b_rows_start = b.col_index_[b_col]; - unsigned b_rows_end = b.col_index_[b_col + 1]; - - for (unsigned b_pos = b_rows_start; b_pos < b_rows_end; b_pos++) { - double b_val = b.value_[b_pos]; - unsigned b_row = b.row_[b_pos]; - - unsigned a_rows_start = col_index_[b_row]; - unsigned a_rows_end = col_index_[b_row + 1]; - - for (unsigned a_pos = a_rows_start; a_pos < a_rows_end; a_pos++) { - double a_val = value_[a_pos]; - unsigned a_row = row_[a_pos]; - tmp_col[a_row] += a_val * b_val; - } - } - for (unsigned i = 0; i < rows_; i++) { - if (fabs(tmp_col[i]) > kEPS) { - c.value_.push_back(tmp_col[i]); - c.row_.push_back(i); - } - } - c.col_index_.push_back(c.value_.size()); - } - return c; - } - - void GetSparsedMatrixFromFile(std::ifstream &file) { - if (!file) { - throw std::runtime_error("Cannot open file with sparsed matrix"); - } - unsigned n = 0; - file >> n >> rows_ >> cols_; - - double tmp_val = 0; - for (unsigned i = 0; i < n; i++) { - file >> tmp_val; - value_.push_back(tmp_val); - } - - unsigned tmp = 0; - for (unsigned i = 0; i < n; i++) { - file >> tmp; - row_.push_back(tmp); - } - - for (unsigned i = 0; i < cols_ + 1; i++) { - file >> tmp; - col_index_.push_back(tmp); - } - } -}; - -inline SparseMatrix GetFromFile(std::ifstream &file) { - size_t r = 0; - size_t c = 0; - file >> r >> c; - - std::vector dense(r * c); - - for (unsigned i = 0; i < r; i++) { - for (unsigned j = 0; j < c; j++) { - file >> dense[(i * c) + j]; - } - } - SparseMatrix a(dense, r, c); - return a; -}; - -using InType = std::tuple; -using OutType = SparseMatrix; -using TestType = std::tuple; -using BaseTask = ppc::task::Task; - -} // namespace luzan_e_double_sparse_matrix_mult_seq