Skip to content

Commit 0b18c24

Browse files
committed
Rename file and add support for getting and setting PRNG state
1 parent 1bc9490 commit 0b18c24

File tree

8 files changed

+236
-39
lines changed

8 files changed

+236
-39
lines changed

lib/node_modules/@stdlib/random/base/chisquare/README.md

+45
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,51 @@ for ( i = 0; i < 100; i++ ) {
150150
}
151151
```
152152

153+
#### chisquare.STATE
154+
155+
Writable property for getting and setting the generator state.
156+
157+
```javascript
158+
var r = chisquare( 2 );
159+
// returns <number>
160+
161+
r = chisquare( 2 );
162+
// returns <number>
163+
164+
// ...
165+
166+
// Get a copy of the current state:
167+
var state = chisquare.STATE;
168+
// returns <Uint32Array>
169+
170+
r = chisquare( 2 );
171+
// returns <number>
172+
173+
r = chisquare( 2 );
174+
// returns <number>
175+
176+
// Reset the state:
177+
chisquare.STATE = state;
178+
179+
// Replay the last two pseudorandom numbers:
180+
r = chisquare( 2 );
181+
// returns <number>
182+
183+
r = chisquare( 2 );
184+
// returns <number>
185+
186+
// ...
187+
```
188+
189+
#### chisquare.STATE_SIZE
190+
191+
Size of generator state.
192+
193+
```javascript
194+
var sz = chisquare.STATE_SIZE;
195+
// returns <number>
196+
```
197+
153198
</section>
154199

155200
<!-- /.usage -->

lib/node_modules/@stdlib/random/base/chisquare/docs/repl.txt

+39
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,45 @@
8282
--------
8383
> var seed = {{alias}}.SEED;
8484

85+
86+
{{alias}}.STATE
87+
Generator state.
88+
89+
Examples
90+
--------
91+
> var r = {{alias}}( 2 )
92+
<number>
93+
> r = {{alias}}( 2 )
94+
<number>
95+
> r = {{alias}}( 2 )
96+
<number>
97+
98+
// Get a copy of the current state:
99+
> var state = {{alias}}.STATE
100+
<Uint32Array>
101+
102+
> r = {{alias}}( 2 )
103+
<number>
104+
> r = {{alias}}( 2 )
105+
<number>
106+
107+
// Set the state:
108+
> {{alias}}.STATE = state;
109+
110+
// Replay the last two pseudorandom numbers:
111+
> r = {{alias}}( 2 )
112+
<number>
113+
> r = {{alias}}( 2 )
114+
<number>
115+
116+
117+
{{alias}}.STATE_SIZE
118+
Size of generator state.
119+
120+
Examples
121+
--------
122+
> var sz = {{alias}}.STATE_SIZE;
123+
85124
See Also
86125
--------
87126

lib/node_modules/@stdlib/random/base/chisquare/lib/chisquare.js

+7-24
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,19 @@
1818

1919
'use strict';
2020

21-
// MODULES //
22-
23-
var factory = require( './factory.js' );
24-
25-
26-
// MAIN //
27-
2821
/**
29-
* Returns a pseudorandom number drawn from a chi-square distribution with degrees of freedom `k`.
22+
* Returns a pseudorandom number drawn from a chi-square distribution.
3023
*
31-
* @function chisquare
32-
* @type {Function}
24+
* @private
25+
* @param {Function} rgamma - PRNG for gamma distributed numbers
3326
* @param {PositiveNumber} k - degrees of freedom
3427
* @returns {number} pseudorandom number
35-
*
36-
* @example
37-
* var v = chisquare( 2 );
38-
* // returns <number>
39-
*
40-
* @example
41-
* var v = chisquare( 0 );
42-
* // returns NaN
43-
*
44-
* @example
45-
* var v = chisquare( NaN );
46-
* // returns NaN
4728
*/
48-
var chisquare = factory();
29+
function sample( rgamma, k ) {
30+
return rgamma( k/2.0, 0.5 );
31+
}
4932

5033

5134
// EXPORTS //
5235

53-
module.exports = chisquare;
36+
module.exports = sample;

lib/node_modules/@stdlib/random/base/chisquare/lib/factory.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@
2020

2121
// MODULES //
2222

23+
var defineProperty = require( '@stdlib/utils/define-property' );
2324
var setReadOnly = require( '@stdlib/utils/define-read-only-property' );
2425
var isPositive = require( '@stdlib/assert/is-positive-number' ).isPrimitive;
2526
var isObject = require( '@stdlib/assert/is-plain-object' );
2627
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2728
var rgamma = require( '@stdlib/random/base/gamma' ).factory;
28-
var chisquare0 = require( './_chisquare.js' );
29+
var chisquare0 = require( './chisquare.js' );
2930

3031

3132
// MAIN //
@@ -86,10 +87,37 @@ function factory() {
8687
}
8788
setReadOnly( prng, 'NAME', 'chisquare' );
8889
setReadOnly( prng, 'SEED', rand.SEED );
90+
defineProperty( prng, 'STATE', {
91+
'configurable': false,
92+
'enumerable': true,
93+
'get': getState,
94+
'set': setState
95+
});
96+
setReadOnly( prng, 'STATE_SIZE', rand.STATE_SIZE );
8997
setReadOnly( prng, 'PRNG', rand.PRNG );
9098

9199
return prng;
92100

101+
/**
102+
* Returns the current pseudorandom number generator state.
103+
*
104+
* @private
105+
* @returns {Uint32Array} current state
106+
*/
107+
function getState() {
108+
return rand.STATE;
109+
}
110+
111+
/**
112+
* Sets the pseudorandom number generator state.
113+
*
114+
* @private
115+
* @param {Uint32Array} s - generator state
116+
*/
117+
function setState( s ) {
118+
rand.STATE = s;
119+
}
120+
93121
/**
94122
* Returns a random number drawn from a chi-square distribution with bound `k`.
95123
*

lib/node_modules/@stdlib/random/base/chisquare/lib/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
// MODULES //
4444

4545
var setReadOnly = require( '@stdlib/utils/define-read-only-property' );
46-
var chisquare = require( './chisquare.js' );
46+
var chisquare = require( './main.js' );
4747
var factory = require( './factory.js' );
4848

4949

lib/node_modules/@stdlib/random/base/chisquare/lib/_chisquare.js renamed to lib/node_modules/@stdlib/random/base/chisquare/lib/main.js

+24-7
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,36 @@
1818

1919
'use strict';
2020

21+
// MODULES //
22+
23+
var factory = require( './factory.js' );
24+
25+
26+
// MAIN //
27+
2128
/**
22-
* Returns a pseudorandom number drawn from a chi-square distribution.
29+
* Returns a pseudorandom number drawn from a chi-square distribution with degrees of freedom `k`.
2330
*
24-
* @private
25-
* @param {Function} rgamma - PRNG for gamma distributed numbers
31+
* @function chisquare
32+
* @type {Function}
2633
* @param {PositiveNumber} k - degrees of freedom
2734
* @returns {number} pseudorandom number
35+
*
36+
* @example
37+
* var v = chisquare( 2 );
38+
* // returns <number>
39+
*
40+
* @example
41+
* var v = chisquare( 0 );
42+
* // returns NaN
43+
*
44+
* @example
45+
* var v = chisquare( NaN );
46+
* // returns NaN
2847
*/
29-
function sample( rgamma, k ) {
30-
return rgamma( k/2.0, 0.5 );
31-
}
48+
var chisquare = factory();
3249

3350

3451
// EXPORTS //
3552

36-
module.exports = sample;
53+
module.exports = chisquare;

lib/node_modules/@stdlib/random/base/chisquare/test/test.factory.js

+53-6
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323
var tape = require( 'tape' );
2424
var ENV = require( '@stdlib/process/env' );
2525
var kstest = require( '@stdlib/stats/kstest' );
26-
var round = require( '@stdlib/math/base/special/round' );
26+
var now = require( '@stdlib/time/now' );
2727
var isnan = require( '@stdlib/math/base/assert/is-nan' );
28+
var isUint32Array = require( '@stdlib/assert/is-uint32array' );
2829
var factory = require( './../lib/factory.js' );
2930

3031

@@ -73,7 +74,7 @@ tape( 'the function returns a seeded pseudorandom number generator', function te
7374
var r2;
7475
var i;
7576

76-
seed = round( Date.now() / 1000 );
77+
seed = now();
7778

7879
chisquare1 = factory( 35, {
7980
'seed': seed
@@ -113,6 +114,18 @@ tape( 'attached to the returned function is the generator seed', function test(
113114
t.end();
114115
});
115116

117+
tape( 'attached to the returned function is the generator state', function test( t ) {
118+
var chisquare = factory();
119+
t.equal( isUint32Array( chisquare.STATE ), true, 'has `STATE` property' );
120+
t.end();
121+
});
122+
123+
tape( 'attached to the returned function is the generator state size', function test( t ) {
124+
var chisquare = factory();
125+
t.equal( typeof chisquare.STATE_SIZE, 'number', 'has `STATE_SIZE` property' );
126+
t.end();
127+
});
128+
116129
tape( 'the function throws an error if degrees of freedom `k` is not a positive number (no options)', function test( t ) {
117130
var values;
118131
var i;
@@ -123,7 +136,8 @@ tape( 'the function throws an error if degrees of freedom `k` is not a positive
123136
'5',
124137
null,
125138
true,
126-
undefined,
139+
false,
140+
void 0,
127141
NaN,
128142
[],
129143
function noop() {}
@@ -151,7 +165,8 @@ tape( 'the function throws an error if degrees of freedom `k` is not a positive
151165
'5',
152166
null,
153167
true,
154-
undefined,
168+
false,
169+
void 0,
155170
NaN,
156171
[],
157172
{},
@@ -178,7 +193,8 @@ tape( 'the function throws an error if provided an options argument which is no
178193
'abc',
179194
null,
180195
true,
181-
undefined,
196+
false,
197+
void 0,
182198
NaN,
183199
[],
184200
function noop() {}
@@ -205,7 +221,8 @@ tape( 'the function throws an error if provided an options argument which is not
205221
5,
206222
null,
207223
true,
208-
undefined,
224+
false,
225+
void 0,
209226
NaN,
210227
[],
211228
function noop() {}
@@ -320,3 +337,33 @@ tape( 'the function returns a PRNG for generating random numbers from a chi-squa
320337
t.end();
321338
}
322339
});
340+
341+
tape( 'the returned function supports setting the generator state', function test( t ) {
342+
var chisquare;
343+
var state;
344+
var arr;
345+
var i;
346+
347+
chisquare = factory( 4 );
348+
349+
// Move to a future state...
350+
for ( i = 0; i < 100; i++ ) {
351+
chisquare();
352+
}
353+
// Capture the current state:
354+
state = chisquare.STATE;
355+
356+
// Move to a future state...
357+
arr = [];
358+
for ( i = 0; i < 100; i++ ) {
359+
arr.push( chisquare() );
360+
}
361+
// Set the state:
362+
chisquare.STATE = state;
363+
364+
// Replay previously generated values...
365+
for ( i = 0; i < 100; i++ ) {
366+
t.equal( chisquare(), arr[ i ], 'returns expected value. i: '+i+'.' );
367+
}
368+
t.end();
369+
});

0 commit comments

Comments
 (0)