Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c301fd1

Browse files
Checking for valid RNG state
1 parent 5bfb234 commit c301fd1

File tree

3 files changed

+22
-11
lines changed

3 files changed

+22
-11
lines changed

THRandom.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ static THGenerator* THGenerator_newUnseeded()
1616
THGenerator *self = THAlloc(sizeof(THGenerator));
1717
memset(self, 0, sizeof(THGenerator));
1818
self->left = 1;
19-
self->initf = 0;
19+
self->seeded = 0;
2020
self->normal_is_valid = 0;
2121
return self;
2222
}
@@ -118,7 +118,7 @@ unsigned long THRandom_seed(THGenerator *_generator)
118118
*/
119119

120120
/* Macros for the Mersenne Twister random generator... */
121-
/* Period parameters */
121+
/* Period parameters */
122122
/* #define n 624 */
123123
/* #define m 397 */
124124
#define MATRIX_A 0x9908b0dfUL /* constant vector a */
@@ -149,7 +149,7 @@ void THRandom_manualSeed(THGenerator *_generator, unsigned long the_seed_)
149149
_generator->state[j] &= 0xffffffffUL; /* for >32 bit machines */
150150
}
151151
_generator->left = 1;
152-
_generator->initf = 1;
152+
_generator->seeded = 1;
153153
}
154154

155155
unsigned long THRandom_initialSeed(THGenerator *_generator)
@@ -164,24 +164,34 @@ void THRandom_nextState(THGenerator *_generator)
164164

165165
_generator->left = n;
166166
_generator->next = 0;
167-
168-
for(j = n-m+1; --j; p++)
167+
168+
for(j = n-m+1; --j; p++)
169169
*p = p[m] ^ TWIST(p[0], p[1]);
170170

171-
for(j = m; --j; p++)
171+
for(j = m; --j; p++)
172172
*p = p[m-n] ^ TWIST(p[0], p[1]);
173173

174174
*p = p[m-n] ^ TWIST(p[0], _generator->state[0]);
175175
}
176176

177+
int THRandom_isValidState(THGenerator *_generator)
178+
{
179+
if ((_generator->seeded == 1) &&
180+
(_generator->left > 0 && _generator->left <= n) &&
181+
(_generator->next >= 0 && _generator->next <= n))
182+
return 1;
183+
184+
return 0;
185+
}
186+
177187
unsigned long THRandom_random(THGenerator *_generator)
178188
{
179189
unsigned long y;
180190

181191
if (--(_generator->left) == 0)
182192
THRandom_nextState(_generator);
183193
y = *(_generator->state + (_generator->next)++);
184-
194+
185195
/* Tempering */
186196
y ^= (y >> 11);
187197
y ^= (y << 7) & 0x9d2c5680UL;
@@ -205,8 +215,8 @@ static double __uniform__(THGenerator *_generator)
205215
y ^= (y << 7) & 0x9d2c5680UL;
206216
y ^= (y << 15) & 0xefc60000UL;
207217
y ^= (y >> 18);
208-
209-
return (double)y * (1.0/4294967296.0);
218+
219+
return (double)y * (1.0/4294967296.0);
210220
/* divided by 2^32 */
211221
}
212222

@@ -237,7 +247,7 @@ double THRandom_normal(THGenerator *_generator, double mean, double stdv)
237247
}
238248
else
239249
_generator->normal_is_valid = 0;
240-
250+
241251
if(_generator->normal_is_valid)
242252
return _generator->normal_rho*cos(2.*M_PI*_generator->normal_x)*stdv+mean;
243253
else

THRandom.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ typedef struct THGenerator {
1010
/* The initial seed. */
1111
unsigned long the_initial_seed;
1212
int left; /* = 1; */
13-
int initf; /* = 0; */
13+
int seeded; /* = 0; */
1414
unsigned long next;
1515
unsigned long state[_MERSENNE_STATE_N]; /* the array for the state vector */
1616
/********************************/

generic/THTensorRandom.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ TH_API void THTensor_(setRNGState)(THGenerator *_generator, THTensor *self)
229229
THArgCheck(THTensor_(nElement)(self) == size, 1, "RNG state is wrong size");
230230
THArgCheck(THTensor_(isContiguous)(self), 1, "RNG state needs to be contiguous");
231231
rng_state = (THGenerator *)THTensor_(data)(self);
232+
THArgCheck(THRandom_isValidState(rng_state), 1, "Invalid RNG state");
232233
THGenerator_copy(_generator, rng_state);
233234
}
234235
#endif

0 commit comments

Comments
 (0)