#pragma once #include //uint64_t //#include // std::runtime_error #include "utils/vector.h" #include "utils/matrix.h" namespace numerics::detail{ // ---------------- Matrix -> Scalar ---------------- template T sum_serial(const utils::Matrix& A) { const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); T sum = T{0}; for (uint64_t i = 0; i < rows; ++i){ for (uint64_t j = 0; j < cols; ++j){ sum += A(i,j); } } return sum; } // ---------------- Vector -> Scalar ---------------- template T sum_serial(const utils::Vector& v) { const uint64_t N = v.size(); T sum = T{0}; for (uint64_t i = 0; i < N; ++i){ sum += v[i]; } return sum; } // ---------------- Matrix -> Vector ---------------- template utils::Vector sum_rowwise_serial(const utils::Matrix& A) { const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); utils::Vector sum(cols, T{0}); for (uint64_t i = 0; i < rows; ++i){ for (uint64_t j = 0; j < cols; ++j){ sum[j] += A(i,j); } } return sum; } template utils::Vector sum_colwise_serial(const utils::Matrix& A) { const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); utils::Vector sum(rows, T{0}); for (uint64_t i = 0; i < rows; ++i){ for (uint64_t j = 0; j < cols; ++j){ sum[i] += A(i,j); } } return sum; } } // namespace numerics