1- from quantlib.types cimport BigNatural, Size
1+ from libc.string cimport memcpy
2+ from quantlib.types cimport BigNatural, Real, Size
3+ from cython.operator cimport dereference as deref
4+ from . cimport _rngtraits
25cimport cython
36cimport numpy as np
47from cython.operator cimport dereference as deref
58from libcpp.vector cimport vector
9+ from quantlib.methods.montecarlo._sample cimport Sample
610np.import_array()
711
812cdef class LowDiscrepancy:
913
1014 def __init__ (self , Size dimension , BigNatural seed = 0 ):
1115 self ._thisptr = new InverseCumulativeRsg[SobolRsg, InverseCumulativeNormal](
12- _rngtraits.LowDiscrepancy.make_sequence_generator(dimension, seed))
16+ _rngtraits.LowDiscrepancy.make_sequence_generator(dimension, seed)
17+ )
18+
19+ def __dealloc__ (self ):
20+ if self ._thisptr is not NULL :
21+ del self ._thisptr
22+
23+ def __iter__ (self ):
24+ return self
25+
26+ @ cython.boundscheck (False )
27+ def __next__ (self ):
28+ cdef np.npy_intp[1 ] dims
29+ dims[0 ] = self ._thisptr.dimension()
30+ cdef arr = np.PyArray_SimpleNew(1 , & dims[0 ], np.NPY_DOUBLE)
31+ cdef Sample[vector[Real]]* s = < Sample[vector[Real]]* > & self ._thisptr.nextSequence()
32+ memcpy(np.PyArray_DATA(arr), s.value.data(), self ._thisptr.dimension() * sizeof(Real))
33+ return (s.weight, arr)
34+
35+ @property
36+ def dimension (self ):
37+ return self ._thisptr.dimension()
38+
39+ def last_sequence (self ):
40+ return self ._thisptr.lastSequence().value
41+
42+
43+ cdef class PseudoRandom:
44+
45+ def __init__ (self , Size dimension , BigNatural seed = 0 ):
46+ self ._thisptr = new _rngtraits.PseudoRandom.rsg_type(
47+ _rngtraits.PseudoRandom.make_sequence_generator(dimension, seed)
48+ )
1349
1450 def __dealloc__ (self ):
1551 if self ._thisptr is not NULL :
@@ -23,16 +59,43 @@ cdef class LowDiscrepancy:
2359 cdef np.npy_intp[1 ] dims
2460 dims[0 ] = self ._thisptr.dimension()
2561 cdef arr = np.PyArray_SimpleNew(1 , & dims[0 ], np.NPY_DOUBLE)
26- cdef double [:] r = arr
27- cdef size_t i
28- cdef vector[double ] s = self ._thisptr.nextSequence().value
29- for i in range (dims[0 ]):
30- r[i] = s[i]
31- return arr
62+ cdef Sample[vector[Real]]* s = < Sample[vector[Real]]* > & self ._thisptr.nextSequence()
63+ memcpy(np.PyArray_DATA(arr), s.value.data(), self ._thisptr.dimension() * sizeof(Real))
64+ return (s.weight, arr)
3265
3366 @property
3467 def dimension (self ):
3568 return self ._thisptr.dimension()
3669
3770 def last_sequence (self ):
3871 return self ._thisptr.lastSequence().value
72+
73+
74+ cdef class FastPseudoRandom:
75+
76+ def __init__ (self , Size dimension , BigNatural seed = 0 ):
77+ cdef Xoshiro256StarStarUniformRng* uniform_random = new Xoshiro256StarStarUniformRng(seed)
78+ cdef ZigguratGaussianRng[Xoshiro256StarStarUniformRng]* rng = new ZigguratGaussianRng[Xoshiro256StarStarUniformRng](deref(uniform_random))
79+ self ._thisptr = new RandomSequenceGenerator[ZigguratGaussianRng[Xoshiro256StarStarUniformRng]](dimension, deref(rng))
80+ del uniform_random
81+ del rng
82+
83+ def __dealloc__ (self ):
84+ if self ._thisptr is not NULL :
85+ del self ._thisptr
86+
87+ def __iter__ (self ):
88+ return self
89+
90+ @ cython.boundscheck (False )
91+ def __next__ (self ):
92+ cdef np.npy_intp[1 ] dims
93+ dims[0 ] = self ._thisptr.dimension()
94+ cdef arr = np.PyArray_SimpleNew(1 , & dims[0 ], np.NPY_DOUBLE)
95+ cdef Sample[vector[Real]]* s = < Sample[vector[Real]]* > & self ._thisptr.nextSequence()
96+ memcpy(np.PyArray_DATA(arr), s.value.data(), self ._thisptr.dimension() * sizeof(Real))
97+ return (s.weight, arr)
98+
99+ @property
100+ def dimension (self ):
101+ return self ._thisptr.dimension()
0 commit comments