Example #1
0
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;
	}