Skip to content

Commit 24f30ef

Browse files
authored
Merge pull request #111 from bashtage/use-complex-fn
REF: Use compute complex
2 parents 8c97648 + 543dc9d commit 24f30ef

File tree

4 files changed

+19
-30
lines changed

4 files changed

+19
-30
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ before_install:
4646

4747
install:
4848
- python setup.py develop
49-
- python setup.py install
5049

5150
script:
5251
- set -e

randomstate/cython_overrides.pxd

Lines changed: 0 additions & 7 deletions
This file was deleted.

randomstate/interface/sfmt/sfmt-shim.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "../../src/common/binomial.h"
1111
#include "../../src/common/entropy.h"
12+
#include "../../src/sfmt/sfmt-jump.h"
1213
#include "../../src/sfmt/sfmt.h"
1314

1415
typedef struct s_aug_state {

randomstate/randomstate.pyx

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ from libc.stdint cimport (uint8_t, uint16_t, uint32_t, uint64_t,
1717
int8_t, int16_t, int32_t, int64_t, intptr_t)
1818
from libc.stdlib cimport malloc, free
1919
from libc.math cimport sqrt
20-
from cpython cimport Py_INCREF, PyComplex_FromDoubles
20+
from cpython cimport Py_INCREF, PyComplex_FromDoubles, PyComplex_RealAsDouble, \
21+
PyComplex_ImagAsDouble, PyInt_AsLong, PyFloat_AsDouble
22+
2123

2224
import randomstate
2325
from binomial cimport binomial_t
24-
from cython_overrides cimport PyFloat_AsDouble, PyInt_AsLong, PyComplex_RealAsDouble, PyComplex_ImagAsDouble
2526
from randomstate.entropy import random_entropy
2627

2728
np.import_array()
@@ -1810,7 +1811,7 @@ cdef class RandomState:
18101811
raise ValueError("method must be either 'bm' or 'zig'")
18111812
cdef np.ndarray ogamma, orelation, oloc, randoms, v_real, v_imag, rho
18121813
cdef double *randoms_data
1813-
cdef double fgamma_r, fgamma_i, frelation_r, frelation_i, frho, f_v_real , f_v_imag, \
1814+
cdef double fgamma_r, fgamma_i, frelation_r, frelation_i, frho, fvar_r , fvar_i, \
18141815
floc_r, floc_i, f_real, f_imag, i_r_scale, r_scale, i_scale, f_rho
18151816
cdef np.npy_intp i, j, n
18161817
cdef np.broadcast it
@@ -1825,19 +1826,19 @@ cdef class RandomState:
18251826
fgamma_r = PyComplex_RealAsDouble(gamma)
18261827
fgamma_i = PyComplex_ImagAsDouble(gamma)
18271828
frelation_r = PyComplex_RealAsDouble(relation)
1828-
frelation_i = PyComplex_ImagAsDouble(relation)
1829+
frelation_i = 0.5 * PyComplex_ImagAsDouble(relation)
18291830

1830-
f_v_real = fgamma_r + frelation_r
1831-
f_v_imag = fgamma_r - frelation_r
1831+
fvar_r = 0.5 * (fgamma_r + frelation_r)
1832+
fvar_i = 0.5 * (fgamma_r - frelation_r)
18321833
if fgamma_i != 0:
18331834
raise ValueError('Im(gamma) != 0')
1834-
if f_v_imag < 0:
1835+
if fvar_i < 0:
18351836
raise ValueError('Re(gamma - relation) < 0')
1836-
if f_v_real < 0:
1837+
if fvar_r < 0:
18371838
raise ValueError('Re(gamma + relation) < 0')
18381839
f_rho = 0.0
1839-
if f_v_imag > 0 and f_v_real > 0:
1840-
f_rho = frelation_i / sqrt(f_v_imag * f_v_real)
1840+
if fvar_i > 0 and fvar_r > 0:
1841+
f_rho = frelation_i / sqrt(fvar_i * fvar_r)
18411842
if f_rho > 1.0 or f_rho < -1.0:
18421843
raise ValueError('Im(relation) ** 2 > Re(gamma ** 2 - relation** 2)')
18431844

@@ -1849,20 +1850,16 @@ cdef class RandomState:
18491850
random_gauss_fill(&self.rng_state, 1, &f_real)
18501851
random_gauss_fill(&self.rng_state, 1, &f_imag)
18511852

1852-
f_imag *= sqrt(1 - f_rho * f_rho)
1853-
f_imag += f_rho * f_real
1854-
f_real *= sqrt(0.5 * f_v_real)
1855-
f_imag *= sqrt(0.5 * f_v_imag)
1856-
1857-
return PyComplex_FromDoubles(floc_r + f_real, floc_i + f_imag)
1853+
compute_complex(&f_real, &f_imag, floc_r, floc_i, fvar_r, fvar_i, f_rho)
1854+
return PyComplex_FromDoubles(f_real, f_imag)
18581855

18591856
randoms = <np.ndarray>np.empty(size, np.complex128)
18601857
randoms_data = <double *>np.PyArray_DATA(randoms)
18611858
n = np.PyArray_SIZE(randoms)
18621859

18631860
i_r_scale = sqrt(1 - f_rho * f_rho)
1864-
r_scale = sqrt(0.5 * f_v_real)
1865-
i_scale = sqrt(0.5 * f_v_imag)
1861+
r_scale = sqrt(fvar_r)
1862+
i_scale = sqrt(fvar_i)
18661863
j = 0
18671864
with self.lock, nogil:
18681865
if method == u'zig':
@@ -1880,7 +1877,6 @@ cdef class RandomState:
18801877
randoms_data[j] = floc_r + r_scale * f_real
18811878
j += 2
18821879

1883-
18841880
return randoms
18851881

18861882
gpc = ogamma + orelation
@@ -1921,10 +1917,10 @@ cdef class RandomState:
19211917
for i in range(n):
19221918
floc_r= (<double*>np.PyArray_MultiIter_DATA(it, 1))[0]
19231919
floc_i= (<double*>np.PyArray_MultiIter_DATA(it, 1))[1]
1924-
f_v_real = (<double*>np.PyArray_MultiIter_DATA(it, 2))[0]
1925-
f_v_imag = (<double*>np.PyArray_MultiIter_DATA(it, 3))[0]
1920+
fvar_r = (<double*>np.PyArray_MultiIter_DATA(it, 2))[0]
1921+
fvar_i = (<double*>np.PyArray_MultiIter_DATA(it, 3))[0]
19261922
f_rho = (<double*>np.PyArray_MultiIter_DATA(it, 4))[0]
1927-
compute_complex(&randoms_data[j], &randoms_data[j+1], floc_r, floc_i, f_v_real, f_v_imag, f_rho)
1923+
compute_complex(&randoms_data[j], &randoms_data[j+1], floc_r, floc_i, fvar_r, fvar_i, f_rho)
19281924
j += 2
19291925
np.PyArray_MultiIter_NEXT(it)
19301926

0 commit comments

Comments
 (0)