Merge remote-tracking branch 'origin/fix-seed-physim-script' into integration_2022_wk51
This commit is contained in:
@@ -26,21 +26,7 @@
|
||||
//#include "PHY/defs.h"
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
#include "rf.h"
|
||||
/*
|
||||
extern void randominit(void);
|
||||
extern double gaussdouble(double,double);
|
||||
//free(input_data);
|
||||
|
||||
//extern int LOG_M(const char *,const char *,void *,int,int,char);
|
||||
//flag change
|
||||
extern int LOG_M(const char *,const char *,void *,int,int,char);
|
||||
*/
|
||||
|
||||
//double pn[1024];
|
||||
|
||||
//#define DEBUG_RF 1
|
||||
|
||||
//free(input_data);
|
||||
void rf_rx(double **r_re,
|
||||
double **r_im,
|
||||
double **r_re_i1,
|
||||
|
||||
@@ -26,57 +26,67 @@
|
||||
|
||||
#include "sim.h"
|
||||
|
||||
static unsigned int seed, iy, ir[98];
|
||||
static unsigned int urseed, iy, ir[98]; /// uniformrandom
|
||||
static bool tableNordDone = false; /// gaussZiggurat
|
||||
|
||||
/*!\brief Generate a random number form `/dev/urandom`. */
|
||||
void fill_random(void *buf, size_t sz)
|
||||
{
|
||||
const char* fn = "/dev/urandom";
|
||||
FILE* f = fopen(fn, "rb");
|
||||
if (f == NULL) {
|
||||
fprintf(stderr, "could not open %s for seed generation: %d %s\n", fn, errno, strerror(errno));
|
||||
abort();
|
||||
}
|
||||
int rc = fread(buf, sz, 1, f);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "could not read %s for seed generation: %d %s\n", fn, errno, strerror(errno));
|
||||
abort();
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
|
||||
static const unsigned int a = 1664525lu;
|
||||
|
||||
/*!\brief Initialization routine for Uniform/Gaussian random number generators. */
|
||||
void randominit(unsigned long seed_init)
|
||||
{
|
||||
unsigned long seed = seed_init;
|
||||
if (seed_init == 0)
|
||||
fill_random(&seed, sizeof(seed));
|
||||
printf("Initializing random number generator, seed %ld\n", seed);
|
||||
|
||||
// initialize uniformrandom RNG
|
||||
urseed = (unsigned int) seed;
|
||||
if (urseed % 2 == 0)
|
||||
urseed += 1; /* urseed and mod are relative prime */
|
||||
for (int i = 1; i <= 97; i++) {
|
||||
urseed = a * urseed; /* mod 2**32 */
|
||||
ir[i] = urseed; /* initialize the shuffle table */
|
||||
}
|
||||
iy = 1;
|
||||
|
||||
// initialize gaussZiggurat RNG
|
||||
tableNor(seed);
|
||||
tableNordDone = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@defgroup _uniformdouble
|
||||
@ingroup numerical Uniform linear congruential random number generator.
|
||||
*/
|
||||
|
||||
/*!\brief Initialization routine for Uniform/Gaussian random number generators. */
|
||||
|
||||
#define a 1664525lu
|
||||
#define mod 4294967296.0 /* is 2**32 */
|
||||
|
||||
#if 1
|
||||
void randominit(unsigned seed_init)
|
||||
{
|
||||
int i;
|
||||
// this need to be integrated with the existing rng, like taus: navid
|
||||
|
||||
if (seed_init == 0) {
|
||||
srand((unsigned)time(NULL));
|
||||
|
||||
seed = (unsigned int) rand();
|
||||
} else {
|
||||
seed = seed_init;
|
||||
}
|
||||
printf("Initializing random number generator, seed %x\n",seed);
|
||||
|
||||
if (seed % 2 == 0) seed += 1; /* seed and mod are relative prime */
|
||||
|
||||
for (i=1; i<=97; i++) {
|
||||
seed = a*seed; /* mod 2**32 */
|
||||
ir[i]= seed; /* initialize the shuffle table */
|
||||
}
|
||||
|
||||
iy=1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!\brief Uniform linear congruential random number generator on \f$[0,1)\f$. Returns a double-precision floating-point number.*/
|
||||
|
||||
double uniformrandom(void)
|
||||
{
|
||||
#define a 1664525lu
|
||||
#define mod 4294967296.0 /* is 2**32 */
|
||||
|
||||
int j;
|
||||
|
||||
j=1 + 97.0*iy/mod;
|
||||
iy=ir[j];
|
||||
seed = a*seed; /* mod 2**32 */
|
||||
ir[j] = seed;
|
||||
return( (double) iy/mod );
|
||||
const double mod = 4294967296.0; /* is 2**32 */
|
||||
int j = 1 + 97.0 * iy / mod;
|
||||
iy = ir[j];
|
||||
urseed = a * urseed; /* mod 2**32 */
|
||||
ir[j] = urseed;
|
||||
return (double)iy / mod;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -109,8 +119,12 @@ double __attribute__ ((no_sanitize_address)) gaussdouble(double mean, double var
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@defgroup _gaussZiggurat
|
||||
@ingroup numerical ziggurat random number generator for exponentially distributed numbers
|
||||
*/
|
||||
// Ziggurat
|
||||
static bool tableNordDone=false;
|
||||
static double wn[128], fn[128];
|
||||
static uint32_t iz, jz, jsr = 123456789, kn[128];
|
||||
static int32_t hz;
|
||||
@@ -180,9 +194,9 @@ double __attribute__ ((no_sanitize_address)) gaussZiggurat(double mean, double v
|
||||
{
|
||||
if (!tableNordDone) {
|
||||
// let's make reasonnable constant tables
|
||||
struct timespec t;
|
||||
clock_gettime(CLOCK_MONOTONIC, &t);
|
||||
tableNor((long)(t.tv_nsec%INT_MAX));
|
||||
unsigned long seed;
|
||||
fill_random(&seed, sizeof(seed));
|
||||
tableNor(seed);
|
||||
}
|
||||
hz = SHR3;
|
||||
iz = hz & 127;
|
||||
|
||||
@@ -523,8 +523,9 @@ the value \f$\mathrm{sgn}(u)i\f$. The search requires at most \f$Nbits-1\f$ com
|
||||
*/
|
||||
int gauss(unsigned int *gauss_LUT,unsigned char Nbits);
|
||||
|
||||
void fill_random(void *buf, size_t sz);
|
||||
double gaussdouble(double,double);
|
||||
void randominit(unsigned int seed_init);
|
||||
void randominit(unsigned long seed_init);
|
||||
double uniformrandom(void);
|
||||
double gaussZiggurat(double mean, double variance);
|
||||
void tableNor(unsigned long seed);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
//#include "SIMULATION/TOOLS/sim.h"
|
||||
#include "sim.h"
|
||||
|
||||
|
||||
static unsigned int s0, s1, s2;
|
||||
@@ -52,20 +52,9 @@ void set_taus_seed(unsigned int seed_init)
|
||||
unsigned long result = 0;
|
||||
|
||||
if (seed_init == 0) {
|
||||
unsigned int data[3];
|
||||
int fd = open("/dev/urandom", O_RDONLY);
|
||||
if (fd == -1)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
if (read(fd, data, sizeof(data)) != sizeof(data))
|
||||
{
|
||||
abort();
|
||||
}
|
||||
close(fd);
|
||||
s0 = data[0];
|
||||
s1 = data[1];
|
||||
s2 = data[2];
|
||||
fill_random(&s0, sizeof(s0));
|
||||
fill_random(&s1, sizeof(s1));
|
||||
fill_random(&s2, sizeof(s2));
|
||||
} else {
|
||||
/* Use reentrant version of rand48 to ensure that no conflicts with other generators occur */
|
||||
srand48_r((long int)seed_init, &buffer);
|
||||
|
||||
Reference in New Issue
Block a user