Spaces:
Running
Running
""" | |
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] | |