#pragma once #include "./core/omp_config.h" #include "detail/random_serial.h" #include "add.h" #include "mul.h" namespace numerics{ // ---------------- inplace_random ---------------- template inline void inplace_random(utils::Vector& v, const T low, const T high) { detail::inplace_random_serial(v, low, high); } template inline void inplace_random(utils::Matrix& A, const T low, const T high) { detail::inplace_random_serial(A, low, high); } // ---------------- random ---------------- template inline utils::Vector random_vector(const uint64_t n, const T low, const T high) { utils::Vector v(n); inplace_random(v, low, high); return v; } template inline utils::Matrix random_matrix(const uint64_t n, const uint64_t m, const T low, const T high) { utils::Matrix A(n, m); inplace_random(A, low, high); return A; } // ---------------- inplace random add---------------- template inline void inplace_random_add(utils::Vector& v, const T low, const T high){ utils::Vector noise = random_vector(v.size(), low, high); inplace_add(v, noise); } template inline void inplace_random_add(utils::Matrix& A, const T low, const T high){ utils::Matrix noise = random_matrix(A.rows(), A.cols(), low, high); inplace_add(A, noise); } // ---------------- random add---------------- template inline utils::Vector random_add(const utils::Vector& v, const T low, const T high){ utils::Vector out = v; inplace_random_add(out, low, high); return out; } template inline utils::Matrix random_add(const utils::Matrix& A, const T low, const T high){ utils::Matrix out = A; inplace_random_add(out, low, high); return out; } // ---------------- inplace random mul---------------- template inline void inplace_random_mul(utils::Vector& v, const T low, const T high){ utils::Vector noise = random_vector(v.size(), low, high); inplace_mul(v, noise); } template inline void inplace_random_mul(utils::Matrix& A, const T low, const T high){ utils::Matrix noise = random_matrix(A.rows(), A.cols(), low, high); inplace_mul(A, noise); } // ---------------- random mul---------------- template inline utils::Vector random_mul(const utils::Vector& v, const T low, const T high){ utils::Vector out = v; inplace_random_mul(out, low, high); return out; } template inline utils::Matrix random_mul(const utils::Matrix& A, const T low, const T high){ utils::Matrix out = A; inplace_random_mul(out, low, high); return out; } }