Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
test_smoke.py883 linesDownload Raw Back to tests
1import pickle
2from dataclasses import dataclass
3from functools import partial
4
5import pytest
6
7import numpy as np
8from numpy.random import MT19937, PCG64, PCG64DXSM, SFC64, Generator, Philox
9from numpy.testing import assert_, assert_array_equal, assert_equal
10
11DTYPES_BOOL_INT_UINT = (np.bool, np.int8, np.int16, np.int32, np.int64,
12                        np.uint8, np.uint16, np.uint32, np.uint64)
13
14
15def params_0(f):
16    val = f()
17    assert_(np.isscalar(val))
18    val = f(10)
19    assert_(val.shape == (10,))
20    val = f((10, 10))
21    assert_(val.shape == (10, 10))
22    val = f((10, 10, 10))
23    assert_(val.shape == (10, 10, 10))
24    val = f(size=(5, 5))
25    assert_(val.shape == (5, 5))
26
27
28def params_1(f, bounded=False):
29    a = 5.0
30    b = np.arange(2.0, 12.0)
31    c = np.arange(2.0, 102.0).reshape((10, 10))
32    d = np.arange(2.0, 1002.0).reshape((10, 10, 10))
33    e = np.array([2.0, 3.0])
34    g = np.arange(2.0, 12.0).reshape((1, 10, 1))
35    if bounded:
36        a = 0.5
37        b = b / (1.5 * b.max())
38        c = c / (1.5 * c.max())
39        d = d / (1.5 * d.max())
40        e = e / (1.5 * e.max())
41        g = g / (1.5 * g.max())
42
43    # Scalar
44    f(a)
45    # Scalar - size
46    f(a, size=(10, 10))
47    # 1d
48    f(b)
49    # 2d
50    f(c)
51    # 3d
52    f(d)
53    # 1d size
54    f(b, size=10)
55    # 2d - size - broadcast
56    f(e, size=(10, 2))
57    # 3d - size
58    f(g, size=(10, 10, 10))
59
60
61def comp_state(state1, state2):
62    identical = True
63    if isinstance(state1, dict):
64        for key in state1:
65            identical &= comp_state(state1[key], state2[key])
66    elif type(state1) != type(state2):
67        identical &= type(state1) == type(state2)
68    elif (isinstance(state1, (list, tuple, np.ndarray)) and isinstance(
69            state2, (list, tuple, np.ndarray))):
70        for s1, s2 in zip(state1, state2):
71            identical &= comp_state(s1, s2)
72    else:
73        identical &= state1 == state2
74    return identical
75
76
77def warmup(rg, n=None):
78    if n is None:
79        n = 11 + np.random.randint(0, 20)
80    rg.standard_normal(n)
81    rg.standard_normal(n)
82    rg.standard_normal(n, dtype=np.float32)
83    rg.standard_normal(n, dtype=np.float32)
84    rg.integers(0, 2 ** 24, n, dtype=np.uint64)
85    rg.integers(0, 2 ** 48, n, dtype=np.uint64)
86    rg.standard_gamma(11.0, n)
87    rg.standard_gamma(11.0, n, dtype=np.float32)
88    rg.random(n, dtype=np.float64)
89    rg.random(n, dtype=np.float32)
90
91
92@dataclass
93class RNGData:
94    bit_generator: type[np.random.BitGenerator]
95    advance: int
96    seed: list[int]
97    rg: Generator
98    seed_vector_bits: int
99
100
101class RNG:
102    @classmethod
103    def _create_rng(cls):
104        # Overridden in test classes. Place holder to silence IDE noise
105        bit_generator = PCG64
106        advance = None
107        seed = [12345]
108        rg = Generator(bit_generator(*seed))
109        seed_vector_bits = 64
110        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
111
112    def test_init(self):
113        data = self._create_rng()
114        data.rg = Generator(data.bit_generator())
115        state = data.rg.bit_generator.state
116        data.rg.standard_normal(1)
117        data.rg.standard_normal(1)
118        data.rg.bit_generator.state = state
119        new_state = data.rg.bit_generator.state
120        assert_(comp_state(state, new_state))
121
122    def test_advance(self):
123        data = self._create_rng()
124        state = data.rg.bit_generator.state
125        if hasattr(data.rg.bit_generator, 'advance'):
126            data.rg.bit_generator.advance(data.advance)
127            assert_(not comp_state(state, data.rg.bit_generator.state))
128        else:
129            bitgen_name = data.rg.bit_generator.__class__.__name__
130            pytest.skip(f'Advance is not supported by {bitgen_name}')
131
132    def test_jump(self):
133        rg = self._create_rng().rg
134        state = rg.bit_generator.state
135        if hasattr(rg.bit_generator, 'jumped'):
136            bit_gen2 = rg.bit_generator.jumped()
137            jumped_state = bit_gen2.state
138            assert_(not comp_state(state, jumped_state))
139            rg.random(2 * 3 * 5 * 7 * 11 * 13 * 17)
140            rg.bit_generator.state = state
141            bit_gen3 = rg.bit_generator.jumped()
142            rejumped_state = bit_gen3.state
143            assert_(comp_state(jumped_state, rejumped_state))
144        else:
145            bitgen_name = rg.bit_generator.__class__.__name__
146            if bitgen_name not in ('SFC64',):
147                raise AttributeError(f'no "jumped" in {bitgen_name}')
148            pytest.skip(f'Jump is not supported by {bitgen_name}')
149
150    def test_uniform(self):
151        rg = self._create_rng().rg
152        r = rg.uniform(-1.0, 0.0, size=10)
153        assert_(len(r) == 10)
154        assert_((r > -1).all())
155        assert_((r <= 0).all())
156
157    def test_uniform_array(self):
158        rg = self._create_rng().rg
159        r = rg.uniform(np.array([-1.0] * 10), 0.0, size=10)
160        assert_(len(r) == 10)
161        assert_((r > -1).all())
162        assert_((r <= 0).all())
163        r = rg.uniform(np.array([-1.0] * 10),
164                            np.array([0.0] * 10), size=10)
165        assert_(len(r) == 10)
166        assert_((r > -1).all())
167        assert_((r <= 0).all())
168        r = rg.uniform(-1.0, np.array([0.0] * 10), size=10)
169        assert_(len(r) == 10)
170        assert_((r > -1).all())
171        assert_((r <= 0).all())
172
173    def test_random(self):
174        rg = self._create_rng().rg
175        assert_(len(rg.random(10)) == 10)
176        params_0(rg.random)
177
178    def test_standard_normal_zig(self):
179        rg = self._create_rng().rg
180        assert_(len(rg.standard_normal(10)) == 10)
181
182    def test_standard_normal(self):
183        rg = self._create_rng().rg
184        assert_(len(rg.standard_normal(10)) == 10)
185        params_0(rg.standard_normal)
186
187    def test_standard_gamma(self):
188        rg = self._create_rng().rg
189        assert_(len(rg.standard_gamma(10, 10)) == 10)
190        assert_(len(rg.standard_gamma(np.array([10] * 10), 10)) == 10)
191        params_1(rg.standard_gamma)
192
193    def test_standard_exponential(self):
194        rg = self._create_rng().rg
195        assert_(len(rg.standard_exponential(10)) == 10)
196        params_0(rg.standard_exponential)
197
198    def test_standard_exponential_float(self):
199        rg = self._create_rng().rg
200        randoms = rg.standard_exponential(10, dtype='float32')
201        assert_(len(randoms) == 10)
202        assert randoms.dtype == np.float32
203        params_0(partial(rg.standard_exponential, dtype='float32'))
204
205    def test_standard_exponential_float_log(self):
206        rg = self._create_rng().rg
207        randoms = rg.standard_exponential(10, dtype='float32',
208                                               method='inv')
209        assert_(len(randoms) == 10)
210        assert randoms.dtype == np.float32
211        params_0(partial(rg.standard_exponential, dtype='float32',
212                         method='inv'))
213
214    def test_standard_cauchy(self):
215        rg = self._create_rng().rg
216        assert_(len(rg.standard_cauchy(10)) == 10)
217        params_0(rg.standard_cauchy)
218
219    def test_standard_t(self):
220        rg = self._create_rng().rg
221        assert_(len(rg.standard_t(10, 10)) == 10)
222        params_1(rg.standard_t)
223
224    def test_binomial(self):
225        rg = self._create_rng().rg
226        assert_(rg.binomial(10, .5) >= 0)
227        assert_(rg.binomial(1000, .5) >= 0)
228
229    def test_reset_state(self):
230        rg = self._create_rng().rg
231        state = rg.bit_generator.state
232        int_1 = rg.integers(2**31)
233        rg.bit_generator.state = state
234        int_2 = rg.integers(2**31)
235        assert_(int_1 == int_2)
236
237    def test_entropy_init(self):
238        bit_generator = self._create_rng().bit_generator
239        rg = Generator(bit_generator())
240        rg2 = Generator(bit_generator())
241        assert_(not comp_state(rg.bit_generator.state,
242                               rg2.bit_generator.state))
243
244    def test_seed(self):
245        data = self._create_rng()
246        rg = Generator(data.bit_generator(*data.seed))
247        rg2 = Generator(data.bit_generator(*data.seed))
248        rg.random()
249        rg2.random()
250        assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state))
251
252    def test_reset_state_gauss(self):
253        data = self._create_rng()
254        rg = Generator(data.bit_generator(*data.seed))
255        rg.standard_normal()
256        state = rg.bit_generator.state
257        n1 = rg.standard_normal(size=10)
258        rg2 = Generator(data.bit_generator())
259        rg2.bit_generator.state = state
260        n2 = rg2.standard_normal(size=10)
261        assert_array_equal(n1, n2)
262
263    def test_reset_state_uint32(self):
264        data = self._create_rng()
265        rg = Generator(data.bit_generator(*data.seed))
266        rg.integers(0, 2 ** 24, 120, dtype=np.uint32)
267        state = rg.bit_generator.state
268        n1 = rg.integers(0, 2 ** 24, 10, dtype=np.uint32)
269        rg2 = Generator(data.bit_generator())
270        rg2.bit_generator.state = state
271        n2 = rg2.integers(0, 2 ** 24, 10, dtype=np.uint32)
272        assert_array_equal(n1, n2)
273
274    def test_reset_state_float(self):
275        data = self._create_rng()
276        rg = Generator(data.bit_generator(*data.seed))
277        rg.random(dtype='float32')
278        state = rg.bit_generator.state
279        n1 = rg.random(size=10, dtype='float32')
280        rg2 = Generator(data.bit_generator())
281        rg2.bit_generator.state = state
282        n2 = rg2.random(size=10, dtype='float32')
283        assert_((n1 == n2).all())
284
285    def test_shuffle(self):
286        rg = self._create_rng().rg
287        original = np.arange(200, 0, -1)
288        permuted = rg.permutation(original)
289        assert_((original != permuted).any())
290
291    def test_permutation(self):
292        rg = self._create_rng().rg
293        original = np.arange(200, 0, -1)
294        permuted = rg.permutation(original)
295        assert_((original != permuted).any())
296
297    def test_beta(self):
298        rg = self._create_rng().rg
299        vals = rg.beta(2.0, 2.0, 10)
300        assert_(len(vals) == 10)
301        vals = rg.beta(np.array([2.0] * 10), 2.0)
302        assert_(len(vals) == 10)
303        vals = rg.beta(2.0, np.array([2.0] * 10))
304        assert_(len(vals) == 10)
305        vals = rg.beta(np.array([2.0] * 10), np.array([2.0] * 10))
306        assert_(len(vals) == 10)
307        vals = rg.beta(np.array([2.0] * 10), np.array([[2.0]] * 10))
308        assert_(vals.shape == (10, 10))
309
310    def test_bytes(self):
311        rg = self._create_rng().rg
312        vals = rg.bytes(10)
313        assert_(len(vals) == 10)
314
315    def test_chisquare(self):
316        rg = self._create_rng().rg
317        vals = rg.chisquare(2.0, 10)
318        assert_(len(vals) == 10)
319        params_1(rg.chisquare)
320
321    def test_exponential(self):
322        rg = self._create_rng().rg
323        vals = rg.exponential(2.0, 10)
324        assert_(len(vals) == 10)
325        params_1(rg.exponential)
326
327    def test_f(self):
328        rg = self._create_rng().rg
329        vals = rg.f(3, 1000, 10)
330        assert_(len(vals) == 10)
331
332    def test_gamma(self):
333        rg = self._create_rng().rg
334        vals = rg.gamma(3, 2, 10)
335        assert_(len(vals) == 10)
336
337    def test_geometric(self):
338        rg = self._create_rng().rg
339        vals = rg.geometric(0.5, 10)
340        assert_(len(vals) == 10)
341        params_1(rg.exponential, bounded=True)
342
343    def test_gumbel(self):
344        rg = self._create_rng().rg
345        vals = rg.gumbel(2.0, 2.0, 10)
346        assert_(len(vals) == 10)
347
348    def test_laplace(self):
349        rg = self._create_rng().rg
350        vals = rg.laplace(2.0, 2.0, 10)
351        assert_(len(vals) == 10)
352
353    def test_logitic(self):
354        rg = self._create_rng().rg
355        vals = rg.logistic(2.0, 2.0, 10)
356        assert_(len(vals) == 10)
357
358    def test_logseries(self):
359        rg = self._create_rng().rg
360        vals = rg.logseries(0.5, 10)
361        assert_(len(vals) == 10)
362
363    def test_negative_binomial(self):
364        rg = self._create_rng().rg
365        vals = rg.negative_binomial(10, 0.2, 10)
366        assert_(len(vals) == 10)
367
368    def test_noncentral_chisquare(self):
369        rg = self._create_rng().rg
370        vals = rg.noncentral_chisquare(10, 2, 10)
371        assert_(len(vals) == 10)
372
373    def test_noncentral_f(self):
374        rg = self._create_rng().rg
375        vals = rg.noncentral_f(3, 1000, 2, 10)
376        assert_(len(vals) == 10)
377        vals = rg.noncentral_f(np.array([3] * 10), 1000, 2)
378        assert_(len(vals) == 10)
379        vals = rg.noncentral_f(3, np.array([1000] * 10), 2)
380        assert_(len(vals) == 10)
381        vals = rg.noncentral_f(3, 1000, np.array([2] * 10))
382        assert_(len(vals) == 10)
383
384    def test_normal(self):
385        rg = self._create_rng().rg
386        vals = rg.normal(10, 0.2, 10)
387        assert_(len(vals) == 10)
388
389    def test_pareto(self):
390        rg = self._create_rng().rg
391        vals = rg.pareto(3.0, 10)
392        assert_(len(vals) == 10)
393
394    def test_poisson(self):
395        rg = self._create_rng().rg
396        vals = rg.poisson(10, 10)
397        assert_(len(vals) == 10)
398        vals = rg.poisson(np.array([10] * 10))
399        assert_(len(vals) == 10)
400        params_1(rg.poisson)
401
402    def test_power(self):
403        rg = self._create_rng().rg
404        vals = rg.power(0.2, 10)
405        assert_(len(vals) == 10)
406
407    def test_integers(self):
408        rg = self._create_rng().rg
409        vals = rg.integers(10, 20, 10)
410        assert_(len(vals) == 10)
411
412    def test_rayleigh(self):
413        rg = self._create_rng().rg
414        vals = rg.rayleigh(0.2, 10)
415        assert_(len(vals) == 10)
416        params_1(rg.rayleigh, bounded=True)
417
418    def test_vonmises(self):
419        rg = self._create_rng().rg
420        vals = rg.vonmises(10, 0.2, 10)
421        assert_(len(vals) == 10)
422
423    def test_wald(self):
424        rg = self._create_rng().rg
425        vals = rg.wald(1.0, 1.0, 10)
426        assert_(len(vals) == 10)
427
428    def test_weibull(self):
429        rg = self._create_rng().rg
430        vals = rg.weibull(1.0, 10)
431        assert_(len(vals) == 10)
432
433    def test_zipf(self):
434        rg = self._create_rng().rg
435        vec_1d = np.arange(2.0, 102.0)
436        vec_2d = np.arange(2.0, 102.0)[None, :]
437        mat = np.arange(2.0, 102.0, 0.01).reshape((100, 100))
438        vals = rg.zipf(10, 10)
439        assert_(len(vals) == 10)
440        vals = rg.zipf(vec_1d)
441        assert_(len(vals) == 100)
442        vals = rg.zipf(vec_2d)
443        assert_(vals.shape == (1, 100))
444        vals = rg.zipf(mat)
445        assert_(vals.shape == (100, 100))
446
447    def test_hypergeometric(self):
448        rg = self._create_rng().rg
449        vals = rg.hypergeometric(25, 25, 20)
450        assert_(np.isscalar(vals))
451        vals = rg.hypergeometric(np.array([25] * 10), 25, 20)
452        assert_(vals.shape == (10,))
453
454    def test_triangular(self):
455        rg = self._create_rng().rg
456        vals = rg.triangular(-5, 0, 5)
457        assert_(np.isscalar(vals))
458        vals = rg.triangular(-5, np.array([0] * 10), 5)
459        assert_(vals.shape == (10,))
460
461    def test_multivariate_normal(self):
462        rg = self._create_rng().rg
463        mean = [0, 0]
464        cov = [[1, 0], [0, 100]]  # diagonal covariance
465        x = rg.multivariate_normal(mean, cov, 5000)
466        assert_(x.shape == (5000, 2))
467        x_zig = rg.multivariate_normal(mean, cov, 5000)
468        assert_(x.shape == (5000, 2))
469        x_inv = rg.multivariate_normal(mean, cov, 5000)
470        assert_(x.shape == (5000, 2))
471        assert_((x_zig != x_inv).any())
472
473    def test_multinomial(self):
474        rg = self._create_rng().rg
475        vals = rg.multinomial(100, [1.0 / 3, 2.0 / 3])
476        assert_(vals.shape == (2,))
477        vals = rg.multinomial(100, [1.0 / 3, 2.0 / 3], size=10)
478        assert_(vals.shape == (10, 2))
479
480    def test_dirichlet(self):
481        rg = self._create_rng().rg
482        s = rg.dirichlet((10, 5, 3), 20)
483        assert_(s.shape == (20, 3))
484
485    def test_pickle(self):
486        rg = self._create_rng().rg
487        pick = pickle.dumps(rg)
488        unpick = pickle.loads(pick)
489        assert_(type(rg) == type(unpick))
490        assert_(comp_state(rg.bit_generator.state,
491                           unpick.bit_generator.state))
492
493        pick = pickle.dumps(rg)
494        unpick = pickle.loads(pick)
495        assert_(type(rg) == type(unpick))
496        assert_(comp_state(rg.bit_generator.state,
497                           unpick.bit_generator.state))
498
499    def test_seed_array(self):
500        data = self._create_rng()
501        if data.seed_vector_bits is None:
502            bitgen_name = data.bit_generator.__name__
503            pytest.skip(f'Vector seeding is not supported by {bitgen_name}')
504
505        if data.seed_vector_bits == 32:
506            dtype = np.uint32
507        else:
508            dtype = np.uint64
509        seed = np.array([1], dtype=dtype)
510        bg = data.bit_generator(seed)
511        state1 = bg.state
512        bg = data.bit_generator(1)
513        state2 = bg.state
514        assert_(comp_state(state1, state2))
515
516        seed = np.arange(4, dtype=dtype)
517        bg = data.bit_generator(seed)
518        state1 = bg.state
519        bg = data.bit_generator(seed[0])
520        state2 = bg.state
521        assert_(not comp_state(state1, state2))
522
523        seed = np.arange(1500, dtype=dtype)
524        bg = data.bit_generator(seed)
525        state1 = bg.state
526        bg = data.bit_generator(seed[0])
527        state2 = bg.state
528        assert_(not comp_state(state1, state2))
529
530        seed = 2 ** np.mod(np.arange(1500, dtype=dtype),
531                           data.seed_vector_bits - 1) + 1
532        bg = data.bit_generator(seed)
533        state1 = bg.state
534        bg = data.bit_generator(seed[0])
535        state2 = bg.state
536        assert_(not comp_state(state1, state2))
537
538    def test_uniform_float(self):
539        bit_generator = self._create_rng().bit_generator
540        rg = Generator(bit_generator(12345))
541        warmup(rg)
542        state = rg.bit_generator.state
543        r1 = rg.random(11, dtype=np.float32)
544        rg2 = Generator(bit_generator())
545        warmup(rg2)
546        rg2.bit_generator.state = state
547        r2 = rg2.random(11, dtype=np.float32)
548        assert_array_equal(r1, r2)
549        assert_equal(r1.dtype, np.float32)
550        assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state))
551
552    def test_gamma_floats(self):
553        bit_generator = self._create_rng().bit_generator
554        rg = Generator(bit_generator())
555        warmup(rg)
556        state = rg.bit_generator.state
557        r1 = rg.standard_gamma(4.0, 11, dtype=np.float32)
558        rg2 = Generator(bit_generator())
559        warmup(rg2)
560        rg2.bit_generator.state = state
561        r2 = rg2.standard_gamma(4.0, 11, dtype=np.float32)
562        assert_array_equal(r1, r2)
563        assert_equal(r1.dtype, np.float32)
564        assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state))
565
566    def test_normal_floats(self):
567        bit_generator = self._create_rng().bit_generator
568        rg = Generator(bit_generator())
569        warmup(rg)
570        state = rg.bit_generator.state
571        r1 = rg.standard_normal(11, dtype=np.float32)
572        rg2 = Generator(bit_generator())
573        warmup(rg2)
574        rg2.bit_generator.state = state
575        r2 = rg2.standard_normal(11, dtype=np.float32)
576        assert_array_equal(r1, r2)
577        assert_equal(r1.dtype, np.float32)
578        assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state))
579
580    def test_normal_zig_floats(self):
581        bit_generator = self._create_rng().bit_generator
582        rg = Generator(bit_generator())
583        warmup(rg)
584        state = rg.bit_generator.state
585        r1 = rg.standard_normal(11, dtype=np.float32)
586        rg2 = Generator(bit_generator())
587        warmup(rg2)
588        rg2.bit_generator.state = state
589        r2 = rg2.standard_normal(11, dtype=np.float32)
590        assert_array_equal(r1, r2)
591        assert_equal(r1.dtype, np.float32)
592        assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state))
593
594    def test_output_fill(self):
595        rg = self._create_rng().rg
596        state = rg.bit_generator.state
597        size = (31, 7, 97)
598        existing = np.empty(size)
599        rg.bit_generator.state = state
600        rg.standard_normal(out=existing)
601        rg.bit_generator.state = state
602        direct = rg.standard_normal(size=size)
603        assert_equal(direct, existing)
604
605        sized = np.empty(size)
606        rg.bit_generator.state = state
607        rg.standard_normal(out=sized, size=sized.shape)
608
609        existing = np.empty(size, dtype=np.float32)
610        rg.bit_generator.state = state
611        rg.standard_normal(out=existing, dtype=np.float32)
612        rg.bit_generator.state = state
613        direct = rg.standard_normal(size=size, dtype=np.float32)
614        assert_equal(direct, existing)
615
616    def test_output_filling_uniform(self):
617        rg = self._create_rng().rg
618        state = rg.bit_generator.state
619        size = (31, 7, 97)
620        existing = np.empty(size)
621        rg.bit_generator.state = state
622        rg.random(out=existing)
623        rg.bit_generator.state = state
624        direct = rg.random(size=size)
625        assert_equal(direct, existing)
626
627        existing = np.empty(size, dtype=np.float32)
628        rg.bit_generator.state = state
629        rg.random(out=existing, dtype=np.float32)
630        rg.bit_generator.state = state
631        direct = rg.random(size=size, dtype=np.float32)
632        assert_equal(direct, existing)
633
634    def test_output_filling_exponential(self):
635        rg = self._create_rng().rg
636        state = rg.bit_generator.state
637        size = (31, 7, 97)
638        existing = np.empty(size)
639        rg.bit_generator.state = state
640        rg.standard_exponential(out=existing)
641        rg.bit_generator.state = state
642        direct = rg.standard_exponential(size=size)
643        assert_equal(direct, existing)
644
645        existing = np.empty(size, dtype=np.float32)
646        rg.bit_generator.state = state
647        rg.standard_exponential(out=existing, dtype=np.float32)
648        rg.bit_generator.state = state
649        direct = rg.standard_exponential(size=size, dtype=np.float32)
650        assert_equal(direct, existing)
651
652    def test_output_filling_gamma(self):
653        rg = self._create_rng().rg
654        state = rg.bit_generator.state
655        size = (31, 7, 97)
656        existing = np.zeros(size)
657        rg.bit_generator.state = state
658        rg.standard_gamma(1.0, out=existing)
659        rg.bit_generator.state = state
660        direct = rg.standard_gamma(1.0, size=size)
661        assert_equal(direct, existing)
662
663        existing = np.zeros(size, dtype=np.float32)
664        rg.bit_generator.state = state
665        rg.standard_gamma(1.0, out=existing, dtype=np.float32)
666        rg.bit_generator.state = state
667        direct = rg.standard_gamma(1.0, size=size, dtype=np.float32)
668        assert_equal(direct, existing)
669
670    def test_output_filling_gamma_broadcast(self):
671        rg = self._create_rng().rg
672        state = rg.bit_generator.state
673        size = (31, 7, 97)
674        mu = np.arange(97.0) + 1.0
675        existing = np.zeros(size)
676        rg.bit_generator.state = state
677        rg.standard_gamma(mu, out=existing)
678        rg.bit_generator.state = state
679        direct = rg.standard_gamma(mu, size=size)
680        assert_equal(direct, existing)
681
682        existing = np.zeros(size, dtype=np.float32)
683        rg.bit_generator.state = state
684        rg.standard_gamma(mu, out=existing, dtype=np.float32)
685        rg.bit_generator.state = state
686        direct = rg.standard_gamma(mu, size=size, dtype=np.float32)
687        assert_equal(direct, existing)
688
689    def test_output_fill_error(self):
690        rg = self._create_rng().rg
691        size = (31, 7, 97)
692        existing = np.empty(size)
693        with pytest.raises(TypeError):
694            rg.standard_normal(out=existing, dtype=np.float32)
695        with pytest.raises(ValueError):
696            rg.standard_normal(out=existing[::3])
697        existing = np.empty(size, dtype=np.float32)
698        with pytest.raises(TypeError):
699            rg.standard_normal(out=existing, dtype=np.float64)
700
701        existing = np.zeros(size, dtype=np.float32)
702        with pytest.raises(TypeError):
703            rg.standard_gamma(1.0, out=existing, dtype=np.float64)
704        with pytest.raises(ValueError):
705            rg.standard_gamma(1.0, out=existing[::3], dtype=np.float32)
706        existing = np.zeros(size, dtype=np.float64)
707        with pytest.raises(TypeError):
708            rg.standard_gamma(1.0, out=existing, dtype=np.float32)
709        with pytest.raises(ValueError):
710            rg.standard_gamma(1.0, out=existing[::3])
711
712    @pytest.mark.parametrize("dtype", DTYPES_BOOL_INT_UINT)
713    def test_integers_broadcast(self, dtype):
714        rg = self._create_rng().rg
715        initial_state = rg.bit_generator.state
716
717        def reset_state(rng):
718            rng.bit_generator.state = initial_state
719
720        if dtype == np.bool:
721            upper = 2
722            lower = 0
723        else:
724            info = np.iinfo(dtype)
725            upper = int(info.max) + 1
726            lower = info.min
727        reset_state(rg)
728        rg.bit_generator.state = initial_state
729        a = rg.integers(lower, [upper] * 10, dtype=dtype)
730        reset_state(rg)
731        b = rg.integers([lower] * 10, upper, dtype=dtype)
732        assert_equal(a, b)
733        reset_state(rg)
734        c = rg.integers(lower, upper, size=10, dtype=dtype)
735        assert_equal(a, c)
736        reset_state(rg)
737        d = rg.integers(np.array(
738            [lower] * 10), np.array([upper], dtype=object), size=10,
739            dtype=dtype)
740        assert_equal(a, d)
741        reset_state(rg)
742        e = rg.integers(
743            np.array([lower] * 10), np.array([upper] * 10), size=10,
744            dtype=dtype)
745        assert_equal(a, e)
746
747        reset_state(rg)
748        a = rg.integers(0, upper, size=10, dtype=dtype)
749        reset_state(rg)
750        b = rg.integers([upper] * 10, dtype=dtype)
751        assert_equal(a, b)
752
753    @pytest.mark.parametrize("dtype", DTYPES_BOOL_INT_UINT)
754    def test_integers_numpy(self, dtype):
755        rg = self._create_rng().rg
756        high = np.array([1])
757        low = np.array([0])
758
759        out = rg.integers(low, high, dtype=dtype)
760        assert out.shape == (1,)
761
762        out = rg.integers(low[0], high, dtype=dtype)
763        assert out.shape == (1,)
764
765        out = rg.integers(low, high[0], dtype=dtype)
766        assert out.shape == (1,)
767
768    @pytest.mark.parametrize("dtype", DTYPES_BOOL_INT_UINT)
769    def test_integers_broadcast_errors(self, dtype):
770        rg = self._create_rng().rg
771        if dtype == np.bool:
772            upper = 2
773            lower = 0
774        else:
775            info = np.iinfo(dtype)
776            upper = int(info.max) + 1
777            lower = info.min
778        with pytest.raises(ValueError):
779            rg.integers(lower, [upper + 1] * 10, dtype=dtype)
780        with pytest.raises(ValueError):
781            rg.integers(lower - 1, [upper] * 10, dtype=dtype)
782        with pytest.raises(ValueError):
783            rg.integers([lower - 1], [upper] * 10, dtype=dtype)
784        with pytest.raises(ValueError):
785            rg.integers([0], [0], dtype=dtype)
786
787
788class TestMT19937(RNG):
789    @classmethod
790    def _create_rng(cls):
791        bit_generator = MT19937
792        advance = None
793        seed = [2 ** 21 + 2 ** 16 + 2 ** 5 + 1]
794        rg = Generator(bit_generator(*seed))
795        seed_vector_bits = 32
796        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
797
798    def test_numpy_state(self):
799        rg = self._create_rng().rg
800        nprg = np.random.RandomState()
801        nprg.standard_normal(99)
802        state = nprg.get_state()
803        rg.bit_generator.state = state
804        state2 = rg.bit_generator.state
805        assert_((state[1] == state2['state']['key']).all())
806        assert_(state[2] == state2['state']['pos'])
807
808
809class TestPhilox(RNG):
810    @classmethod
811    def _create_rng(cls):
812        bit_generator = Philox
813        advance = 2**63 + 2**31 + 2**15 + 1
814        seed = [12345]
815        rg = Generator(bit_generator(*seed))
816        seed_vector_bits = 64
817        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
818
819
820class TestSFC64(RNG):
821    @classmethod
822    def _create_rng(cls):
823        bit_generator = SFC64
824        advance = None
825        seed = [12345]
826        rg = Generator(bit_generator(*seed))
827        seed_vector_bits = 192
828        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
829
830
831class TestPCG64(RNG):
832    @classmethod
833    def _create_rng(cls):
834        bit_generator = PCG64
835        advance = 2**63 + 2**31 + 2**15 + 1
836        seed = [12345]
837        rg = Generator(bit_generator(*seed))
838        seed_vector_bits = 64
839        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
840
841
842class TestPCG64DXSM(RNG):
843    @classmethod
844    def _create_rng(cls):
845        bit_generator = PCG64DXSM
846        advance = 2**63 + 2**31 + 2**15 + 1
847        seed = [12345]
848        rg = Generator(bit_generator(*seed))
849        seed_vector_bits = 64
850        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
851
852
853class TestDefaultRNG(RNG):
854    @classmethod
855    def _create_rng(cls):
856        # This will duplicate some tests that directly instantiate a fresh
857        # Generator(), but that's okay.
858        bit_generator = PCG64
859        advance = 2**63 + 2**31 + 2**15 + 1
860        seed = [12345]
861        rg = np.random.default_rng(*seed)
862        seed_vector_bits = 64
863        return RNGData(bit_generator, advance, seed, rg, seed_vector_bits)
864
865    def test_default_is_pcg64(self):
866        # In order to change the default BitGenerator, we'll go through
867        # a deprecation cycle to move to a different function.
868        rg = self._create_rng().rg
869        assert_(isinstance(rg.bit_generator, PCG64))
870
871    def test_seed(self):
872        np.random.default_rng()
873        np.random.default_rng(None)
874        np.random.default_rng(12345)
875        np.random.default_rng(0)
876        np.random.default_rng(43660444402423911716352051725018508569)
877        np.random.default_rng([43660444402423911716352051725018508569,
878                               279705150948142787361475340226491943209])
879        with pytest.raises(ValueError):
880            np.random.default_rng(-1)
881        with pytest.raises(ValueError):
882            np.random.default_rng([12345, -1])
883 
codekingpro/portable-devtools · Team Ai