int main() { fillArray(test_array, 4, 128); cache = cache_new(CACHE_SIZE_IN_BLOCKS, block_size, 1, CACHE_REPLACEMENTPOLICY_LRU); print_stats(sumA(test_array, 4, 128)); cache = cache_new(CACHE_SIZE_IN_BLOCKS, block_size, 1, CACHE_REPLACEMENTPOLICY_LRU); print_stats(sumB(test_array, 4, 128)); cache = cache_new(CACHE_SIZE_IN_BLOCKS, block_size, 1, CACHE_REPLACEMENTPOLICY_LRU); print_stats(sumC(test_array, 4, 128)); }
// for obtaining a fast empirical distribution of mean differences between two sets of columns for randomly sampled 'clusters' SEXP emp_diffs(SEXP matrix_, SEXP nrow_, SEXP const colsA_, SEXP const colsB_, SEXP nsample_, SEXP niter_){ SEXP diffs = NULL; try{ srand(time(NULL)); PROTECT(nrow_ = AS_INTEGER(nrow_)); int const nrow = *INTEGER_POINTER(nrow_); UNPROTECT(1); PROTECT(colsA_); int * const colsA = INTEGER_POINTER(colsA_); int const ncolA = LENGTH(colsA_); PROTECT(colsB_); int * const colsB = INTEGER_POINTER(colsB_); int const ncolB = LENGTH(colsB_); PROTECT(nsample_ = AS_INTEGER(nsample_)); int const nsample = *INTEGER_POINTER(nsample_); UNPROTECT(1); PROTECT(niter_ = AS_INTEGER(niter_)); int const niter = *INTEGER_POINTER(niter_); UNPROTECT(1); PROTECT(matrix_ = AS_NUMERIC(matrix_)); const double * const matrix = NUMERIC_POINTER(matrix_); PROTECT(diffs = NEW_NUMERIC(niter)); double * const diffsp = NUMERIC_POINTER(diffs); t_float val(0), diff(0), sumA(0), sumB(0); int row(0), i(0), j(0); for(int iter(0); iter<niter; ++iter){ // compute mean over nsample rows for column indices colsA // R matrices are filled BY COLUMN diff=0; for(i=0; i<nsample; ++i){ row = rand() % nrow; sumA=0; sumB=0; for(j=0; j<ncolA; ++j){ // R is 1-indexed val = matrix[row+nrow*(colsA[j]-1)]; if(ISNA(val)) continue; sumA += val; } for(j=0; j<ncolB; ++j){ val = matrix[row+nrow*(colsB[j]-1)]; if(ISNA(val)) continue; sumB += val; } diff += sumB/ncolB - sumA/ncolA; } diffsp[iter] = diff/nsample; } UNPROTECT(1); // matrix_ UNPROTECT(1); // colsA_ UNPROTECT(1); // colsB_ UNPROTECT(1); // diffs } catch (const std::bad_alloc&) { Rf_error( "Memory overflow."); } catch(const std::exception& e){ Rf_error( e.what() ); } catch(const nan_error&){ Rf_error("NaN dissimilarity value."); } catch(...){ Rf_error( "C++ exception (unknown reason)." ); } return diffs; }