3 #ifndef COMMON_UTILS_HPP_ 4 #define COMMON_UTILS_HPP_ 37 static std::stack<std::chrono::steady_clock::time_point>
tictoc_stack;
49 std::chrono::duration<double> time_span =
50 std::chrono::duration_cast<std::chrono::duration<double>>(
52 double rc = time_span.count();
60 [&](
typename T::elem_type &val) { val = (val < prec) ? prec : val; });
65 (*X).for_each([&](
typename T::elem_type &val) {
81 mark =
reinterpret_cast<int *
>(calloc(nlimit,
sizeof(
int)));
84 klimit =
static_cast<int>(sqrt(static_cast<double>(nlimit) + 1));
91 for (k = 3; k <= klimit; k = m) {
93 for (m = k + 1; m < nlimit; m++)
97 for (i = m * 2; i < nlimit; i += m) mark[i] = -1;
102 for (k = 0, i = 1; i < nlimit; i++) {
105 if (k == nthprime + 1) {
117 UVEC negativeIdx = find((*X) < 0);
118 (*X)(negativeIdx) = (*X)(negativeIdx) * -1;
125 #pragma omp parallel for 126 for (
int j = 0; j < X->n_cols; j++) {
127 for (
int i = 0; i < X->n_rows; i++) {
128 if (arma::randu() > sparsity) (*X)(i, j) = 0;
137 T temp = arma::sprandu<T>(m, n, sparsity);
141 MAT W = 10 * arma::randu<MAT>(m, k);
142 MAT H = 10 * arma::randu<MAT>(n, k);
144 makeSparse<MAT>(sparsity, &W);
145 makeSparse<MAT>(sparsity, &H);
147 T temp = ceil(W * trans(H));
154 for (
int i = 0; i < x.size(); i++) {
161 const std::vector<std::vector<size_t>> &v) {
162 std::vector<std::vector<size_t>> s = {{}};
164 std::vector<std::vector<size_t>> r;
168 r.back().push_back(y);
179 template <
class INPUTTYPE,
class LRTYPE>
199 #pragma omp parallel for reduction(+ : nnzsse, nnzwh) 200 for (
UWORD jj = 1; jj <= A.n_cols; jj++) {
201 UWORD startIdx = A.col_ptrs[jj - 1];
202 UWORD endIdx = A.col_ptrs[jj];
204 double nnzssecol = 0;
206 for (
UWORD ii = startIdx; ii < endIdx; ii++) {
207 UWORD row = A.row_indices[ii];
209 for (
UWORD kk = 0; kk < k; kk++) {
210 tempsum += (W(row, kk) * H(col, kk));
212 nnzwhcol += tempsum * tempsum;
213 nnzssecol += (A.values[ii] - tempsum) * (A.values[ii] - tempsum);
221 double normWH = arma::norm(RwRh,
"fro");
227 INFO <<
"error compute time " <<
toc() << std::endl;
228 double fastErr = sqrt(nnzsse + (normWH * normWH - nnzwh));
232 #if defined(MKL_FOUND) && defined(BUILD_SPARSE) 240 void ARMAMKLSCSCMM(
const SP_MAT &mklMat,
char transa,
const MAT &Bt,
242 MKL_INT m, k, n, nnz;
243 m =
static_cast<MKL_INT
>(mklMat.n_rows);
244 k =
static_cast<MKL_INT
>(mklMat.n_cols);
245 n =
static_cast<MKL_INT
>(Bt.n_rows);
252 char *matdescra =
"GUNC";
255 MKL_INT *pntrb =
static_cast<MKL_INT *
>(mklMat.col_ptrs);
256 MKL_INT *pntre = pntrb + 1;
257 mkl_dcscmm(&transa, &m, &n, &k, &alpha, matdescra, mklMat.values,
258 static_cast<MKL_INT *> mklMat.row_indices, pntrb, pntre,
259 static_cast<double *>(Bt.memptr()), &ldb, &beta, Ct, &ldc);
274 cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha,
275 A.memptr(), m, B.memptr(), k, beta, C, m);
278 #endif // COMMON_UTILS_HPP_ void randNMF(const UWORD m, const UWORD n, const UWORD k, const double sparsity, T *A)
#define NUMBEROF_DECIMAL_PLACES
void makeSparse(const double sparsity, T(*X))
void tic()
start the timer. easy to call as tic(); some code; double t=toc();
void fixNumericalError(T *X, const double prec=EPSILON_1EMINUS16)
static std::stack< double > tictoc_stack_omp_clock
#define EPSILON_1EMINUS16
double computeObjectiveError(const INPUTTYPE &A, const LRTYPE &W, const LRTYPE &H)
std::vector< std::vector< size_t > > cartesian_product(const std::vector< std::vector< size_t >> &v)
void cblas_sgemm(const MAT &A, const MAT &B, double *C)
static std::stack< std::chrono::steady_clock::time_point > tictoc_stack
void printVector(const std::vector< T > &x)
static ULONG powersof10[16]
int random_sieve(const int nthprime)
void fixDecimalPlaces(T *X, const int places=NUMBEROF_DECIMAL_PLACES)