41 lines
880 B
Python
41 lines
880 B
Python
|
"""
|
||
|
Use cffi to access any of the underlying C functions from distributions.h
|
||
|
"""
|
||
|
import os
|
||
|
import numpy as np
|
||
|
import cffi
|
||
|
from .parse import parse_distributions_h
|
||
|
ffi = cffi.FFI()
|
||
|
|
||
|
inc_dir = os.path.join(np.get_include(), 'numpy')
|
||
|
|
||
|
# Basic numpy types
|
||
|
ffi.cdef('''
|
||
|
typedef intptr_t npy_intp;
|
||
|
typedef unsigned char npy_bool;
|
||
|
|
||
|
''')
|
||
|
|
||
|
parse_distributions_h(ffi, inc_dir)
|
||
|
|
||
|
lib = ffi.dlopen(np.random._generator.__file__)
|
||
|
|
||
|
# Compare the distributions.h random_standard_normal_fill to
|
||
|
# Generator.standard_random
|
||
|
bit_gen = np.random.PCG64()
|
||
|
rng = np.random.Generator(bit_gen)
|
||
|
state = bit_gen.state
|
||
|
|
||
|
interface = rng.bit_generator.cffi
|
||
|
n = 100
|
||
|
vals_cffi = ffi.new('double[%d]' % n)
|
||
|
lib.random_standard_normal_fill(interface.bit_generator, n, vals_cffi)
|
||
|
|
||
|
# reset the state
|
||
|
bit_gen.state = state
|
||
|
|
||
|
vals = rng.standard_normal(n)
|
||
|
|
||
|
for i in range(n):
|
||
|
assert vals[i] == vals_cffi[i]
|