@@ -112,9 +112,9 @@ cdef extern from "distributions.h":
112
112
cdef void random_gauss_fill (aug_state * state , int count , double * out ) nogil
113
113
cdef void random_gauss_zig_julia_fill (aug_state * state , int count , double * out ) nogil
114
114
115
-
116
115
include "array_utilities.pxi"
117
116
include "bounded_integers.pxi"
117
+ include "aligned_malloc.pxi"
118
118
119
119
cdef double kahan_sum (double * darr , np .npy_intp n ):
120
120
cdef double c , y , t , sum
@@ -141,38 +141,25 @@ cdef class RandomState:
141
141
142
142
IF RNG_SEED == 1 :
143
143
def __init__ (self , seed = None ):
144
- IF RNG_MOD_NAME == 'dsfmt' :
145
- cdef int8_t * iptr
146
- cdef int8_t offset = 0
147
- cdef intptr_t alignment = 0
148
- self .rng_loc = PyMem_Malloc (sizeof (rng_t ))
149
- self .rng_state .rng = < rng_t * > self .rng_loc
150
- alignment = < intptr_t > (& (self .rng_state .rng .status [0 ].u32 [0 ]))
151
- if (alignment % 16 ) != 0 :
152
- iptr = < int8_t * > self .rng_state .rng
153
- offset = 16 - (alignment % 16 )
154
- if offset < 0 :
155
- offset += 16
156
- self .rng_state .rng = < rng_t * > (iptr + offset )
157
- ELSE :
158
- self .rng_loc = PyMem_Malloc (sizeof (rng_t ))
159
- self .rng_state .rng = < rng_t * > self .rng_loc
160
-
144
+ self .rng_state .rng = < rng_t * > PyArray_malloc_aligned (sizeof (rng_t ))
161
145
self .rng_state .binomial = & self .binomial_info
162
- self ._reset_state_variables ()
146
+ IF RNG_MOD_NAME == 'dsfmt' :
147
+ self .rng_state .buffered_uniforms = < double * > PyArray_malloc_aligned (2 * DSFMT_N * sizeof (double ))
163
148
self .lock = Lock ()
149
+ self ._reset_state_variables ()
164
150
self .seed (seed )
165
-
166
151
ELSE :
167
152
def __init__ (self , seed = None , inc = None ):
168
- self .rng_state .rng = < rng_t * > PyMem_Malloc (sizeof (rng_t )) # &self.rng
153
+ self .rng_state .rng = < rng_t * > PyArray_malloc_aligned (sizeof (rng_t ))
169
154
self .rng_state .binomial = & self .binomial_info
170
- self ._reset_state_variables ()
171
155
self .lock = Lock ()
156
+ self ._reset_state_variables ()
172
157
self .seed (seed , inc )
173
158
174
159
def __dealloc__ (self ):
175
- PyMem_Free (self .rng_loc )
160
+ PyArray_free_aligned (self .rng_state .rng )
161
+ IF RNG_MOD_NAME == 'dsfmt' :
162
+ PyArray_free_aligned (self .rng_state .buffered_uniforms )
176
163
177
164
# Pickling support:
178
165
def __getstate__ (self ):
@@ -496,7 +483,7 @@ cdef class RandomState:
496
483
if isinstance (state , tuple ):
497
484
if state [0 ] != 'MT19937' :
498
485
raise ValueError ('Not a ' + rng_name + ' RNG state' )
499
- _set_state (self .rng_state , (state [1 ], state [2 ]))
486
+ _set_state (& self .rng_state , (state [1 ], state [2 ]))
500
487
self .rng_state .has_gauss = state [3 ]
501
488
self .rng_state .gauss = state [4 ]
502
489
self .rng_state .has_uint32 = 0
@@ -505,7 +492,8 @@ cdef class RandomState:
505
492
506
493
if state ['name' ] != rng_name :
507
494
raise ValueError ('Not a ' + rng_name + ' RNG state' )
508
- _set_state (self .rng_state , state ['state' ])
495
+ print (state ['state' ])
496
+ _set_state (& self .rng_state , state ['state' ])
509
497
self .rng_state .has_gauss = state ['gauss' ]['has_gauss' ]
510
498
self .rng_state .gauss = state ['gauss' ]['gauss' ]
511
499
self .rng_state .has_uint32 = state ['uint32' ]['has_uint32' ]
0 commit comments