@@ -1795,11 +1795,12 @@ cdef class RandomState:
1795
1795
1796
1796
>>> s = np.random.complex_normal(size=1000)
1797
1797
"""
1798
+ if method != u'zig' or method != u'bm' :
1799
+ raise ValueError ("method must be either 'bm' or 'zig'" )
1798
1800
cdef np .ndarray ogamma , orelation , oloc , randoms , v_real , v_imag , rho
1799
1801
cdef double * randoms_data
1800
1802
cdef double fgamma_r , fgamma_i , frelation_r , frelation_i , frho , f_v_real , f_v_imag , \
1801
1803
floc_r , floc_i , f_real , f_imag , i_r_scale , r_scale , i_scale , f_rho
1802
- cdef complex cloc
1803
1804
cdef np .npy_intp i , j , n
1804
1805
cdef np .broadcast it
1805
1806
@@ -1830,8 +1831,13 @@ cdef class RandomState:
1830
1831
raise ValueError ('Im(relation) ** 2 > Re(gamma ** 2 - relation** 2)' )
1831
1832
1832
1833
if size is None :
1833
- random_gauss_zig_double_fill (& self .rng_state , 1 , & f_real )
1834
- random_gauss_zig_double_fill (& self .rng_state , 1 , & f_imag )
1834
+ if method == u'zig' :
1835
+ random_gauss_zig_double_fill (& self .rng_state , 1 , & f_real )
1836
+ random_gauss_zig_double_fill (& self .rng_state , 1 , & f_imag )
1837
+ else :
1838
+ random_gauss_fill (& self .rng_state , 1 , & f_real )
1839
+ random_gauss_fill (& self .rng_state , 1 , & f_imag )
1840
+
1835
1841
f_imag *= sqrt (1 - f_rho * f_rho )
1836
1842
f_imag += f_rho * f_real
1837
1843
f_real *= sqrt (0.5 * f_v_real )
@@ -1847,13 +1853,22 @@ cdef class RandomState:
1847
1853
r_scale = sqrt (0.5 * f_v_real )
1848
1854
i_scale = sqrt (0.5 * f_v_imag )
1849
1855
j = 0
1850
- with self .lock : # , nogil:
1851
- for i in range (n ):
1852
- random_gauss_zig_double_fill (& self .rng_state , 1 , & f_real )
1853
- random_gauss_zig_double_fill (& self .rng_state , 1 , & f_imag )
1854
- randoms_data [j + 1 ] = floc_i + i_scale * (f_rho * f_real + i_r_scale * f_imag )
1855
- randoms_data [j ] = floc_r + r_scale * f_real
1856
- j += 2
1856
+ with self .lock , nogil :
1857
+ if method == u'zig' :
1858
+ for i in range (n ):
1859
+ random_gauss_zig_double_fill (& self .rng_state , 1 , & f_real )
1860
+ random_gauss_zig_double_fill (& self .rng_state , 1 , & f_imag )
1861
+ randoms_data [j + 1 ] = floc_i + i_scale * (f_rho * f_real + i_r_scale * f_imag )
1862
+ randoms_data [j ] = floc_r + r_scale * f_real
1863
+ j += 2
1864
+ else :
1865
+ for i in range (n ):
1866
+ random_gauss_fill (& self .rng_state , 1 , & f_real )
1867
+ random_gauss_fill (& self .rng_state , 1 , & f_imag )
1868
+ randoms_data [j + 1 ] = floc_i + i_scale * (f_rho * f_real + i_r_scale * f_imag )
1869
+ randoms_data [j ] = floc_r + r_scale * f_real
1870
+ j += 2
1871
+
1857
1872
1858
1873
return randoms
1859
1874
@@ -1885,9 +1900,11 @@ cdef class RandomState:
1885
1900
n = np .PyArray_SIZE (randoms )
1886
1901
1887
1902
it = np .PyArray_MultiIterNew5 (randoms , oloc , v_real , v_imag , rho )
1888
- # TODO: Box-Muller
1889
1903
with self .lock , nogil :
1890
- random_gauss_zig_double_fill (& self .rng_state , 2 * n , randoms_data )
1904
+ if method == u'zig' :
1905
+ random_gauss_zig_double_fill (& self .rng_state , 2 * n , randoms_data )
1906
+ else :
1907
+ random_gauss_fill (& self .rng_state , 2 * n , randoms_data )
1891
1908
with nogil :
1892
1909
j = 0
1893
1910
for i in range (n ):
0 commit comments