|
|
|
@ -7,22 +7,27 @@ namespace narray
|
|
|
|
|
namespace rand
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
int32_t dpr32_nextseed(int32_t seed)
|
|
|
|
|
//defining global random number seed for numeric array random routines
|
|
|
|
|
narray_rands_t dpr32_rseed = 0;
|
|
|
|
|
|
|
|
|
|
narray_rands_t dpr32_nextseed(narray_rands_t seed)
|
|
|
|
|
{
|
|
|
|
|
int32_t sret = seed;
|
|
|
|
|
narray_rands_t sret = seed;
|
|
|
|
|
sret = ams::mod(sret*dpr32_mult1+1,dpr32_mod);
|
|
|
|
|
return sret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double dpr32_randd(int32_t *seed)
|
|
|
|
|
double dpr32_randd(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
double ret;
|
|
|
|
|
printf("debug: seed: %d\n",(int)*seed);
|
|
|
|
|
*seed = ams::narray::rand::dpr32_nextseed(*seed);
|
|
|
|
|
printf("debug: seed: %d\n",(int)*seed);
|
|
|
|
|
ret = (double)*seed/(double)(dpr32_mod-1);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float dpr32_randf(int32_t *seed)
|
|
|
|
|
float dpr32_randf(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
float ret;
|
|
|
|
|
*seed = ams::narray::rand::dpr32_nextseed(*seed);
|
|
|
|
@ -30,7 +35,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double dpr32_gaussian(int32_t *seed)
|
|
|
|
|
double dpr32_gaussian(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
double ret = 0.0;
|
|
|
|
|
double u1,u2;
|
|
|
|
@ -46,7 +51,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float dpr32_gaussianf(int32_t *seed)
|
|
|
|
|
float dpr32_gaussianf(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
float ret = 0.0f;
|
|
|
|
|
float u1,u2;
|
|
|
|
@ -61,7 +66,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vect2 dpr32_randuvect2(int32_t *seed)
|
|
|
|
|
vect2 dpr32_randuvect2(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
vect2 ret = vect2(0,0);
|
|
|
|
|
double th = ams::narray::rand::dpr32_randd(seed)*2.0*pi;
|
|
|
|
@ -69,7 +74,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vect3 dpr32_randuvect3(int32_t *seed)
|
|
|
|
|
vect3 dpr32_randuvect3(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
vect3 ret;
|
|
|
|
|
double az,el;
|
|
|
|
@ -81,7 +86,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vect4 dpr32_randuvect4(int32_t *seed)
|
|
|
|
|
vect4 dpr32_randuvect4(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
vect4 ret;
|
|
|
|
|
double x,y,z,w;
|
|
|
|
@ -96,7 +101,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vect2f dpr32_randuvect2f(int32_t *seed)
|
|
|
|
|
vect2f dpr32_randuvect2f(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
vect2f ret = vect2f(0,0);
|
|
|
|
|
float th = ams::narray::rand::dpr32_randf(seed)*2.0*pi;
|
|
|
|
@ -104,7 +109,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vect3f dpr32_randuvect3f(int32_t *seed)
|
|
|
|
|
vect3f dpr32_randuvect3f(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
vect3f ret;
|
|
|
|
|
float az,el;
|
|
|
|
@ -116,7 +121,7 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vect4f dpr32_randuvect4f(int32_t *seed)
|
|
|
|
|
vect4f dpr32_randuvect4f(narray_rands_t *seed)
|
|
|
|
|
{
|
|
|
|
|
vect4f ret;
|
|
|
|
|
float x,y,z,w;
|
|
|
|
@ -131,27 +136,27 @@ namespace rand
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t get_rseed()
|
|
|
|
|
narray_rands_t get_rseed()
|
|
|
|
|
{
|
|
|
|
|
return ams::narray::rand::dpr32_rseed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void set_rseed(int32_t seed)
|
|
|
|
|
void set_rseed(narray_rands_t seed)
|
|
|
|
|
{
|
|
|
|
|
ams::narray::rand::dpr32_rseed = seed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void set_rseed_withtimer()
|
|
|
|
|
{
|
|
|
|
|
int32_t t1 = (int32_t)time(NULL);
|
|
|
|
|
int32_t t2 = (int32_t)(::fmod((double)clock()/((double)CLOCKS_PER_SEC)*1000.0f,36000.0f));
|
|
|
|
|
ams::narray::rand::dpr32_rseed = (int32_t)t1 + (int32_t)t2;
|
|
|
|
|
narray_rands_t t1 = (narray_rands_t)time(NULL);
|
|
|
|
|
narray_rands_t t2 = (narray_rands_t)(::fmod((double)clock()/((double)CLOCKS_PER_SEC)*1000.0f,36000.0f));
|
|
|
|
|
ams::narray::rand::dpr32_rseed = (narray_rands_t)t1 + (narray_rands_t)t2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T> void narray_rand_threadf1(
|
|
|
|
|
narray<T> *out,
|
|
|
|
|
narray<int32_t> *rseeds,
|
|
|
|
|
T (*randfunc)(int32_t *),
|
|
|
|
|
narray<narray_rands_t> *rseeds,
|
|
|
|
|
T (*randfunc)(narray_rands_t *),
|
|
|
|
|
int threadnum,
|
|
|
|
|
int nthreads
|
|
|
|
|
)
|
|
|
|
@ -170,15 +175,15 @@ namespace rand
|
|
|
|
|
template<typename T> void narray_random_threadexec1(
|
|
|
|
|
narray<T> *out,
|
|
|
|
|
narray_size_t N,
|
|
|
|
|
T (*randfunc)(int32_t *),
|
|
|
|
|
int32_t *rseed
|
|
|
|
|
T (*randfunc)(narray_rands_t *),
|
|
|
|
|
narray_rands_t *rseed
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
narray_size_t I;
|
|
|
|
|
int J;
|
|
|
|
|
int nthreads;
|
|
|
|
|
std::vector<std::thread*> threads;
|
|
|
|
|
narray<int32_t> rseeds;
|
|
|
|
|
narray<narray_rands_t> rseeds;
|
|
|
|
|
int res;
|
|
|
|
|
|
|
|
|
|
res = out->resize(N);
|
|
|
|
@ -204,6 +209,7 @@ namespace rand
|
|
|
|
|
nthreads = (nthreads>narray_max_threads) ? narray_max_threads : nthreads;
|
|
|
|
|
threads.resize(nthreads);
|
|
|
|
|
rseeds.resize(nthreads);
|
|
|
|
|
|
|
|
|
|
for(J=0;J<nthreads;J++)
|
|
|
|
|
{
|
|
|
|
|
*rseed = dpr32_nextseed(*rseed);
|
|
|
|
@ -239,7 +245,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<double> narray_rand(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<double> ret;
|
|
|
|
|
|
|
|
|
@ -260,7 +266,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<float> narray_randf(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<float> ret;
|
|
|
|
|
|
|
|
|
@ -281,7 +287,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<double> narray_randgauss(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<double> ret;
|
|
|
|
|
|
|
|
|
@ -302,7 +308,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<float> narray_randgaussf(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<float> ret;
|
|
|
|
|
|
|
|
|
@ -323,7 +329,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<vect2> narray_randuvect2(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<vect2> ret;
|
|
|
|
|
|
|
|
|
@ -344,7 +350,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<vect3> narray_randuvect3(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<vect3> ret;
|
|
|
|
|
|
|
|
|
@ -365,7 +371,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<vect4> narray_randuvect4(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<vect4> ret;
|
|
|
|
|
|
|
|
|
@ -386,7 +392,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<vect2f> narray_randuvect2f(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<vect2f> ret;
|
|
|
|
|
|
|
|
|
@ -407,7 +413,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<vect3f> narray_randuvect3f(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<vect3f> ret;
|
|
|
|
|
|
|
|
|
@ -428,7 +434,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<vect4f> narray_randuvect4f(narray_size_t N,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<vect4f> ret;
|
|
|
|
|
|
|
|
|
@ -449,7 +455,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int dpr32_randint(int32_t *seed, int low, int high)
|
|
|
|
|
int dpr32_randint(narray_rands_t *seed, int low, int high)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
int val;
|
|
|
|
@ -465,8 +471,8 @@ namespace rand
|
|
|
|
|
|
|
|
|
|
template<typename T> void narray_rand_threadf2(
|
|
|
|
|
narray<T> *out,
|
|
|
|
|
narray<int32_t> *rseeds,
|
|
|
|
|
T (*randfunc)(int32_t *, T, T),
|
|
|
|
|
narray<narray_rands_t> *rseeds,
|
|
|
|
|
T (*randfunc)(narray_rands_t *, T, T),
|
|
|
|
|
T low,
|
|
|
|
|
T highexcl,
|
|
|
|
|
int threadnum,
|
|
|
|
@ -487,17 +493,17 @@ namespace rand
|
|
|
|
|
template<typename T> void narray_random_threadexec2(
|
|
|
|
|
narray<T> *out,
|
|
|
|
|
narray_size_t N,
|
|
|
|
|
T (*randfunc)(int32_t *, T, T),
|
|
|
|
|
T (*randfunc)(narray_rands_t *, T, T),
|
|
|
|
|
T low,
|
|
|
|
|
T highexcl,
|
|
|
|
|
int32_t *rseed
|
|
|
|
|
narray_rands_t *rseed
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
narray_size_t I;
|
|
|
|
|
int J;
|
|
|
|
|
int nthreads;
|
|
|
|
|
std::vector<std::thread*> threads;
|
|
|
|
|
narray<int32_t> rseeds;
|
|
|
|
|
narray<narray_rands_t> rseeds;
|
|
|
|
|
int res;
|
|
|
|
|
|
|
|
|
|
res = out->resize(N);
|
|
|
|
@ -559,7 +565,7 @@ namespace rand
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
narray<int> narray_randint(narray_size_t N, int low, int highexcl,
|
|
|
|
|
int32_t *rseed)
|
|
|
|
|
narray_rands_t *rseed)
|
|
|
|
|
{
|
|
|
|
|
narray<int> ret;
|
|
|
|
|
|
|
|
|
|