void rtnorm(double *x, double *left, double* right, double *mu, double *sig, int *num) { // TODO: NEED TO DEAL WITH Inf/NA/NaN RNG r; #ifdef USE_R GetRNGstate(); #endif for(int i=0; i < *num; ++i){ #ifdef USE_R if (i%SAMPCHECK==0) R_CheckUserInterrupt(); if (ISNAN(left[i]) || ISNAN(right[i]) || ISNAN(mu[i]) || ISNAN(sig[i])) x[i] = R_NaN; if (ISNA(left[i]) || ISNA(right[i]) || ISNA(mu[i]) || ISNA(sig[i])) x[i] = NA_REAL; #endif #ifdef USE_R if (left[i] != R_NegInf && right[i] != R_PosInf) { x[i] = r.tnorm(left[i], right[i], mu[i], sig[i]); } else if (left[i] != R_NegInf && right[i] == R_PosInf) { x[i] = r.tnorm(left[i], mu[i], sig[i]); } else if (left[i] == R_NegInf && right[i] != R_PosInf) { x[i] = -1.0 * r.tnorm(-1.0 * right[i], -1.0 * mu[i], sig[i]); } else if (left[i] == R_NegInf && right[i] == R_PosInf) { x[i] = r.norm(mu[i], sig[i]); } else { x[i] = R_NaN; } #else // TODO: Need to adjust so that we deal with +/- inf. if (MYFINITE(left[i]) && MYFINITE(right[i])) x[i] = r.tnorm(left[i], right[i], mu[i], sig[i]); else if (MYFINITE(left[i])) x[i] = r.tnorm(left[i], mu[i], sig[i]); else if (MYFINITE(right[i])) x[i] = -1.0 * r.tnorm(-1.0 * right[i], -1.0 * mu[i], sig[i]); else x[i] = r.norm(mu[i], sig[i]); #endif } #ifdef USE_R PutRNGstate(); #endif }
void rtnorm_both(double *x, double *left, double* right, double *mu, double *sig, int *num) { RNG r; #ifdef USE_R GetRNGstate(); #endif for(int i=0; i < *num; ++i){ #ifdef USE_R if (i%SAMPCHECK==0) R_CheckUserInterrupt(); #endif x[i] = r.tnorm(left[i], right[i], mu[i], sig[i]); } #ifdef USE_R PutRNGstate(); #endif }