| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#include |
|
2
|
|
|
|
|
|
|
#include |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
// additional c code goes here |
|
5
|
|
|
|
|
|
|
typedef struct { uint64_t state; uint64_t inc; } pcg_random_t; |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////// |
|
8
|
|
|
|
|
|
|
// Private methods |
|
9
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////// |
|
10
|
|
|
|
|
|
|
|
|
11
|
110323
|
|
|
|
|
|
static uint32_t pcg32_random_r(pcg_random_t* rng) { |
|
12
|
110323
|
|
|
|
|
|
uint64_t oldstate = rng->state; |
|
13
|
|
|
|
|
|
|
// Advance internal state |
|
14
|
110323
|
|
|
|
|
|
rng->state = oldstate * 6364136223846793005ULL + (rng->inc|1); |
|
15
|
|
|
|
|
|
|
// Calculate output function (XSH RR), uses old state for max ILP |
|
16
|
110323
|
|
|
|
|
|
uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; |
|
17
|
110323
|
|
|
|
|
|
uint32_t rot = oldstate >> 59u; |
|
18
|
110323
|
|
|
|
|
|
return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); |
|
19
|
|
|
|
|
|
|
} |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
// PCG64 RXS-M-XS variant |
|
22
|
50317
|
|
|
|
|
|
static inline uint64_t pcg64_random_r(pcg_random_t* rng) { |
|
23
|
|
|
|
|
|
|
//printf("PCG64: %llu / %llu\n", rng->state, rng->inc); |
|
24
|
|
|
|
|
|
|
|
|
25
|
50317
|
|
|
|
|
|
uint64_t num = ((rng->state >> ((rng->state >> 59) + 5)) ^ rng->state) * 12605985483714917081ull; |
|
26
|
50317
|
|
|
|
|
|
rng->state = rng->state * 6364136223846793005ull + rng->inc; |
|
27
|
|
|
|
|
|
|
|
|
28
|
50317
|
|
|
|
|
|
return (num >> 43) ^ num; |
|
29
|
|
|
|
|
|
|
} |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////// |
|
32
|
|
|
|
|
|
|
// Public methods |
|
33
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////// |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
pcg_random_t one; |
|
36
|
|
|
|
|
|
|
|
|
37
|
20
|
|
|
|
|
|
static void _seed(uint64_t seed1, uint64_t seed2) { |
|
38
|
20
|
|
|
|
|
|
one.state = seed1; |
|
39
|
20
|
|
|
|
|
|
one.inc = seed2; |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
//printf("One: %lu / %lu\n", one.state, one.inc); |
|
42
|
20
|
|
|
|
|
|
} |
|
43
|
|
|
|
|
|
|
|
|
44
|
50317
|
|
|
|
|
|
static uint64_t _rand64() { |
|
45
|
50317
|
|
|
|
|
|
uint64_t ret = pcg64_random_r(&one); |
|
46
|
|
|
|
|
|
|
|
|
47
|
50317
|
|
|
|
|
|
return ret; |
|
48
|
|
|
|
|
|
|
} |
|
49
|
|
|
|
|
|
|
|
|
50
|
110323
|
|
|
|
|
|
static uint32_t _rand32() { |
|
51
|
110323
|
|
|
|
|
|
uint32_t ret = pcg32_random_r(&one); |
|
52
|
|
|
|
|
|
|
|
|
53
|
110323
|
|
|
|
|
|
return ret; |
|
54
|
|
|
|
|
|
|
} |