diff --git a/build_linux64/libamscppnarray.linux64.a b/build_linux64/libamscppnarray.linux64.a index 7ba017a..7701ba9 100644 Binary files a/build_linux64/libamscppnarray.linux64.a and b/build_linux64/libamscppnarray.linux64.a differ diff --git a/build_linux64/objstore/amscppnarray.o b/build_linux64/objstore/amscppnarray.o index dfcadd3..b01ce7e 100644 Binary files a/build_linux64/objstore/amscppnarray.o and b/build_linux64/objstore/amscppnarray.o differ diff --git a/build_linux64/objstore/amscppnarray_inits.o b/build_linux64/objstore/amscppnarray_inits.o index 6b52b04..a437bd7 100644 Binary files a/build_linux64/objstore/amscppnarray_inits.o and b/build_linux64/objstore/amscppnarray_inits.o differ diff --git a/build_linux64/objstore/amscppnarray_math.o b/build_linux64/objstore/amscppnarray_math.o index d28db26..cf0b6f1 100644 Binary files a/build_linux64/objstore/amscppnarray_math.o and b/build_linux64/objstore/amscppnarray_math.o differ diff --git a/build_linux64/objstore/amscppnarray_random.o b/build_linux64/objstore/amscppnarray_random.o index 358977f..2a748fc 100644 Binary files a/build_linux64/objstore/amscppnarray_random.o and b/build_linux64/objstore/amscppnarray_random.o differ diff --git a/build_linux64/tests b/build_linux64/tests index 05e1e02..152b659 100644 Binary files a/build_linux64/tests and b/build_linux64/tests differ diff --git a/include/amscppnarray/amscppnarray_random.hpp b/include/amscppnarray/amscppnarray_random.hpp index 55248c4..b1c6300 100644 --- a/include/amscppnarray/amscppnarray_random.hpp +++ b/include/amscppnarray/amscppnarray_random.hpp @@ -14,56 +14,58 @@ namespace rand //Simple Deterministic Psuedorandom Number Generator (32 bit version) // //////////////////////////////////////////////////////////////////////// - static const int32_t dpr32_mod = ( ((int32_t)1) << ((int32_t)30) ) - (int32_t)1; - static const int32_t dpr32_mult1 = ( (int32_t) 1201633 ); - static int32_t dpr32_rseed = 0; // global random number seed for numeric array class + typedef int32_t narray_rands_t; + + static const narray_rands_t dpr32_mod = ( ((narray_rands_t)1) << ((narray_rands_t)30) ) - (narray_rands_t)1; + static const narray_rands_t dpr32_mult1 = ( (narray_rands_t) 1201633 ); + extern narray_rands_t dpr32_rseed; // global random number seed for numeric array class - int32_t dpr32_nextseed(int32_t seed); - double dpr32_randd(int32_t *seed); - float dpr32_randf(int32_t *seed); - double dpr32_gaussian(int32_t *seed); - float dpr32_gaussianf(int32_t *seed); - int dpr32_randint(int32_t *seed, int low, int high); + narray_rands_t dpr32_nextseed(narray_rands_t seed); + double dpr32_randd(narray_rands_t *seed); + float dpr32_randf(narray_rands_t *seed); + double dpr32_gaussian(narray_rands_t *seed); + float dpr32_gaussianf(narray_rands_t *seed); + int dpr32_randint(narray_rands_t *seed, int low, int high); - ams::vect2 dpr32_randuvect2(int32_t *seed); - ams::vect3 dpr32_randuvect3(int32_t *seed); - ams::vect4 dpr32_randuvect4(int32_t *seed); + ams::vect2 dpr32_randuvect2(narray_rands_t *seed); + ams::vect3 dpr32_randuvect3(narray_rands_t *seed); + ams::vect4 dpr32_randuvect4(narray_rands_t *seed); - ams::vect2f dpr32_randuvect2f(int32_t *seed); - ams::vect3f dpr32_randuvect3f(int32_t *seed); - ams::vect4f dpr32_randuvect4f(int32_t *seed); + ams::vect2f dpr32_randuvect2f(narray_rands_t *seed); + ams::vect3f dpr32_randuvect3f(narray_rands_t *seed); + ams::vect4f dpr32_randuvect4f(narray_rands_t *seed); //////////////////////////////////////////// //Numeric array threaded random generators// //////////////////////////////////////////// - int32_t get_rseed(); - void set_rseed(int32_t seed); + narray_rands_t get_rseed(); + void set_rseed(narray_rands_t seed); void set_rseed_withtimer(); narray narray_rand(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randf(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randgauss(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randgaussf(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randint(narray_size_t N, int low, int highexcl, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randuvect2(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randuvect3(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randuvect4(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randuvect2f(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randuvect3f(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); narray narray_randuvect4f(narray_size_t N, - int32_t *rseed = &(ams::narray::rand::dpr32_rseed)); + narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed)); void test_random1(); diff --git a/src/amscppnarray/amscppnarray_math.cpp b/src/amscppnarray/amscppnarray_math.cpp index d7353ee..876ddd0 100644 --- a/src/amscppnarray/amscppnarray_math.cpp +++ b/src/amscppnarray/amscppnarray_math.cpp @@ -57,9 +57,19 @@ namespace narray void narray_testmath2() { + rand::narray_rands_t rs = 1943981; rand::set_rseed_withtimer(); + printf("rseed: %d\n",(int)rand::get_rseed()); + printf("rseed: %d\n",(int)rand::dpr32_rseed); //< -- this is different than the line above - narray unif = ams::narray::rand::narray_rand(10000); + //rand::set_rseed(25); + printf("rseed: %d\n",(int)rand::get_rseed()); + + narray unif = ams::narray::rand::narray_rand(5,&rs); + + + printf("rseed: %d\n",(int)rand::get_rseed()); + double mn1 = narray_mean(unif); double std1 = narray_stdev(unif); double mn2,std2; @@ -69,11 +79,14 @@ namespace narray //_intl_printarr(unif); printf("\n"); unif = unif*2.0-1.0; + //unif.setall(3.5); //_intl_printarr(unif); printf("\n"); mn2 = narray_mean(unif); std2 = narray_stdev(unif); + + printf("mn1=%1.3f std1=%1.3f\n",mn1,std1); printf("mn2=%1.3f std2=%1.3f\n",mn2,std2); diff --git a/src/amscppnarray/amscppnarray_random.cpp b/src/amscppnarray/amscppnarray_random.cpp index 87d5eeb..225e445 100644 --- a/src/amscppnarray/amscppnarray_random.cpp +++ b/src/amscppnarray/amscppnarray_random.cpp @@ -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 void narray_rand_threadf1( narray *out, - narray *rseeds, - T (*randfunc)(int32_t *), + narray *rseeds, + T (*randfunc)(narray_rands_t *), int threadnum, int nthreads ) @@ -170,15 +175,15 @@ namespace rand template void narray_random_threadexec1( narray *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 threads; - narray rseeds; + narray 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 narray_rand(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -260,7 +266,7 @@ namespace rand } narray narray_randf(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -281,7 +287,7 @@ namespace rand } narray narray_randgauss(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -302,7 +308,7 @@ namespace rand } narray narray_randgaussf(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -323,7 +329,7 @@ namespace rand } narray narray_randuvect2(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -344,7 +350,7 @@ namespace rand } narray narray_randuvect3(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -365,7 +371,7 @@ namespace rand } narray narray_randuvect4(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -386,7 +392,7 @@ namespace rand } narray narray_randuvect2f(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -407,7 +413,7 @@ namespace rand } narray narray_randuvect3f(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray ret; @@ -428,7 +434,7 @@ namespace rand } narray narray_randuvect4f(narray_size_t N, - int32_t *rseed) + narray_rands_t *rseed) { narray 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 void narray_rand_threadf2( narray *out, - narray *rseeds, - T (*randfunc)(int32_t *, T, T), + narray *rseeds, + T (*randfunc)(narray_rands_t *, T, T), T low, T highexcl, int threadnum, @@ -487,17 +493,17 @@ namespace rand template void narray_random_threadexec2( narray *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 threads; - narray rseeds; + narray rseeds; int res; res = out->resize(N); @@ -559,7 +565,7 @@ namespace rand } narray narray_randint(narray_size_t N, int low, int highexcl, - int32_t *rseed) + narray_rands_t *rseed) { narray ret;